aboutsummaryrefslogtreecommitdiff
path: root/includes/js/dijit
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dijit')
-rw-r--r--includes/js/dijit/ColorPalette.js292
-rw-r--r--includes/js/dijit/Declaration.js76
-rw-r--r--includes/js/dijit/Dialog.js480
-rw-r--r--includes/js/dijit/Editor.js373
-rw-r--r--includes/js/dijit/InlineEditBox.js422
-rw-r--r--includes/js/dijit/LICENSE195
-rw-r--r--includes/js/dijit/Menu.js487
-rw-r--r--includes/js/dijit/ProgressBar.js95
-rw-r--r--includes/js/dijit/TitlePane.js157
-rw-r--r--includes/js/dijit/Toolbar.js54
-rw-r--r--includes/js/dijit/Tooltip.js292
-rw-r--r--includes/js/dijit/Tree.js1336
-rw-r--r--includes/js/dijit/_Calendar.js239
-rw-r--r--includes/js/dijit/_Container.js346
-rw-r--r--includes/js/dijit/_Templated.js329
-rw-r--r--includes/js/dijit/_TimePicker.js249
-rw-r--r--includes/js/dijit/_Widget.js407
-rw-r--r--includes/js/dijit/_base.js27
-rw-r--r--includes/js/dijit/_base/bidi.js13
-rw-r--r--includes/js/dijit/_base/focus.js342
-rw-r--r--includes/js/dijit/_base/manager.js194
-rw-r--r--includes/js/dijit/_base/place.js213
-rw-r--r--includes/js/dijit/_base/popup.js269
-rw-r--r--includes/js/dijit/_base/scroll.js29
-rw-r--r--includes/js/dijit/_base/sniff.js45
-rw-r--r--includes/js/dijit/_base/typematic.js139
-rw-r--r--includes/js/dijit/_base/wai.js143
-rw-r--r--includes/js/dijit/_base/window.js47
-rw-r--r--includes/js/dijit/_editor/RichText.js1449
-rw-r--r--includes/js/dijit/_editor/_Plugin.js101
-rw-r--r--includes/js/dijit/_editor/html.js106
-rw-r--r--includes/js/dijit/_editor/nls/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/ar/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/ar/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/ar/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/cs/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/cs/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/cs/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/da/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/da/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/da/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/de/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/de/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/de/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/el/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/el/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/el/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/es/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/es/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/es/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/fi/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/fi/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/fi/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/fr/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/fr/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/fr/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/he/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/he/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/he/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/hu/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/hu/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/hu/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/it/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/it/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/it/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/ja/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/ja/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/ja/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/ko/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/ko/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/ko/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/nb/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/nb/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/nb/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/nl/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/nl/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/nl/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/pl/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/pl/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/pl/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt-pt/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt-pt/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt-pt/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/pt/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/ru/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/ru/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/ru/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/sv/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/sv/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/sv/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/tr/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/tr/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/tr/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh-tw/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh-tw/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh-tw/commands.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh/FontChoice.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh/LinkDialog.js1
-rw-r--r--includes/js/dijit/_editor/nls/zh/commands.js1
-rw-r--r--includes/js/dijit/_editor/plugins/AlwaysShowToolbar.js140
-rw-r--r--includes/js/dijit/_editor/plugins/EnterKeyHandling.js416
-rw-r--r--includes/js/dijit/_editor/plugins/FontChoice.js167
-rw-r--r--includes/js/dijit/_editor/plugins/LinkDialog.js147
-rw-r--r--includes/js/dijit/_editor/plugins/TextColor.js40
-rw-r--r--includes/js/dijit/_editor/plugins/ToggleDir.js40
-rw-r--r--includes/js/dijit/_editor/range.js570
-rw-r--r--includes/js/dijit/_editor/selection.js246
-rw-r--r--includes/js/dijit/_tree/Node.html12
-rw-r--r--includes/js/dijit/_tree/Tree.html3
-rw-r--r--includes/js/dijit/_tree/dndContainer.js150
-rw-r--r--includes/js/dijit/_tree/dndSelector.js171
-rw-r--r--includes/js/dijit/_tree/dndSource.js373
-rw-r--r--includes/js/dijit/_tree/model.js84
-rw-r--r--includes/js/dijit/bench/benchReceive.php129
-rw-r--r--includes/js/dijit/bench/benchTool.html189
-rw-r--r--includes/js/dijit/bench/create_widgets.html73
-rw-r--r--includes/js/dijit/bench/test_Button-programmatic.html75
-rw-r--r--includes/js/dijit/bench/test_button-results.html66
-rw-r--r--includes/js/dijit/bench/widget_construction_test.php186
-rw-r--r--includes/js/dijit/changes.txt93
-rw-r--r--includes/js/dijit/demos/chat.html86
-rw-r--r--includes/js/dijit/demos/chat/chat.css40
-rw-r--r--includes/js/dijit/demos/chat/chat.css.commented.css46
-rw-r--r--includes/js/dijit/demos/chat/client.html65
-rw-r--r--includes/js/dijit/demos/chat/community.html114
-rw-r--r--includes/js/dijit/demos/chat/operator.html83
-rw-r--r--includes/js/dijit/demos/chat/room.js127
-rw-r--r--includes/js/dijit/demos/form.html243
-rw-r--r--includes/js/dijit/demos/i18n.html158
-rw-r--r--includes/js/dijit/demos/i18n/continents.json9
-rw-r--r--includes/js/dijit/demos/i18n/data.json8646
-rw-r--r--includes/js/dijit/demos/i18n/flags.css1223
-rw-r--r--includes/js/dijit/demos/i18n/flags.css.commented.css1224
-rw-r--r--includes/js/dijit/demos/i18n/flags.pngbin0 -> 47275 bytes
-rw-r--r--includes/js/dijit/demos/i18n/generate.html2353
-rw-r--r--includes/js/dijit/demos/i18n/langCountryMap.json215
-rw-r--r--includes/js/dijit/demos/i18n/languages.json7045
-rw-r--r--includes/js/dijit/demos/i18n/languages.sh18
-rw-r--r--includes/js/dijit/demos/i18n/sprite.html2319
-rw-r--r--includes/js/dijit/demos/mail.html426
-rw-r--r--includes/js/dijit/demos/mail/icons.gifbin0 -> 1757 bytes
-rw-r--r--includes/js/dijit/demos/mail/icons.pngbin0 -> 2908 bytes
-rw-r--r--includes/js/dijit/demos/mail/mail.css133
-rw-r--r--includes/js/dijit/demos/mail/mail.css.commented.css157
-rw-r--r--includes/js/dijit/demos/mail/mail.json75
-rw-r--r--includes/js/dijit/demos/mail/newMail.html8
-rw-r--r--includes/js/dijit/demos/nihao.html91
-rw-r--r--includes/js/dijit/demos/nihao/nls/en/helloworld.js1
-rw-r--r--includes/js/dijit/demos/nihao/nls/fr/helloworld.js1
-rw-r--r--includes/js/dijit/demos/nihao/nls/helloworld.js1
-rw-r--r--includes/js/dijit/demos/nihao/nls/zh/helloworld.js1
-rw-r--r--includes/js/dijit/dijit-all.js20
-rw-r--r--includes/js/dijit/dijit-all.js.uncompressed.js16235
-rw-r--r--includes/js/dijit/dijit.js20
-rw-r--r--includes/js/dijit/dijit.js.uncompressed.js3641
-rw-r--r--includes/js/dijit/form/Button.js425
-rw-r--r--includes/js/dijit/form/CheckBox.js133
-rw-r--r--includes/js/dijit/form/ComboBox.js1060
-rw-r--r--includes/js/dijit/form/CurrencyTextBox.js51
-rw-r--r--includes/js/dijit/form/DateTextBox.js20
-rw-r--r--includes/js/dijit/form/FilteringSelect.js241
-rw-r--r--includes/js/dijit/form/Form.js384
-rw-r--r--includes/js/dijit/form/MultiSelect.js84
-rw-r--r--includes/js/dijit/form/NumberSpinner.js31
-rw-r--r--includes/js/dijit/form/NumberTextBox.js79
-rw-r--r--includes/js/dijit/form/SimpleTextarea.js50
-rw-r--r--includes/js/dijit/form/Slider.js481
-rw-r--r--includes/js/dijit/form/TextBox.js185
-rw-r--r--includes/js/dijit/form/Textarea.js261
-rw-r--r--includes/js/dijit/form/TimeTextBox.js33
-rw-r--r--includes/js/dijit/form/ValidationTextBox.js308
-rw-r--r--includes/js/dijit/form/_DateTimeTextBox.js175
-rw-r--r--includes/js/dijit/form/_FormWidget.js340
-rw-r--r--includes/js/dijit/form/_Spinner.js117
-rw-r--r--includes/js/dijit/form/nls/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/ar/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/ar/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/ar/validate.js1
-rw-r--r--includes/js/dijit/form/nls/cs/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/cs/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/cs/validate.js1
-rw-r--r--includes/js/dijit/form/nls/da/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/da/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/da/validate.js1
-rw-r--r--includes/js/dijit/form/nls/de/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/de/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/de/validate.js1
-rw-r--r--includes/js/dijit/form/nls/el/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/el/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/el/validate.js1
-rw-r--r--includes/js/dijit/form/nls/es/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/es/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/es/validate.js1
-rw-r--r--includes/js/dijit/form/nls/fi/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/fi/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/fi/validate.js1
-rw-r--r--includes/js/dijit/form/nls/fr/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/fr/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/fr/validate.js1
-rw-r--r--includes/js/dijit/form/nls/he/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/he/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/he/validate.js1
-rw-r--r--includes/js/dijit/form/nls/hu/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/hu/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/hu/validate.js1
-rw-r--r--includes/js/dijit/form/nls/it/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/it/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/it/validate.js1
-rw-r--r--includes/js/dijit/form/nls/ja/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/ja/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/ja/validate.js1
-rw-r--r--includes/js/dijit/form/nls/ko/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/ko/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/ko/validate.js1
-rw-r--r--includes/js/dijit/form/nls/nb/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/nb/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/nb/validate.js1
-rw-r--r--includes/js/dijit/form/nls/nl/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/nl/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/nl/validate.js1
-rw-r--r--includes/js/dijit/form/nls/pl/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/pl/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/pl/validate.js1
-rw-r--r--includes/js/dijit/form/nls/pt-pt/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/pt-pt/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/pt-pt/validate.js1
-rw-r--r--includes/js/dijit/form/nls/pt/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/pt/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/pt/validate.js1
-rw-r--r--includes/js/dijit/form/nls/ru/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/ru/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/ru/validate.js1
-rw-r--r--includes/js/dijit/form/nls/sv/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/sv/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/sv/validate.js1
-rw-r--r--includes/js/dijit/form/nls/tr/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/tr/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/tr/validate.js1
-rw-r--r--includes/js/dijit/form/nls/validate.js1
-rw-r--r--includes/js/dijit/form/nls/zh-tw/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/zh-tw/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/zh-tw/validate.js1
-rw-r--r--includes/js/dijit/form/nls/zh/ComboBox.js1
-rw-r--r--includes/js/dijit/form/nls/zh/Textarea.js1
-rw-r--r--includes/js/dijit/form/nls/zh/validate.js1
-rw-r--r--includes/js/dijit/form/templates/Button.html11
-rw-r--r--includes/js/dijit/form/templates/CheckBox.html7
-rw-r--r--includes/js/dijit/form/templates/ComboBox.html19
-rw-r--r--includes/js/dijit/form/templates/ComboButton.html21
-rw-r--r--includes/js/dijit/form/templates/DropDownButton.html13
-rw-r--r--includes/js/dijit/form/templates/HorizontalSlider.html37
-rw-r--r--includes/js/dijit/form/templates/InlineEditBox.html12
-rw-r--r--includes/js/dijit/form/templates/Spinner.html28
-rw-r--r--includes/js/dijit/form/templates/TextBox.html4
-rw-r--r--includes/js/dijit/form/templates/TimePicker.html5
-rw-r--r--includes/js/dijit/form/templates/ValidationTextBox.html12
-rw-r--r--includes/js/dijit/form/templates/VerticalSlider.html46
-rw-r--r--includes/js/dijit/layout/AccordionContainer.js229
-rw-r--r--includes/js/dijit/layout/BorderContainer.js515
-rw-r--r--includes/js/dijit/layout/ContentPane.js445
-rw-r--r--includes/js/dijit/layout/LayoutContainer.js74
-rw-r--r--includes/js/dijit/layout/LinkPane.js36
-rw-r--r--includes/js/dijit/layout/SplitContainer.js553
-rw-r--r--includes/js/dijit/layout/StackContainer.js493
-rw-r--r--includes/js/dijit/layout/TabContainer.js184
-rw-r--r--includes/js/dijit/layout/_LayoutWidget.js188
-rw-r--r--includes/js/dijit/layout/templates/AccordionPane.html11
-rw-r--r--includes/js/dijit/layout/templates/TabContainer.html4
-rw-r--r--includes/js/dijit/layout/templates/TooltipDialog.html6
-rw-r--r--includes/js/dijit/layout/templates/_TabButton.html10
-rw-r--r--includes/js/dijit/nls/ar/common.js1
-rw-r--r--includes/js/dijit/nls/ar/loading.js1
-rw-r--r--includes/js/dijit/nls/common.js1
-rw-r--r--includes/js/dijit/nls/cs/common.js1
-rw-r--r--includes/js/dijit/nls/cs/loading.js1
-rw-r--r--includes/js/dijit/nls/da/common.js1
-rw-r--r--includes/js/dijit/nls/da/loading.js1
-rw-r--r--includes/js/dijit/nls/de/common.js1
-rw-r--r--includes/js/dijit/nls/de/loading.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ROOT.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ar.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_cs.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_da.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_de-de.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_de.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_el.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_en-gb.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_en-us.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_en.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_es-es.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_es.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_fi-fi.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_fi.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_fr-fr.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_fr.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_he-il.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_he.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_hu.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_it-it.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_it.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ja-jp.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ja.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ko-kr.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ko.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_nl-nl.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_nl.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_no.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_pl.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_pt-br.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_pt-pt.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_pt.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_ru.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_sv.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_tr.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_xx.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_zh-cn.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_zh-tw.js1
-rw-r--r--includes/js/dijit/nls/dijit-all_zh.js1
-rw-r--r--includes/js/dijit/nls/el/common.js1
-rw-r--r--includes/js/dijit/nls/el/loading.js1
-rw-r--r--includes/js/dijit/nls/es/common.js1
-rw-r--r--includes/js/dijit/nls/es/loading.js1
-rw-r--r--includes/js/dijit/nls/fi/common.js1
-rw-r--r--includes/js/dijit/nls/fi/loading.js1
-rw-r--r--includes/js/dijit/nls/fr/common.js1
-rw-r--r--includes/js/dijit/nls/fr/loading.js1
-rw-r--r--includes/js/dijit/nls/he/common.js1
-rw-r--r--includes/js/dijit/nls/he/loading.js1
-rw-r--r--includes/js/dijit/nls/hu/common.js1
-rw-r--r--includes/js/dijit/nls/hu/loading.js1
-rw-r--r--includes/js/dijit/nls/it/common.js1
-rw-r--r--includes/js/dijit/nls/it/loading.js1
-rw-r--r--includes/js/dijit/nls/ja/common.js1
-rw-r--r--includes/js/dijit/nls/ja/loading.js1
-rw-r--r--includes/js/dijit/nls/ko/common.js1
-rw-r--r--includes/js/dijit/nls/ko/loading.js1
-rw-r--r--includes/js/dijit/nls/loading.js1
-rw-r--r--includes/js/dijit/nls/nb/common.js1
-rw-r--r--includes/js/dijit/nls/nb/loading.js1
-rw-r--r--includes/js/dijit/nls/nl/common.js1
-rw-r--r--includes/js/dijit/nls/nl/loading.js1
-rw-r--r--includes/js/dijit/nls/pl/common.js1
-rw-r--r--includes/js/dijit/nls/pl/loading.js1
-rw-r--r--includes/js/dijit/nls/pt-pt/common.js1
-rw-r--r--includes/js/dijit/nls/pt-pt/loading.js1
-rw-r--r--includes/js/dijit/nls/pt/common.js1
-rw-r--r--includes/js/dijit/nls/pt/loading.js1
-rw-r--r--includes/js/dijit/nls/ru/common.js1
-rw-r--r--includes/js/dijit/nls/ru/loading.js1
-rw-r--r--includes/js/dijit/nls/sv/common.js1
-rw-r--r--includes/js/dijit/nls/sv/loading.js1
-rw-r--r--includes/js/dijit/nls/tr/common.js1
-rw-r--r--includes/js/dijit/nls/tr/loading.js1
-rw-r--r--includes/js/dijit/nls/zh-tw/common.js1
-rw-r--r--includes/js/dijit/nls/zh-tw/loading.js1
-rw-r--r--includes/js/dijit/nls/zh/common.js1
-rw-r--r--includes/js/dijit/nls/zh/loading.js1
-rw-r--r--includes/js/dijit/resources/_modules.js15
-rw-r--r--includes/js/dijit/templates/Calendar.html35
-rw-r--r--includes/js/dijit/templates/ColorPalette.html5
-rw-r--r--includes/js/dijit/templates/Dialog.html9
-rw-r--r--includes/js/dijit/templates/InlineEditBox.html8
-rw-r--r--includes/js/dijit/templates/ProgressBar.html9
-rw-r--r--includes/js/dijit/templates/TitlePane.html14
-rw-r--r--includes/js/dijit/templates/Tooltip.html4
-rw-r--r--includes/js/dijit/templates/buttons/bg-fade.pngbin0 -> 177 bytes
-rw-r--r--includes/js/dijit/templates/colors3x4.pngbin0 -> 786 bytes
-rw-r--r--includes/js/dijit/templates/colors7x10.pngbin0 -> 2641 bytes
-rw-r--r--includes/js/dijit/tests/Container.html63
-rw-r--r--includes/js/dijit/tests/Container.js9
-rw-r--r--includes/js/dijit/tests/_Templated.html164
-rw-r--r--includes/js/dijit/tests/_Templated.js9
-rw-r--r--includes/js/dijit/tests/_altCalendar.html36
-rw-r--r--includes/js/dijit/tests/_base/manager.html322
-rw-r--r--includes/js/dijit/tests/_base/manager.js9
-rw-r--r--includes/js/dijit/tests/_base/test_FocusManager.html46
-rw-r--r--includes/js/dijit/tests/_base/test_focusWidget.html130
-rw-r--r--includes/js/dijit/tests/_base/test_placeStrict.html400
-rw-r--r--includes/js/dijit/tests/_base/test_typematic.html56
-rw-r--r--includes/js/dijit/tests/_base/viewport.html79
-rw-r--r--includes/js/dijit/tests/_base/viewport.js10
-rw-r--r--includes/js/dijit/tests/_base/viewportStrict.html81
-rw-r--r--includes/js/dijit/tests/_base/wai.html115
-rw-r--r--includes/js/dijit/tests/_base/wai.js9
-rw-r--r--includes/js/dijit/tests/_data/categories.json12
-rw-r--r--includes/js/dijit/tests/_data/categoriesNested.json13
-rw-r--r--includes/js/dijit/tests/_data/countries.json45
-rw-r--r--includes/js/dijit/tests/_data/dijits.json1
-rw-r--r--includes/js/dijit/tests/_data/states.json64
-rw-r--r--includes/js/dijit/tests/_data/treeTest.json22
-rw-r--r--includes/js/dijit/tests/_editor/test_6112.html745
-rw-r--r--includes/js/dijit/tests/_editor/test_CustomPlugin.html151
-rw-r--r--includes/js/dijit/tests/_editor/test_RichText.html59
-rw-r--r--includes/js/dijit/tests/_editor/test_ToggleDir.html37
-rw-r--r--includes/js/dijit/tests/_editor/test_richtext.css4
-rw-r--r--includes/js/dijit/tests/_editor/test_richtext.css.commented.css4
-rw-r--r--includes/js/dijit/tests/_programaticTest.html109
-rw-r--r--includes/js/dijit/tests/_testCommon.js103
-rw-r--r--includes/js/dijit/tests/css/dijitTests.css69
-rw-r--r--includes/js/dijit/tests/css/dijitTests.css.commented.css78
-rw-r--r--includes/js/dijit/tests/form/Form.html354
-rw-r--r--includes/js/dijit/tests/form/Form.js9
-rw-r--r--includes/js/dijit/tests/form/images/Alabama.jpgbin0 -> 4585 bytes
-rw-r--r--includes/js/dijit/tests/form/test_Button.html286
-rw-r--r--includes/js/dijit/tests/form/test_CheckBox.html127
-rw-r--r--includes/js/dijit/tests/form/test_ComboBox.html289
-rw-r--r--includes/js/dijit/tests/form/test_ComboBox_destroy.html58
-rw-r--r--includes/js/dijit/tests/form/test_DateTextBox.html156
-rw-r--r--includes/js/dijit/tests/form/test_FilteringSelect.html296
-rw-r--r--includes/js/dijit/tests/form/test_Form_onsubmit.html87
-rw-r--r--includes/js/dijit/tests/form/test_MultiSelect.html138
-rw-r--r--includes/js/dijit/tests/form/test_SimpleTextarea.html62
-rw-r--r--includes/js/dijit/tests/form/test_Slider.html208
-rw-r--r--includes/js/dijit/tests/form/test_Spinner.html92
-rw-r--r--includes/js/dijit/tests/form/test_Textarea.html106
-rw-r--r--includes/js/dijit/tests/form/test_TimeTextBox.html143
-rw-r--r--includes/js/dijit/tests/form/test_validate.html428
-rw-r--r--includes/js/dijit/tests/i18n/README4
-rw-r--r--includes/js/dijit/tests/i18n/currency.html210
-rw-r--r--includes/js/dijit/tests/i18n/date.html155
-rw-r--r--includes/js/dijit/tests/i18n/digit.html294
-rw-r--r--includes/js/dijit/tests/i18n/module.js18
-rw-r--r--includes/js/dijit/tests/i18n/number.html136
-rw-r--r--includes/js/dijit/tests/i18n/test_i18n.js206
-rw-r--r--includes/js/dijit/tests/i18n/textbox.html173
-rw-r--r--includes/js/dijit/tests/i18n/time.html207
-rw-r--r--includes/js/dijit/tests/images/arrowSmall.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/tests/images/copy.gifbin0 -> 210 bytes
-rw-r--r--includes/js/dijit/tests/images/cut.gifbin0 -> 112 bytes
-rw-r--r--includes/js/dijit/tests/images/flatScreen.gifbin0 -> 824 bytes
-rw-r--r--includes/js/dijit/tests/images/note.gifbin0 -> 617 bytes
-rw-r--r--includes/js/dijit/tests/images/paste.gifbin0 -> 241 bytes
-rw-r--r--includes/js/dijit/tests/images/plus.gifbin0 -> 151 bytes
-rw-r--r--includes/js/dijit/tests/images/testsBodyBg.gifbin0 -> 753 bytes
-rw-r--r--includes/js/dijit/tests/images/tube.gifbin0 -> 147 bytes
-rw-r--r--includes/js/dijit/tests/images/tubeTall.gifbin0 -> 256 bytes
-rw-r--r--includes/js/dijit/tests/layout/ContentPane.html577
-rw-r--r--includes/js/dijit/tests/layout/ContentPane.js9
-rw-r--r--includes/js/dijit/tests/layout/combotab.html11
-rw-r--r--includes/js/dijit/tests/layout/doc0.html12
-rw-r--r--includes/js/dijit/tests/layout/doc1.html13
-rw-r--r--includes/js/dijit/tests/layout/doc2.html13
-rw-r--r--includes/js/dijit/tests/layout/getResponse.php57
-rw-r--r--includes/js/dijit/tests/layout/tab1.html6
-rw-r--r--includes/js/dijit/tests/layout/tab2.html3
-rw-r--r--includes/js/dijit/tests/layout/tab3.html39
-rw-r--r--includes/js/dijit/tests/layout/tab4.html40
-rw-r--r--includes/js/dijit/tests/layout/test_AccordionContainer.html195
-rw-r--r--includes/js/dijit/tests/layout/test_BorderContainer.html163
-rw-r--r--includes/js/dijit/tests/layout/test_BorderContainer_complex.html178
-rw-r--r--includes/js/dijit/tests/layout/test_BorderContainer_experimental.html253
-rw-r--r--includes/js/dijit/tests/layout/test_BorderContainer_full.html56
-rw-r--r--includes/js/dijit/tests/layout/test_BorderContainer_nested.html70
-rw-r--r--includes/js/dijit/tests/layout/test_ContentPane.html94
-rw-r--r--includes/js/dijit/tests/layout/test_LayoutCode.html383
-rw-r--r--includes/js/dijit/tests/layout/test_LayoutContainer.html174
-rw-r--r--includes/js/dijit/tests/layout/test_SplitContainer.html116
-rw-r--r--includes/js/dijit/tests/layout/test_StackContainer.html62
-rw-r--r--includes/js/dijit/tests/layout/test_StackContainer_code.html64
-rw-r--r--includes/js/dijit/tests/layout/test_TabContainer.html183
-rw-r--r--includes/js/dijit/tests/layout/test_TabContainerTitlePane.html75
-rw-r--r--includes/js/dijit/tests/layout/test_TabContainer_noLayout.html104
-rw-r--r--includes/js/dijit/tests/layout/test_TabContainer_remote.html109
-rw-r--r--includes/js/dijit/tests/manualTests.html12
-rw-r--r--includes/js/dijit/tests/manualTests.js85
-rw-r--r--includes/js/dijit/tests/module.js21
-rw-r--r--includes/js/dijit/tests/ondijitclick.html95
-rw-r--r--includes/js/dijit/tests/ondijitclick.js9
-rw-r--r--includes/js/dijit/tests/runTests.html9
-rw-r--r--includes/js/dijit/tests/test.html37
-rw-r--r--includes/js/dijit/tests/test_Calendar.html81
-rw-r--r--includes/js/dijit/tests/test_ColorPalette.html53
-rw-r--r--includes/js/dijit/tests/test_Declaration.html66
-rw-r--r--includes/js/dijit/tests/test_Dialog.html408
-rw-r--r--includes/js/dijit/tests/test_Dialog_focusDestroy.html61
-rw-r--r--includes/js/dijit/tests/test_Editor.html153
-rw-r--r--includes/js/dijit/tests/test_InlineEditBox.html231
-rw-r--r--includes/js/dijit/tests/test_Menu.html270
-rw-r--r--includes/js/dijit/tests/test_ProgressBar.html165
-rw-r--r--includes/js/dijit/tests/test_TitlePane.html126
-rw-r--r--includes/js/dijit/tests/test_Toolbar.html186
-rw-r--r--includes/js/dijit/tests/test_Tooltip.html117
-rw-r--r--includes/js/dijit/tests/test_TooltipDialog.html349
-rw-r--r--includes/js/dijit/tests/test_Tree.html115
-rw-r--r--includes/js/dijit/tests/test_Tree_Notification_API_Support.html287
-rw-r--r--includes/js/dijit/tests/test_instantiate.html111
-rw-r--r--includes/js/dijit/tests/tree/test_Tree_DnD.html194
-rw-r--r--includes/js/dijit/tests/tree/test_Tree_Programmatic.html40
-rw-r--r--includes/js/dijit/tests/tree/test_Tree_v1.html111
-rw-r--r--includes/js/dijit/tests/widgetsInTemplate.html112
-rw-r--r--includes/js/dijit/tests/widgetsInTemplate.js9
-rw-r--r--includes/js/dijit/themes/a11y/README.txt3
-rw-r--r--includes/js/dijit/themes/a11y/indeterminate_progress.gifbin0 -> 2907 bytes
-rw-r--r--includes/js/dijit/themes/dijit.css1205
-rw-r--r--includes/js/dijit/themes/dijit.css.commented.css1535
-rw-r--r--includes/js/dijit/themes/dijit_rtl.css140
-rw-r--r--includes/js/dijit/themes/dijit_rtl.css.commented.css194
-rw-r--r--includes/js/dijit/themes/nihilo/Calendar.css136
-rw-r--r--includes/js/dijit/themes/nihilo/Calendar.css.commented.css159
-rw-r--r--includes/js/dijit/themes/nihilo/Calendar_rtl.css13
-rw-r--r--includes/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css16
-rw-r--r--includes/js/dijit/themes/nihilo/ColorPalette.css5
-rw-r--r--includes/js/dijit/themes/nihilo/ColorPalette.css.commented.css5
-rw-r--r--includes/js/dijit/themes/nihilo/Common.css29
-rw-r--r--includes/js/dijit/themes/nihilo/Common.css.commented.css37
-rw-r--r--includes/js/dijit/themes/nihilo/Dialog.css138
-rw-r--r--includes/js/dijit/themes/nihilo/Dialog.css.commented.css175
-rw-r--r--includes/js/dijit/themes/nihilo/Dialog_rtl.css21
-rw-r--r--includes/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css29
-rw-r--r--includes/js/dijit/themes/nihilo/Editor.css55
-rw-r--r--includes/js/dijit/themes/nihilo/Editor.css.commented.css60
-rw-r--r--includes/js/dijit/themes/nihilo/Editor_rtl.css7
-rw-r--r--includes/js/dijit/themes/nihilo/Editor_rtl.css.commented.css11
-rw-r--r--includes/js/dijit/themes/nihilo/Menu.css54
-rw-r--r--includes/js/dijit/themes/nihilo/Menu.css.commented.css63
-rw-r--r--includes/js/dijit/themes/nihilo/Menu_rtl.css11
-rw-r--r--includes/js/dijit/themes/nihilo/Menu_rtl.css.commented.css15
-rw-r--r--includes/js/dijit/themes/nihilo/ProgressBar.css24
-rw-r--r--includes/js/dijit/themes/nihilo/ProgressBar.css.commented.css33
-rw-r--r--includes/js/dijit/themes/nihilo/TitlePane.css64
-rw-r--r--includes/js/dijit/themes/nihilo/TitlePane.css.commented.css77
-rw-r--r--includes/js/dijit/themes/nihilo/TitlePane_rtl.css6
-rw-r--r--includes/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css6
-rw-r--r--includes/js/dijit/themes/nihilo/Toolbar.css83
-rw-r--r--includes/js/dijit/themes/nihilo/Toolbar.css.commented.css95
-rw-r--r--includes/js/dijit/themes/nihilo/Tree.css68
-rw-r--r--includes/js/dijit/themes/nihilo/Tree.css.commented.css90
-rw-r--r--includes/js/dijit/themes/nihilo/Tree_rtl.css30
-rw-r--r--includes/js/dijit/themes/nihilo/Tree_rtl.css.commented.css38
-rw-r--r--includes/js/dijit/themes/nihilo/form/Button.css90
-rw-r--r--includes/js/dijit/themes/nihilo/form/Button.css.commented.css109
-rw-r--r--includes/js/dijit/themes/nihilo/form/Button_rtl.css3
-rw-r--r--includes/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css3
-rw-r--r--includes/js/dijit/themes/nihilo/form/Checkbox.css42
-rw-r--r--includes/js/dijit/themes/nihilo/form/Checkbox.css.commented.css69
-rw-r--r--includes/js/dijit/themes/nihilo/form/ComboBox.css7
-rw-r--r--includes/js/dijit/themes/nihilo/form/ComboBox.css.commented.css7
-rw-r--r--includes/js/dijit/themes/nihilo/form/Common.css61
-rw-r--r--includes/js/dijit/themes/nihilo/form/Common.css.commented.css82
-rw-r--r--includes/js/dijit/themes/nihilo/form/Common_rtl.css7
-rw-r--r--includes/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css7
-rw-r--r--includes/js/dijit/themes/nihilo/form/RadioButton.css42
-rw-r--r--includes/js/dijit/themes/nihilo/form/RadioButton.css.commented.css68
-rw-r--r--includes/js/dijit/themes/nihilo/form/Slider.css112
-rw-r--r--includes/js/dijit/themes/nihilo/form/Slider.css.commented.css136
-rw-r--r--includes/js/dijit/themes/nihilo/form/Slider_rtl.css27
-rw-r--r--includes/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css34
-rw-r--r--includes/js/dijit/themes/nihilo/form/Textarea.css11
-rw-r--r--includes/js/dijit/themes/nihilo/form/Textarea.css.commented.css15
-rw-r--r--includes/js/dijit/themes/nihilo/form/TimeTextBox.css1
-rw-r--r--includes/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css1
-rw-r--r--includes/js/dijit/themes/nihilo/images/accordionItemActive.pngbin0 -> 148 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/buttonActive.pngbin0 -> 139 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/buttonDisabled.pngbin0 -> 139 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/buttonEnabled.pngbin0 -> 135 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/buttonHover.pngbin0 -> 134 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/dndCopy.pngbin0 -> 777 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/dndMove.pngbin0 -> 726 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/dndNoCopy.pngbin0 -> 699 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/dndNoMove.pngbin0 -> 677 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/editor.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/editor_rtl.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/no.gifbin0 -> 179 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/preciseSliderThumb.gifbin0 -> 258 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/preciseSliderThumb.pngbin0 -> 413 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gifbin0 -> 258 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.pngbin0 -> 434 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/progressBarAnim.gifbin0 -> 7064 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/progressBarEmpty.pngbin0 -> 314 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/progressBarFull.pngbin0 -> 746 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderEmpty.pngbin0 -> 114 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderEmptyVertical.pngbin0 -> 114 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderFull.pngbin0 -> 130 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderFullFocus.pngbin0 -> 132 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderFullVertical.pngbin0 -> 126 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.pngbin0 -> 126 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderThumb.pngbin0 -> 413 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderThumbFocus.gifbin0 -> 238 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/sliderThumbFocus.pngbin0 -> 421 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.pngbin0 -> 127 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/splitContainerSizerH.pngbin0 -> 121 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.pngbin0 -> 129 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/splitContainerSizerV.pngbin0 -> 116 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteArrows.gifbin0 -> 446 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteArrows.pngbin0 -> 720 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteCheckbox.gifbin0 -> 774 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteCheckbox.pngbin0 -> 707 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteDivIcons.gifbin0 -> 875 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteDivIcons.pngbin0 -> 1062 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteRadio.gifbin0 -> 1137 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteRadio.pngbin0 -> 1073 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gifbin0 -> 1863 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.pngbin0 -> 2195 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteTree.gifbin0 -> 233 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteTree.pngbin0 -> 337 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteTree_rtl.gifbin0 -> 233 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/spriteTree_rtl.pngbin0 -> 335 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomActiveC.gifbin0 -> 518 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gifbin0 -> 291 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomEnabledC.gifbin0 -> 511 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gifbin0 -> 266 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomHoverC.gifbin0 -> 542 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gifbin0 -> 388 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabContainerSprite.gifbin0 -> 1285 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabLeftChecked.gifbin0 -> 303 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabRightChecked.gifbin0 -> 300 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabStripe.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabStripeBottom.gifbin0 -> 432 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabStripeLeft.gifbin0 -> 432 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tabStripeRight.gifbin0 -> 432 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/titleBar.pngbin0 -> 136 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/titleBarActive.pngbin0 -> 148 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.pngbin0 -> 342 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.pngbin0 -> 361 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.gifbin0 -> 204 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.pngbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.pngbin0 -> 319 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/treeExpand_loading.gifbin0 -> 662 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/treeI.gifbin0 -> 71 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/treeI_half.gifbin0 -> 65 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/treeI_half_rtl.gifbin0 -> 66 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/treeI_rtl.gifbin0 -> 72 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/validationInputBg.gifbin0 -> 93 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/validationInputBg.pngbin0 -> 126 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/images/warning.pngbin0 -> 1275 bytes
-rw-r--r--includes/js/dijit/themes/nihilo/layout/AccordionContainer.css35
-rw-r--r--includes/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css44
-rw-r--r--includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css3
-rw-r--r--includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css3
-rw-r--r--includes/js/dijit/themes/nihilo/layout/BorderContainer.css27
-rw-r--r--includes/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css34
-rw-r--r--includes/js/dijit/themes/nihilo/layout/SplitContainer.css27
-rw-r--r--includes/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css34
-rw-r--r--includes/js/dijit/themes/nihilo/layout/TabContainer.css277
-rw-r--r--includes/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css369
-rw-r--r--includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css55
-rw-r--r--includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css69
-rw-r--r--includes/js/dijit/themes/nihilo/nihilo.css1378
-rw-r--r--includes/js/dijit/themes/nihilo/nihilo.css.commented.css39
-rw-r--r--includes/js/dijit/themes/nihilo/nihilo_rtl.css317
-rw-r--r--includes/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css28
-rw-r--r--includes/js/dijit/themes/soria/Calendar.css136
-rw-r--r--includes/js/dijit/themes/soria/Calendar.css.commented.css159
-rw-r--r--includes/js/dijit/themes/soria/Calendar_rtl.css13
-rw-r--r--includes/js/dijit/themes/soria/Calendar_rtl.css.commented.css16
-rw-r--r--includes/js/dijit/themes/soria/ColorPalette.css5
-rw-r--r--includes/js/dijit/themes/soria/ColorPalette.css.commented.css5
-rw-r--r--includes/js/dijit/themes/soria/Common.css29
-rw-r--r--includes/js/dijit/themes/soria/Common.css.commented.css36
-rw-r--r--includes/js/dijit/themes/soria/Dialog.css138
-rw-r--r--includes/js/dijit/themes/soria/Dialog.css.commented.css175
-rw-r--r--includes/js/dijit/themes/soria/Dialog_rtl.css21
-rw-r--r--includes/js/dijit/themes/soria/Dialog_rtl.css.commented.css29
-rw-r--r--includes/js/dijit/themes/soria/Editor.css55
-rw-r--r--includes/js/dijit/themes/soria/Editor.css.commented.css60
-rw-r--r--includes/js/dijit/themes/soria/Editor_rtl.css7
-rw-r--r--includes/js/dijit/themes/soria/Editor_rtl.css.commented.css9
-rw-r--r--includes/js/dijit/themes/soria/Menu.css54
-rw-r--r--includes/js/dijit/themes/soria/Menu.css.commented.css63
-rw-r--r--includes/js/dijit/themes/soria/Menu_rtl.css11
-rw-r--r--includes/js/dijit/themes/soria/Menu_rtl.css.commented.css15
-rw-r--r--includes/js/dijit/themes/soria/ProgressBar.css24
-rw-r--r--includes/js/dijit/themes/soria/ProgressBar.css.commented.css33
-rw-r--r--includes/js/dijit/themes/soria/TitlePane.css64
-rw-r--r--includes/js/dijit/themes/soria/TitlePane.css.commented.css77
-rw-r--r--includes/js/dijit/themes/soria/TitlePane_rtl.css6
-rw-r--r--includes/js/dijit/themes/soria/TitlePane_rtl.css.commented.css6
-rw-r--r--includes/js/dijit/themes/soria/Toolbar.css83
-rw-r--r--includes/js/dijit/themes/soria/Toolbar.css.commented.css95
-rw-r--r--includes/js/dijit/themes/soria/Tree.css68
-rw-r--r--includes/js/dijit/themes/soria/Tree.css.commented.css90
-rw-r--r--includes/js/dijit/themes/soria/Tree_rtl.css30
-rw-r--r--includes/js/dijit/themes/soria/Tree_rtl.css.commented.css38
-rw-r--r--includes/js/dijit/themes/soria/form/Button.css90
-rw-r--r--includes/js/dijit/themes/soria/form/Button.css.commented.css109
-rw-r--r--includes/js/dijit/themes/soria/form/Button_rtl.css3
-rw-r--r--includes/js/dijit/themes/soria/form/Button_rtl.css.commented.css3
-rw-r--r--includes/js/dijit/themes/soria/form/Checkbox.css42
-rw-r--r--includes/js/dijit/themes/soria/form/Checkbox.css.commented.css69
-rw-r--r--includes/js/dijit/themes/soria/form/ComboBox.css7
-rw-r--r--includes/js/dijit/themes/soria/form/ComboBox.css.commented.css7
-rw-r--r--includes/js/dijit/themes/soria/form/Common.css61
-rw-r--r--includes/js/dijit/themes/soria/form/Common.css.commented.css82
-rw-r--r--includes/js/dijit/themes/soria/form/Common_rtl.css7
-rw-r--r--includes/js/dijit/themes/soria/form/Common_rtl.css.commented.css7
-rw-r--r--includes/js/dijit/themes/soria/form/RadioButton.css42
-rw-r--r--includes/js/dijit/themes/soria/form/RadioButton.css.commented.css68
-rw-r--r--includes/js/dijit/themes/soria/form/Slider.css112
-rw-r--r--includes/js/dijit/themes/soria/form/Slider.css.commented.css136
-rw-r--r--includes/js/dijit/themes/soria/form/Slider_rtl.css27
-rw-r--r--includes/js/dijit/themes/soria/form/Slider_rtl.css.commented.css34
-rw-r--r--includes/js/dijit/themes/soria/form/Textarea.css11
-rw-r--r--includes/js/dijit/themes/soria/form/Textarea.css.commented.css15
-rw-r--r--includes/js/dijit/themes/soria/form/TimeTextBox.css1
-rw-r--r--includes/js/dijit/themes/soria/form/TimeTextBox.css.commented.css1
-rw-r--r--includes/js/dijit/themes/soria/images/accordionItemActive.gifbin0 -> 174 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/accordionItemActive.pngbin0 -> 171 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/buttonActive.pngbin0 -> 187 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/buttonDisabled.pngbin0 -> 187 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/buttonEnabled.pngbin0 -> 174 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/buttonHover.pngbin0 -> 160 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/dndCopy.pngbin0 -> 777 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/dndMove.pngbin0 -> 726 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/dndNoCopy.pngbin0 -> 699 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/dndNoMove.pngbin0 -> 677 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/editor.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/editor_rtl.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/preciseSliderThumb.gifbin0 -> 258 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/preciseSliderThumb.pngbin0 -> 413 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.gifbin0 -> 258 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.pngbin0 -> 434 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/progressBarAnim.gifbin0 -> 9304 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/progressBarEmpty.pngbin0 -> 232 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/progressBarFull.pngbin0 -> 251 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderEmpty.pngbin0 -> 114 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderEmptyVertical.pngbin0 -> 114 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderFull.pngbin0 -> 131 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderFullFocus.pngbin0 -> 146 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderFullVertical.pngbin0 -> 127 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderFullVerticalFocus.pngbin0 -> 143 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderThumb.pngbin0 -> 413 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderThumbFocus.gifbin0 -> 238 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/sliderThumbFocus.pngbin0 -> 421 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/splitContainerSizerH-thumb.pngbin0 -> 125 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/splitContainerSizerH.pngbin0 -> 127 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/splitContainerSizerV-thumb.pngbin0 -> 121 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/splitContainerSizerV.pngbin0 -> 124 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteArrows.gifbin0 -> 446 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteArrows.pngbin0 -> 720 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteCheckbox.gifbin0 -> 774 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteCheckbox.pngbin0 -> 707 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteDivIcons.gifbin0 -> 884 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteDivIcons.pngbin0 -> 1114 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRadio.gifbin0 -> 1137 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRadio.pngbin0 -> 1073 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gifbin0 -> 1937 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.pngbin0 -> 3187 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gifbin0 -> 1907 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.pngbin0 -> 3010 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteTree.gifbin0 -> 233 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteTree.pngbin0 -> 337 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteTree_rtl.gifbin0 -> 233 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/spriteTree_rtl.pngbin0 -> 335 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomActiveC.gifbin0 -> 482 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gifbin0 -> 741 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomEnabledC.gifbin0 -> 337 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gifbin0 -> 676 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomHoverC.gifbin0 -> 280 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gifbin0 -> 569 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabContainerSprite.gifbin0 -> 2570 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabLeftChecked.gifbin0 -> 795 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabRightChecked.gifbin0 -> 793 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabStripe.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabStripeBottom.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabStripeLeft.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tabStripeRight.gifbin0 -> 54 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/titleBar.pngbin0 -> 175 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/titleBarActive.pngbin0 -> 171 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorDown.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorDown.pngbin0 -> 342 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorLeft.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorLeft.pngbin0 -> 361 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorRight.gifbin0 -> 204 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorRight.pngbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorUp.gifbin0 -> 205 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/tooltipConnectorUp.pngbin0 -> 319 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/treeExpand_loading.gifbin0 -> 662 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/treeI.gifbin0 -> 71 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/treeI_half.gifbin0 -> 65 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/treeI_half_rtl.gifbin0 -> 66 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/treeI_rtl.gifbin0 -> 72 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/validationInputBg.gifbin0 -> 93 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/validationInputBg.pngbin0 -> 126 bytes
-rw-r--r--includes/js/dijit/themes/soria/images/warning.pngbin0 -> 1275 bytes
-rw-r--r--includes/js/dijit/themes/soria/layout/AccordionContainer.css39
-rw-r--r--includes/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css48
-rw-r--r--includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css3
-rw-r--r--includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css3
-rw-r--r--includes/js/dijit/themes/soria/layout/BorderContainer.css27
-rw-r--r--includes/js/dijit/themes/soria/layout/BorderContainer.css.commented.css34
-rw-r--r--includes/js/dijit/themes/soria/layout/SplitContainer.css27
-rw-r--r--includes/js/dijit/themes/soria/layout/SplitContainer.css.commented.css34
-rw-r--r--includes/js/dijit/themes/soria/layout/TabContainer.css281
-rw-r--r--includes/js/dijit/themes/soria/layout/TabContainer.css.commented.css372
-rw-r--r--includes/js/dijit/themes/soria/layout/TabContainer_rtl.css55
-rw-r--r--includes/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css69
-rw-r--r--includes/js/dijit/themes/soria/soria.css1386
-rw-r--r--includes/js/dijit/themes/soria/soria.css.commented.css39
-rw-r--r--includes/js/dijit/themes/soria/soria_rtl.css317
-rw-r--r--includes/js/dijit/themes/soria/soria_rtl.css.commented.css28
-rw-r--r--includes/js/dijit/themes/templateThemeTest.html184
-rw-r--r--includes/js/dijit/themes/themeTester.html745
-rw-r--r--includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gifbin0 -> 151 bytes
-rw-r--r--includes/js/dijit/themes/themeTesterImages/blackButtonHover.gifbin0 -> 99 bytes
-rw-r--r--includes/js/dijit/themes/themeTesterQuirk.html743
-rw-r--r--includes/js/dijit/themes/tundra/Calendar.css132
-rw-r--r--includes/js/dijit/themes/tundra/Calendar.css.commented.css154
-rw-r--r--includes/js/dijit/themes/tundra/Calendar_rtl.css13
-rw-r--r--includes/js/dijit/themes/tundra/Calendar_rtl.css.commented.css16
-rw-r--r--includes/js/dijit/themes/tundra/ColorPalette.css5
-rw-r--r--includes/js/dijit/themes/tundra/ColorPalette.css.commented.css5
-rw-r--r--includes/js/dijit/themes/tundra/Common.css37
-rw-r--r--includes/js/dijit/themes/tundra/Common.css.commented.css45
-rw-r--r--includes/js/dijit/themes/tundra/Dialog.css145
-rw-r--r--includes/js/dijit/themes/tundra/Dialog.css.commented.css179
-rw-r--r--includes/js/dijit/themes/tundra/Dialog_rtl.css21
-rw-r--r--includes/js/dijit/themes/tundra/Dialog_rtl.css.commented.css29
-rw-r--r--includes/js/dijit/themes/tundra/Editor.css55
-rw-r--r--includes/js/dijit/themes/tundra/Editor.css.commented.css58
-rw-r--r--includes/js/dijit/themes/tundra/Editor_rtl.css7
-rw-r--r--includes/js/dijit/themes/tundra/Editor_rtl.css.commented.css9
-rw-r--r--includes/js/dijit/themes/tundra/Menu.css45
-rw-r--r--includes/js/dijit/themes/tundra/Menu.css.commented.css54
-rw-r--r--includes/js/dijit/themes/tundra/Menu_rtl.css7
-rw-r--r--includes/js/dijit/themes/tundra/Menu_rtl.css.commented.css8
-rw-r--r--includes/js/dijit/themes/tundra/ProgressBar.css23
-rw-r--r--includes/js/dijit/themes/tundra/ProgressBar.css.commented.css28
-rw-r--r--includes/js/dijit/themes/tundra/TitlePane.css55
-rw-r--r--includes/js/dijit/themes/tundra/TitlePane.css.commented.css63
-rw-r--r--includes/js/dijit/themes/tundra/TitlePane_rtl.css6
-rw-r--r--includes/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css6
-rw-r--r--includes/js/dijit/themes/tundra/Toolbar.css83
-rw-r--r--includes/js/dijit/themes/tundra/Toolbar.css.commented.css95
-rw-r--r--includes/js/dijit/themes/tundra/Tree.css65
-rw-r--r--includes/js/dijit/themes/tundra/Tree.css.commented.css86
-rw-r--r--includes/js/dijit/themes/tundra/Tree_rtl.css30
-rw-r--r--includes/js/dijit/themes/tundra/Tree_rtl.css.commented.css37
-rw-r--r--includes/js/dijit/themes/tundra/form/Button.css93
-rw-r--r--includes/js/dijit/themes/tundra/form/Button.css.commented.css113
-rw-r--r--includes/js/dijit/themes/tundra/form/Checkbox.css40
-rw-r--r--includes/js/dijit/themes/tundra/form/Checkbox.css.commented.css47
-rw-r--r--includes/js/dijit/themes/tundra/form/Common.css83
-rw-r--r--includes/js/dijit/themes/tundra/form/Common.css.commented.css126
-rw-r--r--includes/js/dijit/themes/tundra/form/RadioButton.css41
-rw-r--r--includes/js/dijit/themes/tundra/form/RadioButton.css.commented.css49
-rw-r--r--includes/js/dijit/themes/tundra/form/Slider.css113
-rw-r--r--includes/js/dijit/themes/tundra/form/Slider.css.commented.css134
-rw-r--r--includes/js/dijit/themes/tundra/form/Slider_rtl.css26
-rw-r--r--includes/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css31
-rw-r--r--includes/js/dijit/themes/tundra/form/TextArea.css7
-rw-r--r--includes/js/dijit/themes/tundra/form/TextArea.css.commented.css10
-rw-r--r--includes/js/dijit/themes/tundra/images/accordionItemActive.gifbin0 -> 168 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowDown.gifbin0 -> 49 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowDown.pngbin0 -> 149 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowLeft.gifbin0 -> 49 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowLeft.pngbin0 -> 126 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowRight.gifbin0 -> 49 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowRight.pngbin0 -> 129 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowUp.gifbin0 -> 48 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/arrowUp.pngbin0 -> 152 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/buttonActive.pngbin0 -> 129 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/buttonDisabled.pngbin0 -> 135 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/buttonEnabled.pngbin0 -> 137 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/buttonHover.pngbin0 -> 144 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/calendarDayLabel.pngbin0 -> 161 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/calendarMonthLabel.pngbin0 -> 162 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/calendarYearLabel.pngbin0 -> 172 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkboxActive.pngbin0 -> 306 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkboxDisabled.pngbin0 -> 156 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkboxEnabled.pngbin0 -> 160 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkboxHover.pngbin0 -> 164 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkmark.gifbin0 -> 2436 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkmark.pngbin0 -> 2555 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkmarkNoBorder.gifbin0 -> 2028 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/checkmarkNoBorder.pngbin0 -> 2222 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/circleIcon.gifbin0 -> 204 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/circleIcon.pngbin0 -> 2975 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/comboArrowDown.gifbin0 -> 49 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.gifbin0 -> 1676 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.psdbin0 -> 40142 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dndCopy.pngbin0 -> 777 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dndMove.pngbin0 -> 726 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dndNoCopy.pngbin0 -> 699 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dndNoMove.pngbin0 -> 677 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.gifbin0 -> 65 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.pngbin0 -> 135 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/doubleArrowDown.pngbin0 -> 152 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/doubleArrowUp.pngbin0 -> 158 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/editor.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/editor_rtl.gifbin0 -> 3570 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/folderClosed.gifbin0 -> 230 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/folderOpened.gifbin0 -> 339 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/i.gifbin0 -> 48 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/i_half.gifbin0 -> 63 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/i_half_rtl.gifbin0 -> 61 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/i_rtl.gifbin0 -> 48 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/leaf.gifbin0 -> 403 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/loading.gifbin0 -> 751 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/menu.pngbin0 -> 140 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/minusButton.gifbin0 -> 148 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/no.gifbin0 -> 179 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/noX.gifbin0 -> 80 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/plusButton.gifbin0 -> 212 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/popupMenuBg.gifbin0 -> 151 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/preciseSliderThumb.gifbin0 -> 212 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/preciseSliderThumb.pngbin0 -> 248 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gifbin0 -> 212 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.pngbin0 -> 281 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-1.pngbin0 -> 288 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-2.pngbin0 -> 289 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-3.pngbin0 -> 288 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-4.pngbin0 -> 287 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-5.pngbin0 -> 283 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-6.pngbin0 -> 283 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-7.pngbin0 -> 284 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-8.pngbin0 -> 286 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim-9.pngbin0 -> 289 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim.gifbin0 -> 2624 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarAnim.psdbin0 -> 40142 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarEmpty.pngbin0 -> 144 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/progressBarFull.pngbin0 -> 160 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonActive.pngbin0 -> 550 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonActiveDisabled.pngbin0 -> 517 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonActiveHover.pngbin0 -> 646 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonDisabled.pngbin0 -> 403 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonEnabled.pngbin0 -> 487 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/radioButtonHover.pngbin0 -> 497 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderEmpty.pngbin0 -> 124 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderEmptyVertical.pngbin0 -> 88 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderFull.pngbin0 -> 135 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderFullFocus.pngbin0 -> 163 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderFullVertical.pngbin0 -> 99 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderFullVerticalFocus.pngbin0 -> 164 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderThumb.pngbin0 -> 241 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderThumbFocus.gifbin0 -> 216 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/sliderThumbFocus.pngbin0 -> 288 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/smallArrowDown.pngbin0 -> 134 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/smallArrowUp.pngbin0 -> 134 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.pngbin0 -> 127 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/splitContainerSizerH.pngbin0 -> 140 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.pngbin0 -> 129 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/splitContainerSizerV.pngbin0 -> 135 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gifbin0 -> 1863 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.pngbin0 -> 2195 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabActive.pngbin0 -> 155 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabClose.gifbin0 -> 193 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabClose.pngbin0 -> 220 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabCloseHover.gifbin0 -> 193 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabCloseHover.pngbin0 -> 220 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabDisabled.pngbin0 -> 139 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabEnabled.pngbin0 -> 142 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabHover.gifbin0 -> 156 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tabHover.pngbin0 -> 154 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/titleBar.pngbin0 -> 143 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/titleBarBg.gifbin0 -> 97 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorDown.gifbin0 -> 324 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorDown.pngbin0 -> 365 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.gifbin0 -> 325 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.pngbin0 -> 356 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorRight.gifbin0 -> 327 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorRight.pngbin0 -> 375 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorUp.gifbin0 -> 323 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/tooltipConnectorUp.pngbin0 -> 344 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_leaf.gifbin0 -> 839 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gifbin0 -> 841 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_loading.gifbin0 -> 1944 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_minus.gifbin0 -> 211 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gifbin0 -> 210 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_mius.gifbin0 -> 211 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_plus.gifbin0 -> 216 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gifbin0 -> 215 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/validationInputBg.gifbin0 -> 109 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/validationInputBg.pngbin0 -> 165 bytes
-rw-r--r--includes/js/dijit/themes/tundra/images/warning.pngbin0 -> 1275 bytes
-rw-r--r--includes/js/dijit/themes/tundra/layout/AccordionContainer.css31
-rw-r--r--includes/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css37
-rw-r--r--includes/js/dijit/themes/tundra/layout/BorderContainer.css27
-rw-r--r--includes/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css31
-rw-r--r--includes/js/dijit/themes/tundra/layout/SplitContainer.css31
-rw-r--r--includes/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css35
-rw-r--r--includes/js/dijit/themes/tundra/layout/TabContainer.css109
-rw-r--r--includes/js/dijit/themes/tundra/layout/TabContainer.css.commented.css138
-rw-r--r--includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css71
-rw-r--r--includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css89
-rw-r--r--includes/js/dijit/themes/tundra/tundra.css1213
-rw-r--r--includes/js/dijit/themes/tundra/tundra.css.commented.css37
-rw-r--r--includes/js/dijit/themes/tundra/tundra_rtl.css317
-rw-r--r--includes/js/dijit/themes/tundra/tundra_rtl.css.commented.css9
986 files changed, 98869 insertions, 0 deletions
diff --git a/includes/js/dijit/ColorPalette.js b/includes/js/dijit/ColorPalette.js
new file mode 100644
index 0000000..ad0553d
--- /dev/null
+++ b/includes/js/dijit/ColorPalette.js
@@ -0,0 +1,292 @@
+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.requireLocalization("dojo", "colors", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,nl,ko,zh-tw,pl,it,hu,ROOT");
+
+dojo.declare("dijit.ColorPalette",
+ [dijit._Widget, dijit._Templated],
+ {
+ // 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();
+ //
+ // 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,
+
+ // palette: String
+ // Size of grid, either "7x10" or "3x4".
+ palette: "7x10",
+
+ //_value: String
+ // The value of the selected color.
+ value: null,
+
+ //_currentFocus: Integer
+ // Index of the currently focused color.
+ _currentFocus: 0,
+
+ // _xDim: Integer
+ // This is the number of colors horizontally across.
+ _xDim: null,
+
+ // _yDim: Integer
+ /// This is the number of colors vertically down.
+ _yDim: null,
+
+ // _palettes: Map
+ // This represents the value of the colors.
+ // The first level is a hashmap of the different arrays 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: Map
+ // This is stores the path to the palette images
+ _imagePaths: {
+ "7x10": dojo.moduleUrl("dijit", "templates/colors7x10.png"),
+ "3x4": dojo.moduleUrl("dijit", "templates/colors3x4.png")
+ },
+
+ // _paletteCoords: Map
+ // This is a map that is used to calculate the coordinates of the
+ // images that make up the palette.
+ _paletteCoords: {
+ "leftOffset": 3, "topOffset": 3,
+ "cWidth": 20, "cHeight": 20
+
+ },
+
+ // templatePath: String
+ // Path to the template of this widget.
+ templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",
+
+ // _paletteDims: Object
+ // Size of the supported palettes for alignment purposes.
+ _paletteDims: {
+ "7x10": {"width": "206px", "height": "145px"},
+ "3x4": {"width": "86px", "height": "64px"}
+ },
+
+ // tabIndex: String
+ // Widget tabindex.
+ tabIndex: "0",
+
+ postCreate: function(){
+ // A name has to be given to the colorMap, this needs to be unique per Palette.
+ dojo.mixin(this.divNode.style, this._paletteDims[this.palette]);
+ this.imageNode.setAttribute("src", this._imagePaths[this.palette]);
+ var choices = this._palettes[this.palette];
+ this.domNode.style.position = "relative";
+ this._cellNodes = [];
+ this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
+ var url = dojo.moduleUrl("dojo", "resources/blank.gif"),
+ colorObject = new dojo.Color(),
+ coords = this._paletteCoords;
+ for(var row=0; row < choices.length; row++){
+ for(var col=0; col < choices[row].length; col++) {
+ var imgNode = dojo.doc.createElement("img");
+ imgNode.src = url;
+ dojo.addClass(imgNode, "dijitPaletteImg");
+ var color = choices[row][col],
+ colorValue = colorObject.setColor(dojo.Color.named[color]);
+ imgNode.alt = this.colorNames[color];
+ imgNode.color = colorValue.toHex();
+ var imgStyle = imgNode.style;
+ imgStyle.color = imgStyle.backgroundColor = imgNode.color;
+ var cellNode = dojo.doc.createElement("span");
+ cellNode.appendChild(imgNode);
+ dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) {
+ this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
+ }, this);
+ this.divNode.appendChild(cellNode);
+ var cellStyle = cellNode.style;
+ cellStyle.top = coords.topOffset + (row * coords.cHeight) + "px";
+ cellStyle.left = coords.leftOffset + (col * coords.cWidth) + "px";
+ dojo.attr(cellNode, "tabindex", "-1");
+ cellNode.title = this.colorNames[color];
+ dojo.addClass(cellNode, "dijitPaletteCell");
+ dijit.setWaiRole(cellNode, "gridcell");
+ cellNode.index = this._cellNodes.length;
+ this._cellNodes.push(cellNode);
+ }
+ }
+ this._xDim = choices[0].length;
+ this._yDim = choices.length;
+ this.connect(this.divNode, "onfocus", "_onDivNodeFocus");
+
+ // 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 color.
+ // 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: 1,
+ LEFT_ARROW: -1
+ };
+ for(var key in keyIncrementMap){
+ this._connects.push(dijit.typematic.addKeyListener(this.domNode,
+ {keyCode: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));
+ }
+ },
+
+ focus: function(){
+ // summary:
+ // Focus this ColorPalette. Puts focus on the first swatch.
+ this._focusFirst();
+ },
+
+ onChange: function(color){
+ // summary:
+ // Callback when a color is selected.
+ // color: String
+ // Hex value corresponding to color.
+// console.debug("Color selected is: "+color);
+ },
+
+ _focusFirst: function(){
+ this._currentFocus = 0;
+ var cellNode = this._cellNodes[this._currentFocus];
+ window.setTimeout(function(){dijit.focus(cellNode)}, 0);
+ },
+
+ _onDivNodeFocus: function(evt){
+ // focus bubbles on Firefox 2, so just make sure that focus has really
+ // gone to the container
+ if(evt.target === this.divNode){
+ this._focusFirst();
+ }
+ },
+
+ _onFocus: function(){
+ // while focus is on the palette, set its tabindex to -1 so that on a
+ // shift-tab from a cell, the container is not in the tab order
+ dojo.attr(this.divNode, "tabindex", "-1");
+ },
+
+ _onBlur: function(){
+ this._removeCellHighlight(this._currentFocus);
+ // when focus leaves the palette, restore its tabindex, since it was
+ // modified by _onFocus().
+ dojo.attr(this.divNode, "tabindex", this.tabIndex);
+ },
+
+ _onCellDijitclick: function(/*Event*/ evt){
+ // summary:
+ // Handler for click, enter key & space key. Selects the color.
+ // evt:
+ // The event.
+ var target = evt.currentTarget;
+ if (this._currentFocus != target.index){
+ this._currentFocus = target.index;
+ window.setTimeout(function(){dijit.focus(target)}, 0);
+ }
+ this._selectColor(target);
+ dojo.stopEvent(evt);
+ },
+
+ _onCellMouseEnter: function(/*Event*/ evt){
+ // summary:
+ // Handler for onMouseOver. Put focus on the color under the mouse.
+ // evt:
+ // The mouse event.
+ var target = evt.currentTarget;
+ window.setTimeout(function(){dijit.focus(target)}, 0);
+ },
+
+ _onCellFocus: function(/*Event*/ evt){
+ // summary:
+ // Handler for onFocus. Removes highlight of
+ // the color that just lost focus, and highlights
+ // the new color.
+ // evt:
+ // The focus event.
+ this._removeCellHighlight(this._currentFocus);
+ this._currentFocus = evt.currentTarget.index;
+ dojo.addClass(evt.currentTarget, "dijitPaletteCellHighlight");
+ },
+
+ _onCellBlur: function(/*Event*/ evt){
+ // summary:
+ // needed for Firefox 2 on Mac OS X
+ this._removeCellHighlight(this._currentFocus);
+ },
+
+ _removeCellHighlight: function(index){
+ dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight");
+ },
+
+ _selectColor: function(selectNode){
+ // summary:
+ // This selects a color. It triggers the onChange event
+ // area:
+ // The area node that covers the color being selected.
+ var img = selectNode.getElementsByTagName("img")[0];
+ this.onChange(this.value = img.color);
+ },
+
+ _navigateByKey: function(increment, typeCount){
+ // summary:
+ // This is the callback for typematic.
+ // It changes the focus and the highlighed color.
+ // increment:
+ // How much the key is navigated.
+ // typeCount:
+ // How many times typematic has fired.
+
+ // typecount == -1 means the key is released.
+ if(typeCount == -1){ return; }
+
+ var newFocusIndex = this._currentFocus + increment;
+ if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1)
+ {
+ var focusNode = this._cellNodes[newFocusIndex];
+ focusNode.focus();
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/Declaration.js b/includes/js/dijit/Declaration.js
new file mode 100644
index 0000000..2b18cfe
--- /dev/null
+++ b/includes/js/dijit/Declaration.js
@@ -0,0 +1,76 @@
+if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Declaration"] = true;
+dojo.provide("dijit.Declaration");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+ "dijit.Declaration",
+ dijit._Widget,
+ {
+ // summary:
+ // The Declaration widget allows a user to declare new widget
+ // classes directly from a snippet of markup.
+
+ _noScript: true,
+ widgetClass: "",
+ replaceVars: true,
+ defaults: null,
+ mixins: [],
+ buildRendering: function(){
+ var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);
+ var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan();
+ var scripts = dojo.query("> script[type^='dojo/']", src).orphan();
+ var srcType = src.nodeName;
+
+ var propList = this.defaults||{};
+
+ // 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 ];
+
+ if(preambles.length){
+ // we only support one preamble. So be it.
+ propList.preamble = dojo.parser._functionFromScript(preambles[0]);
+ }
+
+ var parsedScripts = dojo.map(scripts, function(s){
+ var evt = s.getAttribute("event")||"postscript";
+ return {
+ event: evt,
+ func: dojo.parser._functionFromScript(s)
+ };
+ });
+
+ // do the connects for each <script type="dojo/connect" event="foo"> block and make
+ // all <script type="dojo/method"> tags execute right after construction
+ this.mixins.push(function(){
+ dojo.forEach(parsedScripts, function(s){
+ dojo.connect(this, s.event, this, s.func);
+ }, this);
+ });
+
+ 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+">";
+ // console.debug(propList.templateString);
+
+ // 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
+ dojo.declare(
+ this.widgetClass,
+ this.mixins,
+ propList
+ );
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/Dialog.js b/includes/js/dijit/Dialog.js
new file mode 100644
index 0000000..928d0dc
--- /dev/null
+++ b/includes/js/dijit/Dialog.js
@@ -0,0 +1,480 @@
+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.TimedMoveable");
+dojo.require("dojo.fx");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit.form.Form");
+dojo.requireLocalization("dijit", "common", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+ "dijit.DialogUnderlay",
+ [dijit._Widget, dijit._Templated],
+ {
+ // summary: The component that grays out the screen behind the dialog
+
+ // 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' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",
+
+ attributeMap: {},
+
+ postCreate: function(){
+ // summary: Append the underlay to the body
+ dojo.body().appendChild(this.domNode);
+ this.bgIframe = new dijit.BackgroundIframe(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.
+
+ var viewport = dijit.getViewport();
+ var is = this.node.style,
+ os = this.domNode.style;
+
+ os.top = viewport.t + "px";
+ os.left = viewport.l + "px";
+ is.width = viewport.w + "px";
+ is.height = viewport.h + "px";
+
+ // process twice since the scroll bar may have been removed
+ // by the previous resizing
+ var viewport2 = dijit.getViewport();
+ if(viewport.w != viewport2.w){ is.width = viewport2.w + "px"; }
+ if(viewport.h != viewport2.h){ is.height = viewport2.h + "px"; }
+ },
+
+ show: function(){
+ // summary: Show the dialog underlay
+ this.domNode.style.display = "block";
+ this.layout();
+ if(this.bgIframe.iframe){
+ this.bgIframe.iframe.style.display = "block";
+ }
+ this._resizeHandler = this.connect(window, "onresize", "layout");
+ },
+
+ hide: function(){
+ // summary: hides the dialog underlay
+ this.domNode.style.display = "none";
+ if(this.bgIframe.iframe){
+ this.bgIframe.iframe.style.display = "none";
+ }
+ this.disconnect(this._resizeHandler);
+ },
+
+ uninitialize: function(){
+ if(this.bgIframe){
+ this.bgIframe.destroy();
+ }
+ }
+ }
+);
+
+
+dojo.declare("dijit._DialogMixin", null,
+ {
+ attributeMap: dijit._Widget.prototype.attributeMap,
+
+ // execute: Function
+ // User defined function to do stuff when the user hits the submit button
+ execute: function(/*Object*/ formContents){},
+
+ // onCancel: Function
+ // Callback when user has canceled dialog, to notify container
+ // (user shouldn't override)
+ onCancel: function(){},
+
+ // onExecute: Function
+ // Callback when user is about to execute dialog, to notify container
+ // (user shouldn't override)
+ onExecute: function(){},
+
+ _onSubmit: function(){
+ // summary: callback when user hits submit button
+ this.onExecute(); // notify container that we are about to execute
+ this.execute(this.getValues());
+ },
+
+ _getFocusItems: function(/*Node*/ dialogNode){
+ // find focusable Items each time a dialog is opened
+ var focusItem = dijit.getFirstInTabbingOrder(dialogNode);
+ this._firstFocusItem = focusItem ? focusItem : dialogNode;
+ focusItem = dijit.getLastInTabbingOrder(dialogNode);
+ this._lastFocusItem = focusItem ? focusItem : this._firstFocusItem;
+ if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" && dojo.attr(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;
+ }
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.Dialog",
+ [dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+ {
+ // 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:
+ // | <div id="test">test content</div>
+ // | ...
+ // | var foo = new dijit.Dialog({ title: "test dialog" },dojo.byId("test"));
+ // | foo.startup();
+
+ templateString: null,
+ templateString:"<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\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",
+
+ // open: Boolean
+ // is True or False depending on state of dialog
+ open: false,
+
+ // duration: Integer
+ // The time in milliseconds it takes the dialog to fade in and out
+ duration: 400,
+
+ // 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,
+
+ // _firstFocusItem: DomNode
+ // The pointer to the first focusable node in the dialog
+ _firstFocusItem:null,
+
+ // _lastFocusItem: DomNode
+ // The pointer to which node has focus prior to our dialog
+ _lastFocusItem:null,
+
+ // doLayout: 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,
+
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {title: "titleBar"}),
+
+ postCreate: function(){
+ dojo.body().appendChild(this.domNode);
+ this.inherited(arguments);
+ var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+ if(this.closeButtonNode){
+ this.closeButtonNode.setAttribute("title", _nlsResources.buttonCancel);
+ }
+ if(this.closeText){
+ this.closeText.setAttribute("title", _nlsResources.buttonCancel);
+ }
+ var s = this.domNode.style;
+ s.visibility = "hidden";
+ s.position = "absolute";
+ s.display = "";
+ s.top = "-9999px";
+
+ this.connect(this, "onExecute", "hide");
+ this.connect(this, "onCancel", "hide");
+ this._modalconnects = [];
+ },
+
+ onLoad: function(){
+ // summary: when href is specified we need to reposition the dialog after the data is loaded
+ this._position();
+ this.inherited(arguments);
+ },
+
+ _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)
+
+ if(this.titleBar){
+ this._moveable = new dojo.dnd.TimedMoveable(this.domNode, { handle: this.titleBar, timeout: 0 });
+ }
+
+ this._underlay = new dijit.DialogUnderlay({
+ id: this.id+"_underlay",
+ "class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
+ });
+
+ var node = this.domNode;
+ this._fadeIn = dojo.fx.combine(
+ [dojo.fadeIn({
+ node: node,
+ duration: this.duration
+ }),
+ dojo.fadeIn({
+ node: this._underlay.domNode,
+ duration: this.duration,
+ onBegin: dojo.hitch(this._underlay, "show")
+ })
+ ]
+ );
+
+ this._fadeOut = dojo.fx.combine(
+ [dojo.fadeOut({
+ node: node,
+ duration: this.duration,
+ onEnd: function(){
+ node.style.visibility="hidden";
+ node.style.top = "-9999px";
+ }
+ }),
+ dojo.fadeOut({
+ node: this._underlay.domNode,
+ duration: this.duration,
+ onEnd: dojo.hitch(this._underlay, "hide")
+ })
+ ]
+ );
+ },
+
+ uninitialize: function(){
+ if(this._fadeIn && this._fadeIn.status() == "playing"){
+ this._fadeIn.stop();
+ }
+ if(this._fadeOut && this._fadeOut.status() == "playing"){
+ this._fadeOut.stop();
+ }
+ if(this._underlay){
+ this._underlay.destroy();
+ }
+ },
+
+ _position: function(){
+ // summary: position modal dialog in center of screen
+
+ if(dojo.hasClass(dojo.body(),"dojoMove")){ return; }
+ var viewport = dijit.getViewport();
+ var mb = dojo.marginBox(this.domNode);
+
+ var style = this.domNode.style;
+ style.left = Math.floor((viewport.l + (viewport.w - mb.w)/2)) + "px";
+ style.top = Math.floor((viewport.t + (viewport.h - mb.h)/2)) + "px";
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary: handles the keyboard events for accessibility reasons
+ if(evt.keyCode){
+ var node = evt.target;
+ if (evt.keyCode == dojo.keys.TAB){
+ this._getFocusItems(this.domNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ // see if we are shift-tabbing from first focusable item on dialog
+ if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+ if(!singleFocusItem){
+ dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.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){
+ if(evt.keyCode == dojo.keys.ESCAPE){
+ this.hide();
+ }else{
+ return; // just let it go
+ }
+ }
+ node = node.parentNode;
+ }
+ // this key is for the disabled document window
+ if(evt.keyCode != dojo.keys.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(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
+
+ dojo.style(this.domNode, "opacity", 0);
+ this.domNode.style.visibility="";
+ this.open = true;
+ this._loadCheck(); // lazy load trigger
+
+ this._position();
+
+ this._fadeIn.play();
+
+ this._savedFocus = dijit.getFocus(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);
+
+ // set timeout to allow the browser to render dialog
+ setTimeout(dojo.hitch(this, function(){
+ dijit.focus(this._firstFocusItem);
+ }), 50);
+ },
+
+ hide: function(){
+ // summary: Hide the dialog
+
+ // if we haven't been initialized yet then we aren't showing and we can just return
+ if(!this._alreadyInitialized){
+ return;
+ }
+
+ if(this._fadeIn.status() == "playing"){
+ this._fadeIn.stop();
+ }
+ this._fadeOut.play();
+
+ if (this._scrollConnected){
+ this._scrollConnected = false;
+ }
+ dojo.forEach(this._modalconnects, dojo.disconnect);
+ this._modalconnects = [];
+ if(this.refocus){
+ this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));
+ }
+ this.open = false;
+ },
+
+ layout: function() {
+ // summary: position the Dialog and the underlay
+ if(this.domNode.style.visibility != "hidden"){
+ this._underlay.layout();
+ this._position();
+ }
+ },
+
+ destroy: function(){
+ dojo.forEach(this._modalconnects, dojo.disconnect);
+ if(this.refocus && this.open){
+ var fo = this._savedFocus;
+ setTimeout(dojo.hitch(dijit,"focus",fo),25);
+ }
+ this.inherited(arguments);
+ }
+ }
+);
+
+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: 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,
+
+ // _firstFocusItem: DomNode
+ // The pointer to the first focusable node in the dialog
+ _firstFocusItem:null,
+
+ // _lastFocusItem: DomNode
+ // The domNode that had focus before we took it.
+ _lastFocusItem: null,
+
+ templateString: null,
+ templateString:"<div class=\"dijitTooltipDialog\" 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=\"presenation\"></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.domNode.className="dijitTooltipDialog " +" dijitTooltipAB"+(corner.charAt(1)=='L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0)=='T' ? "Below" : "Above");
+ },
+
+ onOpen: function(/*Object*/ pos){
+ // summary: called when dialog is displayed
+
+ this._getFocusItems(this.containerNode);
+ this.orient(this.domNode,pos.aroundCorner, pos.corner);
+ this._loadCheck(); // lazy load trigger
+ dijit.focus(this._firstFocusItem);
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary: keep keyboard focus in dialog; close dialog on escape key
+ var node = evt.target;
+ if (evt.keyCode == dojo.keys.TAB){
+ this._getFocusItems(this.containerNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ if(evt.keyCode == dojo.keys.ESCAPE){
+ this.onCancel();
+ }else if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+ if(!singleFocusItem){
+ dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+ if(!singleFocusItem){
+ dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(evt.keyCode == dojo.keys.TAB){
+ // we want the browser's default tab handling to move focus
+ // but we don't want the tab to propagate upwards
+ evt.stopPropagation();
+ }
+ }
+ }
+);
+
+
+}
diff --git a/includes/js/dijit/Editor.js b/includes/js/dijit/Editor.js
new file mode 100644
index 0000000..36f8096
--- /dev/null
+++ b/includes/js/dijit/Editor.js
@@ -0,0 +1,373 @@
+if(!dojo._hasResource["dijit.Editor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Editor"] = true;
+dojo.provide("dijit.Editor");
+dojo.require("dijit._editor.RichText");
+dojo.require("dijit.Toolbar");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit._Container");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor", "commands", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu,ROOT");
+
+dojo.declare(
+ "dijit.Editor",
+ dijit._editor.RichText,
+ {
+ // summary: A rich-text Editing widget
+
+ // plugins: Array
+ // a list of plugin names (as strings) or instances (as objects)
+ // for this widget.
+ plugins: null,
+
+ // extraPlugins: Array
+ // a list of extra plugin names which will be appended to plugins array
+ 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"/*"createLink"*/];
+ }
+
+ this._plugins=[];
+ this._editInterval = this.editActionInterval * 1000;
+ },
+
+ postCreate: function(){
+ //for custom undo/redo
+ if(this.customUndo){
+ dojo['require']("dijit._editor.range");
+ this._steps=this._steps.slice(0);
+ this._undoedSteps=this._undoedSteps.slice(0);
+// this.addKeyHandler('z',this.KEY_CTRL,this.undo);
+// this.addKeyHandler('y',this.KEY_CTRL,this.redo);
+ }
+ if(dojo.isArray(this.extraPlugins)){
+ this.plugins=this.plugins.concat(this.extraPlugins);
+ }
+
+// try{
+ this.inherited(arguments);
+// dijit.Editor.superclass.postCreate.apply(this, 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({});
+ dojo.place(this.toolbar.domNode, this.editingArea, "before");
+ }
+
+ dojo.forEach(this.plugins, this.addPlugin, this);
+ this.onNormalizedDisplayChanged(); //update toolbar button status
+// }catch(e){ console.debug(e); }
+ },
+ destroy: function(){
+ dojo.forEach(this._plugins, function(p){
+ if(p && p.destroy){
+ p.destroy();
+ }
+ });
+ this._plugins=[];
+ this.toolbar.destroy(); 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. Required.
+ // args: This object will be passed to the plugin constructor.
+ // index:
+ // Integer, optional. 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);
+ }
+ },
+ /* 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.
+ customUndo: dojo.isIE,
+
+ // 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 stop 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){
+ 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{
+ try{
+ if(this.customUndo){
+ this.endEditing();
+ this._beginEditing();
+ }
+ var r = this.inherited('execCommand',arguments);
+ if(this.customUndo){
+ this._endEditing();
+ }
+ return r;
+ }catch(e){
+ if(dojo.isMoz && /copy|cut|paste/.test(cmd)){
+ // Warn user of platform limitation. Cannot programmatically access keyboard. See ticket #4136
+ var sub = dojo.string.substitute,
+ accel = {cut:'X', copy:'C', paste:'V'},
+ isMac = navigator.userAgent.indexOf("Macintosh") != -1;
+ alert(sub(this.commands.systemShortcutFF,
+ [this.commands[cmd], sub(this.commands[isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+ }
+ return false;
+ }
+ }
+ },
+ 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 bookmark=b;
+ if(dojo.isIE){
+ if(dojo.isArray(b)){//IE CONTROL
+ bookmark=[];
+ dojo.forEach(b,function(n){
+ bookmark.push(dijit.range.getNode(n,this.editNode));
+ },this);
+ }
+ }else{//w3c range
+ var r=dijit.range.create();
+ r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);
+ r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);
+ bookmark=r;
+ }
+ dojo.withGlobal(this.window,'moveToBookmark',dijit,[bookmark]);
+ },
+ _changeToStep: function(from,to){
+ this.setValue(to.text);
+ var b=to.bookmark;
+ if(!b){ return; }
+ this._moveToBookmark(b);
+ },
+ undo: function(){
+// console.log('undo');
+ this.endEditing(true);
+ var s=this._steps.pop();
+ if(this._steps.length>0){
+ this.focus();
+ this._changeToStep(s,this._steps[this._steps.length-1]);
+ this._undoedSteps.push(s);
+ this.onDisplayChanged();
+ return true;
+ }
+ return false;
+ },
+ redo: function(){
+// console.log('redo');
+ 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();
+ return true;
+ }
+ return false;
+ },
+ endEditing: function(ignore_caret){
+ if(this._editTimer){
+ clearTimeout(this._editTimer);
+ }
+ if(this._inEditing){
+ this._endEditing(ignore_caret);
+ this._inEditing=false;
+ }
+ },
+ _getBookmark: function(){
+ var b=dojo.withGlobal(this.window,dijit.getBookmark);
+ var tmp=[];
+ if(dojo.isIE){
+ if(dojo.isArray(b)){//CONTROL
+ dojo.forEach(b,function(n){
+ tmp.push(dijit.range.getIndex(n,this.editNode).o);
+ },this);
+ b=tmp;
+ }
+ }else{//w3c range
+ tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;
+ b={startContainer:tmp,
+ startOffset:b.startOffset,
+ endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,
+ endOffset:b.endOffset};
+ }
+ return b;
+ },
+ _beginEditing: function(cmd){
+ if(this._steps.length===0){
+ this._steps.push({'text':this.savedContent,'bookmark':this._getBookmark()});
+ }
+ },
+ _endEditing: function(ignore_caret){
+ var v=this.getValue(true);
+
+ this._undoedSteps=[];//clear undoed steps
+ this._steps.push({text: v, bookmark: this._getBookmark()});
+ },
+ onKeyDown: function(e){
+ if(!this.customUndo){
+ this.inherited('onKeyDown',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('onKeyDown',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(){
+ this.inherited('_onBlur',arguments);
+ this.endEditing(true);
+ },
+ onClick: function(){
+ this.endEditing(true);
+ this.inherited('onClick',arguments);
+ }
+ /* end of custom undo/redo support */
+ }
+);
+
+/* the following code is to registered a handler to get default plugins */
+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 "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() });
+ }
+// console.log('name',name,p);
+ o.plugin=p;
+});
+
+}
diff --git a/includes/js/dijit/InlineEditBox.js b/includes/js/dijit/InlineEditBox.js
new file mode 100644
index 0000000..d4568d0
--- /dev/null
+++ b/includes/js/dijit/InlineEditBox.js
@@ -0,0 +1,422 @@
+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, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit.InlineEditBox",
+ dijit._Widget,
+ {
+ // summary: An element with in-line edit capabilitites
+ //
+ // 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:
+ // String getDisplayedValue() OR String getValue()
+ // void setDisplayedValue(String) OR void setValue(String)
+ // void focus()
+ //
+ // editing: 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 (ie, dijit.Editor)
+ renderAsHtml: false,
+
+ // editor: String
+ // Class name for Editor widget
+ editor: "dijit.form.TextBox",
+
+ // editorParams: Object
+ // Set of parameters for editor, like {required: true}
+ editorParams: {},
+
+ onChange: function(value){
+ // summary: User should set this handler to be notified of changes to value
+ },
+
+ // 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: String
+ // The text that gets displayed when there is no value (so that the user has a place to click to edit)
+ noValueIndicator: "<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",
+
+ postMixInProperties: function(){
+ this.inherited('postMixInProperties', 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);
+ }
+
+ this.setValue(this.value || this.displayNode.innerHTML);
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Set disabled state of widget.
+
+ this.disabled = disabled;
+ dijit.setWaiState(this.focusNode || this.domNode, "disabled", disabled);
+ },
+
+ _onMouseOver: function(){
+ dojo.addClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+ },
+
+ _onMouseOut: function(){
+ dojo.removeClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+ },
+
+ _onClick: function(/*Event*/ e){
+ 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
+
+ this.editing = true;
+
+ var editValue =
+ (this.renderAsHtml ?
+ this.value :
+ this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi, "\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));
+
+ // 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.doc.createElement("span");
+ dojo.place(placeholder, this.domNode, "before");
+
+ var ew = this.editWidget = new dijit._InlineEditor({
+ value: dojo.trim(editValue),
+ autoSave: this.autoSave,
+ buttonSave: this.buttonSave,
+ buttonCancel: this.buttonCancel,
+ renderAsHtml: this.renderAsHtml,
+ editor: this.editor,
+ editorParams: this.editorParams,
+ style: dojo.getComputedStyle(this.displayNode),
+ save: dojo.hitch(this, "save"),
+ cancel: dojo.hitch(this, "cancel"),
+ width: this.width
+ }, placeholder);
+
+ // 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
+ var ews = ew.domNode.style;
+ this.displayNode.style.display="none";
+ ews.position = "static";
+ ews.visibility = "visible";
+
+ // 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.)
+ this.domNode = ew.domNode;
+ setTimeout(function(){
+ ew.focus();
+ }, 100);
+ },
+
+ _showText: function(/*Boolean*/ focus){
+ // summary: revert to display mode, and optionally focus on display node
+
+ // display the read-only text and then quickly hide the editor (to avoid screen jitter)
+ this.displayNode.style.display="";
+ var ew = this.editWidget;
+ var ews = ew.domNode.style;
+ ews.position="absolute";
+ ews.visibility="hidden";
+
+ this.domNode = this.displayNode;
+
+ if(focus){
+ dijit.focus(this.displayNode);
+ }
+ ews.display = "none";
+ // give the browser some time to render the display node and then shift focus to it
+ // and hide the edit widget before garbage collecting the edit widget
+ setTimeout(function(){
+ ew.destroy();
+ delete ew;
+ if(dojo.isIE){
+ // messing with the DOM tab order can cause IE to focus the body - so restore
+ dijit.focus(dijit.getFocus());
+ }
+ }, 1000); // no hurry - wait for things to quiesce
+ },
+
+ save: function(/*Boolean*/ focus){
+ // summary:
+ // Save the contents of the editor and revert to display mode.
+ // focus: Boolean
+ // Focus on the display mode text
+ this.editing = false;
+
+ var value = this.editWidget.getValue() + "";
+ if(!this.renderAsHtml){
+ value = value.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;")
+ .replace(/\n/g, "<br>");
+ }
+ this.setValue(value);
+
+ // tell the world that we have changed
+ this.onChange(value);
+
+ this._showText(focus);
+ },
+
+ setValue: function(/*String*/ val){
+ // summary: inserts specified HTML value into this node, or an "input needed" character if node is blank
+ this.value = val;
+ this.displayNode.innerHTML = dojo.trim(val) || this.noValueIndicator;
+ },
+
+ getValue: function(){
+ return this.value;
+ },
+
+ cancel: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, discarding any changes made in the editor
+ this.editing = false;
+ 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:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",
+ widgetsInTemplate: true,
+
+ postMixInProperties: function(){
+ this.inherited('postMixInProperties', 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);
+ var ew = this.editWidget = new cls(this.editorParams, this.editorPlaceholder);
+
+ // Copy the style from the source
+ // Don't copy ALL properties though, just the necessary/applicable ones
+ var srcStyle = this.style;
+ dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"], function(prop){
+ ew.focusNode.style[prop]=srcStyle[prop];
+ }, this);
+ dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], function(prop){
+ this.domNode.style[prop]=srcStyle[prop];
+ }, this);
+ if(this.width=="100%"){
+ // block mode
+ ew.domNode.style.width = "100%"; // because display: block doesn't work for table widgets
+ this.domNode.style.display="block";
+ }else{
+ // inline-block mode
+ ew.domNode.style.width = this.width + (Number(this.width)==this.width ? "px" : "");
+ }
+
+ this.connect(ew, "onChange", "_onChange");
+
+ // Monitor keypress on the edit widget. 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.focusNode || ew.domNode, "onkeypress", "_onKeyPress");
+
+ // priorityChange=false will prevent bogus onChange event
+ (this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget, this.value, false);
+
+ this._initialText = this.getValue();
+
+ if(this.autoSave){
+ this.buttonContainer.style.display="none";
+ }
+ },
+
+ destroy: function(){
+ this.editWidget.destroy();
+ this.inherited(arguments);
+ },
+
+ getValue: function(){
+ var ew = this.editWidget;
+ return ew.getDisplayedValue ? ew.getDisplayedValue() : ew.getValue();
+ },
+
+ _onKeyPress: function(e){
+ // summary: Callback when keypress in the edit box (see template).
+ // description:
+ // For autoSave widgets, if Esc/Enter, call cancel/save.
+ // For non-autoSave widgets, enable save button if the text value is
+ // different than the original value.
+ if(this._exitInProgress){
+ return;
+ }
+ if(this.autoSave){
+ if(e.altKey || e.ctrlKey){ return; }
+ // If Enter/Esc pressed, treat as save/cancel.
+ if(e.keyCode == dojo.keys.ESCAPE){
+ dojo.stopEvent(e);
+ this._exitInProgress = true;
+ this.cancel(true);
+ }else if(e.keyCode == dojo.keys.ENTER){
+ dojo.stopEvent(e);
+ this._exitInProgress = true;
+ this.save(true);
+ }else if(e.keyCode == dojo.keys.TAB){
+ this._exitInProgress = true;
+ // allow 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.
+ setTimeout(dojo.hitch(this, "save", false), 0);
+ }
+ }else{
+ var _this = this;
+ // Delay before calling getValue().
+ // The delay gives the browser a chance to update the Textarea.
+ setTimeout(
+ function(){
+ _this.saveButton.setAttribute("disabled", _this.getValue() == _this._initialText);
+ }, 100);
+ }
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the editor
+ this.inherited(arguments);
+ if(this._exitInProgress){
+ // when user clicks the "save" button, focus is shifted back to display text, causing this
+ // function to be called, but in that case don't do anything
+ return;
+ }
+ if(this.autoSave){
+ this._exitInProgress = true;
+ if(this.getValue() == this._initialText){
+ this.cancel(false);
+ }else{
+ this.save(false);
+ }
+ }
+ },
+
+ enableSave: function(){
+ // summary: User replacable function returning a Boolean to indicate
+ // if the Save button should be enabled or not - usually due to invalid conditions
+ return this.editWidget.isValid ? this.editWidget.isValid() : true; // Boolean
+ },
+
+ _onChange: function(){
+ // summary:
+ // Called when the underlying widget fires an onChange event,
+ // which means that the user has finished entering the value
+ if(this._exitInProgress){
+ // TODO: the onChange event might happen after the return key for an async widget
+ // like FilteringSelect. Shouldn't be deleting the edit widget on end-of-edit
+ return;
+ }
+ if(this.autoSave){
+ this._exitInProgress = true;
+ this.save(true);
+ }else{
+ // in case the keypress event didn't get through (old problem with Textarea that has been fixed
+ // in theory) or if the keypress event comes too quickly and the value inside the Textarea hasn't
+ // been updated yet)
+ this.saveButton.setAttribute("disabled", (this.getValue() == this._initialText) || !this.enableSave());
+ }
+ },
+
+ enableSave: function(){
+ // summary: User replacable function returning a Boolean to indicate
+ // if the Save button should be enabled or not - usually due to invalid conditions
+ return this.editWidget.isValid ? this.editWidget.isValid() : true;
+ },
+
+ focus: function(){
+ this.editWidget.focus();
+ dijit.selectInputText(this.editWidget.focusNode);
+ }
+});
+
+}
diff --git a/includes/js/dijit/LICENSE b/includes/js/dijit/LICENSE
new file mode 100644
index 0000000..3fa2720
--- /dev/null
+++ b/includes/js/dijit/LICENSE
@@ -0,0 +1,195 @@
+Dojo is available under *either* the terms of the modified BSD license *or* the
+Academic Free License version 2.1. As a recipient of Dojo, you may choose which
+license to receive this code under (except as noted in per-module LICENSE
+files). Some modules may not be the copyright of the Dojo Foundation. These
+modules contain explicit declarations of copyright in both the LICENSE files in
+the directories in which they reside and in the code itself. No external
+contributions are allowed under licenses which are fundamentally incompatible
+with the AFL or BSD licenses that Dojo is distributed under.
+
+The text of the AFL and BSD licenses is reproduced below.
+
+-------------------------------------------------------------------------------
+The "New" BSD License:
+**********************
+
+Copyright (c) 2005-2008, The Dojo Foundation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the Dojo Foundation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
+The Academic Free License, v. 2.1:
+**********************************
+
+This Academic Free License (the "License") applies to any original work of
+authorship (the "Original Work") whose owner (the "Licensor") has placed the
+following notice immediately following the copyright notice for the Original
+Work:
+
+Licensed under the Academic Free License version 2.1
+
+1) Grant of Copyright License. Licensor hereby grants You a world-wide,
+royalty-free, non-exclusive, perpetual, sublicenseable license to do the
+following:
+
+a) to reproduce the Original Work in copies;
+
+b) to prepare derivative works ("Derivative Works") based upon the Original
+Work;
+
+c) to distribute copies of the Original Work and Derivative Works to the
+public;
+
+d) to perform the Original Work publicly; and
+
+e) to display the Original Work publicly.
+
+2) Grant of Patent License. Licensor hereby grants You a world-wide,
+royalty-free, non-exclusive, perpetual, sublicenseable license, under patent
+claims owned or controlled by the Licensor that are embodied in the Original
+Work as furnished by the Licensor, to make, use, sell and offer for sale the
+Original Work and Derivative Works.
+
+3) Grant of Source Code License. The term "Source Code" means the preferred
+form of the Original Work for making modifications to it and all available
+documentation describing how to modify the Original Work. Licensor hereby
+agrees to provide a machine-readable copy of the Source Code of the Original
+Work along with each copy of the Original Work that Licensor distributes.
+Licensor reserves the right to satisfy this obligation by placing a
+machine-readable copy of the Source Code in an information repository
+reasonably calculated to permit inexpensive and convenient access by You for as
+long as Licensor continues to distribute the Original Work, and by publishing
+the address of that information repository in a notice immediately following
+the copyright notice that applies to the Original Work.
+
+4) Exclusions From License Grant. Neither the names of Licensor, nor the names
+of any contributors to the Original Work, nor any of their trademarks or
+service marks, may be used to endorse or promote products derived from this
+Original Work without express prior written permission of the Licensor. Nothing
+in this License shall be deemed to grant any rights to trademarks, copyrights,
+patents, trade secrets or any other intellectual property of Licensor except as
+expressly stated herein. No patent license is granted to make, use, sell or
+offer to sell embodiments of any patent claims other than the licensed claims
+defined in Section 2. No right is granted to the trademarks of Licensor even if
+such marks are included in the Original Work. Nothing in this License shall be
+interpreted to prohibit Licensor from licensing under different terms from this
+License any Original Work that Licensor otherwise would have a right to
+license.
+
+5) This section intentionally omitted.
+
+6) Attribution Rights. You must retain, in the Source Code of any Derivative
+Works that You create, all copyright, patent or trademark notices from the
+Source Code of the Original Work, as well as any notices of licensing and any
+descriptive text identified therein as an "Attribution Notice." You must cause
+the Source Code for any Derivative Works that You create to carry a prominent
+Attribution Notice reasonably calculated to inform recipients that You have
+modified the Original Work.
+
+7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
+the copyright in and to the Original Work and the patent rights granted herein
+by Licensor are owned by the Licensor or are sublicensed to You under the terms
+of this License with the permission of the contributor(s) of those copyrights
+and patent rights. Except as expressly stated in the immediately proceeding
+sentence, the Original Work is provided under this License on an "AS IS" BASIS
+and WITHOUT WARRANTY, either express or implied, including, without limitation,
+the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU.
+This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No
+license to Original Work is granted hereunder except under this disclaimer.
+
+8) Limitation of Liability. Under no circumstances and under no legal theory,
+whether in tort (including negligence), contract, or otherwise, shall the
+Licensor be liable to any person for any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License
+or the use of the Original Work including, without limitation, damages for loss
+of goodwill, work stoppage, computer failure or malfunction, or any and all
+other commercial damages or losses. This limitation of liability shall not
+apply to liability for death or personal injury resulting from Licensor's
+negligence to the extent applicable law prohibits such limitation. Some
+jurisdictions do not allow the exclusion or limitation of incidental or
+consequential damages, so this exclusion and limitation may not apply to You.
+
+9) Acceptance and Termination. If You distribute copies of the Original Work or
+a Derivative Work, You must make a reasonable effort under the circumstances to
+obtain the express assent of recipients to the terms of this License. Nothing
+else but this License (or another written agreement between Licensor and You)
+grants You permission to create Derivative Works based upon the Original Work
+or to exercise any of the rights granted in Section 1 herein, and any attempt
+to do so except under the terms of this License (or another written agreement
+between Licensor and You) is expressly prohibited by U.S. copyright law, the
+equivalent laws of other countries, and by international treaty. Therefore, by
+exercising any of the rights granted to You in Section 1 herein, You indicate
+Your acceptance of this License and all of its terms and conditions.
+
+10) Termination for Patent Action. This License shall terminate automatically
+and You may no longer exercise any of the rights granted to You by this License
+as of the date You commence an action, including a cross-claim or counterclaim,
+against Licensor or any licensee alleging that the Original Work infringes a
+patent. This termination provision shall not apply for an action alleging
+patent infringement by combinations of the Original Work with other software or
+hardware.
+
+11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this
+License may be brought only in the courts of a jurisdiction wherein the
+Licensor resides or in which Licensor conducts its primary business, and under
+the laws of that jurisdiction excluding its conflict-of-law provisions. The
+application of the United Nations Convention on Contracts for the International
+Sale of Goods is expressly excluded. Any use of the Original Work outside the
+scope of this License or after its termination shall be subject to the
+requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et
+seq., the equivalent laws of other countries, and international treaty. This
+section shall survive the termination of this License.
+
+12) Attorneys Fees. In any action to enforce the terms of this License or
+seeking damages relating thereto, the prevailing party shall be entitled to
+recover its costs and expenses, including, without limitation, reasonable
+attorneys' fees and costs incurred in connection with such action, including
+any appeal of such action. This section shall survive the termination of this
+License.
+
+13) Miscellaneous. This License represents the complete agreement concerning
+the subject matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent necessary to
+make it enforceable.
+
+14) Definition of "You" in This License. "You" throughout this License, whether
+in upper or lower case, means an individual or a legal entity exercising rights
+under, and complying with all of the terms of, this License. For legal
+entities, "You" includes any entity that controls, is controlled by, or is
+under common control with you. For purposes of this definition, "control" means
+(i) the power, direct or indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (ii) ownership of fifty percent
+(50%) or more of the outstanding shares, or (iii) beneficial ownership of such
+entity.
+
+15) Right to Use. You may use the Original Work in all ways not otherwise
+restricted or conditioned by this License or by law, and Licensor promises not
+to interfere with or be responsible for such uses by You.
+
+This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved.
+Permission is hereby granted to copy and distribute this license without
+modification. This license may not be modified without the express written
+permission of its copyright owner.
diff --git a/includes/js/dijit/Menu.js b/includes/js/dijit/Menu.js
new file mode 100644
index 0000000..049c827
--- /dev/null
+++ b/includes/js/dijit/Menu.js
@@ -0,0 +1,487 @@
+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("dijit._Widget");
+dojo.require("dijit._Container");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.Menu",
+ [dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+ {
+ // summary
+ // A context menu you can assign to multiple elements
+
+ constructor: function(){
+ this._bindings = [];
+ },
+
+ templateString:
+ '<table class="dijit dijitMenu dijitReset dijitMenuTable" waiRole="menu" dojoAttachEvent="onkeypress:_onKeyPress">' +
+ '<tbody class="dijitReset" dojoAttachPoint="containerNode"></tbody>'+
+ '</table>',
+
+ // targetNodeIds: 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: Boolean
+ // if true, right clicking anywhere on the window will cause this context menu to open;
+ // if false, must specify targetNodeIds
+ contextMenuForWindow: false,
+
+ // leftClickToOpen: Boolean
+ // If true, menu will open on left click instead of right click, similiar to a file menu.
+ leftClickToOpen: false,
+
+ // parentMenu: 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,
+
+ // _contextMenuWithMouse: Boolean
+ // used to record mouse and keyboard events to determine if a context
+ // menu is being opened with the keyboard or the mouse
+ _contextMenuWithMouse: false,
+
+ postCreate: function(){
+ if(this.contextMenuForWindow){
+ this.bindDomNode(dojo.body());
+ }else{
+ dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
+ }
+ this.connectKeyNavHandlers([dojo.keys.UP_ARROW], [dojo.keys.DOWN_ARROW]);
+ },
+
+ 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
+ },
+
+ onCancel: function(/*Boolean*/ closeAll){
+ // summary: attach point for notification about when the user cancels the current menu
+ },
+
+ _moveToPopup: function(/*Event*/ evt){
+ if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+ this.focusedChild._onClick(evt);
+ }
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary: Handle keyboard based menu navigation.
+ if(evt.ctrlKey || evt.altKey){ return; }
+
+ switch(evt.keyCode){
+ case dojo.keys.RIGHT_ARROW:
+ this._moveToPopup(evt);
+ dojo.stopEvent(evt);
+ break;
+ case dojo.keys.LEFT_ARROW:
+ if(this.parentMenu){
+ this.onCancel(false);
+ }else{
+ dojo.stopEvent(evt);
+ }
+ break;
+ }
+ },
+
+ onItemHover: function(/*MenuItem*/ item){
+ // summary: Called when cursor is over a MenuItem
+ this.focusChild(item);
+
+ if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
+ this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
+ }
+ },
+
+ _onChildBlur: function(item){
+ // summary: Close all popups that are open and descendants of this menu
+ dijit.popup.close(item.popup);
+ item._blur();
+ this._stopPopupTimer();
+ },
+
+ onItemUnhover: function(/*MenuItem*/ item){
+ // summary: Callback fires when mouse exits a MenuItem
+ },
+
+ _stopPopupTimer: function(){
+ if(this.hover_timer){
+ clearTimeout(this.hover_timer);
+ this.hover_timer = null;
+ }
+ },
+
+ _getTopMenu: function(){
+ for(var top=this; top.parentMenu; top=top.parentMenu);
+ return top;
+ },
+
+ onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+ // summary: user defined function to handle clicks on an item
+ if(item.disabled){ return false; }
+
+ if(item.popup){
+ if(!this.is_open){
+ 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);
+ }
+ },
+
+ // thanks burstlib!
+ _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
+ // summary:
+ // Returns the window reference of the passed iframe
+ var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+ // Moz. TODO: is this available when defaultView isn't?
+ dijit.Menu._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
+ 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);
+
+ //TODO: this is to support context popups in Editor. Maybe this shouldn't be in dijit.Menu
+ var win = dijit.getDocumentWindow(node.ownerDocument);
+ if(node.tagName.toLowerCase()=="iframe"){
+ win = this._iframeContentWindow(node);
+ node = dojo.withGlobal(win, dojo.body);
+ }
+
+ // to capture these events at the top level,
+ // attach to document, not body
+ var cn = (node == dojo.body() ? dojo.doc : node);
+
+ node[this.id] = this._bindings.push([
+ dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
+ dojo.connect(cn, "onkeydown", this, "_contextKey"),
+ dojo.connect(cn, "onmousedown", this, "_contextMouse")
+ ]);
+ },
+
+ unBindDomNode: function(/*String|DomNode*/ nodeName){
+ // summary: detach menu from given node
+ var node = dojo.byId(nodeName);
+ if(node){
+ var bid = node[this.id]-1, b = this._bindings[bid];
+ dojo.forEach(b, dojo.disconnect);
+ delete this._bindings[bid];
+ }
+ },
+
+ _contextKey: function(e){
+ this._contextMenuWithMouse = false;
+ if(e.keyCode == dojo.keys.F10){
+ dojo.stopEvent(e);
+ if(e.shiftKey && e.type=="keydown"){
+ // FF: copying the wrong property from e will cause the system
+ // context menu to appear in spite of stopEvent. Don't know
+ // exactly which properties cause this effect.
+ var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
+ _e.preventDefault = _e.stopPropagation = function(){};
+ // IE: without the delay, focus work in "open" causes the system
+ // context menu to appear in spite of stopEvent.
+ window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
+ }
+ }
+ },
+
+ _contextMouse: function(e){
+ this._contextMenuWithMouse = true;
+ },
+
+ _openMyself: function(/*Event*/ e){
+ // summary:
+ // Internal function for opening myself when the user
+ // does a right-click or something similar
+
+ if(this.leftClickToOpen&&e.button>0){
+ return;
+ }
+ dojo.stopEvent(e);
+
+ // Get coordinates.
+ // if we are opening the menu with the mouse or on safari open
+ // the menu at the mouse cursor
+ // (Safari does not have a keyboard command to open the context menu
+ // and we don't currently have a reliable way to determine
+ // _contextMenuWithMouse on Safari)
+ var x,y;
+ if(dojo.isSafari || this._contextMenuWithMouse){
+ x=e.pageX;
+ y=e.pageY;
+ }else{
+ // otherwise open near e.target
+ var coords = dojo.coords(e.target, true);
+ x = coords.x + 10;
+ y = coords.y + 10;
+ }
+
+ var self=this;
+ var savedFocus = dijit.getFocus(this);
+ function closeAndRestoreFocus(){
+ // user has clicked on a menu or popup
+ dijit.focus(savedFocus);
+ dijit.popup.close(self);
+ }
+ dijit.popup.open({
+ popup: this,
+ x: x,
+ y: 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
+ }
+ },
+
+ onOpen: function(/*Event*/ e){
+ // summary: Open menu relative to the mouse
+ this.isShowingNow = true;
+ },
+
+ onClose: function(){
+ // summary: callback when this menu is closed
+ this._stopPopupTimer();
+ this.parentMenu = null;
+ this.isShowingNow = false;
+ this.currentPopup = null;
+ if(this.focusedChild){
+ this._onChildBlur(this.focusedChild);
+ this.focusedChild = null;
+ }
+ },
+
+ _openPopup: function(){
+ // summary: open the popup to the side of the current menu item
+ this._stopPopupTimer();
+ var from_item = this.focusedChild;
+ var popup = from_item.popup;
+
+ if(popup.isShowingNow){ return; }
+ popup.parentMenu = this;
+ var self = this;
+ dijit.popup.open({
+ parent: this,
+ popup: popup,
+ around: from_item.arrowCell,
+ orient: this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'},
+ onCancel: function(){
+ // called when the child menu is canceled
+ dijit.popup.close(popup);
+ from_item.focus(); // put focus back on my node
+ self.currentPopup = null;
+ }
+ });
+
+ this.currentPopup = popup;
+
+ if(popup.focus){
+ popup.focus();
+ }
+ },
+
+ uninitialize: function(){
+ dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ this.inherited(arguments);
+ }
+}
+);
+
+dojo.declare("dijit.MenuItem",
+ [dijit._Widget, dijit._Templated, dijit._Contained],
+ {
+ // summary: A line item in a Menu Widget
+
+ // Make 3 columns
+ // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
+ templateString:
+ '<tr class="dijitReset dijitMenuItem" '
+ +'dojoAttachEvent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">'
+ +'<td class="dijitReset"><div class="dijitMenuItemIcon ${iconClass}" dojoAttachPoint="iconNode"></div></td>'
+ +'<td tabIndex="-1" class="dijitReset dijitMenuItemLabel" dojoAttachPoint="containerNode,focusNode" waiRole="menuitem"></td>'
+ +'<td class="dijitReset" dojoAttachPoint="arrowCell">'
+ +'<div class="dijitMenuExpand" dojoAttachPoint="expand" style="display:none">'
+ +'<span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span>'
+ +'</div>'
+ +'</td>'
+ +'</tr>',
+
+ // label: String
+ // menu text
+ label: '',
+
+ // iconClass: String
+ // class to apply to div in button to make it display an icon
+ iconClass: "",
+
+ // disabled: Boolean
+ // if true, the menu item is disabled
+ // if false, the menu item is enabled
+ disabled: false,
+
+ postCreate: function(){
+ dojo.setSelectable(this.domNode, false);
+ this.setDisabled(this.disabled);
+ if(this.label){
+ this.setLabel(this.label);
+ }
+ },
+
+ _onHover: function(){
+ // summary: callback when mouse is moved onto menu item
+ this.getParent().onItemHover(this);
+ },
+
+ _onUnhover: function(){
+ // summary: callback when mouse is moved off of menu item
+
+ // if we are unhovering the currently selected item
+ // then unselect it
+ this.getParent().onItemUnhover(this);
+ },
+
+ _onClick: function(evt){
+ this.getParent().onItemClick(this, evt);
+ dojo.stopEvent(evt);
+ },
+
+ onClick: function(/*Event*/ evt){
+ // summary: User defined function to handle clicks
+ },
+
+ focus: function(){
+ dojo.addClass(this.domNode, 'dijitMenuItemHover');
+ try{
+ dijit.focus(this.containerNode);
+ }catch(e){
+ // this throws on IE (at least) in some scenarios
+ }
+ },
+
+ _blur: function(){
+ dojo.removeClass(this.domNode, 'dijitMenuItemHover');
+ },
+
+ setLabel: function(/*String*/ value){
+ this.containerNode.innerHTML=this.label=value;
+ },
+
+ setDisabled: function(/*Boolean*/ value){
+ // summary: enable or disable this menu item
+ this.disabled = value;
+ dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
+ dijit.setWaiState(this.containerNode, 'disabled', value ? 'true' : 'false');
+ }
+});
+
+dojo.declare("dijit.PopupMenuItem",
+ dijit.MenuItem,
+ {
+ _fillContent: function(){
+ // summary: The innerHTML contains both the menu item text and a popup widget
+ // description: 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>
+ 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.domNode.style.display="none";
+ dojo.addClass(this.expand, "dijitMenuExpandEnabled");
+ dojo.style(this.expand, "display", "");
+ dijit.setWaiState(this.containerNode, "haspopup", "true");
+ },
+
+ destroyDescendants: function(){
+ if(this.popup){
+ this.popup.destroyRecursive();
+ delete this.popup;
+ }
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare("dijit.MenuSeparator",
+ [dijit._Widget, dijit._Templated, dijit._Contained],
+ {
+ // summary: A line between two menu items
+
+ templateString: '<tr class="dijitMenuSeparator"><td colspan=3>'
+ +'<div class="dijitMenuSeparatorTop"></div>'
+ +'<div class="dijitMenuSeparatorBottom"></div>'
+ +'</td></tr>',
+
+ postCreate: function(){
+ dojo.setSelectable(this.domNode, false);
+ },
+
+ isFocusable: function(){
+ // summary: over ride to always return false
+ return false; // Boolean
+ }
+});
+
+}
diff --git a/includes/js/dijit/ProgressBar.js b/includes/js/dijit/ProgressBar.js
new file mode 100644
index 0000000..740700a
--- /dev/null
+++ b/includes/js/dijit/ProgressBar.js
@@ -0,0 +1,95 @@
+if(!dojo._hasResource["dijit.ProgressBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.ProgressBar"] = true;
+dojo.provide("dijit.ProgressBar");
+
+dojo.require("dojo.fx");
+dojo.require("dojo.number");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
+ // summary: A progress indication widget
+ //
+ // example:
+ // | <div dojoType="ProgressBar"
+ // | places="0"
+ // | progress="..." maximum="...">
+ // | </div>
+ //
+ // progress: String (Percentage or Number)
+ // initial progress value.
+ // with "%": percentage value, 0% <= progress <= 100%
+ // or without "%": absolute value, 0 <= progress <= maximum
+ progress: "0",
+
+ // maximum: Float
+ // max sample number
+ maximum: 100,
+
+ // places: Number
+ // number of places to show in values; 0 by default
+ places: 0,
+
+ // indeterminate: Boolean
+ // If false: show progress.
+ // If true: show that a process is underway but that the progress is unknown
+ indeterminate: false,
+
+ templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" 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=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",
+
+ _indeterminateHighContrastImagePath:
+ dojo.moduleUrl("dijit", "themes/a11y/indeterminate_progress.gif"),
+
+ // public functions
+ postCreate: function(){
+ this.inherited("postCreate",arguments);
+ this.inteterminateHighContrastImage.setAttribute("src",
+ this._indeterminateHighContrastImagePath);
+ this.update();
+ },
+
+ update: function(/*Object?*/attributes){
+ // summary: update progress information
+ //
+ // attributes: may provide progress and/or maximum properties on this parameter,
+ // see attribute specs for details.
+ dojo.mixin(this, attributes||{});
+ var percent = 1, classFunc;
+ if(this.indeterminate){
+ classFunc = "addClass";
+ dijit.removeWaiState(this.internalProgress, "valuenow");
+ dijit.removeWaiState(this.internalProgress, "valuemin");
+ dijit.removeWaiState(this.internalProgress, "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(this.internalProgress, "describedby", this.label.id);
+ dijit.setWaiState(this.internalProgress, "valuenow", this.progress);
+ dijit.setWaiState(this.internalProgress, "valuemin", 0);
+ dijit.setWaiState(this.internalProgress, "valuemax", this.maximum);
+ }
+ dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
+ this.internalProgress.style.width = (percent * 100) + "%";
+ this.onChange();
+ },
+
+ report: function(/*float*/percent){
+ // Generates message to show; may be overridden by user
+ return dojo.number.format(percent, {type: "percent", places: this.places, locale: this.lang});
+ },
+
+ onChange: function(){
+ // summary: User definable function fired when progress updates.
+ }
+});
+
+}
diff --git a/includes/js/dijit/TitlePane.js b/includes/js/dijit/TitlePane.js
new file mode 100644
index 0000000..8e6368c
--- /dev/null
+++ b/includes/js/dijit/TitlePane.js
@@ -0,0 +1,157 @@
+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.declare(
+ "dijit.TitlePane",
+ [dijit.layout.ContentPane, dijit._Templated],
+{
+ // summary: A pane with a title on top, that can be opened or collapsed.
+ //
+ // description: An accessible container with a Title Heading, and a content
+ // section that slides open and closed. TitlePane is an extension to
+ // ContentPane, providing all the usesful content-control aspects from.
+ //
+ // 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,
+
+ // duration: Integer
+ // Time in milliseconds to fade in/fade out
+ duration: 250,
+
+ // baseClass: String
+ // The root className to use for the various states of this widget
+ baseClass: "dijitTitlePane",
+
+ templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\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",
+
+ postCreate: function(){
+ this.setTitle(this.title);
+ if(!this.open){
+ this.hideNode.style.display = this.wipeNode.style.display = "none";
+ }
+ this._setCss();
+ dojo.setSelectable(this.titleNode, false);
+ this.inherited(arguments);
+ dijit.setWaiState(this.containerNode, "labelledby", this.titleNode.id);
+ dijit.setWaiState(this.focusNode, "haspopup", "true");
+
+ // 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";
+ }
+ });
+ },
+
+ setContent: function(content){
+ // summary:
+ // Typically called when an href is loaded. Our job is to make the animation smooth
+ if(!this.open || 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.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
+ this._wipeIn.play();
+ }
+ },
+
+ toggle: function(){
+ // summary: switches between opened and closed state
+ dojo.forEach([this._wipeIn, this._wipeOut], function(animation){
+ if(animation.status() == "playing"){
+ animation.stop();
+ }
+ });
+
+ this[this.open ? "_wipeOut" : "_wipeIn"].play();
+ 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 we have setHref when hidden)
+ this._loadCheck();
+
+ this._setCss();
+ },
+
+ _setCss: function(){
+ // summary: set the open/close css state for the TitlePane
+ var classes = ["dijitClosed", "dijitOpen"];
+ var boolIndex = this.open;
+ var node = this.titleBarNode || this.focusNode
+ dojo.removeClass(node, classes[!boolIndex+0]);
+ node.className += " " + classes[boolIndex+0];
+
+ // provide a character based indicator for images-off mode
+ this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
+ },
+
+ _onTitleKey: function(/*Event*/ e){
+ // summary: callback when user hits a key
+ if(e.keyCode == dojo.keys.ENTER || e.charCode == dojo.keys.SPACE){
+ this.toggle();
+ }else if(e.keyCode == dojo.keys.DOWN_ARROW && this.open){
+ this.containerNode.focus();
+ e.preventDefault();
+ }
+ },
+
+ _handleFocus: function(/*Event*/ e){
+ // summary: handle blur and focus for this widget
+
+ // add/removeClass is safe to call without hasClass in this case
+ dojo[(e.type == "focus" ? "addClass" : "removeClass")](this.focusNode, this.baseClass + "Focused");
+ },
+
+ setTitle: function(/*String*/ title){
+ // summary: sets the text of the title
+ this.titleNode.innerHTML = title;
+ }
+});
+
+}
diff --git a/includes/js/dijit/Toolbar.js b/includes/js/dijit/Toolbar.js
new file mode 100644
index 0000000..c29fc1a
--- /dev/null
+++ b/includes/js/dijit/Toolbar.js
@@ -0,0 +1,54 @@
+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._Container");
+dojo.require("dijit._Templated");
+
+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 dijitToolbar" 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>',
+
+ tabIndex: "0",
+
+ postCreate: function(){
+ 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);
+ }
+}
+);
+
+// Combine with dijit.MenuSeparator??
+dojo.declare("dijit.ToolbarSeparator",
+ [ dijit._Widget, dijit._Templated ],
+ {
+ // summary: A spacer between two Toolbar items
+ templateString: '<div class="dijitToolbarSeparator dijitInline"></div>',
+ postCreate: function(){ dojo.setSelectable(this.domNode, false); },
+ isFocusable: function(){
+ // summary: This widget isn't focusable, so pass along that fact.
+ return false;
+ }
+
+});
+
+}
diff --git a/includes/js/dijit/Tooltip.js b/includes/js/dijit/Tooltip.js
new file mode 100644
index 0000000..881a947
--- /dev/null
+++ b/includes/js/dijit/Tooltip.js
@@ -0,0 +1,292 @@
+if(!dojo._hasResource["dijit.Tooltip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Tooltip"] = true;
+dojo.provide("dijit.Tooltip");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+ "dijit._MasterTooltip",
+ [dijit._Widget, dijit._Templated],
+ {
+ // summary
+ // Internal widget that holds the actual tooltip markup,
+ // which occurs once per page.
+ // Called by Tooltip widgets which are just containers to hold
+ // the markup
+
+ // duration: Integer
+ // Milliseconds to fade in/fade out
+ duration: 200,
+
+ templateString:"<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){
+ // summary:
+ // Display tooltip w/specified contents to right specified node
+ // (To left if there's no space on the right, or if LTR==right)
+
+ 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;
+
+ // Firefox bug. when innerHTML changes to be shorter than previous
+ // one, the node size will not be updated until it moves.
+ this.domNode.style.top = (this.domNode.offsetTop + 1) + "px";
+
+ // position the element and change CSS according to position[] (a list of positions to try)
+ var align = {};
+ var ltr = this.isLeftToRight();
+ dojo.forEach( (position && position.length) ? position : dijit.Tooltip.defaultPosition, function(pos){
+ switch(pos){
+ case "after":
+ align[ltr ? "BR" : "BL"] = ltr ? "BL" : "BR";
+ break;
+ case "before":
+ align[ltr ? "BL" : "BR"] = ltr ? "BR" : "BL";
+ break;
+ case "below":
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR";
+ align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL";
+ break;
+ case "above":
+ default:
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR";
+ align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL";
+ break;
+ }
+ });
+ var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, align, 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
+ 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(){
+ 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.aroundNode || this.aroundNode !== aroundNode){
+ return;
+ }
+ if(this._onDeck){
+ // this hide request is for a show() that hasn't even started yet;
+ // just cancel the pending show()
+ this._onDeck=null;
+ return;
+ }
+ this.fadeIn.stop();
+ this.isShowingNow = false;
+ this.aroundNode = null;
+ this.fadeOut.play();
+ },
+
+ _onHide: function(){
+ this.domNode.style.cssText=""; // to position offscreen again
+ 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){
+ // 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);
+};
+
+dijit.hideTooltip = function(aroundNode){
+ // summary: hide the tooltip
+ if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+ return dijit._masterTT.hide(aroundNode);
+};
+
+dojo.declare(
+ "dijit.Tooltip",
+ dijit._Widget,
+ {
+ // summary
+ // Pops up a tooltip (a help message) when you hover over a node.
+
+ // label: String
+ // Text to display in the tooltip.
+ // Specified as innerHTML when creating the widget from markup.
+ label: "",
+
+ // showDelay: Integer
+ // Number of milliseconds to wait after hovering over/focusing on the object, before
+ // the tooltip is displayed.
+ showDelay: 400,
+
+ // connectId: String[]
+ // Id(s) of domNodes to attach the tooltip to.
+ // When user hovers over any of the specified dom nodes, the tooltip will appear.
+ connectId: [],
+
+ // position: String[]
+ // See description of dijit.Tooltip.defaultPosition for details on position parameter.
+ position: [],
+
+ postCreate: function(){
+ if(this.srcNodeRef){
+ this.srcNodeRef.style.display = "none";
+ }
+
+ this._connectNodes = [];
+
+ dojo.forEach(this.connectId, function(id) {
+ var node = dojo.byId(id);
+ if (node) {
+ this._connectNodes.push(node);
+ dojo.forEach(["onMouseOver", "onMouseOut", "onFocus", "onBlur", "onHover", "onUnHover"], function(event){
+ this.connect(node, event.toLowerCase(), "_"+event);
+ }, this);
+ if(dojo.isIE){
+ // BiDi workaround
+ node.style.zoom = 1;
+ }
+ }
+ }, this);
+ },
+
+ _onMouseOver: function(/*Event*/ e){
+ this._onHover(e);
+ },
+
+ _onMouseOut: function(/*Event*/ e){
+ if(dojo.isDescendant(e.relatedTarget, e.target)){
+ // false event; just moved from target to target child; ignore.
+ return;
+ }
+ this._onUnHover(e);
+ },
+
+ _onFocus: function(/*Event*/ e){
+ this._focus = true;
+ this._onHover(e);
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(/*Event*/ e){
+ this._focus = false;
+ this._onUnHover(e);
+ this.inherited(arguments);
+ },
+
+ _onHover: function(/*Event*/ e){
+ if(!this._showTimer){
+ var target = e.target;
+ this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay);
+ }
+ },
+
+ _onUnHover: function(/*Event*/ e){
+ // keep a tooltip open if the associated element has focus
+ 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.
+ target = target || this._connectNodes[0];
+ if(!target){ return; }
+
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position);
+
+ this._connectNode = target;
+ },
+
+ close: function(){
+ // summary: hide the tooltip; usually not called directly.
+ dijit.hideTooltip(this._connectNode);
+ delete this._connectNode;
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ },
+
+ uninitialize: function(){
+ this.close();
+ }
+ }
+);
+
+// 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/includes/js/dijit/Tree.js b/includes/js/dijit/Tree.js
new file mode 100644
index 0000000..fc9be8b
--- /dev/null
+++ b/includes/js/dijit/Tree.js
@@ -0,0 +1,1336 @@
+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("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Container");
+dojo.require("dojo.cookie");
+
+dojo.declare(
+ "dijit._TreeNode",
+ [dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained],
+{
+ // summary
+ // Single node within a tree
+
+ // item: dojo.data.Item
+ // the dojo.data entry this tree represents
+ item: null,
+
+ isTreeNode: true,
+
+ // label: String
+ // Text of this tree node
+ label: "",
+
+ isExpandable: null, // show expando node
+
+ isExpanded: false,
+
+ // state: 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:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",
+
+ postCreate: function(){
+ // set label, escaping special characters
+ this.setLabelNode(this.label);
+
+ // 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);
+ }
+ },
+
+ markProcessing: function(){
+ // summary: visually denote that tree is loading data, etc.
+ this.state = "LOADING";
+ this._setExpando(true);
+ },
+
+ unmarkProcessing: function(){
+ // summary: clear markup from markProcessing() call
+ 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)
+ 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.iconNode.className = "dijitInline dijitTreeIcon " + tree.getIconClass(item, this.isExpanded);
+ this.labelNode.className = "dijitTreeLabel " + tree.getLabelClass(item, this.isExpanded);
+ },
+
+ _updateLayout: function(){
+ // summary: set appropriate CSS classes for this.domNode
+ 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
+
+ // apply the appropriate class to the expando node
+ var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
+ "dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"];
+ var idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3);
+ dojo.forEach(styles,
+ function(s){
+ dojo.removeClass(this.expandoNode, s);
+ }, this
+ );
+ dojo.addClass(this.expandoNode, styles[idx]);
+
+ // provide a non-image based indicator for images-off mode
+ this.expandoNodeText.innerHTML =
+ processing ? "*" :
+ (this.isExpandable ?
+ (this.isExpanded ? "-" : "+") : "*");
+ },
+
+ expand: function(){
+ // summary: show my children
+ if(this.isExpanded){ return; }
+ // cancel in progress collapse operation
+ if(this._wipeOut.status() == "playing"){
+ this._wipeOut.stop();
+ }
+
+ this.isExpanded = true;
+ dijit.setWaiState(this.labelNode, "expanded", "true");
+ dijit.setWaiRole(this.containerNode, "group");
+ this.contentNode.className = "dijitTreeContent dijitTreeContentExpanded";
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ this._wipeIn.play();
+ },
+
+ collapse: function(){
+ if(!this.isExpanded){ return; }
+
+ // cancel in progress expand operation
+ if(this._wipeIn.status() == "playing"){
+ this._wipeIn.stop();
+ }
+
+ this.isExpanded = false;
+ dijit.setWaiState(this.labelNode, "expanded", "false");
+ this.contentNode.className = "dijitTreeContent";
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ this._wipeOut.play();
+ },
+
+ setLabelNode: function(label){
+ this.labelNode.innerHTML="";
+ this.labelNode.appendChild(dojo.doc.createTextNode(label));
+ },
+
+ setChildItems: function(/* Object[] */ items){
+ // summary:
+ // Sets the child items of this node, removing/adding nodes
+ // from current children to match specified items[] array.
+
+ var tree = this.tree,
+ model = tree.model;
+
+ // 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.
+ this.getChildren().forEach(function(child){
+ dijit._Container.prototype.removeChild.call(this, child);
+ }, this);
+
+ this.state = "LOADED";
+
+ if(items && items.length > 0){
+ this.isExpandable = true;
+ if(!this.containerNode){ // maybe this node was unfolderized and still has container
+ this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);
+ this.domNode.appendChild(this.containerNode);
+ }
+
+ // 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),
+ existingNode = tree._itemNodeMap[id],
+ node =
+ ( existingNode && !existingNode.getParent() ) ?
+ existingNode :
+ new dijit._TreeNode({
+ item: item,
+ tree: tree,
+ isExpandable: model.mayHaveChildren(item),
+ label: tree.getLabel(item)
+ });
+ this.addChild(node);
+ // note: this won't work if there are two nodes for one item (multi-parented items); will be fixed later
+ tree._itemNodeMap[id] = node;
+ if(this.tree.persist){
+ if(tree._openedItemIds[id]){
+ 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);
+ }
+
+ // On initial tree show, put focus on either the root node of the tree,
+ // or the first child, if the root node is hidden
+ if(!this.parent){
+ var fc = this.tree.showRoot ? this : this.getChildren()[0],
+ tabnode = fc ? fc.labelNode : this.domNode;
+ tabnode.setAttribute("tabIndex", "0");
+ }
+
+ // create animations for showing/hiding the children (if children exist)
+ if(this.containerNode && !this._wipeIn){
+ this._wipeIn = dojo.fx.wipeIn({node: this.containerNode, duration: 150});
+ this._wipeOut = dojo.fx.wipeOut({node: this.containerNode, duration: 150});
+ }
+ },
+
+ 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()
+ this.isExpandable = true;
+ this._setExpando(false);
+ },
+
+ _onNodeFocus: function(evt){
+ var node = dijit.getEnclosingWidget(evt.target);
+ this.tree._onTreeFocus(node);
+ }
+});
+
+dojo.declare(
+ "dijit.Tree",
+ [dijit._Widget, dijit._Templated],
+{
+ // summary
+ // This widget displays hierarchical data from a store. A query is specified
+ // to get the "top level children" from a data store, and then those items are
+ // queried for their children and so on (but lazily, as the user clicks the expand node).
+ //
+ // Thus in the default mode of operation this widget is technically a forest, not a tree,
+ // in that there can be multiple "top level children". However, if you specify label,
+ // then a special top level node (not corresponding to any item in the datastore) is
+ // created, to father all the top level children.
+
+ // store: String||dojo.data.Store
+ // The store to get data to display in the tree.
+ // May remove for 2.0 in favor of "model".
+ store: null,
+
+ // model: dijit.Tree.model
+ // Alternate interface from store to access data (and changes to data) in the tree
+ model: null,
+
+ // query: anything
+ // Specifies datastore query to return the root item for the tree.
+ //
+ // Deprecated functionality: if the query returns multiple items, the tree is given
+ // a fake root node (not corresponding to any item in the data store),
+ // whose children are the items that match this query.
+ //
+ // The root node is shown or hidden based on whether a label is specified.
+ //
+ // Having a query return multiple items is deprecated.
+ // If your store doesn't have a root item, wrap the store with
+ // dijit.tree.ForestStoreModel, and specify model=myModel
+ //
+ // example:
+ // {type:'continent'}
+ query: null,
+
+ // label: 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: Boolean
+ // Should the root node be displayed, or hidden?
+ showRoot: true,
+
+ // childrenAttr: String[]
+ // one ore more attributes that holds children of a tree node
+ childrenAttr: ["children"],
+
+ // openOnClick: Boolean
+ // If true, clicking a folder node's label will open it, rather than calling onClick()
+ openOnClick: false,
+
+ templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",
+
+ isExpandable: true,
+
+ isTree: true,
+
+ // persist: Boolean
+ // enables/disables use of cookies for state saving.
+ persist: true,
+
+ // dndController: String
+ // class name to use as as the dnd controller
+ dndController: null,
+
+ //parameters to pull off of the tree and pass on to the dndController as its params
+ dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance"],
+
+ //declare the above items so they can be pulled from the tree's markup
+ onDndDrop:null,
+ itemCreator:null,
+ onDndCancel:null,
+ checkAcceptance:null,
+ checkItemAcceptance:null,
+
+ _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;
+
+ this._itemNodeMap={};
+
+ if(!this.cookieName){
+ this.cookieName = this.id + "SaveStateCookie";
+ }
+ },
+
+ postCreate: function(){
+ // 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);
+ }
+ }
+
+ // make template for container node (we will clone this and insert it into
+ // any nodes that have children)
+ var div = dojo.doc.createElement('div');
+ div.style.display = 'none';
+ div.className = "dijitTreeContainer";
+ dijit.setWaiRole(div, "presentation");
+ this.containerNodeTemplate = div;
+
+ // 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");
+ // TODO: monitor item deletes so we don't end up w/orphaned nodes?
+
+ this._load();
+
+ this.inherited("postCreate", 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);
+ },
+
+ _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 = new dijit._TreeNode({
+ item: item,
+ tree: this,
+ isExpandable: true,
+ label: this.label || this.getLabel(item)
+ });
+ if(!this.showRoot){
+ rn.rowNode.style.display="none";
+ }
+ this.domNode.appendChild(rn.domNode);
+ this._itemNodeMap[this.model.getIdentity(item)] = rn;
+
+ rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname
+
+ // load top level children
+ this._expandNode(rn);
+ }),
+ function(err){
+ console.error(this, ": error loading root: ", err);
+ }
+ );
+ },
+
+ ////////////// Data store related functions //////////////////////
+ // These just get passed to the model; they are here for back-compat
+
+ mayHaveChildren: function(/*dojo.data.Item*/ item){
+ // summary
+ // User 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)
+ },
+
+ getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+ // summary
+ // User overridable function that return array of child items of given parent item,
+ // or if parentItem==null then return top items in tree
+ },
+
+ ///////////////////////////////////////////////////////
+ // Functions for converting an item to a TreeNode
+ getLabel: function(/*dojo.data.Item*/ item){
+ // summary: user overridable function to get the label for a tree node (given the item)
+ return this.model.getLabel(item); // String
+ },
+
+ getIconClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ // summary: user overridable function to return CSS class name to display icon
+ return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
+ },
+
+ getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ // summary: user overridable function to return CSS class name to display label
+ },
+
+ /////////// Keyboard and Mouse handlers ////////////////////
+
+ _onKeyPress: function(/*Event*/ e){
+ // summary: translates keypress events into commands for the controller
+ if(e.altKey){ return; }
+ var treeNode = dijit.getEnclosingWidget(e.target);
+ if(!treeNode){ return; }
+
+ // Note: On IE e.keyCode is not 0 for printables so check e.charCode.
+ // In dojo charCode is universally 0 for non-printables.
+ if(e.charCode){ // handle printables (letter navigation)
+ // Check for key navigation.
+ var navKey = e.charCode;
+ if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+ navKey = (String.fromCharCode(navKey)).toLowerCase();
+ this._onLetterKeyNav( { node: treeNode, key: navKey } );
+ dojo.stopEvent(e);
+ }
+ }else{ // handle non-printables (arrow keys)
+ var map = this._keyHandlerMap;
+ if(!map){
+ // setup table mapping keys to events
+ map = {};
+ map[dojo.keys.ENTER]="_onEnterKey";
+ map[this.isLeftToRight() ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW]="_onLeftArrow";
+ map[this.isLeftToRight() ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW]="_onRightArrow";
+ map[dojo.keys.UP_ARROW]="_onUpArrow";
+ map[dojo.keys.DOWN_ARROW]="_onDownArrow";
+ map[dojo.keys.HOME]="_onHomeKey";
+ map[dojo.keys.END]="_onEndKey";
+ this._keyHandlerMap = map;
+ }
+ if(this._keyHandlerMap[e.keyCode]){
+ this[this._keyHandlerMap[e.keyCode]]( { node: treeNode, item: treeNode.item } );
+ dojo.stopEvent(e);
+ }
+ }
+ },
+
+ _onEnterKey: function(/*Object*/ message){
+ this._publish("execute", { item: message.item, node: message.node} );
+ this.onClick(message.item, message.node);
+ },
+
+ _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{
+ node = node.getParent();
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ _onHomeKey: function(){
+ // summary: home pressed; get first visible node, set focus there
+ var node = this._getRootOrFirstNode();
+ if(node){
+ this.focusNode(node);
+ }
+ },
+
+ _onEndKey: function(/*Object*/ message){
+ // summary: end pressed; go to last visible node
+
+ var node = this;
+ while(node.isExpanded){
+ var c = node.getChildren();
+ node = c[c.length - 1];
+ }
+
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ },
+
+ _onLetterKeyNav: function(message){
+ // summary: letter key pressed; search for node starting with first char = key
+ var node = startNode = message.node,
+ key = message.key;
+ do{
+ node = this._getNextNode(node);
+ //check for last node, jump to first node if necessary
+ if(!node){
+ node = this._getRootOrFirstNode();
+ }
+ }while(node !== startNode && (node.label.charAt(0).toLowerCase() != key));
+ if(node && node.isTreeNode){
+ // no need to set focus if back where we started
+ if(node !== startNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ _onClick: function(/*Event*/ e){
+ // summary: translates click events into commands for the controller to process
+ var domElement = e.target;
+
+ // find node
+ var nodeWidget = dijit.getEnclosingWidget(domElement);
+ if(!nodeWidget || !nodeWidget.isTreeNode){
+ return;
+ }
+
+ if( (this.openOnClick && nodeWidget.isExpandable) ||
+ (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
+ // 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} );
+ this.onClick(nodeWidget.item, nodeWidget);
+ 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){
+ // summary: user overridable function for executing a tree item
+ },
+
+ _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.isExpandable){
+ if(node.state == "LOADING"){
+ // ignore clicks while we are in the process of loading data
+ return;
+ }
+
+ node.collapse();
+ if(this.persist && node.item){
+ delete this._openedItemIds[this.model.getIdentity(node.item)];
+ this._saveState();
+ }
+ }
+ },
+
+ _expandNode: function(/*_TreeNode*/ node){
+ // summary: called when the user has requested to expand the node
+
+ if(!node.isExpandable){
+ return;
+ }
+
+ var model = this.model,
+ item = node.item;
+
+ switch(node.state){
+ case "LOADING":
+ // ignore clicks while we are in the process of loading data
+ return;
+
+ case "UNCHECKED":
+ // need to load all the children, and then expand
+ node.markProcessing();
+ var _this = this;
+ model.getChildren(item, function(items){
+ node.unmarkProcessing();
+ node.setChildItems(items);
+ _this._expandNode(node);
+ },
+ function(err){
+ console.error(_this, ": error loading root children: ", err);
+ });
+ break;
+
+ default:
+ // data is already loaded; just proceed
+ node.expand();
+ if(this.persist && item){
+ this._openedItemIds[model.getIdentity(item)] = true;
+ this._saveState();
+ }
+ }
+ },
+
+ ////////////////// Miscellaneous functions ////////////////
+
+ blurNode: function(){
+ // summary
+ // Removes focus from the currently focused node (which must be visible).
+ // Usually not called directly (just call focusNode() on another node instead)
+ var node = this.lastFocused;
+ if(!node){ return; }
+ var labelNode = node.labelNode;
+ dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+ labelNode.setAttribute("tabIndex", "-1");
+ dijit.setWaiState(labelNode, "selected", false);
+ this.lastFocused = null;
+ },
+
+ focusNode: function(/* _tree.Node */ node){
+ // summary
+ // Focus on the specified node (which must be visible)
+
+ // set focus so that the label will be voiced using screen readers
+ node.labelNode.focus();
+ },
+
+ _onBlur: function(){
+ // summary:
+ // We've moved away from the whole tree. The currently "focused" node
+ // (see focusNode above) should remain as the lastFocused node so we can
+ // tab back into the tree. Just change CSS to get rid of the dotted border
+ // until that time
+
+ this.inherited(arguments);
+ if(this.lastFocused){
+ var labelNode = this.lastFocused.labelNode;
+ dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+ }
+ },
+
+ _onTreeFocus: function(/*Widget*/ node){
+ // summary:
+ // called from onFocus handler of treeitem labelNode to set styles, wai state and tabindex
+ // for currently focused treeitem.
+
+ if (node){
+ if(node != this.lastFocused){
+ this.blurNode();
+ }
+ var labelNode = node.labelNode;
+ // set tabIndex so that the tab key can find this node
+ labelNode.setAttribute("tabIndex", "0");
+ dijit.setWaiState(labelNode, "selected", true);
+ dojo.addClass(labelNode, "dijitTreeLabelFocused");
+ this.lastFocused = node;
+ }
+ },
+
+ //////////////// Events from the model //////////////////////////
+
+ _onItemDelete: function(/*Object*/ item){
+ //summary: delete event from the store
+ // TODO: currently this isn't called, and technically doesn't need to be,
+ // but it would help with garbage collection
+
+ var identity = this.model.getIdentity(item);
+ var node = this._itemNodeMap[identity];
+
+ if(node){
+ var parent = node.getParent();
+ if(parent){
+ // if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+ parent.removeChild(node);
+ }
+ delete this._itemNodeMap[identity];
+ node.destroyRecursive();
+ }
+ },
+
+ _onItemChange: function(/*Item*/ item){
+ //summary: set data event on an item in the store
+ var model = this.model,
+ identity = model.getIdentity(item),
+ node = this._itemNodeMap[identity];
+
+ if(node){
+ node.setLabelNode(this.getLabel(item));
+ node._updateItemClasses(item);
+ }
+ },
+
+ _onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+ //summary: set data event on an item in the store
+ var model = this.model,
+ identity = model.getIdentity(parent),
+ parentNode = this._itemNodeMap[identity];
+
+ if(parentNode){
+ parentNode.setChildItems(newChildrenList);
+ }
+ },
+
+ /////////////// Miscellaneous funcs
+
+ _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(","));
+ },
+
+ destroy: function(){
+ if(this.rootNode){
+ this.rootNode.destroyRecursive();
+ }
+ 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();
+ }
+});
+
+
+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 ore more attributes that holds children of a tree node
+ childrenAttrs: ["children"],
+
+ // root: 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,
+
+ constructor: function(/* Object */ args){
+ // summary: passed the arguments listed above (store, etc)
+ 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);
+ },
+
+ // =======================================================================
+ // 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 " + 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;
+
+ // 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;
+ dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+
+ if(_waitCount == 0){
+ // all items are already loaded. proceed...
+ onComplete(childItems);
+ }else{
+ // still waiting for some or all of the items to load
+ var onItem = function onItem(item){
+ if(--_waitCount == 0){
+ // all nodes have been loaded, send them to the tree
+ onComplete(childItems);
+ }
+ }
+ dojo.forEach(childItems, function(item){
+ if(!store.isItemLoaded(item)){
+ store.loadItem({
+ item: item,
+ onItem: onItem,
+ onError: onError
+ });
+ }
+ });
+ }
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ getIdentity: function(/* item */ item){
+ return this.store.getIdentity(item); // Object
+ },
+
+ getLabel: function(/*dojo.data.Item*/ item){
+ // summary: get the label for an item
+ return this.store.getLabel(item); // String
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(/* Object? */ args, /*Item*/ parent){
+ // 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.
+ var pInfo = {parent: parent, attribute: this.childrenAttrs[0]};
+ return this.store.newItem(args, pInfo);
+ },
+
+ 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
+ var store = this.store,
+ parentAttr = this.childrenAttrs[0]; // name of "children" attr in parent item
+
+ // remove child from source item, and record the attributee 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){
+ 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.
+ },
+
+ onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+ // summary
+ // Callback to do notifications about new, updated, or deleted items.
+ },
+
+ // =======================================================================
+ ///Events from data store
+
+ _onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+ // summary: handler for when new items appear in the store.
+
+ // In this case there's no correspond onSet() call on the parent of this
+ // item, so need to get the new children list of the parent manually somehow.
+ if(!parentInfo){
+ return;
+ }
+ this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
+ // NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+ this.onChildrenChange(parentInfo.item, children);
+ }));
+ },
+
+ _onDeleteItem: function(/*Object*/ item){
+ // summary: handler for delete notifications from underlying store
+ },
+
+ _onSetItem: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* object | array */ oldValue,
+ /* object | array */ newValue){
+ //summary: set data event on an item in the store
+
+ if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
+ // item's children list changed
+ this.getChildren(item, dojo.hitch(this, function(children){
+ // NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+ this.onChildrenChange(item, children);
+ }));
+ }else{
+ // item's label/icon/etc. changed.
+ this.onChange(item);
+ }
+ }
+});
+
+dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
+ // summary
+ // Interface between Tree and a dojo.store that doesn't have a root item, ie,
+ // 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){
+ // 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)
+ 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
+
+ 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(/* Object? */ args, /*Item*/ parent){
+ // 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){
+ // 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
+ );
+ 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);
+ }
+ },
+
+ // =======================================================================
+ // Callbacks
+
+ onAddToRoot: function(/* item */ item){
+ // summary
+ // Called when item added to root of tree; user must override
+ // to modify the item so that it matches the query for top level items
+ // example
+ // | store.setValue(item, "root", true);
+ console.log(this, ": item ", item, " added to root");
+ },
+
+ onLeaveRoot: function(/* item */ item){
+ // summary
+ // Called when item removed from root of tree; user must override
+ // to modify the item so it doesn't match the query for top level items
+ // example
+ // | store.unsetAttribute(item, "root");
+ 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 _this = this,
+ oldChildren = this.root.children;
+ this.store.fetch({
+ query: this.query,
+ onComplete: 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.
+
+ // In theory, any new item could be a top level item.
+ // Do the safe but inefficient thing by requerying the top
+ // level items. User can override this function to do something
+ // more efficient.
+ 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);
+ }
+});
+
+}
diff --git a/includes/js/dijit/_Calendar.js b/includes/js/dijit/_Calendar.js
new file mode 100644
index 0000000..6dcf3f3
--- /dev/null
+++ b/includes/js/dijit/_Calendar.js
@@ -0,0 +1,239 @@
+if(!dojo._hasResource["dijit._Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._Calendar"] = true;
+dojo.provide("dijit._Calendar");
+
+dojo.require("dojo.cldr.supplemental");
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare(
+ "dijit._Calendar",
+ [dijit._Widget, dijit._Templated],
+ {
+ //
+ // 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 is used internally by other widgets and is not accessible
+ // as a standalone widget.
+ // 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:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><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>\t\n",
+
+ // value: Date
+ // the currently selected Date
+ value: new Date(),
+
+ // dayWidth: String
+ // How to represent the days of the week in the calendar header. See dojo.date.locale
+ dayWidth: "narrow",
+
+ setValue: function(/*Date*/ value){
+ // summary: set the current date and update the UI. If the date is disabled, the selection will
+ // not change, but the display will change to the corresponding month.
+ if(!this.value || dojo.date.compare(value, this.value)){
+ value = new Date(value);
+ this.displayMonth = new Date(value);
+ if(!this.isDisabledDate(value, this.lang)){
+ this.value = value;
+ this.value.setHours(0,0,0,0);
+ this.onChange(this.value);
+ }
+ this._populateGrid();
+ }
+ },
+
+ _setText: function(node, text){
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+ node.appendChild(dojo.doc.createTextNode(text));
+ },
+
+ _populateGrid: function(){
+ var month = this.displayMonth;
+ month.setDate(1);
+ var firstDay = month.getDay();
+ var daysInMonth = dojo.date.getDaysInMonth(month);
+ var daysInPreviousMonth = dojo.date.getDaysInMonth(dojo.date.add(month, "month", -1));
+ var today = new Date();
+ var selected = this.value;
+
+ var 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 Date(month);
+ var 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 = dojo.date.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!dojo.date.compare(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ if(!dojo.date.compare(date, selected, "date")){
+ 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];
+ this._setText(label, date.getDate());
+ }, this);
+
+ // Fill in localized month name
+ var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+ this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
+
+ // Fill in localized prev/current/next years
+ var y = month.getFullYear() - 1;
+ var d = new Date();
+ dojo.forEach(["previous", "current", "next"], function(name){
+ d.setFullYear(y++);
+ this._setText(this[name+"YearLabelNode"],
+ dojo.date.locale.format(d, {selector:'year', locale:this.lang}));
+ }, this);
+
+ // Set up repeating mouse behavior
+ var _this = this;
+ var typematic = function(nodeProp, dateProp, adj){
+ 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(){
+ this.setValue(new Date());
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ 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 = dojo.date.locale.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);
+
+ // Fill in spacer element with all the month names (invisible) so that the maximum width will affect layout
+ var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+ dojo.forEach(monthNames, function(name){
+ var monthSpacer = dojo.doc.createElement("div");
+ this._setText(monthSpacer, name);
+ this.monthLabelSpacer.appendChild(monthSpacer);
+ }, this);
+
+ this.value = null;
+ this.setValue(new Date());
+ },
+
+ _adjustDisplay: function(/*String*/part, /*int*/amount){
+ this.displayMonth = dojo.date.add(this.displayMonth, part, amount);
+ this._populateGrid();
+ },
+
+ _onDayClick: function(/*Event*/evt){
+ var node = evt.target;
+ dojo.stopEvent(evt);
+ while(!node.dijitDateValue){
+ node = node.parentNode;
+ }
+ if(!dojo.hasClass(node, "dijitCalendarDisabledDate")){
+ this.setValue(node.dijitDateValue);
+ this.onValueSelected(this.value);
+ }
+ },
+
+ onValueSelected: function(/*Date*/date){
+ // summary: a date cell was selected. It may be the same as the previous value.
+ },
+
+ onChange: function(/*Date*/date){
+ // summary: called only when the selected date has changed
+ },
+
+ isDisabledDate: function(/*Date*/dateObject, /*String?*/locale){
+ // summary:
+ // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+/*=====
+ 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.
+
+/*=====
+ return ""; // String
+=====*/
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/_Container.js b/includes/js/dijit/_Container.js
new file mode 100644
index 0000000..47d9ee8
--- /dev/null
+++ b/includes/js/dijit/_Container.js
@@ -0,0 +1,346 @@
+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._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
+ // implements dijit._Container
+ for(var p=this.domNode.parentNode; p; p=p.parentNode){
+ var id = p.getAttribute && p.getAttribute("widgetId");
+ if(id){
+ var parent = dijit.byId(id);
+ return parent.isContainer ? parent : null;
+ }
+ }
+ return null;
+ },
+
+ _getSibling: function(which){
+ var node = this.domNode;
+ do{
+ node = node[which+"Sibling"];
+ }while(node && node.nodeType != 1);
+ if(!node){ return null; } // null
+ var id = node.getAttribute("widgetId");
+ return dijit.byId(id);
+ },
+
+ 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"); // Mixed
+ },
+
+ 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"); // Mixed
+ }
+ }
+);
+
+dojo.declare("dijit._Container",
+ null,
+ {
+ // summary:
+ // Mixin for widgets that contain a list of children.
+ // description:
+ // Use this mixin when the widget needs to know about and
+ // keep track of it's widget children. Widgets like SplitContainer
+ // and TabContainer.
+
+ isContainer: true,
+
+ addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+ // summary:
+ // Process the given child widget, inserting it's dom node as
+ // a child of our dom node
+
+ if(insertIndex === undefined){
+ insertIndex = "last";
+ }
+ var refNode = this.containerNode || this.domNode;
+ if(insertIndex && typeof insertIndex == "number"){
+ var children = dojo.query("> [widgetid]", refNode);
+ if(children && children.length >= insertIndex){
+ refNode = children[insertIndex-1]; 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*/ widget){
+ // summary:
+ // Removes the passed widget instance from this widget but does
+ // not destroy it
+ var node = widget.domNode;
+ node.parentNode.removeChild(node); // detach but don't destroy
+ },
+
+ _nextElement: function(node){
+ do{
+ node = node.nextSibling;
+ }while(node && node.nodeType != 1);
+ return node;
+ },
+
+ _firstElement: function(node){
+ node = node.firstChild;
+ if(node && node.nodeType != 1){
+ node = this._nextElement(node);
+ }
+ return node;
+ },
+
+ getChildren: function(){
+ // summary:
+ // Returns array of children widgets
+ return dojo.query("> [widgetId]", this.containerNode || this.domNode).map(dijit.byNode); // Array
+ },
+
+ hasChildren: function(){
+ // summary:
+ // Returns true if widget has children
+ var cn = this.containerNode || this.domNode;
+ return !!this._firstElement(cn); // Boolean
+ },
+
+ _getSiblingOfChild: function(/*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
+ var node = child.domNode;
+ var which = (dir>0 ? "nextSibling" : "previousSibling");
+ do{
+ node = node[which];
+ }while(node && (node.nodeType != 1 || !dijit.byNode(node)));
+ return node ? dijit.byNode(node) : null;
+ }
+ }
+);
+
+dojo.declare("dijit._KeyNavContainer",
+ [dijit._Container],
+ {
+
+ // summary: A _Container with keyboard navigation of its children.
+ // decscription:
+ // To use this mixin, call connectKeyNavHandlers() in
+ // postCreate() and call startupKeyNavChildren() in startup().
+ // It provides normalized keyboard and focusing code for Container
+ // widgets.
+/*=====
+ // focusedChild: Widget
+ // The currently focused child widget, or null if there isn't one
+ focusedChild: null,
+=====*/
+
+ _keyNavCodes: {},
+
+ connectKeyNavHandlers: function(/*Array*/ prevKeyCodes, /*Array*/ nextKeyCodes){
+ // summary:
+ // Call in postCreate() to attach the keyboard handlers
+ // to the container.
+ // preKeyCodes: Array
+ // Key codes for navigating to the previous child.
+ // nextKeyCodes: Array
+ // Key codes for navigating to the next child.
+
+ 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
+ dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
+ },
+
+ addChild: function(/*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.
+ this.focusChild(this._getFirstFocusableChild());
+ },
+
+ focusNext: function(){
+ // summary: Focus the next widget or focal node (for widgets
+ // with multiple focal nodes) within this container.
+ if(this.focusedChild && this.focusedChild.hasNextFocalNode
+ && this.focusedChild.hasNextFocalNode()){
+ this.focusedChild.focusNext();
+ return;
+ }
+ var child = this._getNextFocusableChild(this.focusedChild, 1);
+ if(child.getFocalNodes){
+ this.focusChild(child, child.getFocalNodes()[0]);
+ }else{
+ this.focusChild(child);
+ }
+ },
+
+ focusPrev: function(){
+ // summary: Focus the previous widget or focal node (for widgets
+ // with multiple focal nodes) within this container.
+ if(this.focusedChild && this.focusedChild.hasPrevFocalNode
+ && this.focusedChild.hasPrevFocalNode()){
+ this.focusedChild.focusPrev();
+ return;
+ }
+ var child = this._getNextFocusableChild(this.focusedChild, -1);
+ if(child.getFocalNodes){
+ var nodes = child.getFocalNodes();
+ this.focusChild(child, nodes[nodes.length-1]);
+ }else{
+ this.focusChild(child);
+ }
+ },
+
+ focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+ // summary: Focus widget. Optionally focus 'node' within widget.
+ if(widget){
+ if(this.focusedChild && widget !== this.focusedChild){
+ this._onChildBlur(this.focusedChild);
+ }
+ this.focusedChild = widget;
+ if(node && widget.focusFocalNode){
+ widget.focusFocalNode(node);
+ }else{
+ widget.focus();
+ }
+ }
+ },
+
+ _startupChild: function(/*Widget*/ widget){
+ // summary:
+ // Set tabindex="-1" on focusable widgets so that we
+ // can focus them programmatically and by clicking.
+ // Connect focus and blur handlers.
+ if(widget.getFocalNodes){
+ dojo.forEach(widget.getFocalNodes(), function(node){
+ dojo.attr(node, "tabindex", -1);
+ this._connectNode(node);
+ }, this);
+ }else{
+ var node = widget.focusNode || widget.domNode;
+ if(widget.isFocusable()){
+ dojo.attr(node, "tabindex", -1);
+ }
+ this._connectNode(node);
+ }
+ },
+
+ _connectNode: function(/*Element*/ node){
+ this.connect(node, "onfocus", "_onNodeFocus");
+ this.connect(node, "onblur", "_onNodeBlur");
+ },
+
+ _onContainerFocus: function(evt){
+ // focus bubbles on Firefox,
+ // so just make sure that focus has really gone to the container
+ if(evt.target === this.domNode){
+ this.focusFirstChild();
+ }
+ },
+
+ _onContainerKeypress: function(evt){
+ if(evt.ctrlKey || evt.altKey){ return; }
+ var func = this._keyNavCodes[evt.keyCode];
+ if(func){
+ func();
+ dojo.stopEvent(evt);
+ }
+ },
+
+ _onNodeFocus: function(evt){
+ // while focus is on a child,
+ // take the container out of the tab order so that
+ // we can shift-tab to the element before the container
+ dojo.attr(this.domNode, "tabindex", -1);
+ // record the child that has been focused
+ var widget = dijit.getEnclosingWidget(evt.target);
+ if(widget && widget.isFocusable()){
+ this.focusedChild = widget;
+ }
+ dojo.stopEvent(evt);
+ },
+
+ _onNodeBlur: function(evt){
+ // when focus leaves a child,
+ // reinstate the container's tabindex
+ if(this.tabIndex){
+ dojo.attr(this.domNode, "tabindex", this.tabIndex);
+ }
+ dojo.stopEvent(evt);
+ },
+
+ _onChildBlur: function(/*Widget*/ widget){
+ // summary:
+ // Called when focus leaves a child widget to go
+ // to a sibling widget.
+ },
+
+ _getFirstFocusableChild: function(){
+ return this._getNextFocusableChild(null, 1);
+ },
+
+ _getNextFocusableChild: function(child, dir){
+ 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;
+ }
+ child = this._getSiblingOfChild(child, dir);
+ }
+ // no focusable child found
+ return null;
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/_Templated.js b/includes/js/dijit/_Templated.js
new file mode 100644
index 0000000..2de10e1
--- /dev/null
+++ b/includes/js/dijit/_Templated.js
@@ -0,0 +1,329 @@
+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.declare("dijit._Templated",
+ null,
+ {
+ // summary:
+ // Mixin for widgets that are instantiated from a template
+ //
+ // templateNode: DomNode
+ // a node that represents the widget template. Pre-empts both templateString and templatePath.
+ templateNode: null,
+
+ // templateString: 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.
+ templateString: null,
+
+ // templatePath: String
+ // Path to template (HTML file) for this widget relative to dojo.baseUrl
+ templatePath: null,
+
+ // widgetsInTemplate: Boolean
+ // should we parse the template to find widgets that might be
+ // declared in markup inside it? false by default.
+ widgetsInTemplate: false,
+
+ // containerNode: DomNode
+ // holds child elements. "containerNode" is generally set via a
+ // dojoAttachPoint assignment and it designates where children of
+ // the src dom node will be placed
+ containerNode: null,
+
+ // skipNodeCache: 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,
+
+ _stringRepl: function(tmpl){
+ 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 = _this[key.substr(1)]; }
+ if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide
+ if(!value){ 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.
+
+ // 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 = dijit._Templated._createNodesFromText(this._stringRepl(cached))[0];
+ }else{
+ // if it's a node, all we have to do is clone it
+ node = cached.cloneNode(true);
+ }
+
+ // recurse through the node, looking for, and attaching to, our
+ // attachment points which should be defined on the template node.
+ this._attachTemplateNodes(node);
+
+ var source = this.srcNodeRef;
+ if(source && source.parentNode){
+ source.parentNode.replaceChild(node, source);
+ }
+
+ this.domNode = node;
+ if(this.widgetsInTemplate){
+ var cw = this._supportingWidgets = dojo.parser.parse(node);
+ this._attachTemplateNodes(cw, function(n,p){
+ return n[p];
+ });
+ }
+
+ this._fillContent(source);
+ },
+
+ _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
+ 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
+
+ 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;
+ }
+ }
+ }
+
+ // 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]);
+ }
+ });
+ }
+
+ }
+ }
+ }
+);
+
+// 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
+ // The URL to get the template from. dojo.uri.Uri is often passed as well.
+ // 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){
+ return cached;
+ }
+
+ // If necessary, load template string from template path
+ if(!templateString){
+ templateString = dijit._Templated._sanitizeTemplateString(dojo._getText(templatePath));
+ }
+
+ 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
+ return (tmplts[key] = dijit._Templated._createNodesFromText(templateString)[0]); //Node
+ }
+};
+
+dijit._Templated._sanitizeTemplateString = function(/*String*/tString){
+ // 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.
+ if(tString){
+ tString = tString.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+ var matches = tString.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(matches){
+ tString = matches[1];
+ }
+ }else{
+ tString = "";
+ }
+ return tString; //String
+};
+
+
+if(dojo.isIE){
+ dojo.addOnUnload(function(){
+ var cache = dijit._Templated._templateCache;
+ for(var key in cache){
+ var value = cache[key];
+ if(!isNaN(value.nodeType)){ // isNode equivalent
+ dojo._destroyElement(value);
+ }
+ delete cache[key];
+ }
+ });
+}
+
+(function(){
+ var tagMap = {
+ cell: {re: /^<t[dh][\s\r\n>]/i, pre: "<table><tbody><tr>", post: "</tr></tbody></table>"},
+ row: {re: /^<tr[\s\r\n>]/i, pre: "<table><tbody>", post: "</tbody></table>"},
+ section: {re: /^<(thead|tbody|tfoot)[\s\r\n>]/i, pre: "<table>", post: "</table>"}
+ };
+
+ // dummy container node used temporarily to hold nodes being created
+ var tn;
+
+ dijit._Templated._createNodesFromText = function(/*String*/text){
+ // summary:
+ // Attempts to create a set of nodes based on the structure of the passed text.
+
+ if(!tn){
+ tn = dojo.doc.createElement("div");
+ tn.style.display="none";
+ dojo.body().appendChild(tn);
+ }
+ var tableType = "none";
+ var rtext = text.replace(/^\s+/, "");
+ for(var type in tagMap){
+ var map = tagMap[type];
+ if(map.re.test(rtext)){
+ tableType = type;
+ text = map.pre + text + map.post;
+ break;
+ }
+ }
+
+ tn.innerHTML = text;
+ if(tn.normalize){
+ tn.normalize();
+ }
+
+ var tag = { cell: "tr", row: "tbody", section: "table" }[tableType];
+ var _parent = (typeof tag != "undefined") ?
+ tn.getElementsByTagName(tag)[0] :
+ tn;
+
+ var nodes = [];
+ while(_parent.firstChild){
+ nodes.push(_parent.removeChild(_parent.firstChild));
+ }
+ tn.innerHTML="";
+ return nodes; // Array
+ }
+})();
+
+// 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:""
+})
+
+}
diff --git a/includes/js/dijit/_TimePicker.js b/includes/js/dijit/_TimePicker.js
new file mode 100644
index 0000000..1ce9bad
--- /dev/null
+++ b/includes/js/dijit/_TimePicker.js
@@ -0,0 +1,249 @@
+if(!dojo._hasResource["dijit._TimePicker"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._TimePicker"] = true;
+dojo.provide("dijit._TimePicker");
+
+dojo.require("dijit.form._FormWidget");
+dojo.require("dojo.date.locale");
+
+/*=====
+dojo.declare(
+ "dijit._TimePicker.__Constraints",
+ [dojo.date.locale.__FormatOptions],
+ {
+ // clickableIncrement: String
+ // see dijit._TimePicker.clickableIncrement
+ clickableIncrement: "T00:15:00",
+
+ // visibleIncrement: String
+ // see dijit._TimePicker.visibleIncrement
+ visibleIncrement: "T01:00:00",
+
+ // visibleRange: String
+ // see dijit._TimePicker.visibleRange
+ visibleRange: "T05:00:00"
+ }
+);
+=====*/
+
+dojo.declare("dijit._TimePicker",
+ [dijit._Widget, dijit._Templated],
+ {
+ // summary:
+ // A graphical time picker.
+ // This widget is used internally by other widgets and is not accessible
+ // as a standalone widget.
+
+ templateString:"<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div dojoAttachPoint=\"upArrow\" class=\"dijitButtonNode\"><span class=\"dijitTimePickerA11yText\">&#9650;</span></div\n ><div dojoAttachPoint=\"timeMenu,focusNode\" dojoAttachEvent=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div dojoAttachPoint=\"downArrow\" class=\"dijitButtonNode\"><span class=\"dijitTimePickerA11yText\">&#9660;</span></div\n></div>\n",
+ 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
+ constraints:{},
+
+ serialize: dojo.date.stamp.toISOString,
+
+//TODOC: what is priority?
+ setValue:function(/*Date*/ date, /*Boolean*/ priority){
+ // summary:
+ // Set the value of the TimePicker
+ // Redraws the TimePicker around the new date
+
+ //dijit._TimePicker.superclass.setValue.apply(this, arguments);
+ this.value=date;
+ 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`
+ return false; // Boolean
+ },
+
+ _showText:function(){
+ this.timeMenu.innerHTML = "";
+ var fromIso = dojo.date.stamp.fromISOString;
+ 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();
+ };
+
+ var clickableIncrementSeconds = sinceMidnight(this._clickableIncrementDate);
+ var visibleIncrementSeconds = sinceMidnight(this._visibleIncrementDate);
+ var visibleRangeSeconds = sinceMidnight(this._visibleRangeDate);
+
+ // round reference date to previous visible increment
+ var time = this.value.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;
+ for(var i = -(this._totalIncrements >> 1); i < (this._totalIncrements >> 1); i += this._clickableIncrement){
+ this.timeMenu.appendChild(this._createOption(i));
+ }
+
+ // TODO:
+ // I commented this out because it
+ // causes problems for a TimeTextBox in a Dialog, or as the editor of an InlineEditBox,
+ // because the timeMenu node isn't visible yet. -- Bill (Bug #????)
+ // dijit.focus(this.timeMenu);
+ },
+
+ postCreate:function(){
+ // instantiate constraints
+ if(this.constraints===dijit._TimePicker.prototype.constraints){
+ this.constraints={};
+ }
+
+ // brings in visibleRange, increments, etc.
+ dojo.mixin(this, this.constraints);
+
+ // dojo.date.locale needs the lang in the constraints as locale
+ if(!this.constraints.locale){
+ this.constraints.locale=this.lang;
+ }
+
+ // assign typematic mouse listeners to the arrow buttons
+ this.connect(this.timeMenu, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+ var typematic = dijit.typematic.addMouseListener;
+ typematic(this.upArrow,this,this._onArrowUp, 0.8, 500);
+ typematic(this.downArrow,this,this._onArrowDown, 0.8, 500);
+ //dijit.typematic.addListener(this.upArrow,this.timeMenu, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_onArrowUp", 0.8, 500);
+ //dijit.typematic.addListener(this.downArrow, this.timeMenu, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_onArrowDown", 0.8,500);
+
+ this.inherited(arguments);
+ this.setValue(this.value);
+ },
+
+ _createOption:function(/*Number*/ index){
+ // summary: creates a clickable time option
+ var div = dojo.doc.createElement("div");
+ var date = (div.date = new Date(this._refDate));
+ div.index = index;
+ var incrementDate = this._clickableIncrementDate;
+ date.setHours(date.getHours() + incrementDate.getHours() * index,
+ date.getMinutes() + incrementDate.getMinutes() * index,
+ date.getSeconds() + incrementDate.getSeconds() * index);
+
+ var innerDiv = dojo.doc.createElement('div');
+ dojo.addClass(div,this.baseClass+"Item");
+ dojo.addClass(innerDiv,this.baseClass+"ItemInner");
+ innerDiv.innerHTML = dojo.date.locale.format(date, this.constraints);
+ div.appendChild(innerDiv);
+
+ 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(!dojo.date.compare(this.value, date, this.constraints.selector)){
+ div.selected = true;
+ dojo.addClass(div, this.baseClass+"ItemSelected");
+ }
+ return div;
+ },
+
+ _onOptionSelected:function(/*Object*/ tgt){
+ var tdate = tgt.target.date || tgt.target.parentNode.date;
+ if(!tdate || this.isDisabledDate(tdate)){ return; }
+ this.setValue(tdate);
+ this.onValueSelected(tdate);
+ },
+
+ onValueSelected:function(value){
+ },
+
+ onmouseover:function(/*Event*/ e){
+ var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;
+ this._highlighted_option=tgr;
+ dojo.addClass(tgr, this.baseClass+"ItemHover");
+ },
+
+ onmouseout:function(/*Event*/ e){
+ var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;
+ if(this._highlighted_option===tgr){
+ dojo.removeClass(tgr, this.baseClass+"ItemHover");
+ }
+ },
+
+ _mouseWheeled:function(/*Event*/e){
+ // summary: handle the mouse wheel listener
+ 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(){
+ // summary: remove the bottom time and add one to the top
+ var index = this.timeMenu.childNodes[0].index - 1;
+ var div = this._createOption(index);
+ this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]);
+ this.timeMenu.insertBefore(div, this.timeMenu.childNodes[0]);
+ },
+
+ _onArrowDown:function(){
+ // summary: remove the top time and add one to the bottom
+ var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].index + 1;
+ var div = this._createOption(index);
+ this.timeMenu.removeChild(this.timeMenu.childNodes[0]);
+ this.timeMenu.appendChild(div);
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/_Widget.js b/includes/js/dijit/_Widget.js
new file mode 100644
index 0000000..361b6bf
--- /dev/null
+++ b/includes/js/dijit/_Widget.js
@@ -0,0 +1,407 @@
+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" );
+
+dojo.declare("dijit._Widget", null, {
+ // summary:
+ // The foundation of dijit widgets.
+ //
+ // id: 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: 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: String
+ // Unsupported by Dijit, but here for completeness. Dijit only supports setting text direction on the
+ // entire document.
+ // 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".
+ dir: "",
+
+ // class: String
+ // HTML class attribute
+ "class": "",
+
+ // style: String
+ // HTML style attribute
+ style: "",
+
+ // title: String
+ // HTML title attribute
+ title: "",
+
+ // srcNodeRef: DomNode
+ // pointer to original dom node
+ srcNodeRef: null,
+
+ // domNode: DomNode
+ // this is our visible representation of the widget! Other DOM
+ // Nodes may by assigned to other properties, usually through the
+ // template system's dojoAttachPonit syntax, but the domNode
+ // property is the canonical "top level" node in widget UI.
+ domNode: null,
+
+ // attributeMap: Object
+ // A map of attributes and attachpoints -- typically standard HTML attributes -- to set
+ // on the widget's dom, at the "domNode" attach point, by default.
+ // Other node references can be specified as properties of 'this'
+ attributeMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""}, // TODO: add on* handlers?
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+//TODOC: params and srcNodeRef need docs. Is srcNodeRef optional?
+//TODOC: summary needed for postscript
+ postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ this.create(params, srcNodeRef);
+ },
+
+ create: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ // summary:
+ // Kick off the life-cycle of a widget
+ // description:
+ // To understand the process by which widgets are instantiated, it
+ // is critical to understand what other methods create calls and
+ // which of them you'll want to override. Of course, adventurous
+ // developers could override create entirely, but this should
+ // only be done as a last resort.
+ //
+ // Below is a list of the methods that are called, in the order
+ // they are fired, along with notes about what they do and if/when
+ // you should over-ride them in your widget:
+ //
+ // * postMixInProperties:
+ // | * a stub function that you can over-ride to modify
+ // variables that may have been naively assigned by
+ // mixInProperties
+ // * widget is added to manager object here
+ // * buildRendering:
+ // | * Subclasses use this method to handle all UI initialization
+ // Sets this.domNode. Templated widgets do this automatically
+ // and otherwise it just uses the source dom node.
+ // * postCreate:
+ // | * a stub function that you can over-ride to modify take
+ // actions once the widget has been placed in the UI
+
+ // 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=[];
+
+ // _attaches: String[]
+ // names of all our dojoAttachPoint variables
+ this._attaches=[];
+
+ //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();
+
+ // Copy attributes listed in attributeMap into the [newly created] DOM for the widget.
+ // The placement of these attributes is according to the property mapping in attributeMap.
+ // Note special handling for 'style' and 'class' attributes which are lists and can
+ // have elements from both old and new structures, and some attributes like "type"
+ // cannot be processed this way as they are not mutable.
+ if(this.domNode){
+ for(var attr in this.attributeMap){
+ var value = this[attr];
+ if(typeof value != "object" && ((value !== "" && value !== false) || (params && params[attr]))){
+ this.setAttribute(attr, value);
+ }
+ }
+ }
+
+ 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;
+ }
+ },
+
+ 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.
+ },
+
+ buildRendering: function(){
+ // summary:
+ // Construct the UI for this widget, setting this.domNode.
+ // Most widgets will mixin TemplatedWidget, which overrides this method.
+ this.domNode = this.srcNodeRef || dojo.doc.createElement('div');
+ },
+
+ postCreate: function(){
+ // summary:
+ // Called after a widget's dom has been setup
+ },
+
+ startup: function(){
+ // summary:
+ // Called after a widget's children, and other widgets on the page, have been created.
+ // Provides an opportunity to manipulate any children before they are displayed.
+ // 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*/ finalize){
+ // summary:
+ // Destroy this widget and it's descendants. This is the generic
+ // "destructor" function that all widget users should call to
+ // cleanly discard with a widget. Once a widget is destroyed, it's
+ // removed from the manager object.
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ this.destroyDescendants();
+ this.destroy();
+ },
+
+ destroy: function(/*Boolean*/ finalize){
+ // summary:
+ // Destroy this widget, but not its descendants
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ this.uninitialize();
+ dojo.forEach(this._connects, function(array){
+ dojo.forEach(array, dojo.disconnect);
+ });
+
+ // destroy widgets created as part of template, etc.
+ dojo.forEach(this._supportingWidgets || [], function(w){ w.destroy(); });
+
+ this.destroyRendering(finalize);
+ dijit.registry.remove(this.id);
+ },
+
+ destroyRendering: function(/*Boolean*/ finalize){
+ // summary:
+ // Destroys the DOM nodes associated with this widget
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ if(this.bgIframe){
+ this.bgIframe.destroy();
+ delete this.bgIframe;
+ }
+
+ if(this.domNode){
+ dojo._destroyElement(this.domNode);
+ delete this.domNode;
+ }
+
+ if(this.srcNodeRef){
+ dojo._destroyElement(this.srcNodeRef);
+ delete this.srcNodeRef;
+ }
+ },
+
+ destroyDescendants: function(){
+ // summary:
+ // Recursively destroy the children of this widget and their
+ // descendants.
+
+ // TODO: should I destroy in the reverse order, to go bottom up?
+ dojo.forEach(this.getDescendants(), function(widget){ widget.destroy(); });
+ },
+
+ uninitialize: function(){
+ // summary:
+ // stub function. Override to implement custom widget tear-down
+ // behavior.
+ return false;
+ },
+
+ ////////////////// MISCELLANEOUS METHODS ///////////////////
+
+ onFocus: function(){
+ // summary:
+ // stub function. Override or connect to this method to receive
+ // notifications for when the widget moves into focus.
+ },
+
+ onBlur: function(){
+ // summary:
+ // stub function. Override or connect to this method to receive
+ // notifications for when the widget moves out of focus.
+ },
+
+ _onFocus: function(e){
+ this.onFocus();
+ },
+
+ _onBlur: function(){
+ this.onBlur();
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // summary
+ // Set native HTML attributes reflected in the widget,
+ // such as readOnly, disabled, and maxLength in TextBox widgets.
+ // description
+ // In general, a widget's "value" is controlled via setValue()/getValue(),
+ // rather than this method. The exception is for widgets where the
+ // end user can't adjust the value, such as Button and CheckBox;
+ // in the unusual case that you want to change the value attribute of
+ // those widgets, use setAttribute().
+ var mapNode = this[this.attributeMap[attr]||'domNode'];
+ this[attr] = value;
+ switch(attr){
+ case "class":
+ dojo.addClass(mapNode, value);
+ break;
+ case "style":
+ if(mapNode.style.cssText){
+ mapNode.style.cssText += "; " + value;// FIXME: Opera
+ }else{
+ mapNode.style.cssText = value;
+ }
+ break;
+ default:
+ if(/^on[A-Z]/.test(attr)){ // eg. onSubmit needs to be onsubmit
+ attr = attr.toLowerCase();
+ }
+ if(typeof value == "function"){ // functions execute in the context of the widget
+ value = dojo.hitch(this, value);
+ }
+ dojo.attr(mapNode, attr, value);
+ }
+ },
+
+ toString: function(){
+ // summary:
+ // returns a string that represents the widget. 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 reversable
+ // serialization.
+ return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
+ },
+
+ getDescendants: function(){
+ // summary:
+ // Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+ if(this.containerNode){
+ var list= dojo.query('[widgetId]', this.containerNode);
+ return list.map(dijit.byNode); // Array
+ }else{
+ return [];
+ }
+ },
+
+//TODOC
+ nodesWithKeyClick: ["input", "button"],
+
+ connect: function(
+ /*Object|null*/ obj,
+ /*String*/ event,
+ /*String|Function*/ method){
+ // summary:
+ // Connects specified obj/event to specified method of this object
+ // and registers for disconnect() on widget destroy.
+ // Special event: "ondijitclick" triggers on a click or enter-down or space-up
+ // Similar to dojo.connect() but takes three arguments rather than four.
+ var handles =[];
+ if(event == "ondijitclick"){
+ // add key based click activation for unsupported nodes.
+ if(!this.nodesWithKeyClick[obj.nodeName]){
+ handles.push(dojo.connect(obj, "onkeydown", this,
+ function(e){
+ if(e.keyCode == dojo.keys.ENTER){
+ return (dojo.isString(method))?
+ this[method](e) : method.call(this, e);
+ }else if(e.keyCode == dojo.keys.SPACE){
+ // stop space down as it causes IE to scroll
+ // the browser window
+ dojo.stopEvent(e);
+ }
+ }));
+ handles.push(dojo.connect(obj, "onkeyup", this,
+ function(e){
+ if(e.keyCode == dojo.keys.SPACE){
+ return dojo.isString(method) ?
+ this[method](e) : method.call(this, e);
+ }
+ }));
+ }
+ event = "onclick";
+ }
+ handles.push(dojo.connect(obj, event, this, method));
+
+ // return handles for FormElement and ComboBox
+ this._connects.push(handles);
+ return handles;
+ },
+
+ disconnect: function(/*Object*/ handles){
+ // summary:
+ // Disconnects handle created by this.connect.
+ // Also removes handle from this widget's list of connects
+ 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;
+ }
+ }
+ },
+
+ isLeftToRight: function(){
+ // summary:
+ // Checks the DOM to for the text direction for bi-directional support
+ // description:
+ // This method cannot be used during widget construction because the widget
+ // must first be connected to the DOM tree. Parent nodes are searched for the
+ // 'dir' attribute until one is found, otherwise left to right mode is assumed.
+ // See HTML spec, DIR attribute for more information.
+
+ if(!("_ltr" in this)){
+ this._ltr = dojo.getComputedStyle(this.domNode).direction != "rtl";
+ }
+ return this._ltr; //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");
+ }
+});
+
+}
diff --git a/includes/js/dijit/_base.js b/includes/js/dijit/_base.js
new file mode 100644
index 0000000..f6b2dcb
--- /dev/null
+++ b/includes/js/dijit/_base.js
@@ -0,0 +1,27 @@
+if(!dojo._hasResource["dijit._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base"] = true;
+dojo.provide("dijit._base");
+
+dojo.require("dijit._base.focus");
+dojo.require("dijit._base.manager");
+dojo.require("dijit._base.place");
+dojo.require("dijit._base.popup");
+dojo.require("dijit._base.scroll");
+dojo.require("dijit._base.sniff");
+dojo.require("dijit._base.bidi");
+dojo.require("dijit._base.typematic");
+dojo.require("dijit._base.wai");
+dojo.require("dijit._base.window");
+
+// FIXME: Find a better way of solving this bug!
+if(dojo.isSafari){
+ // Ugly-ass hack to solve bug #5626 for 1.1; basically force Safari to re-layout.
+ // Note that we can't reliably use dojo.addOnLoad here because this bug is basically
+ // a timing / race condition; so instead we use window.onload.
+ dojo.connect(window, "load", function(){
+ window.resizeBy(1,0);
+ setTimeout(function(){ window.resizeBy(-1,0); }, 10);
+ });
+}
+
+}
diff --git a/includes/js/dijit/_base/bidi.js b/includes/js/dijit/_base/bidi.js
new file mode 100644
index 0000000..7cd3f46
--- /dev/null
+++ b/includes/js/dijit/_base/bidi.js
@@ -0,0 +1,13 @@
+if(!dojo._hasResource["dijit._base.bidi"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.bidi"] = true;
+dojo.provide("dijit._base.bidi");
+
+// summary: applies a class to the top of the document for right-to-left stylesheet rules
+
+dojo.addOnLoad(function(){
+ if(!dojo._isBodyLtr()){
+ dojo.addClass(dojo.body(), "dijitRtl");
+ }
+});
+
+}
diff --git a/includes/js/dijit/_base/focus.js b/includes/js/dijit/_base/focus.js
new file mode 100644
index 0000000..46230b5
--- /dev/null
+++ b/includes/js/dijit/_base/focus.js
@@ -0,0 +1,342 @@
+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");
+
+// summary:
+// These functions are used to query or set the focus and selection.
+//
+// Also, they trace when widgets become actived/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: tests whether the current selection is empty
+ var _window = dojo.global;
+ var _document = dojo.doc;
+ if(_document.selection){ // IE
+ return !_document.selection.createRange().text; // Boolean
+ }else{
+ var selection = _window.getSelection();
+ if(dojo.isString(selection)){ // Safari
+ return !selection; // Boolean
+ }else{ // Mozilla/W3
+ return selection.isCollapsed || !selection.toString(); // Boolean
+ }
+ }
+ },
+
+ getBookmark: function(){
+ // summary: Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+ var bookmark, selection = dojo.doc.selection;
+ if(selection){ // IE
+ var range = selection.createRange();
+ if(selection.type.toUpperCase()=='CONTROL'){
+ if(range.length){
+ bookmark=[];
+ var i=0,len=range.length;
+ while(i<len){
+ bookmark.push(range.item(i++));
+ }
+ }else{
+ bookmark=null;
+ }
+ }else{
+ bookmark = range.getBookmark();
+ }
+ }else{
+ if(window.getSelection){
+ selection = dojo.global.getSelection();
+ if(selection){
+ range = selection.getRangeAt(0);
+ bookmark = range.cloneRange();
+ }
+ }else{
+ console.warn("No idea how to store the current selection for this browser!");
+ }
+ }
+ return bookmark; // Array
+ },
+
+ moveToBookmark: function(/*Object*/bookmark){
+ // summary: Moves current selection to a bookmark
+ // bookmark: This should be a returned object from dojo.html.selection.getBookmark()
+ var _document = dojo.doc;
+ if(_document.selection){ // IE
+ var range;
+ if(dojo.isArray(bookmark)){
+ range = _document.body.createControlRange();
+ dojo.forEach(bookmark, "range.addElement(item)"); //range.addElement does not have call/apply method, so can not call it directly
+ }else{
+ range = _document.selection.createRange();
+ range.moveToBookmark(bookmark);
+ }
+ range.select();
+ }else{ //Moz/W3C
+ var selection = dojo.global.getSelection && dojo.global.getSelection();
+ if(selection && selection.removeAllRanges){
+ selection.removeAllRanges();
+ selection.addRange(bookmark);
+ }else{
+ console.warn("No idea how to restore selection for this browser!");
+ }
+ }
+ },
+
+ getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+ // summary:
+ // Returns the current focus and selection.
+ // Called when a popup appears (either a top level menu or a dialog),
+ // or when a toolbar/menubar receives focus
+ //
+ // menu:
+ // The menu that's being opened
+ //
+ // openedForWindow:
+ // iframe in which menu was opened
+ //
+ // returns:
+ // A handle to restore focus/selection
+
+ return {
+ // Node to return focus to
+ node: menu && dojo.isDescendant(dijit._curFocus, menu.domNode) ? dijit._prevFocus : dijit._curFocus,
+
+ // Previously selected text
+ bookmark:
+ !dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed) ?
+ dojo.withGlobal(openedForWindow||dojo.global, dijit.getBookmark) :
+ null,
+
+ 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;
+
+ // 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)
+ if(bookmark && dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed)){
+ if(openedForWindow){
+ openedForWindow.focus();
+ }
+ try{
+ dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
+ }catch(e){
+ /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+ }
+ }
+ },
+
+ // _activeStack: Array
+ // List of currently active widgets (focused widget and it's ancestors)
+ _activeStack: [],
+
+ registerWin: function(/*Window?*/targetWindow){
+ // summary:
+ // Registers listeners on the specified window (either the main
+ // window or an iframe) to detect when the user has clicked somewhere.
+ // Anyone that creates an iframe should call this function.
+
+ if(!targetWindow){
+ targetWindow = window;
+ }
+
+ dojo.connect(targetWindow.document, "onmousedown", function(evt){
+ dijit._justMouseDowned = true;
+ setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
+ dijit._onTouchNode(evt.target||evt.srcElement);
+ });
+ //dojo.connect(targetWindow, "onscroll", ???);
+
+ // Listen for blur and focus events on targetWindow's body
+ var body = targetWindow.document.body || targetWindow.document.getElementsByTagName("body")[0];
+ if(body){
+ if(dojo.isIE){
+ body.attachEvent('onactivate', function(evt){
+ if(evt.srcElement.tagName.toLowerCase() != "body"){
+ dijit._onFocusNode(evt.srcElement);
+ }
+ });
+ body.attachEvent('ondeactivate', function(evt){ dijit._onBlurNode(evt.srcElement); });
+ }else{
+ body.addEventListener('focus', function(evt){ dijit._onFocusNode(evt.target); }, true);
+ body.addEventListener('blur', function(evt){ dijit._onBlurNode(evt.target); }, true);
+ }
+ }
+ body = null; // prevent memory leak (apparent circular reference via closure)
+ },
+
+ _onBlurNode: function(/*DomNode*/ node){
+ // summary:
+ // Called when focus leaves a node.
+ // Usually ignored, _unless_ it *isn't* 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){
+ // summary:
+ // Callback when node is focused or mouse-downed
+
+ // 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){
+ if(node.dijitPopupParent){
+ node=dijit.byId(node.dijitPopupParent).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=dijit.getDocumentWindow(node.ownerDocument).frameElement;
+ }else{
+ var id = node.getAttribute && node.getAttribute("widgetId");
+ if(id){
+ newStack.unshift(id);
+ }
+ node=node.parentNode;
+ }
+ }
+ }catch(e){ /* squelch */ }
+
+ dijit._setStack(newStack);
+ },
+
+ _onFocusNode: function(/*DomNode*/ node){
+ // summary
+ // Callback when node is focused
+ if(node && node.tagName && node.tagName.toLowerCase() == "body"){
+ 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(newStack){
+ // summary
+ // The stack of active widgets has changed. Send out appropriate events and record new stack
+
+ 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;
+ }
+ }
+
+ // for all elements that have gone out of focus, send blur event
+ for(var i=oldStack.length-1; i>=nCommon; i--){
+ var widget = dijit.byId(oldStack[i]);
+ if(widget){
+ widget._focused = false;
+ widget._hasBeenBlurred = true;
+ if(widget._onBlur){
+ widget._onBlur();
+ }
+ if (widget._setStateClass){
+ widget._setStateClass();
+ }
+ dojo.publish("widgetBlur", [widget]);
+ }
+ }
+
+ // 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();
+ }
+ if (widget._setStateClass){
+ widget._setStateClass();
+ }
+ dojo.publish("widgetFocus", [widget]);
+ }
+ }
+ }
+});
+
+// register top window and all the iframes it contains
+dojo.addOnLoad(dijit.registerWin);
+
+}
diff --git a/includes/js/dijit/_base/manager.js b/includes/js/dijit/_base/manager.js
new file mode 100644
index 0000000..cfb5337
--- /dev/null
+++ b/includes/js/dijit/_base/manager.js
@@ -0,0 +1,194 @@
+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
+
+ constructor: function(){
+ this._hash={};
+ },
+
+ add: function(/*Widget*/ widget){
+ 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;
+ },
+
+ remove: function(/*String*/ id){
+ delete this._hash[id];
+ },
+
+ forEach: function(/*Function*/ func){
+ for(var id in this._hash){
+ func(this._hash[id]);
+ }
+ },
+
+ filter: function(/*Function*/ filter){
+ var res = new dijit.WidgetSet();
+ this.forEach(function(widget){
+ if(filter(widget)){ res.add(widget); }
+ });
+ return res; // dijit.WidgetSet
+ },
+
+ byId: function(/*String*/ id){
+ return this._hash[id];
+ },
+
+ byClass: function(/*String*/ cls){
+ return this.filter(function(widget){ return widget.declaredClass==cls; }); // dijit.WidgetSet
+ }
+ });
+
+/*=====
+dijit.registry = {
+ // summary: A list of widgets on a page.
+ // description: Is an instance of dijit.WidgetSet
+};
+=====*/
+dijit.registry = new dijit.WidgetSet();
+
+dijit._widgetTypeCtr = {};
+
+dijit.getUniqueId = function(/*String*/widgetType){
+ // summary
+ // Generates a unique id for a given widgetType
+
+ var id;
+ do{
+ id = widgetType + "_" +
+ (widgetType in dijit._widgetTypeCtr ?
+ ++dijit._widgetTypeCtr[widgetType] : dijit._widgetTypeCtr[widgetType] = 0);
+ }while(dijit.byId(id));
+ return id; // String
+};
+
+
+if(dojo.isIE){
+ // Only run this 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.addOnUnload(function(){
+ dijit.registry.forEach(function(widget){ widget.destroy(); });
+ });
+}
+
+dijit.byId = function(/*String|Widget*/id){
+ // summary:
+ // Returns a widget by its id, or if passed a widget, no-op (like dojo.byId())
+ return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+ // summary:
+ // Returns the widget as referenced by node
+ return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+ // summary:
+ // Returns the widget whose dom tree contains node or null if
+ // the node is not contained within the dom tree of any widget
+ while(node){
+ if(node.getAttribute && node.getAttribute("widgetId")){
+ return dijit.registry.byId(node.getAttribute("widgetId"));
+ }
+ node = node.parentNode;
+ }
+ return null;
+};
+
+// elements that are tab-navigable if they have no tabindex value set
+// (except for "a", which must have an href attribute)
+dijit._tabElements = {
+ area: true,
+ button: true,
+ input: true,
+ object: true,
+ select: true,
+ textarea: true
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+ var style = dojo.style(elem);
+ return (style.visibility != "hidden")
+ && (style.visibility != "collapsed")
+ && (style.display != "none");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+ // summary:
+ // Tests if an element is tab-navigable
+ if(dojo.hasAttr(elem, "disabled")){ return false; }
+ var hasTabindex = dojo.hasAttr(elem, "tabindex");
+ var tabindex = dojo.attr(elem, "tabindex");
+ if(hasTabindex && tabindex >= 0) {
+ return true; // boolean
+ }
+ var name = elem.nodeName.toLowerCase();
+ if(((name == "a" && dojo.hasAttr(elem, "href"))
+ || dijit._tabElements[name])
+ && (!hasTabindex || tabindex >= 0)){
+ return true; // boolean
+ }
+ return false; // boolean
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+ // summary:
+ // 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){
+ var isShown = dijit._isElementShown(child);
+ if(isShown && dijit.isTabNavigable(child)){
+ var tabindex = dojo.attr(child, "tabindex");
+ if(!dojo.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(isShown){ walkTree(child) }
+ });
+ };
+ if(dijit._isElementShown(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; // Element
+};
+
+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; // Element
+};
+
+}
diff --git a/includes/js/dijit/_base/place.js b/includes/js/dijit/_base/place.js
new file mode 100644
index 0000000..3165c11
--- /dev/null
+++ b/includes/js/dijit/_base/place.js
@@ -0,0 +1,213 @@
+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");
+
+// ported from dojo.html.util
+
+dijit.getViewport = function(){
+ // summary
+ // Returns the dimensions and scroll position of the viewable area of a browser window
+
+ var _window = dojo.global;
+ var _document = dojo.doc;
+
+ // get viewport size
+ var w = 0, h = 0;
+ var de = _document.documentElement;
+ var dew = de.clientWidth, deh = de.clientHeight;
+ if(dojo.isMozilla){
+ // mozilla
+ // _window.innerHeight includes the height taken by the scroll bar
+ // clientHeight is ideal but has DTD issues:
+ // #4539: FF reverses the roles of body.clientHeight/Width and documentElement.clientHeight/Width based on the DTD!
+ // check DTD to see whether body or documentElement returns the viewport dimensions using this algorithm:
+ var minw, minh, maxw, maxh;
+ var dbw = _document.body.clientWidth;
+ if(dbw > dew){
+ minw = dew;
+ maxw = dbw;
+ }else{
+ maxw = dew;
+ minw = dbw;
+ }
+ var dbh = _document.body.clientHeight;
+ if(dbh > deh){
+ minh = deh;
+ maxh = dbh;
+ }else{
+ maxh = deh;
+ minh = dbh;
+ }
+ w = (maxw > _window.innerWidth) ? minw : maxw;
+ h = (maxh > _window.innerHeight) ? minh : maxh;
+ }else if(!dojo.isOpera && _window.innerWidth){
+ //in opera9, dojo.body().clientWidth should be used, instead
+ //of window.innerWidth/document.documentElement.clientWidth
+ //so we have to check whether it is opera
+ w = _window.innerWidth;
+ h = _window.innerHeight;
+ }else if(dojo.isIE && de && deh){
+ w = dew;
+ h = deh;
+ }else if(dojo.body().clientWidth){
+ // IE5, Opera
+ w = dojo.body().clientWidth;
+ h = dojo.body().clientHeight;
+ }
+
+ // get scroll position
+ var scroll = dojo._docScroll();
+
+ return { w: w, h: h, l: scroll.x, t: scroll.y }; // object
+};
+
+dijit.placeOnScreen = function(
+ /* DomNode */ node,
+ /* Object */ pos,
+ /* Object */ corners,
+ /* boolean? */ tryOnly){
+ // summary:
+ // Keeps 'node' in the visible area of the screen while trying to
+ // place closest to pos.x, pos.y. The input coordinates are
+ // expected to be the desired document position.
+ //
+ // Set which corner(s) you want to bind to, such as
+ //
+ // placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
+ //
+ // The desired x/y will be treated as the topleft(TL)/topright(TR) or
+ // BottomLeft(BL)/BottomRight(BR) corner of the node. Each corner is tested
+ // and if a perfect match is found, it will be used. Otherwise, it goes through
+ // all of the specified corners, and choose the most appropriate one.
+ //
+ // NOTE: node is assumed to be absolutely or relatively positioned.
+
+ var choices = dojo.map(corners, function(corner){ return { corner: corner, pos: pos }; });
+
+ 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 = dijit.getViewport();
+
+ // 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 = (corner.charAt(1) == 'L' ? pos.x : Math.max(view.l, pos.x - mb.w)),
+ startY = (corner.charAt(0) == 'T' ? pos.y : Math.max(view.t, pos.y - mb.h)),
+ endX = (corner.charAt(1) == 'L' ? Math.min(view.l + view.w, startX + mb.w) : pos.x),
+ endY = (corner.charAt(0) == 'T' ? Math.min(view.t + view.h, 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.placeOnScreenAroundElement = function(
+ /* DomNode */ node,
+ /* DomNode */ aroundNode,
+ /* Object */ aroundCorners,
+ /* Function */ layoutNode){
+
+ // summary
+ // Like placeOnScreen, except it accepts aroundNode instead of x,y
+ // and attempts to place node around it. Uses margin box dimensions.
+ //
+ // aroundCorners
+ // specify Which corner of aroundNode should be
+ // used to place the node => which corner(s) of node to use (see the
+ // corners parameter in dijit.placeOnScreen)
+ // e.g. {'TL': 'BL', 'BL': 'TL'}
+ //
+ // 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 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 aroundNodeW = aroundNode.offsetWidth; //mb.w;
+ var aroundNodeH = aroundNode.offsetHeight; //mb.h;
+ var aroundNodePos = dojo.coords(aroundNode, true);
+ aroundNode.style.display=oldDisplay;
+
+ // Generate list of possible positions for node
+ var choices = [];
+ for(var nodeCorner in aroundCorners){
+ choices.push( {
+ aroundCorner: nodeCorner,
+ corner: aroundCorners[nodeCorner],
+ pos: {
+ x: aroundNodePos.x + (nodeCorner.charAt(1) == 'L' ? 0 : aroundNodeW),
+ y: aroundNodePos.y + (nodeCorner.charAt(0) == 'T' ? 0 : aroundNodeH)
+ }
+ });
+ }
+
+ return dijit._place(node, choices, layoutNode);
+}
+
+}
diff --git a/includes/js/dijit/_base/popup.js b/includes/js/dijit/_base/popup.js
new file mode 100644
index 0000000..6cb4dfc
--- /dev/null
+++ b/includes/js/dijit/_base/popup.js
@@ -0,0 +1,269 @@
+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 = new function(){
+ // summary:
+ // This class is used to show/hide widgets as popups.
+ //
+
+ var stack = [],
+ beginZIndex=1000,
+ idGen = 1;
+
+ this.prepare = function(/*DomNode*/ node){
+ // summary:
+ // Prepares a node to be used as a popup
+ //
+ // description:
+ // Attaches node to dojo.doc.body, and
+ // positions it 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
+
+ dojo.body().appendChild(node);
+ var s = node.style;
+ if(s.display == "none"){
+ s.display="";
+ }
+ s.visibility = "hidden"; // not needed for hiding, but used as flag that node is off-screen
+ s.position = "absolute";
+ s.top = "-9999px";
+ };
+
+ this.open = function(/*Object*/ args){
+ // summary:
+ // Popup the widget at the specified position
+ //
+ // args: Object
+ // 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
+ // orient: Object
+ // structure specifying possible positions of popup relative to "around" node
+ // 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);
+ // ie: 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)
+ //
+ // examples:
+ // 1. opening at the mouse position
+ // dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
+ // 2. 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 it's own _onBlur callback
+ // (fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
+
+ var widget = args.popup,
+ orient = args.orient || {'BL':'TL', 'TL':'BL'},
+ around = args.around,
+ id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+idGen++);
+
+ // make wrapper div to hold widget and possibly hold iframe behind it.
+ // we can't attach the iframe as a child of the widget.domNode because
+ // widget.domNode might be a <table>, <ul>, etc.
+ var wrapper = dojo.doc.createElement("div");
+ dijit.setWaiRole(wrapper, "presentation");
+ wrapper.id = id;
+ wrapper.className="dijitPopup";
+ wrapper.style.zIndex = beginZIndex + stack.length;
+ wrapper.style.visibility = "hidden";
+ if(args.parent){
+ wrapper.dijitPopupParent=args.parent.id;
+ }
+ dojo.body().appendChild(wrapper);
+
+ var s = widget.domNode.style;
+ s.display = "";
+ s.visibility = "";
+ s.position = "";
+ wrapper.appendChild(widget.domNode);
+
+ var iframe = new dijit.BackgroundIframe(wrapper);
+
+ // position the wrapper node
+ 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']);
+
+ wrapper.style.visibility = "visible";
+ // TODO: use effects to fade in wrapper
+
+ var handlers = [];
+
+ // 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 getTopPopup = function(){
+ 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];
+ }
+
+ // 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.keyCode == dojo.keys.ESCAPE && args.onCancel){
+ dojo.stopEvent(evt);
+ args.onCancel();
+ }else if(evt.keyCode == dojo.keys.TAB){
+ dojo.stopEvent(evt);
+ var topPopup = 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", null, args.onCancel));
+ }
+
+ handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+ var topPopup = 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){
+ widget.onOpen(best);
+ }
+
+ return best;
+ };
+
+ this.close = function(/*Widget*/ popup){
+ // summary:
+ // Close specified popup and any popups that it parented
+ 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){
+ widget.onClose();
+ }
+ dojo.forEach(top.handlers, dojo.disconnect);
+
+ // #2685: check if the widget still has a domNode so ContentPane can change its URL without getting an error
+ if(!widget||!widget.domNode){ return; }
+
+ this.prepare(widget.domNode);
+
+ iframe.destroy();
+ dojo._destroyElement(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 html="<iframe src='javascript:\"\"'"
+ + " style='position: absolute; left: 0px; top: 0px;"
+ + "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+ iframe = dojo.doc.createElement(html);
+ }else{
+ iframe = dojo.doc.createElement("iframe");
+ iframe.src = 'javascript:""';
+ iframe.className = "dijitBackgroundIframe";
+ }
+ iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
+ dojo.body().appendChild(iframe);
+ }
+ return iframe;
+ };
+
+ this.push = function(iframe){
+ iframe.style.display="";
+ if(dojo.isIE){
+ iframe.style.removeExpression("width");
+ iframe.style.removeExpression("height");
+ }
+ queue.push(iframe);
+ }
+}();
+
+// fill the queue
+if(dojo.isIE && dojo.isIE < 7){
+ dojo.addOnLoad(function(){
+ var f = dijit._frames;
+ dojo.forEach([f.pop()], f.push);
+ });
+}
+
+
+dijit.BackgroundIframe = function(/* DomNode */node){
+ // summary:
+ // For IE 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.isIE < 7) || (dojo.isFF && dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+ var iframe = dijit._frames.pop();
+ node.appendChild(iframe);
+ if(dojo.isIE){
+ iframe.style.setExpression("width", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetWidth");
+ iframe.style.setExpression("height", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetHeight");
+ }
+ this.iframe = iframe;
+ }
+};
+
+dojo.extend(dijit.BackgroundIframe, {
+ destroy: function(){
+ // summary: destroy the iframe
+ if(this.iframe){
+ dijit._frames.push(this.iframe);
+ delete this.iframe;
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/_base/scroll.js b/includes/js/dijit/_base/scroll.js
new file mode 100644
index 0000000..2aeac5a
--- /dev/null
+++ b/includes/js/dijit/_base/scroll.js
@@ -0,0 +1,29 @@
+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){
+ // summary
+ // Scroll the passed node into view, if it is not.
+
+ // don't rely on that node.scrollIntoView works just because the function is there
+ // it doesnt work in Konqueror or Opera even though the function is there and probably
+ // not safari either
+ // native scrollIntoView() causes FF3's whole window to scroll if there is no scroll bar
+ // on the immediate parent
+ // dont like browser sniffs implementations but sometimes you have to use it
+ // #6146: IE scrollIntoView is broken
+ // It's not enough just to scroll the menu node into view if
+ // node.scrollIntoView hides part of the parent's scrollbar,
+ // so just manage the parent scrollbar ourselves
+ var parent = node.parentNode;
+ var parentBottom = parent.scrollTop + dojo.marginBox(parent).h; //PORT was getBorderBox
+ var nodeBottom = node.offsetTop + dojo.marginBox(node).h;
+ if(parentBottom < nodeBottom){
+ parent.scrollTop += (nodeBottom - parentBottom);
+ }else if(parent.scrollTop > node.offsetTop){
+ parent.scrollTop -= (parent.scrollTop - node.offsetTop);
+ }
+};
+
+}
diff --git a/includes/js/dijit/_base/sniff.js b/includes/js/dijit/_base/sniff.js
new file mode 100644
index 0000000..30835cc
--- /dev/null
+++ b/includes/js/dijit/_base/sniff.js
@@ -0,0 +1,45 @@
+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");
+
+// ported from dojo.html.applyBrowserClass (style.js)
+
+// summary:
+// Applies pre-set class names based on browser & version to the
+// top-level HTML node. Simply doing a require on this module will
+// establish this CSS. Modified version of Morris' CSS hack.
+(function(){
+ var d = dojo;
+ var ie = d.isIE;
+ var opera = d.isOpera;
+ var maj = Math.floor;
+ var ff = d.isFF;
+ var classes = {
+ dj_ie: ie,
+// dj_ie55: ie == 5.5,
+ dj_ie6: maj(ie) == 6,
+ dj_ie7: maj(ie) == 7,
+ dj_iequirks: ie && d.isQuirks,
+// NOTE: Opera not supported by dijit
+ dj_opera: opera,
+ dj_opera8: maj(opera) == 8,
+ dj_opera9: maj(opera) == 9,
+ dj_khtml: d.isKhtml,
+ dj_safari: d.isSafari,
+ dj_gecko: d.isMozilla,
+ dj_ff2: maj(ff) == 2
+ }; // no dojo unsupported browsers
+
+ for(var p in classes){
+ if(classes[p]){
+ var html = dojo.doc.documentElement; //TODO browser-specific DOM magic needed?
+ if(html.className){
+ html.className += " " + p;
+ }else{
+ html.className = p;
+ }
+ }
+ }
+})();
+
+}
diff --git a/includes/js/dijit/_base/typematic.js b/includes/js/dijit/_base/typematic.js
new file mode 100644
index 0000000..9500839
--- /dev/null
+++ b/includes/js/dijit/_base/typematic.js
@@ -0,0 +1,139 @@
+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);
+ this._currentTimeout = (this._currentTimeout < 0) ? this._initialDelay : ((this._subsequentDelay > 1) ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay));
+ 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){
+ // 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.
+ // Parameters:
+ // evt: key or mouse event object to pass to the user callback
+ // _this: pointer to the user's widget space.
+ // node: the DOM node object to pass the the callback function
+ // callback: function to call until the sequence is stopped called with 3 parameters:
+ // count: integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped
+ // node: the DOM node object passed in
+ // evt: key or mouse event object
+ // obj: user space object used to uniquely identify each typematic sequence
+ // subsequentDelay: if > 1, the number of milliseconds until the 3->n events occur
+ // or else the fractional time multiplier for the next event's delay, default=0.9
+ // initialDelay: the number of milliseconds until the 2nd event occurs, default=500ms
+ if(obj != this._obj){
+ this.stop();
+ this._initialDelay = initialDelay || 500;
+ this._subsequentDelay = subsequentDelay || 0.90;
+ this._obj = obj;
+ this._evt = evt;
+ this._node = node;
+ this._currentTimeout = -1;
+ this._count = -1;
+ this._callback = dojo.hitch(_this, callback);
+ this._fireEventAndReload();
+ }
+ },
+
+ stop: function(){
+ // summary:
+ // Stop an ongoing timed, repeating callback sequence.
+ if(this._timer){
+ clearTimeout(this._timer);
+ this._timer = null;
+ }
+ if(this._obj){
+ this._callback(-1, this._node, this._evt);
+ this._obj = null;
+ }
+ },
+
+ addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+ // summary: Start listening for a specific typematic key.
+ // keyObject: an object defining the key to listen for.
+ // key: (mandatory) the keyCode (number) or character (string) to listen for.
+ // ctrlKey: desired ctrl key state to initiate the calback 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
+ // See the trigger method for other parameters.
+ // Returns an array of dojo.connect handles
+ return [
+ dojo.connect(node, "onkeypress", this, function(evt){
+ if(evt.keyCode == keyObject.keyCode && (!keyObject.charCode || keyObject.charCode == evt.charCode) &&
+ (keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
+ (keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
+ (keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+ dojo.stopEvent(evt);
+ dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
+ }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){
+ // 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);
+ }),
+ 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){
+ dojo.stopEvent(evt);
+ }),
+ dc(node, "dblclick", this, function(evt){
+ dojo.stopEvent(evt);
+ if(dojo.isIE){
+ dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+ setTimeout(dojo.hitch(this, dijit.typematic.stop), 50);
+ }
+ })
+ ];
+ },
+
+ addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+ // summary: Start listening for a specific typematic key and mouseclick.
+ // This is a thin wrapper to addKeyListener and addMouseListener.
+ // mouseNode: the DOM node object to listen on for mouse events.
+ // keyNode: the DOM node object to listen on for key events.
+ // See the addMouseListener and addKeyListener methods for other parameters.
+ // Returns an array of dojo.connect handles
+ return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay).concat(
+ this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay));
+ }
+};
+
+}
diff --git a/includes/js/dijit/_base/wai.js b/includes/js/dijit/_base/wai.js
new file mode 100644
index 0000000..a9d47a2
--- /dev/null
+++ b/includes/js/dijit/_base/wai.js
@@ -0,0 +1,143 @@
+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.doc.createElement("div");
+ div.id = "a11yTestNode";
+ div.style.cssText = 'border: 1px solid;'
+ + 'border-color:red green;'
+ + 'position: absolute;'
+ + 'height: 5px;'
+ + 'top: -999px;'
+ + 'background-image: url("' + dojo.moduleUrl("dojo", "resources/blank.gif") + '");';
+ dojo.body().appendChild(div);
+
+ // 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");
+ dojo.body().removeChild(div);
+ }
+ }
+};
+
+// Test if computer is in high contrast mode.
+// Make sure the a11y test runs first, before widgets are instantiated.
+if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up
+ dojo._loaders.unshift(dijit.wai.onload);
+}
+
+dojo.mixin(dijit,
+{
+ hasWaiRole: function(/*Element*/ elem){
+ // summary: Determines if an element has a role.
+ // returns: true if elem has a role attribute and false if not.
+ return elem.hasAttribute ? elem.hasAttribute("role") : !!elem.getAttribute("role");
+ },
+
+ getWaiRole: function(/*Element*/ elem){
+ // summary: Gets the role for an element.
+ // returns:
+ // The role of elem or an empty string if elem
+ // does not have a role.
+ var value = elem.getAttribute("role");
+ if(value){
+ var prefixEnd = value.indexOf(":");
+ return prefixEnd == -1 ? value : value.substring(prefixEnd+1);
+ }else{
+ return "";
+ }
+ },
+
+ setWaiRole: function(/*Element*/ elem, /*String*/ role){
+ // summary: Sets the role on an element.
+ // description:
+ // On Firefox 2 and below, "wairole:" is
+ // prepended to the provided role value.
+ elem.setAttribute("role", (dojo.isFF && dojo.isFF < 3) ? "wairole:" + role : role);
+ },
+
+ removeWaiRole: function(/*Element*/ elem){
+ // summary: Removes the role from an element.
+ elem.removeAttribute("role");
+ },
+
+ hasWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary: Determines if an element has a given state.
+ // description:
+ // On Firefox 2 and below, we check for an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we check for an attribute
+ // called "aria-"+state.
+ // returns:
+ // true if elem has a value for the given state and
+ // false if it does not.
+ if(dojo.isFF && dojo.isFF < 3){
+ return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ 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:
+ // On Firefox 2 and below, we check for an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we check 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.
+ if(dojo.isFF && dojo.isFF < 3){
+ return elem.getAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ var value = elem.getAttribute("aria-"+state);
+ return value ? value : "";
+ }
+ },
+
+ setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+ // summary: Sets a state on an element.
+ // description:
+ // On Firefox 2 and below, we set an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we set an attribute called
+ // "aria-"+state.
+ if(dojo.isFF && dojo.isFF < 3){
+ elem.setAttributeNS("http://www.w3.org/2005/07/aaa",
+ "aaa:"+state, value);
+ }else{
+ elem.setAttribute("aria-"+state, value);
+ }
+ },
+
+ removeWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary: Removes a state from an element.
+ // description:
+ // On Firefox 2 and below, we remove the attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we remove the attribute called
+ // "aria-"+state.
+ if(dojo.isFF && dojo.isFF < 3){
+ elem.removeAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ elem.removeAttribute("aria-"+state);
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/_base/window.js b/includes/js/dijit/_base/window.js
new file mode 100644
index 0000000..c1bbb54
--- /dev/null
+++ b/includes/js/dijit/_base/window.js
@@ -0,0 +1,47 @@
+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){
+ // summary
+ // Get window object associated with document doc
+
+ // With Safari, there is not way to retrieve the window from the document, so we must fix it.
+ if(dojo.isSafari && !doc._parentWindow){
+ /*
+ This is a Safari specific function that fix the reference to the parent
+ window from the document object.
+ TODO: #5711: should the use of document below reference dojo.doc instead
+ in case they're not the same?
+ */
+ var fix=function(win){
+ win.document._parentWindow=win;
+ for(var i=0; i<win.frames.length; i++){
+ fix(win.frames[i]);
+ }
+ }
+ fix(window.top);
+ }
+
+ //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
+ //TODO: #5711: should the use of document below reference dojo.doc instead in case they're not the same?
+ if(dojo.isIE && window !== document.parentWindow && !doc._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.parentWindow || doc.defaultView; // Window
+}
+
+}
diff --git a/includes/js/dijit/_editor/RichText.js b/includes/js/dijit/_editor/RichText.js
new file mode 100644
index 0000000..9ece365
--- /dev/null
+++ b/includes/js/dijit/_editor/RichText.js
@@ -0,0 +1,1449 @@
+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._editor.selection");
+dojo.require("dijit._editor.html");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit.form", "Textarea", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+// 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";
+ var s = savetextarea.style;
+ s.display='none';
+ s.position='absolute';
+ s.top="-100px";
+ s.left="-100px";
+ s.height="3px";
+ s.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, {
+ constructor: function(){
+ // summary:
+ // dijit._editor.RichText is the core of the WYSIWYG editor in dojo, which
+ // provides the basic editing features. It also encapsulates the differences
+ // of different js engines for various browsers
+ //
+ // contentPreFilters: Array
+ // pre content filter function register array.
+ // these filters will be executed before the actual
+ // editing area get the html content
+ this.contentPreFilters = [];
+
+ // contentPostFilters: Array
+ // post content filter function register array.
+ // these will be used on the resulting html
+ // from contentDomPostFilters. The resuling
+ // content is the final html (returned by getValue())
+ this.contentPostFilters = [];
+
+ // contentDomPreFilters: Array
+ // 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: Array
+ // 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: Array
+ // array to store all the stylesheets applied to the editing area
+ this.editingAreaStyleSheets=[];
+
+ this._keyHandlers = {};
+ this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
+ if(dojo.isMoz){
+ this.contentPreFilters.push(this._fixContentForMoz);
+ this.contentPostFilters.push(this._removeMozBogus);
+ }else if(dojo.isSafari){
+ this.contentPostFilters.push(this._removeSafariBogus);
+ }
+ //this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
+
+ this.onLoadDeferred = new dojo.Deferred();
+ },
+
+ // inheritWidth: Boolean
+ // whether to inherit the parent's width or simply use 100%
+ inheritWidth: false,
+
+ // focusOnLoad: Boolean
+ // whether focusing into this instance of richtext when page onload
+ focusOnLoad: false,
+
+ // name: String
+ // If a save name is specified the content is saved and restored when the user
+ // leave this page can come back, or if the editor is not properly closed after
+ // editing has started.
+ name: "",
+
+ // styleSheets: String
+ // semicolon (";") separated list of css files for the editing area
+ styleSheets: "",
+
+ // _content: 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=""
+ height: "300px",
+
+ // minHeight: String
+ // The minimum height that the editor should have
+ minHeight: "1em",
+
+ // isClosed: Boolean
+ isClosed: true,
+
+ // isLoaded: Boolean
+ isLoaded: false,
+
+ // _SEPARATOR: String
+ // used to concat contents from multiple textareas into a single string
+ _SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@",
+
+ // onLoadDeferred: dojo.Deferred
+ // deferred which is fired when the editor finishes loading
+ onLoadDeferred: null,
+
+ postCreate: function(){
+ // summary: init
+ 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.
+ var exec = function(cmd, arg){
+ return arguments.length == 1 ? function(){ this.execCommand(cmd); } :
+ function(){ this.execCommand(cmd, arg); };
+ };
+
+ var ctrlKeyHandlers = { b: exec("bold"),
+ i: exec("italic"),
+ u: exec("underline"),
+ a: exec("selectall"),
+ s: function(){ this.save(true); },
+
+ "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, this.KEY_CTRL, ctrlKeyHandlers[key]);
+ }
+ },
+
+ // events: Array
+ // events which should be connected to the underlying editing area
+ events: ["onKeyPress", "onKeyDown", "onKeyUp", "onClick"],
+
+ // events: Array
+ // events which should be connected to the underlying editing
+ // area, events in this array will be addListener with
+ // capture=true
+ captureEvents: [],
+
+ _editorCommandsLocalized: false,
+ _localizeEditorCommands: function(){
+ 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
+
+ //in the array below, ul can not come directly after ol,
+ //otherwise the queryCommandValue returns Normal for it
+ var formats = ['p', 'pre', 'address', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'div', 'ul'];
+ var localhtml = "", format, i=0;
+ while((format=formats[i++])){
+ if(format.charAt(1) != 'l'){
+ localhtml += "<"+format+"><span>content</span></"+format+">";
+ }else{
+ localhtml += "<"+format+"><li>content</li></"+format+">";
+ }
+ }
+ //queryCommandValue returns empty if we hide editNode, so move it out of screen temporary
+ var div=dojo.doc.createElement('div');
+ div.style.position = "absolute";
+ div.style.left = "-2000px";
+ div.style.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] = dojo.doc.queryCommandValue("formatblock");//this.queryCommandValue("formatblock");
+ this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
+ node = node.nextSibling;
+ }
+ dojo.doc.body.removeChild(div);
+ },
+
+ open: function(/*DomNode?*/element){
+ // summary:
+ // Transforms the node referenced in this.domNode into a rich text editing
+ // node. This will result in the creation and replacement with an <iframe>
+ // if designMode(FF)/contentEditable(IE) is used.
+
+ 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"])){ this.domNode = element; } // else unchanged
+
+ var html;
+ if( (this.domNode["nodeName"])&&
+ (this.domNode.nodeName.toLowerCase() == "textarea")){
+ // if we were created from a textarea, then we need to create a
+ // new editing harness node.
+ this.textarea = this.domNode;
+ this.name=this.textarea.name;
+ html = this._preFilterContent(this.textarea.value);
+ this.domNode = dojo.doc.createElement("div");
+ this.domNode.setAttribute('widgetId',this.id);
+ this.textarea.removeAttribute('widgetId');
+ this.domNode.cssText = this.textarea.cssText;
+ this.domNode.className += " "+this.textarea.className;
+ dojo.place(this.domNode, this.textarea, "before");
+ var tmpFunc = dojo.hitch(this, function(){
+ //some browsers refuse to submit display=none textarea, so
+ //move the textarea out of screen instead
+ dojo.attr(this.textarea, 'tabIndex', '-1');
+ with(this.textarea.style){
+ display = "block";
+ position = "absolute";
+ left = top = "-1000px";
+
+ if(dojo.isIE){ //nasty IE bug: abnormal formatting if overflow is not hidden
+ this.__overflow = overflow;
+ overflow = "hidden";
+ }
+ }
+ });
+ if(dojo.isIE){
+ setTimeout(tmpFunc, 10);
+ }else{
+ tmpFunc();
+ }
+
+ // this.domNode.innerHTML = html;
+
+// if(this.textarea.form){
+// // FIXME: port: this used to be before advice!!!
+// dojo.connect(this.textarea.form, "onsubmit", this, function(){
+// // FIXME: should we be calling close() here instead?
+// this.textarea.value = this.getValue();
+// });
+// }
+ }else{
+ html = this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));
+ this.domNode.innerHTML = '';
+ }
+ if(html == ""){ html = "&nbsp;"; }
+
+ var content = dojo.contentBox(this.domNode);
+ // var content = dojo.contentBox(this.srcNodeRef);
+ this._oldHeight = content.h;
+ this._oldWidth = content.w;
+
+ // 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( (this.domNode["nodeName"]) &&
+ (this.domNode.nodeName == "LI") ){
+ this.domNode.innerHTML = " <br>";
+ }
+
+ this.editingArea = dojo.doc.createElement("div");
+ this.domNode.appendChild(this.editingArea);
+
+ 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);
+ break;
+ }
+ }
+ }
+
+ // FIXME: need to do something different for Opera/Safari
+ this.connect(window, "onbeforeunload", "_saveContent");
+ // dojo.connect(window, "onunload", this, "_saveContent");
+ }
+
+ this.isClosed = false;
+ // Safari's selections go all out of whack if we do it inline,
+ // so for now IE is our only hero
+ //if(typeof dojo.doc.body.contentEditable != "undefined"){
+ if(dojo.isIE || dojo.isSafari || dojo.isOpera){ // contentEditable, easy
+
+ if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+ console.debug("dijit._editor.RichText: 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");
+ }
+
+ var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"");
+ var ifr = this.editorObject = this.iframe = dojo.doc.createElement('iframe');
+ ifr.id = this.id+"_iframe";
+ ifr.src = burl;
+ ifr.style.border = "none";
+ ifr.style.width = "100%";
+ ifr.frameBorder = 0;
+ // ifr.style.scrolling = this.height ? "auto" : "vertical";
+ this.editingArea.appendChild(ifr);
+ var h = null; // set later in non-ie6 branch
+ var loadFunc = dojo.hitch( this, function(){
+ if(h){ dojo.disconnect(h); h = null; }
+ this.window = ifr.contentWindow;
+ var d = this.document = this.window.document;
+ d.open();
+ d.write(this._getIframeDocTxt(html));
+ d.close();
+
+ 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;
+ }
+
+ if(dojo.isIE){
+ this._localizeEditorCommands();
+ }
+
+ this.onLoad();
+ this.savedContent = this.getValue(true);
+ });
+ if(dojo.isIE && dojo.isIE < 7){ // IE 6 is a steaming pile...
+ var t = setInterval(function(){
+ if(ifr.contentWindow.isLoaded){
+ clearInterval(t);
+ loadFunc();
+ }
+ }, 100);
+ }else{ // blissful sanity!
+ h = dojo.connect(
+ ((dojo.isIE) ? ifr.contentWindow : ifr), "onload", loadFunc
+ );
+ }
+ }else{ // designMode in iframe
+ this._drawIframe(html);
+ this.savedContent = this.getValue(true);
+ }
+
+ // TODO: this is a guess at the default line-height, kinda works
+ if(this.domNode.nodeName == "LI"){ this.domNode.lastChild.style.marginTop = "-1.2em"; }
+ this.domNode.className += " RichTextEditable";
+ },
+
+ //static cache variables shared among all instance of this class
+ _local2NativeFormatNames: {},
+ _native2LocalFormatNames: {},
+ _localizedIframeTitles: null,
+
+ _getIframeDocTxt: function(/* String */ html){
+ var _cs = dojo.getComputedStyle(this.domNode);
+ if(dojo.isIE || (!this.height && !dojo.isMoz)){
+ html="<div>"+html+"</div>";
+ }
+ 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{
+ lineHeight = "1.0";
+ }
+ return [
+ this.isLeftToRight() ? "<html><head>" : "<html dir='rtl'><head>",
+ (dojo.isMoz ? "<title>" + this._localizedIframeTitles.iframeEditTitle + "</title>" : ""),
+ "<style>",
+ "body,html {",
+ " background:transparent;",
+ " font:", font, ";",
+ " padding: 1em 0 0 0;",
+ " margin: -1em 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+ " height: 100%;",
+ "}",
+ // TODO: left positioning will cause contents to disappear out of view
+ // if it gets too wide for the visible area
+ "body{",
+ " top:0px; left:0px; right:0px;",
+ ((this.height||dojo.isOpera) ? "" : "position: fixed;"),
+ // FIXME: IE 6 won't understand min-height?
+ " min-height:", this.minHeight, ";",
+ " line-height:", lineHeight,
+ "}",
+ "p{ margin: 1em 0 !important; }",
+ (this.height ? // height:auto undoes the height:100%
+ "" : "body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"
+ ),
+ "li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ",
+ "li{ min-height:1.2em; }",
+ "</style>",
+ this._applyEditingAreaStyleSheets(),
+ "</head><body>"+html+"</body></html>"
+ ].join(""); // String
+ },
+
+ _drawIframe: function(/*String*/html){
+ // summary:
+ // Draws an iFrame using the existing one if one exists.
+ // Used by Mozilla, Safari, and Opera
+
+ if(!this.iframe){
+ var ifr = this.iframe = dojo.doc.createElement("iframe");
+ ifr.id=this.id;
+ // this.iframe.src = "about:blank";
+ // dojo.doc.body.appendChild(this.iframe);
+ // console.debug(this.iframe.contentDocument.open());
+ // dojo.body().appendChild(this.iframe);
+ var ifrs = ifr.style;
+ // ifrs.border = "1px solid black";
+ ifrs.border = "none";
+ ifrs.lineHeight = "0"; // squash line height
+ ifrs.verticalAlign = "bottom";
+// ifrs.scrolling = this.height ? "auto" : "vertical";
+ this.editorObject = this.iframe;
+ // get screen reader text for mozilla here, too
+ this._localizedIframeTitles = dojo.i18n.getLocalization("dijit.form", "Textarea");
+ // need to find any associated label element and update iframe document title
+ var label=dojo.query('label[for="'+this.id+'"]');
+ if(label.length){
+ this._localizedIframeTitles.iframeEditTitle = label[0].innerHTML + " " + this._localizedIframeTitles.iframeEditTitle;
+ }
+ }
+ // opera likes this to be outside the with block
+ // this.iframe.src = "javascript:void(0)";//dojo.uri.dojoUri("src/widget/templates/richtextframe.html") + ((dojo.doc.domain != currentDomain) ? ("#"+dojo.doc.domain) : "");
+ this.iframe.style.width = this.inheritWidth ? this._oldWidth : "100%";
+
+ if(this.height){
+ this.iframe.style.height = this.height;
+ }else{
+ this.iframe.height = this._oldHeight;
+ }
+
+ var tmpContent;
+ if(this.textarea){
+ tmpContent = this.srcNodeRef;
+ }else{
+ tmpContent = dojo.doc.createElement('div');
+ tmpContent.style.display="none";
+ tmpContent.innerHTML = html;
+ //append tmpContent to under the current domNode so that the margin
+ //calculation below is correct
+ this.editingArea.appendChild(tmpContent);
+ }
+
+ this.editingArea.appendChild(this.iframe);
+
+ //do we want to show the content before the editing area finish loading here?
+ //if external style sheets are used for the editing area, the appearance now
+ //and after loading of the editing area won't be the same (and padding/margin
+ //calculation above may not be accurate)
+ // tmpContent.style.display = "none";
+ // this.editingArea.appendChild(this.iframe);
+
+ var _iframeInitialized = false;
+ // console.debug(this.iframe);
+ // var contentDoc = this.iframe.contentWindow.document;
+
+
+ // note that on Safari lower than 420+, we have to get the iframe
+ // by ID in order to get something w/ a contentDocument property
+
+ var contentDoc = this.iframe.contentDocument;
+ contentDoc.open();
+ if(dojo.isAIR){
+ contentDoc.body.innerHTML = html;
+ }else{
+ contentDoc.write(this._getIframeDocTxt(html));
+ }
+ contentDoc.close();
+
+ // now we wait for onload. Janky hack!
+ var ifrFunc = dojo.hitch(this, function(){
+ if(!_iframeInitialized){
+ _iframeInitialized = true;
+ }else{ return; }
+ if(!this.editNode){
+ try{
+ if(this.iframe.contentWindow){
+ this.window = this.iframe.contentWindow;
+ this.document = this.iframe.contentWindow.document
+ }else if(this.iframe.contentDocument){
+ // for opera
+ this.window = this.iframe.contentDocument.window;
+ this.document = this.iframe.contentDocument;
+ }
+ if(!this.document.body){
+ throw 'Error';
+ }
+ }catch(e){
+ setTimeout(ifrFunc,500);
+ _iframeInitialized = false;
+ return;
+ }
+
+ dojo._destroyElement(tmpContent);
+ this.onLoad();
+ }else{
+ dojo._destroyElement(tmpContent);
+ this.editNode.innerHTML = html;
+ this.onDisplayChanged();
+ }
+ this._preDomFilterContent(this.editNode);
+ });
+
+ ifrFunc();
+ },
+
+ _applyEditingAreaStyleSheets: function(){
+ // summary:
+ // apply the specified css files in styleSheets
+ 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);
+ 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");
+ with(stylesheet){
+ rel="stylesheet";
+ type="text/css";
+ 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: true,
+ _mozSettingProps: ['styleWithCSS','insertBrOnReturn'],
+ setDisabled: function(/*Boolean*/ disabled){
+ if(dojo.isIE || dojo.isSafari || dojo.isOpera){
+ if(dojo.isIE){ this.editNode.unselectable = "on"; } // prevent IE from setting focus
+ this.editNode.contentEditable = !disabled;
+ if(dojo.isIE){
+ var _this = this;
+ setTimeout(function(){ _this.editNode.unselectable = "off"; }, 0);
+ }
+ }else{ //moz
+ if(disabled){
+ //AP: why isn't this set in the constructor, or put in mozSettingProps as a hash?
+ this._mozSettings=[false,this.blockNodeForEnter==='BR'];
+ }
+ this.document.designMode=(disabled?'off':'on');
+ if(!disabled && this._mozSettings){
+ dojo.forEach(this._mozSettingProps, function(s,i){
+ this.document.execCommand(s,false,this._mozSettings[i]);
+ },this);
+ }
+// this.document.execCommand('contentReadOnly', false, disabled);
+// if(disabled){
+// this.blur(); //to remove the blinking caret
+// }
+ }
+ this.disabled = disabled;
+ },
+
+/* Event handlers
+ *****************/
+
+ _isResized: function(){ return false; },
+
+ onLoad: function(/* Event */ e){
+ // summary: handler after the content of the document finishes loading
+ this.isLoaded = true;
+ if(!this.window.__registeredWindow){
+ this.window.__registeredWindow=true;
+ dijit.registerWin(this.window);
+ }
+ if(!dojo.isIE && (this.height || dojo.isMoz)){
+ this.editNode=this.document.body;
+ }else{
+ 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(); }
+ }
+ }
+
+ try{
+ this.setDisabled(false);
+ }catch(e){
+ // Firefox throws an exception if the editor is initially hidden
+ // so, if this fails, try again onClick by adding "once" advice
+ var handle = dojo.connect(this, "onClick", this, function(){
+ this.setDisabled(false);
+ dojo.disconnect(handle);
+ });
+ }
+
+ this._preDomFilterContent(this.editNode);
+
+ var events=this.events.concat(this.captureEvents),i=0,et;
+ while((et=events[i++])){
+ this.connect(this.document, et.toLowerCase(), et);
+ }
+ if(!dojo.isIE){
+ try{ // sanity check for Mozilla
+ //AP: what's the point of this?
+// this.document.execCommand("useCSS", false, true); // old moz call
+ this.document.execCommand("styleWithCSS", false, false); // new moz call
+ //this.document.execCommand("insertBrOnReturn", false, false); // new moz call
+ }catch(e2){ }
+ // FIXME: when scrollbars appear/disappear this needs to be fired
+ }else{ // IE contentEditable
+ // give the node Layout on IE
+ this.connect(this.document, "onmousedown", "_onMouseDown"); // #4996 fix focus
+ this.editNode.style.zoom = 1.0;
+ }
+
+ if(this.focusOnLoad){
+ setTimeout(dojo.hitch(this, "focus"), 0); // have to wait for IE to set unselectable=off
+ }
+
+ this.onDisplayChanged(e);
+ if(this.onLoadDeferred){
+ this.onLoadDeferred.callback(true);
+ }
+ },
+
+ onKeyDown: function(/* Event */ e){
+ // summary: Fired on keydown
+
+ // 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(dojo.isIE){
+ if(e.keyCode == dojo.keys.TAB && e.shiftKey && !e.ctrlKey && !e.altKey){
+ // focus the BODY so the browser will tab away from it instead
+ this.iframe.focus();
+ }else if(e.keyCode == dojo.keys.TAB && !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);
+ }
+ }else if(dojo.isMoz){
+ if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+ // update iframe document title for screen reader
+ this.iframe.contentDocument.title = this._localizedIframeTitles.iframeFocusTitle;
+
+ // Place focus on the iframe. A subsequent tab or shift tab will put focus
+ // on the correct control.
+ this.iframe.focus(); // this.focus(); won't work
+ dojo.stopEvent(e);
+ }else if(e.keyCode == dojo.keys.TAB && e.shiftKey){
+ // if there is a toolbar, set focus to it, otherwise ignore
+ if(this.toolbar){
+ this.toolbar.focus();
+ }
+ dojo.stopEvent(e);
+ }
+ }
+ },
+
+ onKeyUp: function(e){
+ // summary: Fired on keyup
+ return;
+ },
+
+ KEY_CTRL: 1,
+ KEY_SHIFT: 2,
+
+ onKeyPress: function(e){
+ // summary: Fired on keypress
+
+ // handle the various key events
+ var modifiers = (e.ctrlKey && !e.altKey) ? this.KEY_CTRL : 0 | e.shiftKey ? this.KEY_SHIFT : 0;
+
+ var key = e.keyChar || e.keyCode;
+ if(this._keyHandlers[key]){
+ // console.debug("char:", e.key);
+ var handlers = this._keyHandlers[key], i = 0, h;
+ while((h = handlers[i++])){
+ if(modifiers == h.modifiers){
+ if(!h.handler.apply(this,arguments)){
+ e.preventDefault();
+ }
+ break;
+ }
+ }
+ }
+
+ // function call after the character has been inserted
+ setTimeout(dojo.hitch(this, function(){
+ this.onKeyPressed(e);
+ }), 1);
+ },
+
+ addKeyHandler: function(/*String*/key, /*Int*/modifiers, /*Function*/handler){
+ // summary: add a handler for a keyboard shortcut
+ if(!dojo.isArray(this._keyHandlers[key])){ this._keyHandlers[key] = []; }
+ this._keyHandlers[key].push({
+ modifiers: modifiers || 0,
+ handler: handler
+ });
+ },
+
+ onKeyPressed: function(/*Event*/e){
+ this.onDisplayChanged(/*e*/); // can't pass in e
+ },
+
+ onClick: function(/*Event*/e){
+// console.info('onClick',this._tryDesignModeOn);
+ this.onDisplayChanged(e);
+ },
+
+ _onMouseDown: function(/*Event*/e){ // IE only to prevent 2 clicks to focus
+ if(!this._focused && !this.disabled){
+ this.focus();
+ }
+ },
+
+ _onBlur: function(e){
+ this.inherited(arguments);
+ var _c=this.getValue(true);
+ if(_c!=this.savedContent){
+ this.onChange(_c);
+ this.savedContent=_c;
+ }
+ if(dojo.isMoz && this.iframe){
+ this.iframe.contentDocument.title = this._localizedIframeTitles.iframeEditTitle;
+ }
+ },
+ _initialFocus: true,
+ _onFocus: function(/*Event*/e){
+ // summary: Fired on focus
+ this.inherited(arguments);
+ if(dojo.isMoz && this._initialFocus){
+ this._initialFocus = false;
+ if(this.editNode.innerHTML.replace(/^\s+|\s+$/g, "") == "&nbsp;"){
+ this.placeCursorAtStart();
+// this.execCommand("selectall");
+// this.window.getSelection().collapseToStart();
+ }
+ }
+ },
+
+ // TODO: why is this needed - should we deprecate this ?
+ blur: function(){
+ // summary: remove focus from this instance
+ 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 instance
+ 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
+
+// var _t=new Date();
+ if(!this._updateTimer){
+// this._lastUpdate=_t;
+ if(this._updateTimer){
+ clearTimeout(this._updateTimer);
+ }
+ this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);
+ }
+ },
+ onNormalizedDisplayChanged: function(){
+ // summary:
+ // This event is fired every updateInterval ms or more
+ // description:
+ // If something needs to happen immidiately after a
+ // user change, please use onDisplayChanged instead
+ this._updateTimer=null;
+ },
+ onChange: function(newContent){
+ // summary:
+ // this is fired if and only if the editor loses focus and
+ // the content is changed
+
+// console.log('onChange',newContent);
+ },
+ _normalizeCommand: function(/*String*/cmd){
+ // summary:
+ // Used as the advice function by dojo.connect to map our
+ // normalized set of commands to those supported by the target
+ // browser
+
+ var command = cmd.toLowerCase();
+ if(command == "hilitecolor" && !dojo.isMoz){
+ command = "backcolor";
+ }
+
+ return command;
+ },
+
+ 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
+ var ie = 1;
+ var mozilla = 1 << 1;
+ var safari = 1 << 2;
+ var opera = 1 << 3;
+ var safari420 = 1 << 4;
+
+ var gt420 = dojo.isSafari;
+
+ function isSupportedBy(browsers){
+ return {
+ ie: Boolean(browsers & ie),
+ mozilla: Boolean(browsers & mozilla),
+ safari: Boolean(browsers & safari),
+ safari420: Boolean(browsers & safari420),
+ 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 | safari | 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":
+ supportedBy = isSupportedBy(mozilla | ie | opera | safari420);
+ 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 | safari420);
+ 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.isSafari && supportedBy.safari) ||
+ (gt420 && supportedBy.safari420) ||
+ (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
+ 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);
+ if(argument != undefined){
+ if(command == "heading"){
+ throw new Error("unimplemented");
+ }else if((command == "formatblock") && dojo.isIE){
+ argument = '<'+argument+'>';
+ }
+ }
+ if(command == "inserthtml"){
+ argument=this._preFilterContent(argument);
+ 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);
+ returnValue=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
+ dojo.withGlobal(this.window,'remove',dijit._editor.selection);
+ returnValue=true;
+ }else{
+ returnValue=this.document.execCommand(command, false, argument);
+ }
+ }else if(
+ (command == "unlink")&&
+ (this.queryCommandEnabled("unlink"))&&
+ (dojo.isMoz || dojo.isSafari)
+ ){
+ // fix up unlink in Mozilla to unlink the link and not just the selection
+
+ // grab selection
+ // Mozilla gets upset if we just store the range so we have to
+ // get the basic properties and recreate to save the selection
+ var selection = this.window.getSelection();
+ // var selectionRange = selection.getRangeAt(0);
+ // var selectionStartContainer = selectionRange.startContainer;
+ // var selectionStartOffset = selectionRange.startOffset;
+ // var selectionEndContainer = selectionRange.endContainer;
+ // var selectionEndOffset = selectionRange.endOffset;
+
+ // select our link and unlink
+ var a = dojo.withGlobal(this.window, "getAncestorElement",dijit._editor.selection, ['a']);
+ dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [a]);
+
+ returnValue=this.document.execCommand("unlink", false, null);
+ }else if((command == "hilitecolor")&&(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(command, false, argument);
+ this.document.execCommand("styleWithCSS", false, false);
+
+ }else if((dojo.isIE)&&( (command == "backcolor")||(command == "forecolor") )){
+ // 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 = arguments.length > 1 ? argument : null;
+ returnValue = this.document.execCommand(command, false, argument);
+
+ // timeout is workaround for weird IE behavior were the text
+ // selection gets correctly re-created, but subsequent input
+ // apparently isn't bound to it
+// setTimeout(function(){tr.select();}, 1);
+ }else{
+ argument = arguments.length > 1 ? argument : null;
+// if(dojo.isMoz){
+// this.document = this.iframe.contentWindow.document
+// }
+
+ 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
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ if(dojo.isMoz || dojo.isSafari){
+ if(command == "unlink"){ // mozilla returns true always
+ // console.debug(dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']));
+ return dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']);
+ }else if(command == "inserttable"){
+ return true;
+ }
+ }
+ //see #4109
+ if(dojo.isSafari){
+ if(command == "copy"){
+ command = "cut";
+ }else if(command == "paste"){
+ return true;
+ }
+ }
+
+ // return this.document.queryCommandEnabled(command);
+ var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
+ return elem.queryCommandEnabled(command);
+ },
+
+ queryCommandState: function(command){
+ // summary: check the state of a given command
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ return this.document.queryCommandState(command);
+ },
+
+ queryCommandValue: function(command){
+ // summary: check the value of a given command
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ if(dojo.isIE && command == "formatblock"){
+ return this._local2NativeFormatNames[this.document.queryCommandValue(command)];
+ }
+ return this.document.queryCommandValue(command);
+ },
+
+ // Misc.
+
+ placeCursorAtStart: function(){
+ // summary:
+ // place the cursor at the start of the editing area
+ this.focus();
+
+ //see comments in placeCursorAtEnd
+ var isvalid=false;
+ if(dojo.isMoz){
+ var first=this.editNode.firstChild;
+ while(first){
+ if(first.nodeType == 3){
+ if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [first]);
+ break;
+ }
+ }else if(first.nodeType == 1){
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [first]);
+ break;
+ }
+ first = first.nextSibling;
+ }
+ }else{
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+ }
+ if(isvalid){
+ dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [true]);
+ }
+ },
+
+ placeCursorAtEnd: function(){
+ // summary:
+ // place the cursor at the end of the editing area
+ 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;
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+ break;
+ }
+ }else if(last.nodeType == 1){
+ isvalid=true;
+ if(last.lastChild){
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last.lastChild]);
+ }else{
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+ }
+ break;
+ }
+ last = last.previousSibling;
+ }
+ }else{
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+ }
+ if(isvalid){
+ dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [false]);
+ }
+ },
+
+ getValue: function(/*Boolean?*/nonDestructive){
+ // summary:
+ // return the current content of the editing area (post filters are applied)
+ if(this.textarea){
+ if(this.isClosed || !this.isLoaded){
+ return this.textarea.value;
+ }
+ }
+
+ return this._postFilterContent(null, nonDestructive);
+ },
+
+ setValue: function(/*String*/html){
+ // summary:
+ // this function set the content. No undo history is preserved
+
+ if(!this.isLoaded){
+ // try again after the editor is finished loading
+ this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
+ this.setValue(html);
+ }));
+ return;
+ }
+
+ if(this.textarea && (this.isClosed || !this.isLoaded)){
+ this.textarea.value=html;
+ }else{
+ html = this._preFilterContent(html);
+ var node = this.isClosed ? this.domNode : this.editNode;
+ 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)
+ 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(dojo.isMoz && !html){ 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
+ var ec = html;
+ dojo.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } });
+ return ec;
+ },
+ _preDomFilterContent: function(/*DomNode*/dom){
+ // summary:
+ // filter the input
+ 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
+ var ec;
+ if(!dojo.isString(dom)){
+ dom = dom || this.editNode;
+ if(this.contentDomPostFilters.length){
+ if(nonDestructive && dom['cloneNode']){
+ dom = dom.cloneNode(true);
+ }
+ dojo.forEach(this.contentDomPostFilters, function(ef){
+ dom = ef(dom);
+ });
+ }
+ ec = dijit._editor.getChildrenHtml(dom);
+ }else{
+ ec = dom;
+ }
+
+ if(!ec.replace(/^(?:\s|\xA0)+/g, "").replace(/(?:\s|\xA0)+$/g,"").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
+ var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+ saveTextarea.value += this._SEPARATOR + this.name + ":" + this.getValue();
+ },
+
+ escapeXml: function(/*String*/str, /*Boolean*/noSingleQuotes){
+ dojo.deprecated('dijit.Editor::escapeXml is deprecated','use dijit._editor.escapeXml instead', 2);
+ return dijit._editor.escapeXml(str,noSingleQuotes);
+ },
+
+ getNodeHtml: function(/* DomNode */node){
+ dojo.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit._editor.getNodeHtml instead', 2);
+ return dijit._editor.getNodeHtml(node);
+ },
+
+ getNodeChildrenHtml: function(/* DomNode */dom){
+ dojo.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit._editor.getChildrenHtml instead', 2);
+ return dijit._editor.getChildrenHtml(dom);
+ },
+
+ close: function(/*Boolean*/save, /*Boolean*/force){
+ // 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.
+ // force:
+ 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.textarea){
+ with(this.textarea.style){
+ position = "";
+ left = top = "";
+ if(dojo.isIE){
+ overflow = this.__overflow;
+ this.__overflow = null;
+ }
+ }
+ this.textarea.value = save ? this._content : this.savedContent;
+ dojo._destroyElement(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;
+// }
+// }
+ this.domNode.innerHTML = save ? this._content : this.savedContent;
+ }
+
+ dojo.removeClass(this.domNode, "RichTextEditable");
+ this.isClosed = true;
+ this.isLoaded = false;
+ // FIXME: is this always the right thing to do?
+ delete this.editNode;
+
+ 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
+ },
+
+ destroyRendering: function(){
+ // summary: stub
+ },
+
+ destroy: function(){
+ this.destroyRendering();
+ if(!this.isClosed){ this.close(false); }
+ this.inherited("destroy",arguments);
+ //dijit._editor.RichText.superclass.destroy.call(this);
+ },
+
+ _removeMozBogus: function(/* String */ html){
+ return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, ''); // String
+ },
+ _removeSafariBogus: function(/* String */ html){
+ return html.replace(/\sclass="webkit-block-placeholder"/gi, ''); // String
+ },
+ _fixContentForMoz: function(/* String */ html){
+ // summary:
+ // Moz can not handle strong/em tags correctly, convert them to b/i
+ return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
+ .replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String
+ },
+
+ _srcInImgRegex : /(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi ,
+ _hrefInARegex : /(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi ,
+
+ _preFixUrlAttributes: function(/* String */ html){
+ return html.replace(this._hrefInARegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
+ .replace(this._srcInImgRegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/_Plugin.js b/includes/js/dijit/_editor/_Plugin.js
new file mode 100644
index 0000000..32fde3b
--- /dev/null
+++ b/includes/js/dijit/_editor/_Plugin.js
@@ -0,0 +1,101 @@
+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.Editor");
+dojo.require("dijit.form.Button");
+
+dojo.declare("dijit._editor._Plugin", null, {
+ // summary
+ // This represents a "plugin" to the editor, which is basically
+ // a single button on the Toolbar and some associated code
+ constructor: function(/*Object?*/args, /*DomNode?*/node){
+ if(args){
+ dojo.mixin(this, args);
+ }
+ this._connects=[];
+ },
+
+ editor: null,
+ iconClassPrefix: "dijitEditorIcon",
+ button: null,
+ queryCommand: null,
+ command: "",
+ commandArg: null,
+ useDefaultCommand: true,
+ buttonClass: dijit.form.Button,
+ getLabel: function(key){
+ return this.editor.commands[key];
+ },
+ _initButton: function(props){
+ if(this.command.length){
+ var label = this.getLabel(this.command);
+ var className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1);
+ if(!this.button){
+ props = dojo.mixin({
+ label: label,
+ showLabel: false,
+ iconClass: className,
+ dropDown: this.dropDown,
+ tabIndex: "-1"
+ }, props || {});
+ this.button = new this.buttonClass(props);
+ }
+ }
+ },
+ destroy: function(f){
+ dojo.forEach(this._connects, dojo.disconnect);
+ },
+ connect: function(o, f, tf){
+ this._connects.push(dojo.connect(o, f, this, tf));
+ },
+ updateState: function(){
+ var _e = this.editor;
+ var _c = this.command;
+ if(!_e){ return; }
+ if(!_e.isLoaded){ return; }
+ if(!_c.length){ return; }
+ if(this.button){
+ try{
+ var enabled = _e.queryCommandEnabled(_c);
+ this.button.setAttribute('disabled', !enabled);
+ if(typeof this.button.checked == 'boolean'){
+ this.button.setAttribute('checked', _e.queryCommandState(_c));
+ }
+ }catch(e){
+ console.debug(e);
+ }
+ }
+ },
+ setEditor: function(/*Widget*/editor){
+ // FIXME: detatch 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();
+
+ // FIXME: wire up editor to button here!
+ if(this.command.length &&
+ !this.editor.queryCommandAvailable(this.command)
+ ){
+ // console.debug("hiding:", this.command);
+ if(this.button){
+ this.button.domNode.style.display = "none";
+ }
+ }
+ if(this.button && this.useDefaultCommand){
+ this.connect(this.button, "onClick",
+ dojo.hitch(this.editor, "execCommand", this.command, this.commandArg)
+ );
+ }
+ this.connect(this.editor, "onNormalizedDisplayChanged", "updateState");
+ },
+ setToolbar: function(/*Widget*/toolbar){
+ if(this.button){
+ toolbar.addChild(this.button);
+ }
+ // console.debug("adding", this.button, "to:", toolbar);
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/html.js b/includes/js/dijit/_editor/html.js
new file mode 100644
index 0000000..8b20592
--- /dev/null
+++ b/includes/js/dijit/_editor/html.js
@@ -0,0 +1,106 @@
+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
+ output = '<'+node.nodeName.toLowerCase();
+
+ //store the list of attributes and sort it to have the
+ //attributes appear in the dictionary order
+ var attrarray = [];
+ if(dojo.isIE && node.outerHTML){
+ var s = node.outerHTML;
+ s = s.substr(0,s.indexOf('>'));
+ s = s.replace(/(['"])[^"']*\1/g, '');//to make the following regexp safe
+ var reg = /([^\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;
+ }
+ }
+ if(key=='style'){
+ attrarray.push([key, node.style.cssText.toLowerCase()]);
+ }else{
+ attrarray.push([key, key=='class'?node.className:node.getAttribute(key)]);
+ }
+ }
+ }
+ }else{
+ var attr, i=0, attrs = node.attributes;
+ while((attr=attrs[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);
+ });
+ i=0;
+ while((attr=attrarray[i++])){
+ output += ' '+attr[0]+'="'+
+ (dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1],true) : attr[1])+'"';
+ }
+ if(node.childNodes.length){
+ output += '>' + dijit._editor.getChildrenHtml(node)+'</'+node.nodeName.toLowerCase()+'>';
+ }else{
+ output += ' />';
+ }
+ break;
+ 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;
+ var i=0;
+ var node;
+ while((node=nodes[i++])){
+ out += dijit._editor.getNodeHtml(node);
+ }
+ return out; // String
+}
+
+}
diff --git a/includes/js/dijit/_editor/nls/FontChoice.js b/includes/js/dijit/_editor/nls/FontChoice.js
new file mode 100644
index 0000000..71da48d
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/FontChoice.js
@@ -0,0 +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":"Paragraph","pre":"Pre-formatted","sans-serif":"sans-serif","fontName":"Font","h1":"Heading","h2":"Subheading","h3":"Sub-subheading","monospace":"monospace","fontSize":"Size","cursive":"cursive"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/LinkDialog.js b/includes/js/dijit/_editor/nls/LinkDialog.js
new file mode 100644
index 0000000..3e1b917
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Set","text":"Description:","insertImageTitle":"Image Properties","url":"URL:","createLinkTitle":"Link Properties"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ar/FontChoice.js b/includes/js/dijit/_editor/nls/ar/FontChoice.js
new file mode 100644
index 0000000..72381b6
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ar/FontChoice.js
@@ -0,0 +1 @@
+({"1":"صغير جدا جدا ","2":"صغير جدا ","formatBlock":"النسق","monospaced":"خط أحادي المسافة ","3":"صغير ","4":"متوسط ","5":"كبير ","6":"كبير جدا ","7":"كبير جدا جدا ","fantasy":"خيالي ","serif":"serif","p":"فقرة ","pre":"منسق بصفة مسبقة ","sans-serif":"sans-serif","fontName":"طاقم طباعة","h1":"عنوان","h2":"عنوان فرعي ","h3":"فرعي-عنوان فرعي ","fontSize":"الحجم","cursive":"كتابة بحروف متصلة ","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ar/LinkDialog.js b/includes/js/dijit/_editor/nls/ar/LinkDialog.js
new file mode 100644
index 0000000..ca46031
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ar/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"تحديد","text":"الوصف: ","insertImageTitle":"خصائص الصورة ","url":"عنوان URL:","createLinkTitle":"خصائص الوصلة "}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ar/commands.js b/includes/js/dijit/_editor/nls/ar/commands.js
new file mode 100644
index 0000000..79ce209
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ar/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"ازالة النسق","copy":"نسخ","paste":"لصق","selectAll":"اختيار كل","insertOrderedList":"كشف مرقم","insertTable":"ادراج/تحرير جدول ","underline":"تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول ","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","italic":"مائل","fontName":"اسم طاقم الطباعة","justifyLeft":"محاذاة الى اليسار","unlink":"ازالة وصلة","toggleTableBorder":"تبديل حدود الجدول ","fontSize":"حجم طاقم الطباعة","indent":"ازاحة للداخل","redo":"اعادة","strikethrough":"تشطيب","justifyFull":"ضبط","justifyCenter":"محاذاة في الوسط","hiliteColor":"لون الخلفية","deleteTable":"حذف جدول ","outdent":"ازاحة للخارج","cut":"قص","plainFormatBlock":"نمط الفقرة","toggleDir":"تبديل الاتجاه ","bold":"عريض","systemShortcutFF":"يكون التصرف \"${0}\" متاحا فقط في برنامج Mozilla Firefox باستخدام اختصارات لوحة المفاتيح. استخدم ${1}.","justifyRight":"محاذاة الى اليمين","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/commands.js b/includes/js/dijit/_editor/nls/commands.js
new file mode 100644
index 0000000..d58b0c8
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Remove Format","copy":"Copy","paste":"Paste","selectAll":"Select All","insertOrderedList":"Numbered List","insertTable":"Insert/Edit Table","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/cs/FontChoice.js b/includes/js/dijit/_editor/nls/cs/FontChoice.js
new file mode 100644
index 0000000..2a12e61
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/cs/FontChoice.js
@@ -0,0 +1 @@
+({"1":"extra malé","2":"velmi malé","formatBlock":"Formát","monospaced":"monospaced","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","fontSize":"Velikost","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/cs/LinkDialog.js b/includes/js/dijit/_editor/nls/cs/LinkDialog.js
new file mode 100644
index 0000000..cf124d5
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/cs/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Nastavit","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"Adresa URL:","createLinkTitle":"Vlastnosti odkazu"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/cs/commands.js b/includes/js/dijit/_editor/nls/cs/commands.js
new file mode 100644
index 0000000..2d19f8f
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/cs/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Odebrat formát","copy":"Kopírovat","paste":"Vložit","selectAll":"Vybrat vše","insertOrderedList":"Číslovaný seznam","insertTable":"Vložit/upravit tabulku","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","insertHorizontalRule":"Vodorovné pravítko","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obraz","superscript":"Horní index","subscript":"Dolní index","createLink":"Vytvořit odkaz","undo":"Zpět","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","ctrlKey":"Ctrl+${0}","fontSize":"Velikost písma","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é","systemShortcutFF":"Akce \"${0}\" je v prohlížeči Mozilla Firefox dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesy ${1}.","justifyRight":"Zarovnat vpravo","appleKey":"⌘${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/da/FontChoice.js b/includes/js/dijit/_editor/nls/da/FontChoice.js
new file mode 100644
index 0000000..aae3c40
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/da/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Format","monospaced":"monospaced","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","fontSize":"Størrelse","cursive":"kursiv","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/da/LinkDialog.js b/includes/js/dijit/_editor/nls/da/LinkDialog.js
new file mode 100644
index 0000000..87fd8a9
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/da/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Definér","text":"Beskrivelse:","insertImageTitle":"Billedegenskaber","url":"URL:","createLinkTitle":"Linkegenskaber"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/da/commands.js b/includes/js/dijit/_editor/nls/da/commands.js
new file mode 100644
index 0000000..04e6262
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/da/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Fjern format","copy":"Kopiér","paste":"Sæt ind","selectAll":"Markér alle","insertOrderedList":"Nummereret liste","insertTable":"Indsæt/redigér tabel","underline":"Understreget","foreColor":"Forgrundsfarve","htmlToggle":"HTML-kilde","formatBlock":"Afsnitstypografi","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","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejusteret","unlink":"Fjern link","toggleTableBorder":"Skift tabelramme","fontSize":"Skriftstørrelse","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","systemShortcutFF":"Funktionen \"${0}\" kan kun bruges i Mozilla Firefox med en tastaturgenvej. Brug ${1}.","justifyRight":"Højrejusteret","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/de/FontChoice.js b/includes/js/dijit/_editor/nls/de/FontChoice.js
new file mode 100644
index 0000000..d23c16d
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/de/FontChoice.js
@@ -0,0 +1 @@
+({"1":"XXS","2":"XS","formatBlock":"Format","monospaced":"Monospace","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","fontSize":"Größe","cursive":"Kursiv","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/de/LinkDialog.js b/includes/js/dijit/_editor/nls/de/LinkDialog.js
new file mode 100644
index 0000000..0bc01cb
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/de/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Festlegen","text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","url":"URL:","createLinkTitle":"Linkeigenschaften"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/de/commands.js b/includes/js/dijit/_editor/nls/de/commands.js
new file mode 100644
index 0000000..d597b0e
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/de/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Formatierung entfernen","copy":"Kopieren","paste":"Einfügen","selectAll":"Alles auswählen","insertOrderedList":"Nummerierung","insertTable":"Tabelle einfügen/bearbeiten","underline":"Unterstrichen","foreColor":"Vordergrundfarbe","htmlToggle":"HTML-Quelltext","formatBlock":"Absatzstil","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","italic":"Kursiv","fontName":"Schriftartname","justifyLeft":"Linksbündig","unlink":"Link entfernen","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","ctrlKey":"Strg+${0}","fontSize":"Schriftgröße","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":"Richtung wechseln","bold":"Fett","systemShortcutFF":"Die Aktion \"${0}\" ist in Mozilla Firefox nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.","justifyRight":"Rechtsbündig","appleKey":"⌘${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/el/FontChoice.js b/includes/js/dijit/_editor/nls/el/FontChoice.js
new file mode 100644
index 0000000..ac1d1fd
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/el/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-μικρά","2":"x-μικρά","formatBlock":"Μορφή","monospaced":"σταθερού πλάτους","3":"μικρά","4":"μεσαία","5":"μεγάλα","6":"x-μεγάλα","7":"xx-μεγάλα","fantasy":"φαντασίας","serif":"με πατούρες (serif)","p":"Παράγραφος","pre":"Προ-μορφοποιημένο","sans-serif":"χωρίς πατούρες (sans-serif)","fontName":"Γραμματοσειρά","h1":"Επικεφαλίδα","h2":"Δευτερεύουσα επικεφαλίδα","h3":"Δευτερεύουσα επικεφαλίδα τρίτου επιπέδου","fontSize":"Μέγεθος","cursive":"πλάγιοι","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/el/LinkDialog.js b/includes/js/dijit/_editor/nls/el/LinkDialog.js
new file mode 100644
index 0000000..a615aeb
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/el/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Ορισμός","text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","url":"Διεύθυνση URL:","createLinkTitle":"Ιδιότητες διασύνδεσης"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/el/commands.js b/includes/js/dijit/_editor/nls/el/commands.js
new file mode 100644
index 0000000..4954c9c
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/el/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Αφαίρεση μορφοποίησης","copy":"Αντιγραφή","paste":"Επικόλληση","selectAll":"Επιλογή όλων","insertOrderedList":"Αριθμημένη λίστα","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","superscript":"Εκθέτης","subscript":"Δείκτης","createLink":"Δημιουργία διασύνδεσης","undo":"Αναίρεση","italic":"Πλάγια","fontName":"Όνομα γραμματοσειράς","justifyLeft":"Στοίχιση αριστερά","unlink":"Αφαίρεση διασύνδεσης","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","fontSize":"Μέγεθος γραμματοσειράς","indent":"Εσοχή","redo":"Επανάληψη","strikethrough":"Διαγράμμιση","justifyFull":"Πλήρης στοίχιση","justifyCenter":"Στοίχιση στο κέντρο","hiliteColor":"Χρώμα φόντου","deleteTable":"Διαγραφή πίνακα","outdent":"Μείωση περιθωρίου","cut":"Αποκοπή","plainFormatBlock":"Στυλ παραγράφου","toggleDir":"Εναλλαγή κατεύθυνσης","bold":"Έντονα","systemShortcutFF":"Η ενέργεια \"${0}\" είναι διαθέσιμη μόνο στο Mozilla Firefox με τη χρήση συντόμευσης πληκτρολογίου. Χρησιμοποιήστε το ${1}.","justifyRight":"Στοίχιση δεξιά","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/es/FontChoice.js b/includes/js/dijit/_editor/nls/es/FontChoice.js
new file mode 100644
index 0000000..b0f4d90
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/es/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-pequeño","2":"x-pequeño","formatBlock":"Formato","monospaced":"monoespacio","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","fontSize":"Tamaño","cursive":"cursiva","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/es/LinkDialog.js b/includes/js/dijit/_editor/nls/es/LinkDialog.js
new file mode 100644
index 0000000..8dfe95f
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/es/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Establecer","text":"Descripción:","insertImageTitle":"Propiedades de la imagen","url":"URL:","createLinkTitle":"Propiedades del enlace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/es/commands.js b/includes/js/dijit/_editor/nls/es/commands.js
new file mode 100644
index 0000000..54605ed
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/es/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Eliminar formato","copy":"Copiar","paste":"Pegar","selectAll":"Seleccionar todo","insertOrderedList":"Lista numerada","insertTable":"Insertar/Editar tabla","underline":"Subrayado","foreColor":"Color de primer plano","htmlToggle":"Fuente HTML","formatBlock":"Estilo de párrafo","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","italic":"Cursiva","fontName":"Nombre de font","justifyLeft":"Alinear izquierda","unlink":"Eliminar enlace","toggleTableBorder":"Conmutar borde de tabla","ctrlKey":"Control+${0}","fontSize":"Tamaño de font","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","systemShortcutFF":"La acción \"${0}\" sólo está disponible en Mozilla Firefox mediante un atajo de teclado. Utilice ${1}.","justifyRight":"Alinear derecha","appleKey":"⌘${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fi/FontChoice.js b/includes/js/dijit/_editor/nls/fi/FontChoice.js
new file mode 100644
index 0000000..b5975ef
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fi/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Muoto","monospaced":"monospaced","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","fontSize":"Koko","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fi/LinkDialog.js b/includes/js/dijit/_editor/nls/fi/LinkDialog.js
new file mode 100644
index 0000000..dba80b6
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fi/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Aseta","text":"Kuvaus:","insertImageTitle":"Kuvan ominaisuudet","url":"URL-osoite:","createLinkTitle":"Linkin ominaisuudet"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fi/commands.js b/includes/js/dijit/_editor/nls/fi/commands.js
new file mode 100644
index 0000000..2d2cfc7
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fi/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Poista muotoilu","copy":"Kopioi","paste":"Liitä","selectAll":"Valitse kaikki","insertOrderedList":"Numeroitu luettelo","insertTable":"Lisää taulukko/muokkaa taulukkoa","underline":"Alleviivaus","foreColor":"Edustaväri","htmlToggle":"HTML-lähde","formatBlock":"Kappaletyyli","insertHorizontalRule":"Vaakasuuntainen viiva","delete":"Poista","insertUnorderedList":"Numeroimaton luettelo","tableProp":"Taulukon ominaisuudet","insertImage":"Lisää kuva","superscript":"Yläindeksi","subscript":"Alaindeksi","createLink":"Luo linkki","undo":"Kumoa","italic":"Kursivointi","fontName":"Fontin nimi","justifyLeft":"Tasaus vasemmalle","unlink":"Poista linkki","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","fontSize":"Fontin koko","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","systemShortcutFF":"Toiminto \"${0}\" on käytettävissä vain Mozilla Firefox -ohjelmassa, kun käytetään pikanäppäimiä. Käytä kohdetta ${1}.","justifyRight":"Tasaus oikealle","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fr/FontChoice.js b/includes/js/dijit/_editor/nls/fr/FontChoice.js
new file mode 100644
index 0000000..749ed85
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fr/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xxs","2":"xs","formatBlock":"Mise en forme","monospaced":"espacement constant","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","fontSize":"Taille","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fr/LinkDialog.js b/includes/js/dijit/_editor/nls/fr/LinkDialog.js
new file mode 100644
index 0000000..d3d8728
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fr/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Définir","text":"Description :","insertImageTitle":"Propriétés de l'image","url":"URL :","createLinkTitle":"Propriétés du lien"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/fr/commands.js b/includes/js/dijit/_editor/nls/fr/commands.js
new file mode 100644
index 0000000..34eb40c
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/fr/commands.js
@@ -0,0 +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","underline":"Souligner","foreColor":"Couleur d'avant-plan","htmlToggle":"Source HTML","formatBlock":"Style de paragraphe","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","italic":"Italique","fontName":"Nom de police","justifyLeft":"Aligner à gauche","unlink":"Supprimer le lien","toggleTableBorder":"Afficher/Masquer la bordure du tableau","fontSize":"Taille de police","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":"Afficher/Masquer la direction","bold":"Gras","systemShortcutFF":"L'action \"${0}\" est disponible dans Mozilla Firefox uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","justifyRight":"Aligner à droite","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/he/FontChoice.js b/includes/js/dijit/_editor/nls/he/FontChoice.js
new file mode 100644
index 0000000..13b2126
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/he/FontChoice.js
@@ -0,0 +1 @@
+({"1":"קטן ביות","2":"קטן מאוד","formatBlock":"עיצוב","monospaced":"monospaced","3":"קטן ","4":"בינוני","5":"גדול","6":"גדול מאוד","7":"גדול ביותר","fantasy":"fantasy","serif":"serif","p":"פיסקה","pre":"מעוצב מראש","sans-serif":"sans-serif","fontName":"גופן","h1":"כותרת","h2":"תת-כותרת","h3":"תת-תת-כותרת","fontSize":"גודל","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/he/LinkDialog.js b/includes/js/dijit/_editor/nls/he/LinkDialog.js
new file mode 100644
index 0000000..c99735b
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/he/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"הגדרה","text":"תיאור:","insertImageTitle":"תכונות תמונה","url":"URL:","createLinkTitle":"תכונות קישור"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/he/commands.js b/includes/js/dijit/_editor/nls/he/commands.js
new file mode 100644
index 0000000..6488ff8
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/he/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"סילוק עיצוב","copy":"העתקה","paste":"הדבקה","selectAll":"בחירת הכל","insertOrderedList":"רשימה ממוספרת","insertTable":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית ","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה","italic":"נטוי","fontName":"שם גופן","justifyLeft":"יישור לשמאל","unlink":"סילוק הקישור","toggleTableBorder":"מיתוג גבול טבלה","fontSize":"גופן יחסי","indent":"הגדלת כניסה","redo":"שחזור פעולה","strikethrough":"קו חוצה","justifyFull":"יישור דו-צדדי","justifyCenter":"יישור למרכז","hiliteColor":"צבע רקע","deleteTable":"מחיקת טבלה","outdent":"הקטנת כניסה","cut":"גזירה","plainFormatBlock":"סגנון פיסקה","toggleDir":"מיתוג כיוון ","bold":"מודגש","systemShortcutFF":"הפעולה \"${0}\" זמינה בדפדפן Mozilla Firefox רק באמצעות קיצור דרך במקלדת. נא להשתמש ב-${1}.","justifyRight":"יישור לימין","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/hu/FontChoice.js b/includes/js/dijit/_editor/nls/hu/FontChoice.js
new file mode 100644
index 0000000..0a6ca9f
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/hu/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-kicsi","2":"x-kicsi","formatBlock":"Formátum","monospaced":"egyenközű","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","fontSize":"Méret","cursive":"kurzív","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/hu/LinkDialog.js b/includes/js/dijit/_editor/nls/hu/LinkDialog.js
new file mode 100644
index 0000000..8662cf2
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/hu/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Beállítás","text":"Leírás:","insertImageTitle":"Kép tulajdonságai","url":"URL:","createLinkTitle":"Hivatkozás tulajdonságai"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/hu/commands.js b/includes/js/dijit/_editor/nls/hu/commands.js
new file mode 100644
index 0000000..3cd13e3
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/hu/commands.js
@@ -0,0 +1 @@
+({"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","underline":"Aláhúzott","foreColor":"Előtérszín","htmlToggle":"HTML forrás","formatBlock":"Bekezdés stílusa","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","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","fontSize":"Betűméret","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ányváltás","bold":"Félkövér","systemShortcutFF":"A(z) \"${0}\" művelet csak Mozilla Firefox böngészőben érhető el billentyűparancs használatával. Használja a következőt: ${1}.","justifyRight":"Jobbra igazítás","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/it/FontChoice.js b/includes/js/dijit/_editor/nls/it/FontChoice.js
new file mode 100644
index 0000000..d2ad29d
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/it/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Formato","monospaced":"monospaced","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","fontSize":"Dimensione","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/it/LinkDialog.js b/includes/js/dijit/_editor/nls/it/LinkDialog.js
new file mode 100644
index 0000000..72f76e4
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/it/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Imposta","text":"Descrizione:","insertImageTitle":"Proprietà immagine","url":"URL:","createLinkTitle":"Proprietà collegamento"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/it/commands.js b/includes/js/dijit/_editor/nls/it/commands.js
new file mode 100644
index 0000000..6e22372
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/it/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":"Inserisci immagine","superscript":"Apice","subscript":"Pedice","createLink":"Crea collegamento","undo":"Annulla","italic":"Corsivo","fontName":"Nome carattere","justifyLeft":"Allinea a sinistra","unlink":"Rimuovi collegamento","toggleTableBorder":"Mostra/Nascondi margine tabella","fontSize":"Dimensione carattere","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","systemShortcutFF":"L'azione \"${0}\" è disponibile solo in Mozilla Firefox tramite tasti di scelta rapida. Utilizzare ${1}.","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ja/FontChoice.js b/includes/js/dijit/_editor/nls/ja/FontChoice.js
new file mode 100644
index 0000000..633fc9a
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ja/FontChoice.js
@@ -0,0 +1 @@
+({"1":"超極小","2":"極小","formatBlock":"フォーマット","monospaced":"monospace","3":"小","4":"標準","5":"大","6":"特大","7":"超特大","fantasy":"fantasy","serif":"serif","p":"段落","pre":"事前フォーマット済み","sans-serif":"sans-serif","fontName":"フォント","h1":"見出し","h2":"副見出し","h3":"副見出しの副見出し","fontSize":"サイズ","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ja/LinkDialog.js b/includes/js/dijit/_editor/nls/ja/LinkDialog.js
new file mode 100644
index 0000000..2fc7a63
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ja/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"設定","text":"説明:","insertImageTitle":"イメージ・プロパティー","url":"URL:","createLinkTitle":"リンク・プロパティー"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ja/commands.js b/includes/js/dijit/_editor/nls/ja/commands.js
new file mode 100644
index 0000000..c33fdca
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ja/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"形式の除去","copy":"コピー","paste":"貼り付け","selectAll":"すべて選択","insertOrderedList":"番号付きリスト","insertTable":"テーブルの挿入/編集","underline":"下線","foreColor":"前景色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの除去","toggleTableBorder":"テーブル・ボーダーの切り替え","fontSize":"フォント・サイズ","indent":"インデント","redo":"やり直し","strikethrough":"取り消し線","justifyFull":"両端揃え","justifyCenter":"中央揃え","hiliteColor":"背景色","deleteTable":"テーブルの削除","outdent":"アウトデント","cut":"切り取り","plainFormatBlock":"段落スタイル","toggleDir":"方向の切り替え","bold":"太字","systemShortcutFF":"\"${0}\" アクションは、キーボード・ショートカットを使用して Mozilla Firefox でのみ使用できます。${1} を使用してください。","justifyRight":"右揃え","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ko/FontChoice.js b/includes/js/dijit/_editor/nls/ko/FontChoice.js
new file mode 100644
index 0000000..cd5268a
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ko/FontChoice.js
@@ -0,0 +1 @@
+({"1":"가장 작게","2":"조금 작게","formatBlock":"서식","monospaced":"monospaced","3":"작게","4":"중간","5":"크게","6":"조금 크게","7":"가장 크게","fantasy":"fantasy","serif":"serif","p":"단락","pre":"서식이 지정됨","sans-serif":"sans-serif","fontName":"글꼴","h1":"제목","h2":"부제목","h3":"하위 부제목","fontSize":"크기","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ko/LinkDialog.js b/includes/js/dijit/_editor/nls/ko/LinkDialog.js
new file mode 100644
index 0000000..c8d10c3
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ko/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"설정","text":"설명:","insertImageTitle":"이미지 등록 정보","url":"URL:","createLinkTitle":"링크 등록 정보"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ko/commands.js b/includes/js/dijit/_editor/nls/ko/commands.js
new file mode 100644
index 0000000..8327472
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ko/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"형식 제거","copy":"복사","paste":"붙여넣기","selectAll":"모두 선택","insertOrderedList":"번호 목록","insertTable":"테이블 삽입/편집","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","insertHorizontalRule":"수평 자","delete":"삭제","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","italic":"이탤릭체","fontName":"글꼴 이름","justifyLeft":"왼쪽 맞춤","unlink":"링크 제거","toggleTableBorder":"토글 테이블 경계","fontSize":"글꼴 크기","indent":"들여쓰기","redo":"다시 실행","strikethrough":"취소선","justifyFull":"양쪽 맞춤","justifyCenter":"가운데 맞춤","hiliteColor":"배경색","deleteTable":"테이블 삭제","outdent":"내어쓰기","cut":"잘라내기","plainFormatBlock":"단락 양식","toggleDir":"토글 방향","bold":"굵은체","systemShortcutFF":"\"${0}\" 조치는 키보드 바로 가기를 사용하는 Mozilla Firefox에서만 사용 가능합니다. ${1} 사용.","justifyRight":"오른쪽 맞춤","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nb/FontChoice.js b/includes/js/dijit/_editor/nls/nb/FontChoice.js
new file mode 100644
index 0000000..440c44b
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nb/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-liten","2":"x-liten","formatBlock":"Format","monospaced":"ikke-proporsjonal","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","fontSize":"Størrelse","cursive":"kursiv","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nb/LinkDialog.js b/includes/js/dijit/_editor/nls/nb/LinkDialog.js
new file mode 100644
index 0000000..1f26a40
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nb/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Definer","text":"Beskrivelse:","insertImageTitle":"Bildeegenskaper","url":"URL:","createLinkTitle":"Koblingsegenskaper"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nb/commands.js b/includes/js/dijit/_editor/nls/nb/commands.js
new file mode 100644
index 0000000..039c1b3
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nb/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Fjern format","copy":"Kopier","paste":"Lim inn","selectAll":"Velg alle","insertOrderedList":"Nummerert liste","insertTable":"Sett inn/rediger tabell","underline":"Understreking","foreColor":"Forgrunnsfarge","htmlToggle":"HTML-kilde","formatBlock":"Avsnittsstil","insertHorizontalRule":"Vannrett strek","delete":"Slett","insertUnorderedList":"Punktliste","tableProp":"Tabellegenskap","insertImage":"Sett inn bilde","superscript":"Hevet skrift","subscript":"Senket skrift","createLink":"Opprett kobling","undo":"Angre","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejuster","unlink":"Fjern kobling","toggleTableBorder":"Bytt tabellkant","fontSize":"Skriftstørrelse","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","systemShortcutFF":"Handlingen \"${0}\" er bare tilgjengelig i Mozilla Firefox ved hjelp av en tastatursnarvei. Bruk ${1}.","justifyRight":"Høyrejuster","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nl/FontChoice.js b/includes/js/dijit/_editor/nls/nl/FontChoice.js
new file mode 100644
index 0000000..7af12bf
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nl/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-klein","2":"x-klein","formatBlock":"Opmaak","monospaced":"monospaced","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","fontSize":"Grootte","cursive":"cursief","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nl/LinkDialog.js b/includes/js/dijit/_editor/nls/nl/LinkDialog.js
new file mode 100644
index 0000000..5f89113
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nl/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Instellen","text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","url":"URL:","createLinkTitle":"Linkeigenschappen"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/nl/commands.js b/includes/js/dijit/_editor/nls/nl/commands.js
new file mode 100644
index 0000000..3a259c3
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/nl/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Opmaak verwijderen","copy":"Kopiëren","paste":"Plakken","selectAll":"Alles selecteren","insertOrderedList":"Genummerde lijst","insertTable":"Tabel invoegen/bewerken","underline":"Onderstrepen","foreColor":"Voorgrondkleur","htmlToggle":"HTML-bron","formatBlock":"Alineastijl","insertHorizontalRule":"Horizontale liniaal","delete":"Wissen","insertUnorderedList":"Lijst met opsommingstekens","tableProp":"Tabeleigenschap","insertImage":"Afbeelding invoegen","superscript":"Superscript","subscript":"Subscript","createLink":"Link maken","undo":"Ongedaan maken","italic":"Cursief","fontName":"Lettertype","justifyLeft":"Links uitlijnen","unlink":"Link verwijderen","toggleTableBorder":"Tabelkader wijzigen","ctrlKey":"Ctrl+${0}","fontSize":"Lettergrootte","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","systemShortcutFF":"De actie \"${0}\" is alleen beschikbaar in Mozilla Firefox via een sneltoestcombinatie. Gebruik ${1}.","justifyRight":"Rechts uitlijnen","appleKey":"⌘${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pl/FontChoice.js b/includes/js/dijit/_editor/nls/pl/FontChoice.js
new file mode 100644
index 0000000..8c9bbd8
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pl/FontChoice.js
@@ -0,0 +1 @@
+({"1":"najmniejsza","2":"mniejsza","formatBlock":"Format","monospaced":"stałej szerokości","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","fontSize":"Wielkość","cursive":"kursywa","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pl/LinkDialog.js b/includes/js/dijit/_editor/nls/pl/LinkDialog.js
new file mode 100644
index 0000000..9d6c182
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pl/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Ustaw","text":"Opis:","insertImageTitle":"Właściwości obrazu","url":"Adres URL:","createLinkTitle":"Właściwości odsyłacza"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pl/commands.js b/includes/js/dijit/_editor/nls/pl/commands.js
new file mode 100644
index 0000000..49f8021
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pl/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Usuń formatowanie","copy":"Kopiuj","paste":"Wklej","selectAll":"Wybierz wszystko","insertOrderedList":"Lista numerowana","insertTable":"Wstaw/edytuj tabelę","underline":"Podkreślenie","foreColor":"Kolor pierwszego planu","htmlToggle":"Źródło HTML","formatBlock":"Styl akapitu","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","italic":"Kursywa","fontName":"Nazwa czcionki","justifyLeft":"Wyrównaj do lewej","unlink":"Usuń odsyłacz","toggleTableBorder":"Przełącz ramkę tabeli","fontSize":"Wielkość czcionki","indent":"Wcięcie","redo":"Przywróć","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","systemShortcutFF":"Działanie ${0} jest dostępne w przeglądarce Mozilla Firefox wyłącznie za pomocą skrótu klawiaturowego. Użyj ${1}.","justifyRight":"Wyrównaj do prawej","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt-pt/FontChoice.js b/includes/js/dijit/_editor/nls/pt-pt/FontChoice.js
new file mode 100644
index 0000000..f697a6f
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt-pt/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xxs","2":"xs","formatBlock":"Formato","monospaced":"monospaced","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","fontSize":"Tamanho","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt-pt/LinkDialog.js b/includes/js/dijit/_editor/nls/pt-pt/LinkDialog.js
new file mode 100644
index 0000000..3478d41
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt-pt/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades da imagem","url":"URL:","createLinkTitle":"Propriedade da ligação"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt-pt/commands.js b/includes/js/dijit/_editor/nls/pt-pt/commands.js
new file mode 100644
index 0000000..0a93447
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt-pt/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Remover formato","copy":"Copiar","paste":"Colar","selectAll":"Seleccionar tudo","insertOrderedList":"Lista numerada","insertTable":"Inserir/Editar tabela","underline":"Sublinhado","foreColor":"Cor de primeiro plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de parágrafo","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","italic":"Itálico","fontName":"Nome do tipo de letra","justifyLeft":"Alinhar à esquerda","unlink":"Remover ligação","toggleTableBorder":"Alternar limite da tabela","fontSize":"Tamanho do tipo de letra","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","systemShortcutFF":"A acção \"${0}\" apenas está disponível no Mozilla Firefox utilizando um atalho de teclado. Utilize ${1}.","justifyRight":"Alinhar à direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt/FontChoice.js b/includes/js/dijit/_editor/nls/pt/FontChoice.js
new file mode 100644
index 0000000..e2ee4e7
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-small","2":"x-small","formatBlock":"Formato","monospaced":"monospaced","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","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","fontSize":"Tamanho","cursive":"cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt/LinkDialog.js b/includes/js/dijit/_editor/nls/pt/LinkDialog.js
new file mode 100644
index 0000000..e74d4fd
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades de Imagem","url":"URL:","createLinkTitle":"Propriedades de Link"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/pt/commands.js b/includes/js/dijit/_editor/nls/pt/commands.js
new file mode 100644
index 0000000..e7aabc5
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/pt/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","underline":"Sublinhado","foreColor":"Cor do Primeiro Plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de Parágrafo","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","italic":"Itálico","fontName":"Nome da Fonte","justifyLeft":"Alinhar pela Esquerda","unlink":"Remover Link","toggleTableBorder":"Alternar Moldura da Tabela","fontSize":"Tamanho da Fonte","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":"Alternar Direção","bold":"Negrito","systemShortcutFF":"A ação \"${0}\" está disponível apenas no Mozilla Firefox utilizando um atalho do teclado. Utilize ${1}.","justifyRight":"Alinhar pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ru/FontChoice.js b/includes/js/dijit/_editor/nls/ru/FontChoice.js
new file mode 100644
index 0000000..b1fde8d
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ru/FontChoice.js
@@ -0,0 +1 @@
+({"1":"самый маленький","2":"очень маленький","formatBlock":"Формат","monospaced":"непропорциональный","3":"маленький","4":"средний","5":"большой","6":"очень большой","7":"самый большой","fantasy":"артистический","serif":"с засечками","p":"Абзац","pre":"Заранее отформатированный","sans-serif":"без засечек","fontName":"Шрифт","h1":"Заголовок","h2":"Подзаголовок","h3":"Вложенный подзаголовок","fontSize":"Размер","cursive":"курсив","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ru/LinkDialog.js b/includes/js/dijit/_editor/nls/ru/LinkDialog.js
new file mode 100644
index 0000000..42a6826
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ru/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Задать","text":"Описание:","insertImageTitle":"Свойства изображения","url":"URL:","createLinkTitle":"Свойства ссылки"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/ru/commands.js b/includes/js/dijit/_editor/nls/ru/commands.js
new file mode 100644
index 0000000..82ed23f
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/ru/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Удалить формат","copy":"Копировать","paste":"Вставить","selectAll":"Выбрать все","insertOrderedList":"Нумерованный список","insertTable":"Вставить/изменить таблицу","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Код HTML","formatBlock":"Стиль абзаца","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript":"Верхний индекс","subscript":"Нижний индекс","createLink":"Создать ссылку","undo":"Отменить","italic":"Курсив","fontName":"Название шрифта","justifyLeft":"По левому краю","unlink":"Удалить ссылку","toggleTableBorder":"Переключить рамку таблицы","fontSize":"Размер шрифта","indent":"Отступ","redo":"Повторить","strikethrough":"Перечеркивание","justifyFull":"По ширине","justifyCenter":"По центру","hiliteColor":"Цвет фона","deleteTable":"Удалить таблицу","outdent":"Втяжка","cut":"Вырезать","plainFormatBlock":"Стиль абзаца","toggleDir":"Изменить направление","bold":"Полужирный","systemShortcutFF":"Действие \"${0}\" доступно в Mozilla Firefox только через сочетание клавиш. Используйте ${1}.","justifyRight":"По правому краю","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/sv/FontChoice.js b/includes/js/dijit/_editor/nls/sv/FontChoice.js
new file mode 100644
index 0000000..8d9c1b1
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/sv/FontChoice.js
@@ -0,0 +1 @@
+({"1":"mycket, mycket litet","2":"mycket litet","formatBlock":"Format","monospaced":"fast teckenavstånd","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","fontSize":"Storlek","cursive":"kursivt","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/sv/LinkDialog.js b/includes/js/dijit/_editor/nls/sv/LinkDialog.js
new file mode 100644
index 0000000..64e8cfb
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/sv/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Ange","text":"Beskrivning:","insertImageTitle":"Bildegenskaper","url":"URL-adress:","createLinkTitle":"Länkegenskaper"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/sv/commands.js b/includes/js/dijit/_editor/nls/sv/commands.js
new file mode 100644
index 0000000..a5082a4
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/sv/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Ta bort format","copy":"Kopiera","paste":"Klistra in","selectAll":"Markera allt","insertOrderedList":"Numrerad lista","insertTable":"Infoga/redigera tabell","underline":"Understrykning","foreColor":"Förgrundsfärg","htmlToggle":"HTML-källkod","formatBlock":"Styckeformat","insertHorizontalRule":"Horisontell linjal","delete":"Ta bort","insertUnorderedList":"Punktlista","tableProp":"Tabellegenskap","insertImage":"Infoga bild","superscript":"Upphöjt","subscript":"Nedsänkt","createLink":"Skapa länk","undo":"Ångra","italic":"Kursiv","fontName":"Teckensnittsnamn","justifyLeft":"Vänsterjustera","unlink":"Ta bort länk","toggleTableBorder":"Aktivera/avaktivera tabellram","ctrlKey":"Ctrl+${0}","fontSize":"Teckenstorlek","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","systemShortcutFF":"Åtgärden \"${0}\" är endast tillgänglig i Mozilla Firefox med hjälp av ett kortkommando. Använd ${1}.","justifyRight":"Högerjustera","appleKey":"⌘${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/tr/FontChoice.js b/includes/js/dijit/_editor/nls/tr/FontChoice.js
new file mode 100644
index 0000000..3f11939
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/tr/FontChoice.js
@@ -0,0 +1 @@
+({"1":"xx-küçük","2":"x-küçük","formatBlock":"Biçim","monospaced":"eşaralıklı","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","fontSize":"Boyut","cursive":"el yazısı","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/tr/LinkDialog.js b/includes/js/dijit/_editor/nls/tr/LinkDialog.js
new file mode 100644
index 0000000..7f5856d
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/tr/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"Ayarla","text":"Açıklama:","insertImageTitle":"Resim Özellikleri","url":"URL:","createLinkTitle":"Bağlantı Özellikleri"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/tr/commands.js b/includes/js/dijit/_editor/nls/tr/commands.js
new file mode 100644
index 0000000..5731261
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/tr/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"Biçimi Kaldır","copy":"Kopyala","paste":"Yapıştır","selectAll":"Tümünü Seç","insertOrderedList":"Numaralı Liste","insertTable":"Tablo Ekle/Düzenle","underline":"Altı Çizili","foreColor":"Ön Plan Rengi","htmlToggle":"HTML Kaynağı","formatBlock":"Paragraf Stili","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","italic":"İtalik","fontName":"Yazı Tipi Adı","justifyLeft":"Sola Hizala","unlink":"Bağlantıyı Kaldır","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","fontSize":"Yazı Tipi Boyutu","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","systemShortcutFF":"\"${0}\" işlemi yalnızca Mozilla Firefox'ta bir klavye kısayoluyla birlikte kullanılabilir. ${1} işlemini kullanın.","justifyRight":"Sağa Hizala","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh-tw/FontChoice.js b/includes/js/dijit/_editor/nls/zh-tw/FontChoice.js
new file mode 100644
index 0000000..fa5527c
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh-tw/FontChoice.js
@@ -0,0 +1 @@
+({"1":"最小","2":"較小","formatBlock":"格式","monospaced":"單距","3":"小","4":"中","5":"大","6":"較大","7":"最大","fantasy":"Fantasy","serif":"新細明體","p":"段落","pre":"預先格式化","sans-serif":"新細明體","fontName":"字型","h1":"標題","h2":"子標題","h3":"次子標題","fontSize":"大小","cursive":"Cursive","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh-tw/LinkDialog.js b/includes/js/dijit/_editor/nls/zh-tw/LinkDialog.js
new file mode 100644
index 0000000..fb74fb6
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh-tw/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"設定","text":"說明:","insertImageTitle":"影像檔內容","url":"URL:","createLinkTitle":"鏈結內容"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh-tw/commands.js b/includes/js/dijit/_editor/nls/zh-tw/commands.js
new file mode 100644
index 0000000..adde3bc
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh-tw/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"移除格式","copy":"複製","paste":"貼上","selectAll":"全選","insertOrderedList":"編號清單","insertTable":"插入/編輯表格","underline":"底線","foreColor":"前景顏色","htmlToggle":"HTML 原始檔","formatBlock":"段落樣式","insertHorizontalRule":"水平尺規","delete":"刪除","insertUnorderedList":"項目符號清單","tableProp":"表格內容","insertImage":"插入影像","superscript":"上標","subscript":"下標","createLink":"建立鏈結","undo":"復原","italic":"斜體","fontName":"字型名稱","justifyLeft":"靠左對齊","unlink":"移除鏈結","toggleTableBorder":"切換表格邊框","fontSize":"字型大小","indent":"縮排","redo":"重做","strikethrough":"加刪除線","justifyFull":"對齊","justifyCenter":"置中對齊","hiliteColor":"背景顏色","deleteTable":"刪除表格","outdent":"凸排","cut":"剪下","plainFormatBlock":"段落樣式","toggleDir":"切換方向","bold":"粗體","systemShortcutFF":"\"${0}\" 動作在 Mozilla Firefox 中,只能使用鍵盤快速鍵。請使用 ${1}。","justifyRight":"靠右對齊","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh/FontChoice.js b/includes/js/dijit/_editor/nls/zh/FontChoice.js
new file mode 100644
index 0000000..ba28c8b
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh/FontChoice.js
@@ -0,0 +1 @@
+({"1":"XXS 号","2":"XS 号","formatBlock":"格式","monospaced":"等宽","3":"S 号","4":"M 号","5":"L 号","6":"XL 号","7":"XXL 号","fantasy":"虚线","serif":"有衬线","p":"段落","pre":"预设有格式的","sans-serif":"无衬线","fontName":"字体","h1":"标题","h2":"子标题","h3":"二级子标题","fontSize":"大小","cursive":"草书","monospace":"monospace"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh/LinkDialog.js b/includes/js/dijit/_editor/nls/zh/LinkDialog.js
new file mode 100644
index 0000000..73fca59
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh/LinkDialog.js
@@ -0,0 +1 @@
+({"set":"集合","text":"描述:","insertImageTitle":"图像属性","url":"URL:","createLinkTitle":"链接属性"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/nls/zh/commands.js b/includes/js/dijit/_editor/nls/zh/commands.js
new file mode 100644
index 0000000..4cb3c96
--- /dev/null
+++ b/includes/js/dijit/_editor/nls/zh/commands.js
@@ -0,0 +1 @@
+({"removeFormat":"除去格式","copy":"复制","paste":"粘贴","selectAll":"全选","insertOrderedList":"编号列表","insertTable":"插入/编辑表","underline":"下划线","foreColor":"前景色","htmlToggle":"HTML 源代码","formatBlock":"段落样式","insertHorizontalRule":"水平线","delete":"删除","insertUnorderedList":"符号列表","tableProp":"表属性","insertImage":"插入图像","superscript":"上标","subscript":"下标","createLink":"创建链接","undo":"撤销","italic":"斜体","fontName":"字体名称","justifyLeft":"左对齐","unlink":"除去链接","toggleTableBorder":"切换表边框","fontSize":"字体大小","indent":"增加缩进","redo":"重做","strikethrough":"删除线","justifyFull":"对齐","justifyCenter":"居中","hiliteColor":"背景色","deleteTable":"删除表","outdent":"减少缩进","cut":"剪切","plainFormatBlock":"段落样式","toggleDir":"固定方向","bold":"粗体","systemShortcutFF":"只能在 Mozilla Firefox 中通过键盘快捷方式执行“${0}”操作。请使用 ${1}。","justifyRight":"右对齐","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
diff --git a/includes/js/dijit/_editor/plugins/AlwaysShowToolbar.js b/includes/js/dijit/_editor/plugins/AlwaysShowToolbar.js
new file mode 100644
index 0000000..9879e88
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/AlwaysShowToolbar.js
@@ -0,0 +1,140 @@
+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){
+ this.editor = e;
+// setTimeout(dojo.hitch(this,this.enable), 10000);
+ e.onLoadDeferred.addCallback(dojo.hitch(this, this.enable));
+// this.scrollInterval = setInterval(dojo.hitch(this, "globalOnScrollHandler"), 100);
+ },
+ enable: function(d){
+ 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.marginBox(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.marginBox(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(height != this._lastHeight){
+ this._lastHeight = height;
+ // this.editorObject.style.height = this._lastHeight + "px";
+ dojo.marginBox(e.iframe, { h: this._lastHeight });
+// this.iframe.height=this._lastHeight+10+'px';
+// this.iframe.style.height=this._lastHeight+'px';
+ }
+ },
+ _lastHeight: 0,
+ globalOnScrollHandler: function(){
+ var isIE = dojo.isIE && dojo.isIE<7;
+ if(!this._handleScroll){ return; }
+ var tdn = this.editor.toolbar.domNode;
+ var db = dojo.body;
+
+ if(!this._scrollSetUp){
+ this._scrollSetUp = true;
+ this._scrollThreshold = dojo._abs(tdn, true).y;
+// console.log("threshold:", this._scrollThreshold);
+ //what's this for?? comment out for now
+// if((isIE)&&(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.marginBox(tdn);
+ this.editor.iframe.style.marginTop = tdnbox.h+"px";
+
+ if(isIE){
+ s.left = dojo._abs(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(isIE){
+ 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(){
+ this._IEOriginalPos = null;
+ this._handleScroll = false;
+ dojo.forEach(this._connects, dojo.disconnect);
+// clearInterval(this.scrollInterval);
+
+ if(dojo.isIE && dojo.isIE<7){
+ dojo.removeClass(this.editor.toolbar.domNode, 'dijitIEFixedToolbar');
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/plugins/EnterKeyHandling.js b/includes/js/dijit/_editor/plugins/EnterKeyHandling.js
new file mode 100644
index 0000000..083743d
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/EnterKeyHandling.js
@@ -0,0 +1,416 @@
+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 handle enter key events to make all
+ // browsers have identical behaviors.
+
+ // 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.
+ blockNodeForEnter: 'P',
+ constructor: function(args){
+ if(args){
+ dojo.mixin(this,args);
+ }
+ },
+ setEditor: function(editor){
+ 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, h); //enter
+ editor.addKeyHandler(13, 2, h); //shift+enter
+ this.connect(this.editor,'onKeyPressed','onKeyPressed');
+ }
+ },
+ connect: function(o,f,tf){
+ if(!this._connects){
+ this._connects=[];
+ }
+ this._connects.push(dojo.connect(o,f,this,tf));
+ },
+ destroy: function(){
+ dojo.forEach(this._connects,dojo.disconnect);
+ this._connects=[];
+ },
+ onKeyPressed: function(e){
+ if(this._checkListLater){
+ if(dojo.withGlobal(this.editor.window, 'isCollapsed', dijit)){
+ if(!dojo.withGlobal(this.editor.window, 'hasAncestorElement', dijit._editor.selection, ['LI'])){
+ //circulate the undo detection code by calling RichText::execCommand directly
+ dijit._editor.RichText.prototype.execCommand.apply(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){
+ //the following won't work, it will move the caret to the last list item in the previous list
+// var newrange = dijit.range.create();
+// newrange.setStart(block.firstChild,0);
+// var selection = dijit.range.getSelection(this.editor.window)
+// selection.removeAllRanges();
+// selection.addRange(newrange);
+ //move to the start by move backward one char
+ var r = this.editor.document.selection.createRange();
+ r.move('character',-1);
+ r.select();
+ }
+ }else{
+ alert('onKeyPressed: Can not find the new block node'); //FIXME
+ }
+ }
+ }
+ this._checkListLater = false;
+ }else if(this._pressedEnterInBlock){
+ //the new created is the original current P, so we have previousSibling below
+ this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
+ delete this._pressedEnterInBlock;
+ }
+ },
+ bogusHtmlContent: '&nbsp;',
+ blockNodes: /^(?:H1|H2|H3|H4|H5|H6|LI)$/,
+ handleEnterKey: function(e){
+ // summary: manually handle enter key event to make the behavior consistant across
+ // all supported browsers. See property blockNodeForEnter for available options
+ if(!this.blockNodeForEnter){ return true; } //let browser handle this
+ var selection, range, newrange;
+ if(e.shiftKey //shift+enter always generates <br>
+ || this.blockNodeForEnter=='BR'){
+ var parent = dojo.withGlobal(this.editor.window, "getParentElement", dijit._editor.selection);
+ var header = dijit.range.getAncestor(parent,this.editor.blockNodes);
+ if(header){
+ if(header.tagName=='LI'){
+ return true; //let brower handle
+ }
+ selection = dijit.range.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ if(!range.collapsed){
+ range.deleteContents();
+ }
+ if(dijit.range.atBeginningOfContainer(header, range.startContainer, range.startOffset)){
+ dojo.place(this.editor.document.createElement('br'), header, "before");
+ }else if(dijit.range.atEndOfContainer(header, range.startContainer, range.startOffset)){
+ dojo.place(this.editor.document.createElement('br'), header, "after");
+ newrange = dijit.range.create();
+ newrange.setStartAfter(header);
+
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ }else{
+ return true; //let brower handle
+ }
+ }else{
+ //don't change this: do not call this.execCommand, as that may have other logic in subclass
+ // FIXME
+ dijit._editor.RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>');
+ }
+ return false;
+ }
+ var _letBrowserHandle = true;
+ //blockNodeForEnter is either P or DIV
+ //first remove selection
+ selection = dijit.range.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ if(!range.collapsed){
+ range.deleteContents();
+ }
+
+ var block = dijit.range.getBlockAncestor(range.endContainer, null, this.editor.editNode);
+
+ if((this._checkListLater = (block.blockNode && block.blockNode.tagName == 'LI'))){
+ return true;
+ }
+
+ //text node directly under body, let's wrap them in a node
+ if(!block.blockNode){
+ this.editor.document.execCommand('formatblock', false, this.blockNodeForEnter);
+ //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.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length){
+ this.removeTrailingBr(block.blockNode);
+ return false;
+ }
+ }else{
+ block.blockNode = this.editor.editNode;
+ }
+ selection = dijit.range.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ }
+ var newblock = this.editor.document.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();
+ newrange.setStart(newblock,0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(this.editor.height){
+ newblock.scrollIntoView(false);
+ }
+ }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){
+ //browser does not scroll the caret position into view, do it manually
+ newblock.nextSibling.scrollIntoView(false);
+ }
+ _letBrowserHandle = false;
+ }else{ //press enter in the middle of P
+ 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){
+ 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 && para.lastChild.tagName=='BR')){
+
+ dojo._destroyElement(para.lastChild);
+ }
+ }
+ if(!para.childNodes.length){
+ para.innerHTML=this.bogusHtmlContent;
+ }
+ },
+ _fixNewLineBehaviorForIE: function(d){
+ if(this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS === undefined){
+ var lineFixingStyles = "p{margin:0 !important;}";
+ var insertCssText = function(
+ /*String*/ cssStr,
+ /*Document*/ doc,
+ /*String*/ URI)
+ {
+ // summary:
+ // Attempt to insert CSS rules into the document through inserting a
+ // style element
+
+ // DomNode Style = insertCssText(String ".dojoMenu {color: green;}"[, DomDoc document, dojo.uri.Uri Url ])
+ if(!cssStr){
+ return null; // HTMLStyleElement
+ }
+ if(!doc){ doc = document; }
+// if(URI){// fix paths in cssStr
+// cssStr = dojo.html.fixPathsInCssText(cssStr, URI);
+// }
+ var style = doc.createElement("style");
+ style.setAttribute("type", "text/css");
+ // IE is b0rken enough to require that we add the element to the doc
+ // before changing it's properties
+ var head = doc.getElementsByTagName("head")[0];
+ if(!head){ // must have a head tag
+ console.debug("No head tag in document, aborting styles");
+ return null; // HTMLStyleElement
+ }else{
+ head.appendChild(style);
+ }
+ if(style.styleSheet){// IE
+ var setFunc = function(){
+ try{
+ style.styleSheet.cssText = cssStr;
+ }catch(e){ console.debug(e); }
+ };
+ if(style.styleSheet.disabled){
+ setTimeout(setFunc, 10);
+ }else{
+ setFunc();
+ }
+ }else{ // w3c
+ var cssText = doc.createTextNode(cssStr);
+ style.appendChild(cssText);
+ }
+ return style; // HTMLStyleElement
+ }
+ insertCssText(lineFixingStyles, this.editor.document);
+ this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS = true;
+ // this.regularPsToSingleLinePs(this.editNode);
+ return d;
+ }
+ return null;
+ },
+ regularPsToSingleLinePs: function(element, noWhiteSpaceInEmptyP){
+ 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.nodeName!='BR') &&
+ (currentNode.nodeType==1) &&
+ (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._destroyElement(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._destroyElement(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){
+ if( (p.previousSibling) &&
+ (p.previousSibling.nodeName == 'P' || dojo.style(p.previousSibling, '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){
+ function getParagraphParents(node){
+ 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){
+ if(node.nodeType != 1 || node.tagName != 'P'){
+ return dojo.style(node, 'display') == 'block';
+ }else{
+ if(!node.childNodes.length || node.innerHTML=="&nbsp;"){ return true; }
+ //return node.innerHTML.match(/^(<br\ ?\/?>| |\&nbsp\;)$/i);
+ }
+ return false;
+ }
+
+ 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'){
+ 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._destroyElement(deleteNode);
+ deleteNode = null;
+ }
+ }
+ }
+ return element;
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/plugins/FontChoice.js b/includes/js/dijit/_editor/plugins/FontChoice.js
new file mode 100644
index 0000000..642237b
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/FontChoice.js
@@ -0,0 +1,167 @@
+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.form.FilteringSelect");
+dojo.require("dojo.data.ItemFileReadStore");
+dojo.require("dojo.i18n");
+
+dojo.requireLocalization("dijit._editor", "FontChoice", null, "zh,pt,da,tr,ru,de,sv,ja,he,ROOT,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit._editor.plugins.FontChoice",
+ dijit._editor._Plugin,
+ {
+ // summary:
+ // This plugin provides three dropdowns for setting font information in the editor
+ //
+ // description:
+ // The commands provided by this plugin are:
+ //
+ // * fontName
+ // | Provides a dropdown to select from a list of generic font names
+ // * fontSize
+ // | Provides a dropdown to select from a list of pre-defined font sizes
+ // * formatBlock
+ // | Provides a dropdown to select from a list of 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.
+
+ _uniqueId: 0,
+
+ buttonClass: dijit.form.FilteringSelect,
+
+ _initButton: function(){
+ //TODO: would be nice to be able to handle comma-separated font lists and search within them
+ var cmd = this.command;
+ var names = this.custom ||
+ {
+ fontName: this.generic ? ["serif", "sans-serif", "monospace", "cursive", "fantasy"] : // CSS font-family generics
+ ["Arial", "Times New Roman", "Comic Sans MS", "Courier New"],
+ fontSize: [1,2,3,4,5,6,7], // sizes according to the old HTML FONT SIZE
+ formatBlock: ["p", "h1", "h2", "h3", "pre"]
+ }[cmd];
+ var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice");
+ var items = dojo.map(names, function(value){
+ var name = strings[value] || value;
+ var label = name;
+ switch(cmd){
+ case "fontName":
+ label = "<div style='font-family: "+value+"'>" + name + "</div>";
+ break;
+ case "fontSize":
+ // we're stuck using the deprecated FONT tag to correspond with the size measurements used by the editor
+ label = "<font size="+value+"'>"+name+"</font>";
+ break;
+ case "formatBlock":
+ label = "<" + value + ">" + name + "</" + value + ">";
+ }
+ return { label: label, name: name, value: value };
+ });
+ items.push({label: "", name:"", value:""}); // FilteringSelect doesn't like unmatched blank strings
+
+ dijit._editor.plugins.FontChoice.superclass._initButton.apply(this,
+ [{ labelType: "html", labelAttr: "label", searchAttr: "name", store: new dojo.data.ItemFileReadStore(
+ { data: { identifier: "value", items: items } })}]);
+
+ this.button.setValue("");
+
+ this.connect(this.button, "onChange", function(choice){
+ if(this.updating){ return; }
+ // FIXME: IE is really messed up here!!
+ if(dojo.isIE && "_savedSelection" in this){
+ var b = this._savedSelection;
+ delete this._savedSelection;
+ this.editor.focus();
+ this.editor._moveToBookmark(b);
+ }else{
+// this.editor.focus();
+ dijit.focus(this._focusHandle);
+ }
+ if(this.command == "fontName" && choice.indexOf(" ") != -1){ choice = "'" + choice + "'"; }
+ this.editor.execCommand(this.editor._normalizeCommand(this.command), choice);
+ });
+ },
+
+ updateState: function(){
+ this.inherited(arguments);
+ var _e = this.editor;
+ var _c = this.command;
+ if(!_e || !_e.isLoaded || !_c.length){ return; }
+ if(this.button){
+ var value = _e.queryCommandValue(this.editor._normalizeCommand(_c)) || "";
+ // strip off single quotes, if any
+ var quoted = dojo.isString(value) && value.match(/'([^']*)'/);
+ if(quoted){ value = quoted[1]; }
+//console.log("selected " + value);
+ if(this.generic && _c == "fontName"){
+ 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?
+ };
+//console.log("mapped to " + map[value]);
+ value = map[value] || value;
+ }else if(_c == "fontSize" && value.indexOf && value.indexOf("px") != -1){
+ var pixels = parseInt(value);
+ value = {10:1, 13:2, 16:3, 18:4, 24:5, 32:6, 48:7}[pixels] || value;
+ }
+ this.updating = true;
+ this.button.setValue(value);
+ delete this.updating;
+ }
+
+ // FIXME: IE is *really* b0rken
+ if(dojo.isIE){
+ this._savedSelection = this.editor._getBookmark();
+ }
+ this._focusHandle = dijit.getFocus(this.editor.iframe);
+ },
+
+ setToolbar: function(){
+ this.inherited(arguments);
+
+ var forRef = this.button;
+ if(!forRef.id){ forRef.id = dijit._scopeName+"EditorButton-"+this.command+(this._uniqueId++); } //TODO: is this necessary? FilteringSelects always seem to have an id?
+ var label = dojo.doc.createElement("label");
+ dojo.addClass(label, "dijit dijitReset dijitLeft dijitInline");
+ label.setAttribute("for", forRef.id);
+ var strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice");
+ label.appendChild(dojo.doc.createTextNode(strings[this.command]));
+ dojo.place(label, this.button.domNode, "before");
+ }
+ }
+);
+
+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});
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/plugins/LinkDialog.js b/includes/js/dijit/_editor/plugins/LinkDialog.js
new file mode 100644
index 0000000..9015058
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/LinkDialog.js
@@ -0,0 +1,147 @@
+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.Dialog");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dojo.i18n");
+dojo.require("dojo.string");
+dojo.requireLocalization("dijit._editor", "LinkDialog", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare("dijit._editor.plugins.LinkDialog",
+ dijit._editor._Plugin,
+ {
+ // summary:
+ // This plugin provides dialogs for inserting links and images into the editor
+ //
+ // description:
+ // The commands provided by this plugin are:
+ // * createLink
+ // * insertImage
+
+ buttonClass: dijit.form.DropDownButton,
+ useDefaultCommand: false,
+ urlRegExp: "((https?|ftps?)\\://|)(([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+(arpa|aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(((\\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])))(\\:(0|[1-9]\\d*))?(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?",
+ 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'>",
+ "</td></tr><tr><td>",
+ "<label for='${id}_textInput'>${text}</label>",
+ "</td><td>",
+ "<input dojoType='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' name='textInput'>",
+ "</td></tr><tr><td colspan='2'>",
+ "<button dojoType='dijit.form.Button' type='submit'>${set}</button>",
+ "</td></tr></table>"
+ ].join(""),
+
+ _initButton: function(){
+ var _this = this;
+ this.tag = this.command == 'insertImage' ? 'img' : 'a';
+ var messages = 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);
+ },
+ onClose: dojo.hitch(this, "_onCloseDialog")
+ }));
+ messages.urlRegExp = this.urlRegExp;
+ messages.id = dijit.getUniqueId(this.editor.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.inherited(arguments);
+ },
+
+ _setContent: function(staticPanel){
+ this.dropDown.setContent(staticPanel);
+ },
+
+ setValue: function(args){
+ // summary: callback from the dialog when user hits "set" button
+ //TODO: prevent closing popup if the text is empty
+ this._onCloseDialog();
+ if(dojo.isIE){ //see #4151
+ var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+ if(a){
+ dojo.withGlobal(this.editor.window, "selectElement", dijit._editor.selection, [a]);
+ }
+ }
+ args.tag = this.tag;
+ args.refAttr = this.tag == 'img' ? 'src' : 'href';
+ //TODO: textInput should be formatted by escapeXml
+ var template = "<${tag} ${refAttr}='${urlInput}' _djrealurl='${urlInput}'" +
+ (args.tag == 'img' ? " alt='${textInput}'>" : ">${textInput}") +
+ "</${tag}>";
+ this.editor.execCommand('inserthtml', dojo.string.substitute(template, args));
+ },
+
+ _onCloseDialog: function(){
+ // FIXME: IE is really messed up here!!
+ if(dojo.isIE){
+ if("_savedSelection" in this){
+ var b = this._savedSelection;
+ delete this._savedSelection;
+ this.editor.focus();
+ this.editor._moveToBookmark(b);
+ }
+ }else{
+ this.editor.focus();
+ }
+ },
+
+ _onOpenDialog: function(){
+ var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+ var url, text;
+ if(a){
+ url = a.getAttribute('_djrealurl');
+ text = this.tag == 'img' ? a.getAttribute('alt') : 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);
+ }
+ // FIXME: IE is *really* b0rken
+ if(dojo.isIE){
+ this._savedSelection = this.editor._getBookmark();
+ }
+ this.dropDown.reset();
+ this.dropDown.setValues({urlInput: url || '', textInput: text || ''});
+ //dijit.focus(this.urlInput);
+ }/*,
+
+//TODO we don't show this state anymore
+ updateState: function(){
+ // summary: change shading on button if we are over a link (or not)
+
+ var _e = this.editor;
+ if(!_e || !_e.isLoaded){ return; }
+ if(this.button){
+ // display button differently if there is an existing link associated with the current selection
+ var hasA = dojo.withGlobal(this.editor.window, "hasAncestorElement", dijit._editor.selection, [this.tag]);
+ this.button.setAttribute('checked', hasA);
+ }
+ }
+*/
+ }
+);
+
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+ if(o.plugin){ return; }
+ switch(o.args.name){
+ case "createLink": case "insertImage":
+ o.plugin = new dijit._editor.plugins.LinkDialog({command: o.args.name});
+ }
+});
+
+}
diff --git a/includes/js/dijit/_editor/plugins/TextColor.js b/includes/js/dijit/_editor/plugins/TextColor.js
new file mode 100644
index 0000000..fef3911
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/TextColor.js
@@ -0,0 +1,40 @@
+if(!dojo._hasResource["dijit._editor.plugins.TextColor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.TextColor"] = true;
+dojo.provide("dijit._editor.plugins.TextColor");
+
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.ColorPalette");
+
+dojo.declare("dijit._editor.plugins.TextColor",
+ dijit._editor._Plugin,
+ {
+ // summary:
+ // This plugin provides dropdown color pickers for setting text color and background color
+ //
+ // description:
+ // The commands provided by this plugin are:
+ // * foreColor - sets the text color
+ // * hiliteColor - sets the background color
+
+ buttonClass: dijit.form.DropDownButton,
+
+//TODO: set initial focus/selection state?
+
+ constructor: function(){
+ this.dropDown = new dijit.ColorPalette();
+ this.connect(this.dropDown, "onChange", function(color){
+ this.editor.execCommand(this.command, color);
+ });
+ }
+ }
+);
+
+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/includes/js/dijit/_editor/plugins/ToggleDir.js b/includes/js/dijit/_editor/plugins/ToggleDir.js
new file mode 100644
index 0000000..7aaae70
--- /dev/null
+++ b/includes/js/dijit/_editor/plugins/ToggleDir.js
@@ -0,0 +1,40 @@
+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.experimental("dijit._editor.plugins.ToggleDir");
+
+dojo.require("dijit._editor._Plugin");
+
+dojo.declare("dijit._editor.plugins.ToggleDir",
+ dijit._editor._Plugin,
+ {
+ //summary: This plugin is used to toggle direction of the edited document only,
+ // no matter what direction the whole page is.
+
+ useDefaultCommand: false,
+ command: "toggleDir",
+
+ _initButton: function(){
+ this.inherited("_initButton", arguments);
+ this.connect(this.button, "onClick", this._toggleDir);
+ },
+
+ updateState: function(){},//overwrite
+
+ _toggleDir: function(){
+ var editDoc = this.editor.editorObject.contentWindow.document.documentElement;
+ var isLtr = dojo.getComputedStyle(editDoc).direction == "ltr";
+ editDoc.dir/*html node*/ = isLtr ? "rtl" : "ltr";
+ }
+ }
+);
+
+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/includes/js/dijit/_editor/range.js b/includes/js/dijit/_editor/range.js
new file mode 100644
index 0000000..cd84b60
--- /dev/null
+++ b/includes/js/dijit/_editor/range.js
@@ -0,0 +1,570 @@
+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){
+ var getAncestors = function(n,root){
+ var as=[];
+ while(n){
+ as.unshift(n);
+ if(n!=root && n.tagName!='BODY'){
+ n = n.parentNode;
+ }else{
+ break;
+ }
+ }
+ return as;
+ };
+ var n1as = getAncestors(n1,root);
+ var n2as = getAncestors(n2,root);
+
+ 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(dojo.trim(node.nodeValue.substr(0,offset))==0){
+ 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(dojo.trim(node.nodeValue.substr(offset))==0){
+ 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(){
+ if(dijit.range._w3c){
+ return dojo.doc.createRange();
+ }else{//IE
+ return new dijit.range.W3CRange;
+ }
+}
+
+dijit.range.getSelection = function(win, /*Boolean?*/ignoreUpdate){
+ if(dijit.range._w3c){
+ return win.getSelection();
+ }else{//IE
+ var id=win.__W3CRange,s;
+ if(!id || !dijit.range.ie.cachedSelection[id]){
+ s = new dijit.range.ie.selection(win);
+ //use win as the key in an object is not reliable, which
+ //can leads to quite odd behaviors. thus we generate a
+ //string and use it as a key in the cache
+ id=(new Date).getTime();
+ while(id in dijit.range.ie.cachedSelection){
+ id=id+1;
+ }
+ id=String(id);
+ dijit.range.ie.cachedSelection[id] = s;
+ }else{
+ s = dijit.range.ie.cachedSelection[id];
+ }
+ 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 share 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!=3 && startOffset == startnode.childNodes.length){
+ if(startnode.nextSibling && startnode.nextSibling.nodeType==3){
+ startnode = startnode.nextSibling;
+ startOffset = 0;
+ }
+ }
+ return [startnode, startOffset];
+ },
+ setEndPoint: function(range, container, offset){
+ //text node
+ var atmrange = range.duplicate(), node, len;
+ if(container.nodeType!=3){ //normal node
+ atmrange.moveToElementText(container);
+ atmrange.collapse(true);
+ if(offset == container.childNodes.length){
+ if(offset > 0){
+ //a simple atmrange.collapse(false); won't work here:
+ //although moveToElementText(node) is supposed to encompass the content of the node,
+ //but when collapse to end, it is in fact after the ending tag of node (collapse to start
+ //is after the begining tag of node as expected)
+ node = container.lastChild;
+ len = 0;
+ while(node && node.nodeType == 3){
+ len += node.length;
+ container = node; //pass through
+ node = node.previousSibling;
+ }
+ if(node){
+ atmrange.moveToElementText(node);
+ }
+ atmrange.collapse(false);
+ offset = len; //pass through
+ }else{ //no childNodes
+ atmrange.moveToElementText(container);
+ atmrange.collapse(true);
+ }
+ }else{
+ if(offset > 0){
+ node = container.childNodes[offset-1];
+ if(node.nodeType==3){
+ container = node;
+ offset = node.length;
+ //pass through
+ }else{
+ atmrange.moveToElementText(node);
+ atmrange.collapse(false);
+ }
+ }
+ }
+ }
+ 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.moveEnd('character',offset) != offset){
+ alert('Error when moving!');
+ }
+ atmrange.collapse(false);
+ }
+ }
+
+ return atmrange;
+ },
+ decomposeTextRange: function(range){
+ var tmpary = dijit.range.ie.getEndPoint(range);
+ var startContainter = tmpary[0], startOffset = tmpary[1];
+ var endContainter = 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);
+ endContainter = tmpary[0], endOffset = tmpary[1];
+ }
+ }
+ return [[startContainter, startOffset],[endContainter, endOffset], range.parentElement()];
+ },
+ setRange: function(range, startContainter,
+ startOffset, endContainter, endOffset, check){
+ var startrange = dijit.range.ie.setEndPoint(range, startContainter, startOffset);
+ range.setEndPoint('StartToStart', startrange);
+ if(!this.collapsed){
+ var endrange = dijit.range.ie.setEndPoint(range, endContainter, endOffset);
+ range.setEndPoint('EndToEnd', endrange);
+ }
+
+ return range;
+ }
+ }
+
+dojo.declare("dijit.range.W3CRange",null, {
+ constructor: function(){
+ if(arguments.length>0){
+ this.setStart(arguments[0][0][0],arguments[0][0][1]);
+ this.setEnd(arguments[0][1][0],arguments[0][1][1],arguments[0][2]);
+ }else{
+ this.commonAncestorContainer = null;
+ this.startContainer = null;
+ this.startOffset = 0;
+ this.endContainer = null;
+ this.endOffset = 0;
+ this.collapsed = true;
+ }
+ },
+ _simpleSetEndPoint: function(node, range, end){
+ var r = (this._body||node.ownerDocument.body).createTextRange();
+ if(node.nodeType!=1){
+ r.moveToElementText(node.parentNode);
+ }else{
+ r.moveToElementText(node);
+ }
+ r.collapse(true);
+ range.setEndPoint(end?'EndToEnd':'StartToStart',r);
+ },
+ _updateInternal: function(__internal_common){
+ if(this.startContainer !== this.endContainer){
+ if(!__internal_common){
+ var r = (this._body||this.startContainer.ownerDocument.body).createTextRange();
+ this._simpleSetEndPoint(this.startContainer,r);
+ this._simpleSetEndPoint(this.endContainer,r,true);
+ __internal_common = r.parentElement();
+ }
+ this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer, __internal_common);
+ }else{
+ this.commonAncestorContainer = this.startContainer;
+ }
+ this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset);
+ },
+ setStart: function(node, offset, __internal_common){
+ 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, __internal_common);
+ }else{
+ this._updateInternal(__internal_common);
+ }
+ },
+ setEnd: function(node, offset, __internal_common){
+ 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, __internal_common);
+ }else{
+ this._updateInternal(__internal_common);
+ }
+ },
+ 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);
+ 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)
+
+}
diff --git a/includes/js/dijit/_editor/selection.js b/includes/js/dijit/_editor/selection.js
new file mode 100644
index 0000000..9b403aa
--- /dev/null
+++ b/includes/js/dijit/_editor/selection.js
@@ -0,0 +1,246 @@
+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.doc.selection){ //IE
+ 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;
+ }
+ },
+
+ getSelectedText: function(){
+ // summary:
+ // Return the text (no html tags) included in the current selection or null if no text is selected
+ if(dojo.doc.selection){ //IE
+ 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();
+ }
+ }
+ return ''
+ },
+
+ getSelectedHtml: function(){
+ // summary:
+ // Return the html of the current selection or null if unavailable
+ if(dojo.doc.selection){ //IE
+ 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 frag = selection.getRangeAt(0).cloneContents();
+ var div = dojo.doc.createElement("div");
+ div.appendChild(frag);
+ return div.innerHTML;
+ }
+ 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(this.getType() == "control"){
+ if(dojo.doc.selection){ //IE
+ 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(this.getType() == "control"){
+ var p = this.getSelectedElement();
+ if(p){ return p.parentNode; }
+ }else{
+ if(dojo.doc.selection){ //IE
+ return dojo.doc.selection.createRange().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)
+ return this.getAncestorElement.apply(this, arguments) != null;
+ },
+
+ 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)
+
+ var node = this.getSelectedElement() || this.getParentElement();
+ return this.getParentOfType(node, arguments);
+ },
+
+ isTag: function(/*DomNode*/node, /*Array*/tags){
+ 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;
+ }
+ }
+ }
+ return "";
+ },
+
+ getParentOfType: function(/*DomNode*/node, /*Array*/tags){
+ while(node){
+ if(this.isTag(node, tags).length){
+ return node;
+ }
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ collapse: function(/*Boolean*/beginning) {
+ // summary: clear current selection
+ 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.doc.selection){ // IE
+ var range = dojo.doc.selection.createRange();
+ range.collapse(beginning);
+ range.select();
+ }
+ },
+
+ remove: function(){
+ // summary: delete current selection
+ var _s = dojo.doc.selection;
+ if(_s){ //IE
+ if(_s.type.toLowerCase() != "none"){
+ _s.clear();
+ }
+ return _s;
+ }else{
+ _s = dojo.global.getSelection();
+ _s.deleteFromDocument();
+ return _s;
+ }
+ },
+
+ selectElementChildren: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+ // summary:
+ // clear previous selection and select the content of the node
+ // (excluding the node itself)
+ var _window = dojo.global;
+ var _document = dojo.doc;
+ element = dojo.byId(element);
+ if(_document.selection && dojo.body().createTextRange){ // IE
+ var 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(_window.getSelection){
+ var selection = _window.getSelection();
+ if(selection.setBaseAndExtent){ // Safari
+ selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
+ }else if(selection.selectAllChildren){ // Mozilla
+ selection.selectAllChildren(element);
+ }
+ }
+ },
+
+ selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+ // summary:
+ // clear previous selection and select element (including all its children)
+ var range, _document = dojo.doc;
+ element = dojo.byId(element);
+ if(_document.selection && dojo.body().createTextRange){ // IE
+ 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 = dojo.global.getSelection();
+ // FIXME: does this work on Safari?
+ if(selection.removeAllRanges){ // Mozilla
+ range = _document.createRange();
+ range.selectNode(element);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/_tree/Node.html b/includes/js/dijit/_tree/Node.html
new file mode 100644
index 0000000..00e49a5
--- /dev/null
+++ b/includes/js/dijit/_tree/Node.html
@@ -0,0 +1,12 @@
+<div class="dijitTreeNode" waiRole="presentation"
+ ><div dojoAttachPoint="rowNode" waiRole="presentation"
+ ><span dojoAttachPoint="expandoNode" class="dijitTreeExpando" waiRole="presentation"
+ ></span
+ ><span dojoAttachPoint="expandoNodeText" class="dijitExpandoText" waiRole="presentation"
+ ></span
+ ><div dojoAttachPoint="contentNode" class="dijitTreeContent" waiRole="presentation">
+ <div dojoAttachPoint="iconNode" class="dijitInline dijitTreeIcon" waiRole="presentation"></div>
+ <span dojoAttachPoint="labelNode" class="dijitTreeLabel" wairole="treeitem" tabindex="-1" waiState="selected-false" dojoAttachEvent="onfocus:_onNodeFocus"></span>
+ </div
+ ></div>
+</div>
diff --git a/includes/js/dijit/_tree/Tree.html b/includes/js/dijit/_tree/Tree.html
new file mode 100644
index 0000000..9b90f4e
--- /dev/null
+++ b/includes/js/dijit/_tree/Tree.html
@@ -0,0 +1,3 @@
+<div class="dijitTreeContainer" waiRole="tree"
+ dojoAttachEvent="onclick:_onClick,onkeypress:_onKeyPress">
+</div>
diff --git a/includes/js/dijit/_tree/dndContainer.js b/includes/js/dijit/_tree/dndContainer.js
new file mode 100644
index 0000000..308e5ea
--- /dev/null
+++ b/includes/js/dijit/_tree/dndContainer.js
@@ -0,0 +1,150 @@
+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(tree, params){
+ // summary: a constructor of the Container
+ // tree: Node: node or node's id to build the container on
+ // params: Object: a dict of parameters, which gets mixed into the object
+ 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
+
+ // 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", dojo, "stopEvent"),
+ dojo.connect(this.node, "onselectstart", dojo, "stopEvent")
+ ];
+ },
+
+
+ // abstract access to the map
+ getItem: function(/*String*/ key){
+ // summary: returns a data item by its key (id)
+ //console.log("Container getItem()", arguments,this.map, this.map[key], this.selection[key]);
+ return this.selection[key];
+ //return this.map[key]; // Object
+ },
+
+ // mouse events
+ onMouseOver: function(e){
+ // summary: event processor for onmouseover
+ // e: Event: mouse event
+
+ // handle when mouse has just moved over the Tree itself (not a TreeNode, but the Tree)
+ var rt = e.relatedTarget; // the previous location
+ while(rt){
+ if(rt == this.node){ break; }
+ try{
+ rt = rt.parentNode;
+ }catch(x){
+ rt = null;
+ }
+ }
+ if(!rt){
+ this._changeState("Container", "Over");
+ this.onOverEvent();
+ }
+
+ // code below is for handling depending on which TreeNode we are over
+ var n = this._getChildByEvent(e); // the TreeNode
+ 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();
+ },
+
+ _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;
+ },
+
+ _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(dojo.hasClass(node, "dijitTreeContent")){ return node; }
+ }
+ }
+ return null;
+ },
+
+ markupFactory: function(tree, params){
+ params._skipStartup = true;
+ return new dijit._tree.dndContainer(tree, params);
+ },
+
+ _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
+ },
+
+ onOutEvent: function(){
+ // summary: this function is called once, when mouse is out of our container
+ }
+});
+
+}
diff --git a/includes/js/dijit/_tree/dndSelector.js b/includes/js/dijit/_tree/dndSelector.js
new file mode 100644
index 0000000..b19210f
--- /dev/null
+++ b/includes/js/dijit/_tree/dndSelector.js
@@ -0,0 +1,171 @@
+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(tree, params){
+ 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")
+ );
+ },
+
+ // object attributes (for markup)
+ singular: false, // is singular property
+
+ // methods
+ getSelectedItems: function(){
+ var selectedItems = []
+ for (var i in this.selection){
+ selectedItems.push(dijit.getEnclosingWidget(this.selection[i]).item);
+ }
+ return selectedItems;
+ },
+
+ getSelectedNodes: function(){
+ return this.selection;
+ },
+
+ selectNone: function(){
+ // summary: unselects all items
+ return this._removeSelection()._removeAnchor(); // self
+ },
+
+ insertItems: function(item, parent){
+ // summary: inserts new data items (see Container's insertNodes method for details)
+
+ //we actually need to add things to the store here instead of adding noes to the tree directly
+ },
+
+ destroy: function(){
+ // summary: prepares the object to be garbage-collected
+ dojo.dnd.Selector.superclass.destroy.call(this);
+ this.selection = this.anchor = null;
+ },
+
+ // mouse events
+ onMouseDown: function(e){
+ // summary: event processor for onmousedown
+ // e: Event: mouse event
+ if(!this.current){ return; }
+
+ var item = dijit.getEnclosingWidget(this.current).item
+ var id = this.tree.model.getIdentity(item);
+
+ if (!this.current.id) {
+ this.current.id=id;
+ }
+
+ if (!this.current.type) {
+ this.current.type="data";
+ }
+
+ if(!this.singular && !dojo.dnd.getCopyKeyState(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.dnd.getCopyKeyState(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.dnd.getCopyKeyState(e)){
+ //TODO add range to selection
+ }else{
+ //TODO select new range from anchor
+ }
+ }else{
+ if(dojo.dnd.getCopyKeyState(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{
+ var item = dijit.getEnclosingWidget(this.current).item
+ var id = this.tree.model.getIdentity(item);
+ if(!(id in this.selection)){
+ this.selectNone();
+ this.anchor = this.current;
+ this._addItemClass(this.current, "Anchor");
+ this.selection[id] = this.current;
+ }
+ }
+ }
+ }
+
+ dojo.stopEvent(e);
+ },
+
+ onMouseMove: function() {
+
+ },
+
+ onOverEvent: function() {
+ this.onmousemoveEvent = dojo.connect(this.node, "onmousemove", this, "onMouseMove");
+ },
+
+ onMouseUp: function(e){
+ // summary: event processor for onmouseup
+ // e: Event: mouse event
+ if(!this.simpleSelection){ return; }
+ this.simpleSelection = false;
+ this.selectNone();
+ if(this.current){
+ this.anchor = this.current;
+ this._addItemClass(this.anchor, "Anchor");
+ this.selection[this.current.id] = this.current;
+ }
+ },
+ _removeSelection: function(){
+ // summary: unselects all items
+ var e = dojo.dnd._empty;
+ for(var i in this.selection){
+ if(i in e){ continue; }
+ var node = dojo.byId(i);
+ if(node){ this._removeItemClass(node, "Selected"); }
+ }
+ this.selection = {};
+ return this; // self
+ },
+ _removeAnchor: function(){
+ if(this.anchor){
+ this._removeItemClass(this.anchor, "Anchor");
+ this.anchor = null;
+ }
+ return this; // self
+ }
+});
+
+}
diff --git a/includes/js/dijit/_tree/dndSource.js b/includes/js/dijit/_tree/dndSource.js
new file mode 100644
index 0000000..ccb91ad
--- /dev/null
+++ b/includes/js/dijit/_tree/dndSource.js
@@ -0,0 +1,373 @@
+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, {
+ // summary: a Source object, which can be used as a DnD source, or a DnD target
+
+ // object attributes (for markup)
+ isSource: true,
+ copyOnly: false,
+ skipForm: false,
+ accept: ["text"],
+
+ constructor: function(tree, params){
+ // summary: a constructor of the Source
+ // tree: dijit.Tree: the tree widget to build the source on
+ // params: Object: a dict of parameters, recognized parameters are:
+ // isSource: Boolean: can be used as a DnD source, if true; assumed to be "true" if omitted
+ // accept: Array: list of accepted types (text strings) for a target; assumed to be ["text"] if omitted
+ // horizontal: Boolean: a horizontal container, if true, vertical otherwise or when omitted
+ // copyOnly: Boolean: always copy items, if true, use a state of Ctrl key otherwise
+ // skipForm: Boolean: don't start the drag operation, if clicked on form elements
+ // the rest of parameters are passed to the selector
+ 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"];
+ 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;
+ this.targetBox = null;
+ this.before = true;
+
+ // states
+ this.sourceState = "";
+ if(this.isSource){
+ dojo.addClass(this.node, "dojoDndSource");
+ }
+ this.targetState = "";
+ if(this.accept){
+ dojo.addClass(this.node, "dojoDndTarget");
+ }
+ if(this.horizontal){
+ dojo.addClass(this.node, "dojoDndHorizontal");
+ }
+ // set up events
+ this.topics = [
+ dojo.subscribe("/dnd/source/over", this, "onDndSourceOver"),
+ dojo.subscribe("/dnd/start", this, "onDndStart"),
+ dojo.subscribe("/dnd/drop", this, "onDndDrop"),
+ dojo.subscribe("/dnd/cancel", this, "onDndCancel")
+ ];
+ },
+
+ startup: function(){
+ },
+
+ // methods
+ checkAcceptance: function(source, nodes){
+ // summary: checks, if the target can accept nodes from this source
+ // source: Object: the source which provides items
+ // nodes: Array: the list of transferred items
+ 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" was pressed
+ 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;
+ },
+
+ // markup methods
+ markupFactory: function(params, node){
+ params._skipStartup = true;
+ return new dijit._tree.dndSource(node, params);
+ },
+
+ // mouse event processors
+ onMouseMove: function(e){
+ // summary: event processor for onmousemove
+ // e: Event: mouse event
+ if(this.isDragging && this.targetState == "Disabled"){ return; }
+ this.inherited("onMouseMove", arguments);
+ var m = dojo.dnd.manager();
+ if(this.isDragging){
+ // calculate before/after
+
+ if (this.allowBetween){ // not implemented yet for tree since it has no concept of order
+ var before = false;
+ if(this.current){
+ if(!this.targetBox || this.targetAnchor != this.current){
+ this.targetBox = {
+ xy: dojo.coords(this.current, true),
+ w: this.current.offsetWidth,
+ h: this.current.offsetHeight
+ };
+ }
+ if(this.horizontal){
+ before = (e.pageX - this.targetBox.xy.x) < (this.targetBox.w / 2);
+ }else{
+ before = (e.pageY - this.targetBox.xy.y) < (this.targetBox.h / 2);
+ }
+ }
+ if(this.current != this.targetAnchor || before != this.before){
+ this._markTargetAnchor(before);
+ m.canDrop(!this.current || m.source != this || !(this.current.id in this.selection));
+ }
+ }
+ }else{
+ if(this.mouseDown && this.isSource){
+ var n = this.getSelectedNodes();
+ var nodes=[];
+ for (var i in n){
+ nodes.push(n[i]);
+ }
+ if(nodes.length){
+ m.startDrag(this, nodes, this.copyState(dojo.dnd.getCopyKeyState(e)));
+ }
+ }
+ }
+ },
+
+ onMouseDown: function(e){
+ // summary: event processor for onmousedown
+ // e: Event: mouse event
+ this.mouseDown = true;
+ this.mouseButton = e.button;
+ this.inherited("onMouseDown",arguments);
+ },
+
+ onMouseUp: function(e){
+ // summary: event processor for onmouseup
+ // e: Event: mouse event
+ if(this.mouseDown){
+ this.mouseDown = false;
+ this.inherited("onMouseUp",arguments);
+ }
+ },
+
+ onMouseOver: function(e){
+ // summary: event processor for onmouseover
+ // e: Event: mouse event
+
+ // handle when mouse has just moved over the Tree itself (not a TreeNode, but the Tree)
+ var rt = e.relatedTarget; // the previous location
+ while(rt){
+ if(rt == this.node){ break; }
+ try{
+ rt = rt.parentNode;
+ }catch(x){
+ rt = null;
+ }
+ }
+ if(!rt){
+ this._changeState("Container", "Over");
+ this.onOverEvent();
+ }
+
+ // code below is for handling depending on which TreeNode we are over
+ var n = this._getChildByEvent(e); // the TreeNode
+ if(this.current == n){ return; }
+ if(this.current){ this._removeItemClass(this.current, "Over"); }
+ var m = dojo.dnd.manager();
+ if(n){
+ this._addItemClass(n, "Over");
+ if(this.isDragging){
+ if(this.checkItemAcceptance(n,m.source)){
+ m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(n in this.selection)));
+ }else{
+ m.canDrop(false);
+ }
+ }
+ }else{
+ if(this.isDragging){
+ if (m.source && this.checkAcceptance(m.source,m.source.getSelectedNodes())){
+ m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+ }else{
+ m.canDrop(false);
+ }
+ }
+ }
+ this.current = n;
+ },
+
+ checkItemAcceptance: function(node, source){
+ // summary: stub funciton to be overridden if one wants to check for the ability to drop at the node/item level
+ 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 source which has the mouse over it
+ if(this != source){
+ this.mouseDown = false;
+ if(this.targetAnchor){
+ this._unmarkTargetAnchor();
+ }
+ }else if(this.isDragging){
+ var m = dojo.dnd.manager();
+ m.canDrop(this.targetState != "Disabled" && (!this.current || m.source != this || !(this.current.id in this.selection)));
+ }
+ },
+ onDndStart: function(source, nodes, copy){
+ // summary: topic event processor for /dnd/start, called to initiate the DnD operation
+ // source: Object: the source which provides items
+ // nodes: Array: the list of transferred items
+ // copy: Boolean: copy items, if true, move items otherwise
+
+ if(this.isSource){
+ this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
+ }
+ var accepted = this.checkAcceptance(source, nodes);
+
+ this._changeState("Target", accepted ? "" : "Disabled");
+
+ if(accepted){
+ dojo.dnd.manager().overSource(this);
+ }
+
+ this.isDragging = true;
+ },
+
+ itemCreator: function(nodes){
+ return dojo.map(nodes, function(node){
+ return {
+ "id": node.id,
+ "name": node.textContent || node.innerText || ""
+ };
+ });
+ },
+
+ onDndDrop: function(source, nodes, copy){
+ // summary:
+ // Topic event processor for /dnd/drop, called to finish the DnD operation..
+ // 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 source which provides items
+ // nodes: Array: the list of transferred items
+ // copy: Boolean: copy items, if true, move items otherwise
+
+ if(this.containerState == "Over"){
+ var tree = this.tree,
+ model = tree.model,
+ target = this.current,
+ requeryRoot = false; // set to true iff top level items change
+
+ this.isDragging = false;
+
+ // Compute the new parent item
+ var targetWidget = dijit.getEnclosingWidget(target),
+ newParentItem = (targetWidget && targetWidget.item) || tree.item;
+
+ // If we are dragging from another source (or at least, another source
+ // that points to a different data store), then we need to make new data
+ // store items for each element in nodes[]. This call get the parameters
+ // to pass to store.newItem()
+ var newItemsParams;
+ if(source != this){
+ newItemsParams = this.itemCreator(nodes, target);
+ }
+
+ dojo.forEach(nodes, function(node, idx){
+ 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.
+ var childTreeNode = dijit.getEnclosingWidget(node),
+ childItem = childTreeNode.item,
+ oldParentItem = childTreeNode.getParent().item;
+
+ model.pasteItem(childItem, oldParentItem, newParentItem, copy);
+ }else{
+ model.newItem(newItemsParams[idx], newParentItem);
+ }
+ }, 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
+ if(this.targetAnchor){
+ this._unmarkTargetAnchor();
+ this.targetAnchor = null;
+ }
+ this.before = true;
+ this.isDragging = false;
+ this.mouseDown = false;
+ delete this.mouseButton;
+ this._changeState("Source", "");
+ this._changeState("Target", "");
+ },
+
+ // utilities
+
+ onOverEvent: function(){
+ // summary: this function is called once, when mouse is over our container
+ this.inherited("onOverEvent",arguments);
+ dojo.dnd.manager().overSource(this);
+ },
+ onOutEvent: function(){
+ // summary: this function is called once, when mouse is out of our container
+ this.inherited("onOutEvent",arguments);
+ dojo.dnd.manager().outSource(this);
+ },
+ _markTargetAnchor: function(before){
+ // summary: assigns a class to the current target anchor based on "before" status
+ // before: Boolean: insert before, if true, after otherwise
+ if(this.current == this.targetAnchor && this.before == before){ return; }
+ if(this.targetAnchor){
+ this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ }
+ this.targetAnchor = this.current;
+ this.targetBox = null;
+ this.before = before;
+ if(this.targetAnchor){
+ this._addItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ }
+ },
+ _unmarkTargetAnchor: function(){
+ // summary: removes a class of the current target anchor based on "before" status
+ if(!this.targetAnchor){ return; }
+ this._removeItemClass(this.targetAnchor, this.before ? "Before" : "After");
+ this.targetAnchor = null;
+ this.targetBox = null;
+ this.before = true;
+ },
+ _markDndStatus: function(copy){
+ // summary: changes source's state based on "copy" status
+ this._changeState("Source", copy ? "Copied" : "Moved");
+ }
+});
+
+dojo.declare("dijit._tree.dndTarget", dijit._tree.dndSource, {
+ // summary: a Target object, which can be used as a DnD target
+
+ constructor: function(node, params){
+ // summary: a constructor of the Target --- see the Source constructor for details
+ this.isSource = false;
+ dojo.removeClass(this.node, "dojoDndSource");
+ },
+
+ // markup methods
+ markupFactory: function(params, node){
+ params._skipStartup = true;
+ return new dijit._tree.dndTarget(node, params);
+ }
+});
+
+}
diff --git a/includes/js/dijit/_tree/model.js b/includes/js/dijit/_tree/model.js
new file mode 100644
index 0000000..5ef4ac1
--- /dev/null
+++ b/includes/js/dijit/_tree/model.js
@@ -0,0 +1,84 @@
+
+dojo.declare(
+ "dijit.tree.model",
+ null,
+{
+ // summary
+ // Contract for any data provider object for the tree. 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
+ },
+
+ // =======================================================================
+ // 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.
+ },
+
+ 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)
+ },
+
+ 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.
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ getIdentity: function(/* item */ item){
+ // summary: returns identity for an item
+ },
+
+ getLabel: function(/*dojo.data.Item*/ item){
+ // summary: get the label for an item
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(/* Object? */ args, /*Item?*/ parent){
+ // summary
+ // Creates a new item. See dojo.data.api.Write for details on args.
+ },
+
+ 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.
+ },
+
+ // =======================================================================
+ // 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.
+ },
+
+ onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+ // summary
+ // Callback to do notifications about new, updated, or deleted items.
+ }
+});
+
diff --git a/includes/js/dijit/bench/benchReceive.php b/includes/js/dijit/bench/benchReceive.php
new file mode 100644
index 0000000..6330077
--- /dev/null
+++ b/includes/js/dijit/bench/benchReceive.php
@@ -0,0 +1,129 @@
+<?php
+/*
+
+ benchReceive.php - example way to handle incoming benchmark data,
+ or how to use JSON php class to mangle data. No benchmark data
+ is stored currently.
+
+--
+-- Table structure for table `benchmarks`
+--
+
+CREATE TABLE `benchmarks` (
+ `id` int(11) NOT NULL auto_increment,
+ `useragent` varchar(242) NOT NULL default '',
+ `dojover` varchar(96) NOT NULL default '',
+ `testNum` int(11) NOT NULL default '0',
+ `dijit` varchar(64) NOT NULL default '',
+ `testCount` int(11) NOT NULL default '0',
+ `testAverage` float NOT NULL default '0',
+ `testMethod` varchar(10) NOT NULL default '',
+ `testTime` bigint(20) NOT NULL default '0',
+ `dataSet` varchar(64) NOT NULL default '',
+ PRIMARY KEY (`id`),
+ KEY `dijit` (`dijit`,`testAverage`),
+ KEY `dataSet` (`dataSet`)
+) TYPE=MyISAM;
+
+--
+-- [end table struct] --
+
+*/
+
+if (is_array($_POST)) {
+
+ $username = '';
+ $password = '';
+ $dataBase = '';
+ $table = '';
+
+ mysql_connect("localhost",$username,$password);
+ mysql_select_db($dataBase);
+
+ require("../../dojo/tests/resources/JSON.php");
+ $json = new Services_JSON();
+
+ // see "escape()" call in benchTest.html
+ $string = $json->decode(urldecode($_POST['key']));
+ // $string = $json->decode($_POST['key']);
+
+ print "<h1>Thank YOU!</h1>";
+ print "
+ <p>Your results have been added to our database. No
+ personal information outside of what you see here
+ has been stored.
+ </p>
+
+ <p>You can <a href= \"javascript:history.back()\">go back</a>
+ and run more tests, or even better, load up another browser
+ and the submit your tests again!
+ </p>
+
+ <p>again ... thanks for your time.</p>
+
+ ";
+
+ print "<h3>Results Submitted:</h3>";
+ print "<pre style=\"font:6pt Terminal,sans-serif; border:1px solid #cecece; background-color:#ededed; padding:20px; \">";
+
+ $ua = $string->clientNavigator;
+ $dojov = $string->dojoVersion;
+
+ print "Client: ".$ua."\n";
+ print "Dojo v".$dojov."\n";
+
+ if (is_array($string->dataSet)) {
+ print "\nTest Results:";
+ // should client serialize a key, or is this safer?
+ $dataSet = md5(serialize($string));
+ foreach ($string->dataSet as $test) {
+ $data = array(
+ 'dataSet' => $dataSet,
+ 'useragent' => $ua,
+ 'dojover' => $dojov,
+ 'testNum' => $test->testNum,
+ 'testMethod' => $test->testMethod,
+ 'testTime' => $test->testTime,
+ 'testAverage' => $test->testAverage,
+ 'testCount' => $test->testCount,
+ 'dijit' => $test->dijit
+ );
+ print_r($data);
+ add_rec($table,$data);
+ }
+ }
+
+ if (is_array($string->errors)) {
+ // not saving errors at this point
+ print "\nErrors:";
+ foreach ($string->errors as $error) {
+ print_r($error);
+ }
+ }
+ print "</pre>";
+}
+
+function add_rec($table, $data) {
+
+ if (!is_array($data)) { return FALSE; }
+
+ $keys = array_keys($data);
+ $values = array_values($data);
+ $field=0;
+
+ for ($field;$field<sizeof($data);$field++) {
+ if (!ereg("^[0-9].*$",$keys[$field])) {
+ $sqlfields = $sqlfields.$keys[$field]."=\"".$values[$field]."\", ";
+ }
+ }
+ $sqlfields = (substr($sqlfields,0,(strlen($sqlfields)-2)));
+
+ if ($query = mysql_query("insert into $table set $sqlfields")) {
+ $id = mysql_insert_id();
+ return ($id);
+ }else{
+ return FALSE;
+ }
+}
+
+?>
diff --git a/includes/js/dijit/bench/benchTool.html b/includes/js/dijit/bench/benchTool.html
new file mode 100644
index 0000000..b8a9041
--- /dev/null
+++ b/includes/js/dijit/bench/benchTool.html
@@ -0,0 +1,189 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo interactive benchmark tool</title>
+ <script type="text/javascript" src="../../dojo/dojo.js"></script>
+ <script type="text/javascript">
+ // FIXME:
+ // the url below points to dojo.inpdx.net/benchResults.php
+ // need to setup DB on dtk.org and change URL here to store
+ // results elsewhere ... work db structure in accompanying
+ // .php file
+ // basic stats are located at http://dojo.inpdx.net/benchmarks.html
+
+ dojo.require("dojo.fx");
+ // FIXME: this seems an excessive fix for IE6 issue ...
+ dojo.require("dijit.dijit");
+ // dojo.require("dijit.form.Button");
+ dojo.require("dijit.dijit-all");
+ dojo.require("dojo.parser");
+
+
+ // setup global variables
+ var masterResults = { clientNavigator: navigator.userAgent, dataSet: [], errors: [] }
+ var isRunning = false;
+ var theCount, theClass, runner = null;
+ var testCount = 0;
+ dojo.addOnLoad(function(){
+ theCount = dojo.byId('countNode');
+ theClass = dojo.byId('classNode');
+ runner = dojo.byId('runner');
+ masterResults.dojoVersion = dojo.version.toString();
+ });
+
+
+ function _toggleRunMsg(){
+ var newMsg = (isRunning) ? " Run Test " : " Running ..."
+ dojo.fx.chain([
+ dojo.fadeOut({
+ node:runner,
+ duration:200,
+ onEnd: function(){
+ runner.innerHTML = newMsg;
+ isRunning=!isRunning;
+ }
+ }),
+ dojo.fadeIn({ node:runner, duration: 200 })
+ ]).play();
+ }
+
+ function runTest(){
+ if(isRunning){ return; }
+ _toggleRunMsg();
+ setTimeout(function(){_runRealTest();},1000);
+ }
+
+ function _runRealTest(){
+
+ var _error = false;
+ var count = theCount.value;
+ var aclass = theClass.value.toString();
+ var theMethod = (dojo.byId('parse').checked) ? "parse" : "create";
+
+ var tmpNode = document.createElement('div');
+
+ switch(theMethod){
+ case "parse" :
+ var tmpString = [];
+ for(var i=0; i<count; i++){
+ tmpString.push('<div dojoType="', aclass, '"></div>');
+ }
+ tmpNode.innerHTML = tmpString.join("");
+ var tmpTimer = new Date().getTime();
+ dojo.parser.parse(tmpNode);
+ var endTime = new Date().getTime() - tmpTimer;
+ break;
+ case "create" :
+ var construction = dojo.getObject(aclass);
+ var tmpTimer = new Date().getTime();
+ for(var i=0; i<count; i++){
+ var tmp = new construction({});
+ tmpNode.appendChild(tmp.domNode);
+ }
+ var endTime = new Date().getTime() - tmpTimer;
+ break;
+ }
+
+ var average = (endTime / count);
+ var msg = "It took: "+endTime+"ms to "+theMethod+" "+count+" "+aclass+" widgets"+
+ "<br>(average: "+average+" ms/widget)<br><br>";
+
+ masterResults.dataSet.push({
+ testNum: ++testCount,
+ dijit: aclass,
+ testCount: count,
+ testAverage: average,
+ testMethod: theMethod,
+ testTime: endTime
+ });
+
+ dojo.byId("results").innerHTML += msg;
+ setTimeout(function(){_toggleRunMsg();},250);
+
+ // Nodes have to be in the document for IE7 to GC them.
+ // Do this after generating the widgets to dispel
+ // notion that widget parents have to be in document
+ // a-priori.
+ dojo.byId("limbo").appendChild(tmpNode);
+ }
+
+ function doDebug(){
+ var key = escape(dojo.toJson(masterResults));
+ dojo.byId('hiddenHolder').value = key;
+ return true;
+ }
+
+ </script>
+ <style>
+ @import "../../dijit/themes/tundra/tundra.css";
+ @import "../../dijit/themes/dijit.css";
+ @import "../../dojo/resources/dojo.css";
+ @import "../../dijit/tests/css/dijitTests.css";
+
+ #limbo {
+ display: none;
+ }
+ #theContainer {
+ float:left;
+ display: block; padding:12px; padding-top:0;
+ width:420px; margin-left:20px;
+ background-color:#fff; -moz-border-radius:8pt 8pt;
+ border:2px solid #ededed;
+ }
+ #leftControl { float:left; width:300px; }
+ #testControl, #submitControl { border:2px solid #ededed; padding:12px; -moz-border-radius:8pt 8pt; background-color:#fff; }
+ #results { overflow:auto; height:300px; border:1px solid #ccc; color:darkred; padding:8px; }
+ #results li { list-style-type: none; }
+ #results ul { margin:0; padding:0; }
+ .runHolder, .submitButton {
+ border:1px solid #ccc; padding:3px; -moz-border-radius:8pt 8pt; text-align:center;
+ cursor:pointer; background-color:#ededed; display:block; width:125px;
+ }
+
+ </style>
+</head>
+<body class="tundra">
+ <div id="limbo"></div>
+ <h1 class="testTitle">Dojo Benchmark Tool</h1>
+
+ <div id="leftControl">
+ <div id="testControl">
+
+ Class: <input type="text" name="dijit" id="classNode" value="dijit.form.Button"><br><br>
+ Count: <input type="text" name="count" id="countNode" value="100" size="4" ><br><br>
+
+ Method: <label for="parse">
+ <input type="radio" name="theMethod" value="parse" id="parse" checked="on"> Parse
+ </label>
+ <label for="create">
+ <input type="radio" name="theMethod" value="create" id="create"> Create
+ </label>
+
+ <br><br>
+ <span onclick="runTest()" class="runHolder"><span id="runner"> Run Test </span></span>
+
+ </div>
+
+ <br>
+
+ <div id="submitControl">
+ <p>
+ * The results of these tests are important to us. Please feel free to submit your dataSet
+ to Dojotoolkit.org. Your privacy will be respected.
+
+ </p>
+ <div id="hiddenResults">
+ <form id="resultForm" action="http://dojo.inpdx.net/benchResults.php"
+ method="POST" onsubmit="doDebug()">
+ <input type="hidden" id="hiddenHolder" value="" name="key">
+ <input type="submit" value=" Submit Data " class="submitButton">
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <div id="theContainer"><h3>Results:</h3><div id="results"></div></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/bench/create_widgets.html b/includes/js/dijit/bench/create_widgets.html
new file mode 100644
index 0000000..9a6f78a
--- /dev/null
+++ b/includes/js/dijit/bench/create_widgets.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>PROGRAMMATIC - Dojo Widget Creation Test</title>
+ <script type="text/javascript" src="../../dojo/dojo.js"></script>
+ <script type="text/javascript" src="../dijit.js"></script>
+ <script type="text/javascript">
+ var queryCount = location.search.match(/count=(\d*)/);
+ var count = (queryCount ? parseInt(queryCount[1]) : 100);
+ var queryClass = location.search.match(/class=([a-zA-z.]*)/);
+ var className = (queryClass ? queryClass[1] : "form.Button");
+
+ dojo.require("dijit." + className);
+ dojo.require("dojo.parser");
+ logMessage = window.alert;
+ </script>
+ <style type="text/css">
+ @import "../themes/tundra/tundra.css";
+ /* group multiple buttons in a row */
+ .box {
+ display: block;
+ text-align: center;
+ }
+ .box .dojoButton {
+ width: 80px;
+ margin-right: 10px;
+ }
+ .dojoButtonContents {
+ font-size: 1.6em;
+ }
+
+ #buttonContainer {
+ border: 1px solid black;
+ width: 100%;
+ }
+
+ #results {
+ color: darkred;
+ }
+ </style>
+ </head>
+ <body class=tundra>
+ <script language='javascript'>
+ document.write("<h2>Currently Creating "+count+" "+className+" instances</h2>");
+ </script>
+ Pass <code>?count=<i><b>100</b></i></code> in the query string to change the number of widgets.<br>
+ Pass <code>?class=<i><b>form.Button</b></i></code> in the query string to change the widget class.
+ <h3 id="results"></h3>
+
+ <div id="buttonContainer" class='box'></div>
+ <br>
+ <script type="text/javascript">
+ // See if we can make a widget in script and attach it to the DOM ourselves.
+ var constructor = dojo.getObject("dijit."+className);
+ function makeEm(){
+ var container = dojo.byId("buttonContainer");
+ var t0 = new Date().getTime();
+ for (var i = 1; i <= count; i++) {
+ var it =
+ new constructor(
+ {label:"Button "+i, onclick:'logMessage("clicked simple")'}
+ );
+ container.appendChild(it.domNode);
+ it.domNode.style.display = '';
+ }
+ var t1 = new Date().getTime();
+ dojo.byId("results").innerHTML = "It took " + (t1 - t0) + " msec to create " + count + " "+className+" instances programmatically.";
+ }
+ dojo.addOnLoad(makeEm);
+ </script>
+ </body>
+</html>
diff --git a/includes/js/dijit/bench/test_Button-programmatic.html b/includes/js/dijit/bench/test_Button-programmatic.html
new file mode 100644
index 0000000..a9d0cd1
--- /dev/null
+++ b/includes/js/dijit/bench/test_Button-programmatic.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>PROGRAMMATIC - Dojo Button 100 Test</title>
+ <script type="text/javascript" src="../../dojo/dojo.js" XdjConfig='isDebug: true, debugAtAllCosts: true'></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser");
+ logMessage = window.alert;
+ </script>
+
+<style>
+
+ @import "../themes/tundra/tundra.css";
+
+ /* group multiple buttons in a row */
+ .box {
+ display: block;
+ text-align: center;
+ }
+ .box .dojoButton {
+ width:80px;
+ margin-right: 10px;
+ }
+ .dojoButtonContents {
+ font-size: 1.6em;
+ }
+
+ #buttonContainer {
+ border:1px solid black;
+ width:100%;
+ }
+
+ #results {
+ color:darkred;
+ }
+
+</style>
+ </head>
+<body class=tundra>
+<h2>Creating dojot.form.buttons programmatically</h2>
+<h3 id="results"></h3>
+
+<div id="buttonContainer" class='box'></div>
+
+<br>
+Pass "?count=<i><b>n</b></i>" in the query string to change the number of buttons.
+
+<script type="text/javascript">
+// See if we can make a widget in script and attach it to the DOM ourselves.
+
+function makeEm() {
+ var queryCount = location.search.match(/count=(\d*)/);
+ var count = (queryCount ? parseInt(queryCount[1]) : 100);
+ var container = dojo.byId("buttonContainer");
+ var t0 = new Date().getTime();
+ for (var i = 1; i <= count; i++) {
+ var it =
+ new dijit.form.Button(
+ {label:"Button "+i, onclick:'logMessage("clicked simple")'}
+ );
+ container.appendChild(it.domNode);
+ it.domNode.style.display = '';
+ }
+ var t1 = new Date().getTime();
+ dojo.byId("results").innerHTML = "It took " + (t1 - t0) + " msec to create " + count + " Buttons programmatically.";
+}
+dojo.addOnLoad(makeEm);
+
+
+</script>
+
+</body>
+</html>
diff --git a/includes/js/dijit/bench/test_button-results.html b/includes/js/dijit/bench/test_button-results.html
new file mode 100644
index 0000000..c9fa520
--- /dev/null
+++ b/includes/js/dijit/bench/test_button-results.html
@@ -0,0 +1,66 @@
+<html>
+<style>
+ th { vertical-align:bottom; }
+ td {
+ padding:10px;
+ text-align:right;
+ }
+ .computer { vertical-align:top; }
+</style>
+<body>
+<h3>Widget instantiation timing test results</h3>
+
+<table>
+
+<tr><th rowspan=2>Computer/OS</th><th rowspan=2>Browser</th><th colspan=3>Parsing</th><th colspan=3>Programmatic</th></tr>
+<tr> <th>100</th><th>500</th><th>1000</th><th>100</th><th>500</th><th>1000</th></tr>
+<tr><td class='computer' rowspan=3>MacBook Pro 2.16<br> OS 10.4 2GB RAM</td>
+ <td>FF (2.0.0.3)</td>
+ <td>303</td><td>1724</td><td>3505</td>
+ <td>195</td><td>1006</td><td>2266</td>
+</tr>
+<tr><td>Safari (2.04)</td>
+ <td>192</td><td>1460</td><td>4463</td>
+ <td>142</td><td>895</td><td>2403</td>
+</tr>
+<tr><td>WebKit Nightly (21223)</td>
+ <td>110</td><td>540</td><td>1096</td>
+ <td>85</td><td>458</td><td>940</td>
+</tr>
+
+
+<tr><td class='computer' rowspan=2>Dell Precision 2.13 PPro<br> XP SP 2 - 2GB RAM</td>
+ <td>FF (2.0.0.3)</td>
+ <td>282</td><td>1266</td><td>2484</td>
+ <td>250</td><td>890</td><td>1766</td>
+</tr>
+
+<tr>
+ <td>IE7 (7.0.5730.11)</td>
+ <td>303</td><td>2079</td><td>5172</td>
+ <td>203</td><td>1140</td><td>2422</td>
+</tr>
+
+<tr><td><!--browser--></td>
+ <td><!--100 parse--></td><td><!--500 parse--></td><td><!--1000 parse--></td>
+ <td><!--100 code--></td><td><!--500 code--></td><td><!--1000 code--></td>
+</tr>
+</table>
+
+
+<H3>If you want to play:</H3>
+<p></p>
+<ol>
+ <li> Run the following tests:
+ <ul>
+ <li><a href='http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-parse.php?count=100'>http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-parse.php?count=100</a></li>
+ <li><a href='http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-programmatic.html?count=100'>http://dojotoolkit.org/~owen/bench/dojo/dijit/bench/test_Button-programmatic.html?count=100</a></li>
+ </ul>
+ <br>
+ Change the "count=" to 100, 500, 1000 for each.
+ <br><br>
+ Restart the browser between each test/count. Run each test 3 times and record the smallest number.
+ </li>
+ <li>Record your tests in the copy of this file in SVN: <code>dijit/bench/test_Button-results.html</code> and check it in. Reference ticket #2968.</li>
+</ol>
+</body>
diff --git a/includes/js/dijit/bench/widget_construction_test.php b/includes/js/dijit/bench/widget_construction_test.php
new file mode 100644
index 0000000..4718c9c
--- /dev/null
+++ b/includes/js/dijit/bench/widget_construction_test.php
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+ <head>
+ <title>test of various synchronous page searching methods</title>
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ </style>
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("dijit._Widget");
+ dojo.require("dijit._Templated");
+
+ /* dummy widget for benchmarking purposes */
+ dojo.declare(
+ "SimpleButton",
+ [ dijit._Widget, dijit._Templated ],
+ function(){ },
+ {
+ label: "",
+
+ templateString: "<button dojoAttachEvent='onclick:onClick'>${label}</button>",
+
+ onClick: function(){
+ this.domNode.style.backgroundColor="green";
+ },
+ postCreate: function(){
+ }
+ }
+ );
+ </script>
+ </head>
+ <body>
+ <h1 style="font-size: 40px; line-height: 50px;">This page contains a huge number of nodes, most of which are "chaff".</h1>
+ <h3>Here's the relative timings for this page</h3>
+ <div id="profileOutputTable"></div>
+ <!--
+ <h3>And some comparison data</h3>
+ <table border=1>
+ <thead>
+ <tr>
+ <th>IE
+ <th>Safari
+ <th>Gecko (on PC)
+ <th>Gecko (on intel mac)
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>4890
+ <td>3242
+ <td>3094
+ <td>3782
+ </tr>
+ </tbody>
+ </table>
+ -->
+
+
+<?
+ $containerDepth = 30;
+ $leadingChaff = 100;
+ $trailingChaff = 100;
+ $items = 100;
+?>
+<?
+ function generateChaff($iters){
+ for($i=0;$i<$iters;$i++){ ?>
+ <pre class="highlighted"><code><span class="hl-reserved">var </span><span class="hl-identifier">dlg</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">blah</span><span class="hl-default">.</span><span class="hl-identifier">ext</span><span class="hl-default">.</span><span class="hl-identifier">LayoutDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">config</span><span class="hl-code">.</span><span class="hl-identifier">id</span><span class="hl-code"> || </span><span class="hl-identifier">blah</span><span class="hl-code">.</span><span class="hl-identifier">util</span><span class="hl-code">.</span><span class="hl-identifier">Dom</span><span class="hl-code">.</span><span class="hl-identifier">generateId</span><span class="hl-brackets">()</span><span class="hl-code">, </span><span class="hl-brackets">{
+ </span><span title="autoCreate" class="hl-identifier">autoCreate</span><span class="hl-code"> : </span><span class="hl-reserved">true</span><span class="hl-code">,
+ </span><span title="minWidth" class="hl-identifier">minWidth</span><span class="hl-code">:</span><span class="hl-number">400</span><span class="hl-code">,
+ </span><span title="minHeight" class="hl-identifier">minHeight</span><span class="hl-code">:</span><span class="hl-number">300</span><span class="hl-code">,
+ </span>
+ <span title="syncHeightBeforeShow" class="hl-identifier">syncHeightBeforeShow</span><span class="hl-code">: </span><span class="hl-reserved">true</span><span class="hl-code">,
+ </span><span title="shadow" class="hl-identifier">shadow</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,
+ </span><span title="fixedcenter" class="hl-identifier">fixedcenter</span><span class="hl-code">: </span><span class="hl-reserved">true</span><span class="hl-code">,
+ </span><span title="center" class="hl-identifier">center</span><span class="hl-code">:</span><span class="hl-brackets">{</span><span class="hl-identifier">autoScroll</span><span class="hl-code">:</span><span class="hl-reserved">false</span><span class="hl-brackets">}</span><span class="hl-code">,
+ </span><span title="east" class="hl-identifier">east</span><span class="hl-code">:</span><span class="hl-brackets">{</span><span class="hl-identifier">split</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,</span><span class="hl-identifier">initialSize</span><span class="hl-code">:</span><span class="hl-number">150</span><span class="hl-code">,</span><span class="hl-identifier">minSize</span><span class="hl-code">:</span><span class="hl-number">150</span><span class="hl-code">,</span><span class="hl-identifier">maxSize</span><span class="hl-code">:</span><span class="hl-number">250</span><span class="hl-brackets">}
+ })</span><span class="hl-default">;
+ </span><span class="hl-identifier">dlg</span><span class="hl-default">.</span><span class="hl-identifier">setTitle</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">Choose an Image</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-default">;
+ </span><span class="hl-identifier">dlg</span><span class="hl-default">.</span><span class="hl-identifier">getEl</span><span class="hl-brackets">()</span><span class="hl-default">.</span><span class="hl-identifier">addClass</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">ychooser-dlg</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-default">;</span></code></pre><br />
+ <pre class="highlighted"><code><span class="hl-reserved">var </span><span class="hl-identifier">animated</span><span class="hl-default"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">blah</span><span class="hl-default">.</span><span class="hl-identifier">ext</span><span class="hl-default">.</span><span class="hl-identifier">Resizable</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">animated</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-brackets">{
+ </span><span title="east" class="hl-identifier">width</span><span class="hl-code">: </span><span class="hl-number">200</span><span class="hl-code">,
+ </span><span title="east" class="hl-identifier">height</span><span class="hl-code">: </span><span class="hl-number">100</span><span class="hl-code">,
+ </span><span title="east" class="hl-identifier">minWidth</span><span class="hl-code">:</span><span class="hl-number">100</span><span class="hl-code">,
+ </span><span class="hl-identifier">minHeight</span><span class="hl-code">:</span><span class="hl-number">50</span><span class="hl-code">,
+ </span><span class="hl-identifier">animate</span><span class="hl-code">:</span><span class="hl-reserved">true</span><span class="hl-code">,
+ </span><span class="hl-identifier">easing</span><span class="hl-code">: </span><span class="hl-identifier">YAHOO</span><span class="hl-code">.</span><span class="hl-identifier">util</span><span class="hl-code">.</span><span class="hl-identifier">Easing</span><span class="hl-code">.</span><span class="hl-identifier">backIn</span><span class="hl-code">,
+ </span><span class="hl-identifier">duration</span><span class="hl-code">:</span><span class="hl-number">.6
+ </span><span class="hl-brackets">})</span><span class="hl-default">;</span></code></pre>
+ <h4>The standard Lorem Ipsum passage, used since the 1500s</h4>
+ <p>
+ "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
+ ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat. Duis aute irure dolor in
+ reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+ culpa qui officia deserunt mollit anim id est laborum."
+ </p>
+
+ <h4>Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC</h4>
+
+ <p>
+ "Sed ut perspiciatis unde omnis iste natus error sit voluptatem
+ accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
+ quae ab illo inventore veritatis et quasi architecto beatae vitae
+ dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
+ aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
+ eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam
+ est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
+ velit, sed quia non numquam eius modi tempora incidunt ut labore et
+ dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam,
+ quis nostrum exercitationem ullam corporis suscipit laboriosam,
+ nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure
+ reprehenderit qui in ea voluptate velit esse quam nihil molestiae
+ consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla
+ pariatur?"
+ </p>
+
+ <h4>1914 translation by H. Rackham</h4>
+
+ <p>
+ "But I must explain to you how all this mistaken idea of denouncing
+ pleasure and praising pain was born and I will give you a complete
+ account of the system, and expound the actual teachings of the
+ great explorer of the truth, the master-builder of human happiness.
+ No one rejects, dislikes, or avoids pleasure itself, because it is
+ pleasure, but because those who do not know how to pursue pleasure
+ rationally encounter consequences that are extremely painful. Nor
+ again is there anyone who loves or pursues or desires to obtain
+ pain of itself, because it is pain, but because occasionally
+ circumstances occur in which toil and pain can procure him some
+ great pleasure. To take a trivial example, which of us ever
+ undertakes laborious physical exercise, except to obtain some
+ advantage from it? But who has any right to find fault with a man
+ who chooses to enjoy a pleasure that has no annoying consequences,
+ or one who avoids a pain that produces no resultant pleasure?"
+ </p>
+ <? }
+ } // end generateChaff
+ $widgetName = "SimpleButton";
+?>
+<? generateChaff($leadingChaff); ?>
+<hr>
+<? for($i=0;$i<$containerDepth;$i++){ ?>
+ <table border="1" cellpadding="0" cellspacing="0" width="100%">
+ <!--
+ <table>
+ -->
+ <tr>
+ <td>
+ <br>
+ chaff!
+ <br>
+<? } ?>
+<? for($i=0;$i<$items;$i++){ ?>
+ <div dojoType="<?= $widgetName ?>" label="item2 <?= $i ?>">item2 <?= $i ?></div>
+<? } ?>
+<? for($i=0;$i<$containerDepth;$i++){ ?>
+ </td>
+ </tr>
+ </table>
+<? } ?>
+<? generateChaff($trailingChaff); ?>
+<? for($i=0;$i<$items;$i++){ ?>
+ <div dojoType="<?= $widgetName ?>" label="item2 <?= $i ?>"><span>item <?= $i ?></span></div>
+<? } ?>
+
+<script type="text/javascript">
+
+ oldTime = new Date();
+ dojo.addOnLoad(function(){
+ var time = new Date().getTime() - oldTime;
+ var p = document.createElement("p");
+ alert("Widgets loaded in " + time + "ms");
+ });
+
+</script>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/changes.txt b/includes/js/dijit/changes.txt
new file mode 100644
index 0000000..525305b
--- /dev/null
+++ b/includes/js/dijit/changes.txt
@@ -0,0 +1,93 @@
+Changes from Dojo 0.4 dojo.widgets to new dijit project
+=======================================================
+
+The widgets and widget infrastructure have been separated into separate project,
+vastly streamlined and with a new directory structure. There are many other changes.
+
+Markup
+------
+
+dojoType="button" replaced by dojoType="dijit.Button" Must use fully qualified class name,
+and it's case-sensitive.
+
+Need to manually dojo.require("dojo.parser") to get parsing
+
+Widget namespaces and widget auto-loading are desupported.
+
+onClick="foo" now overrides (ie, replaces) the default onClick() function rather than attaching to it,
+so widget designers should make empty onClick() functions (when appropriate).
+
+Programmatic creation
+---------------------
+Create widgets via
+
+ new dijit.Button(params, srcNodeRef)
+
+createWidget() call removed since multiple renderers are no longer supported (see next section).
+
+At least for the dijit widgets, all widgets are guaranteed to work programmatically, which in
+effect means that all widgets must have templates, unless the default <div> works.
+
+Renderers
+---------
+Removed support for multiple renderers (svg & vml & a11y) for a single widget.
+If a widget wants to render differently on different platforms, there must be
+branching code inside the widget, or it needs to call a library that branches
+based on the browser type (like dojo.gfx or dojo.charting).
+
+
+Templates
+---------
+"this." is no longer used within ${} substitution notation. See ticket #2905.
+dojoRoot,buildScriptBase,dojoModuleUrl are no longer supported, but
+any JavaScript properties on the widget's 'this' may be referenced with dotted notation.
+The attributes dojoOn* are desupported (including dojoOnBuild);
+also can't use id attribute to affect a dojoAttachPoint.
+
+dojoAttachEvent is case sensitive, so capitalization matters. You will probably have
+to change
+
+dojoAttachEvent="onClick"
+
+to
+
+dojoAttachEvent="onclick: onClick"
+
+(given that the event name is lowercase, and assuming that the method name is camel case)
+
+lists within dojoAttachPoint, dojoAttachEvent, waiRole, and waiState are now comma-separated
+(not separated by semi-colons)
+
+Standard HTML attributes like 'id', 'name', 'lang', etc. are carried over programmatically
+by the _Widget constructor and do not need to be declared in the template (see _Widget.attributeMap)
+
+Parent/Child relationships
+--------------------------
+By default widgets exist as islands, not knowing about their parent widget or children widgets.
+The exception is the destroy() function which will also delete all descendant widgets.
+Some widgets like Tree and SplitContainer will know about their children, but those widgets
+will use the special mixins in Container.js / Layout.js.
+
+Widget.js base class
+--------------------
+
+ - Widget.js, Domwidget.js, HtmlWidget.js combined into dijit.base.Widget, with TemplatedWidget mixin
+for widgets with templates
+
+ - on widget creation, postMixInProperties(), buildRendering() and postCreate() is called.
+ fillInTemplate() is no longer called. In addition, those functions call signatures have changed.
+ No arguments are passed. To get the source dom Node, just reference this.srcDomNode.
+When postCreate() is called the widget children don't yet exist.
+
+ - The TemplatedWidget mixin defines buildRendering(). widgetsInTemplate not ported yet.
+
+ - onResized() removed
+
+ - the whole parent/child relationship thing is gone
+
+ - extraArgs[] is gone
+
+ - postCreate() called but child widgets don't exist yet
+
+ - templateCssPath ignored. User must manually include tundra.css file
+
diff --git a/includes/js/dijit/demos/chat.html b/includes/js/dijit/demos/chat.html
new file mode 100644
index 0000000..bd599f9
--- /dev/null
+++ b/includes/js/dijit/demos/chat.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Chat Demo Starter</title>
+
+ <style type="text/css">
+ @import "../../dijit/tests/css/dijitTests.css";
+ @import "../themes/soria/soria.css";
+ @import "chat/chat.css";
+
+ .body { width:720px; margin:0 auto; }
+
+ .picker {
+ margin:0 auto;
+ height:100px;
+ }
+
+ .box a { color:#000; text-decoration:none; }
+
+ .box { border:1px solid #666;
+ background:#b7cdee url('../themes/soria/images/gradientTopBg.png') repeat-x top left;
+ background-position:0px -1px;
+ padding:35px;
+ padding-top:15px;
+ padding-bottom:15px;
+ margin:5px;
+ font-weight:bold;
+ -moz-border-radius:7pt;
+ cursor:pointer;
+ }
+ .box:hover {
+ color:#fff;
+ background-color:#54f767;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: false, defaultTestTheme: 'soria'"></script>
+ <script type="text/javascript" src="../tests/_testCommon.js"></script>
+
+ <script type="text/javascript">
+ var _pass = function(/* Event */e){
+ var href = e.target.getAttribute("href")||null;
+ if(href){ window.location.href = href; }
+ }
+
+
+ dojo.addOnLoad(function(){
+ var links = dojo.query(".box");
+ dojo.forEach(links,function(node){
+ dojo.connect(node,"onclick","_pass");
+ });
+ });
+ </script>
+
+</head>
+<body class="soria">
+<div class="body">
+ <h1 class="testTitle">Dojo chat demo preabmle ...</h1>
+ <p>
+ There are two examples of chat, using <a
+ href="http://cometd.org">cometd</a> as a backend and Dojo's
+ dojox.cometd client as a transport.
+ </p>
+ <p>
+ The first, a simple public chat room, that any live participants
+ that happen to be online will be able to communicate.
+ </p>
+ <div class="dijitInline box" href="chat/community.html">Join Group Chat</div>
+ <p>The other: the example from the Dojo Book - an example of a
+ client / operator relationship, where the client chats from an
+ 'existing' page, and the operator has a TabContainer view of
+ open client chats, and can communicate privately and directly
+ to the client. The client page demonstrates how this can be used in existing
+ pages for real-time support. You will need two people for this, or you
+ are welcome to talk to yourself ...
+ </p>
+ <div class="dijitInline">
+ <div class="dijitInline box" href="chat/client.html">Client Page</div>
+ <div class="dijitInline box" href="chat/operator.html">Operator Page</div>
+ </div>
+ <p>the Chatroom widget source can be found <a href="chat/room.js">here</a>.</p>
+</div>
+</body>
+</html>
diff --git a/includes/js/dijit/demos/chat/chat.css b/includes/js/dijit/demos/chat/chat.css
new file mode 100644
index 0000000..9dde485
--- /dev/null
+++ b/includes/js/dijit/demos/chat/chat.css
@@ -0,0 +1,40 @@
+.chatroom
+{
+ position:relative;
+ height:240px;
+ background-color: #e0e0e0;
+ border: 0px solid black;
+}
+.chat
+{
+ height: 200px;
+ overflow: auto;
+ background-color: #fff;
+ padding: 4px;
+ border: 0px solid black;
+}
+.dijitTabContainer .chat {
+ height:auto;
+}
+.input {
+ position:absolute;
+ bottom:0px;
+ display:block;
+ padding: 4px;
+ border: 0px solid black;
+ border-top: 1px solid black;
+}
+.phrase
+{
+ width:200px;
+ background-color:#ededed;
+}
+.username
+{
+ width:145px;
+ background-color: #ededed;
+}
+.hidden { display: none; }
+.from { font-weight: bold; }
+.alert { font-style: italic; }
+.dijitTitlePaneContentInner { padding:0px !important; }
diff --git a/includes/js/dijit/demos/chat/chat.css.commented.css b/includes/js/dijit/demos/chat/chat.css.commented.css
new file mode 100644
index 0000000..0874a53
--- /dev/null
+++ b/includes/js/dijit/demos/chat/chat.css.commented.css
@@ -0,0 +1,46 @@
+.chatroom
+{
+ position:relative;
+ height:240px;
+ background-color: #e0e0e0;
+ border: 0px solid black;
+}
+
+.chat
+{
+ height: 200px;
+ overflow: auto;
+ background-color: #fff;
+ padding: 4px;
+ border: 0px solid black;
+}
+.dijitTabContainer .chat {
+ height:auto;
+}
+
+.input {
+ position:absolute;
+ bottom:0px;
+ display:block;
+ padding: 4px;
+ border: 0px solid black;
+ border-top: 1px solid black;
+}
+
+.phrase
+{
+ width:200px;
+ background-color:#ededed;
+}
+
+.username
+{
+ width:145px;
+ background-color: #ededed;
+}
+
+.hidden { display: none; }
+.from { font-weight: bold; }
+.alert { font-style: italic; }
+.dijitTitlePaneContentInner { padding:0px !important; }
+
diff --git a/includes/js/dijit/demos/chat/client.html b/includes/js/dijit/demos/chat/client.html
new file mode 100644
index 0000000..5471272
--- /dev/null
+++ b/includes/js/dijit/demos/chat/client.html
@@ -0,0 +1,65 @@
+<html>
+<head>
+ <title>Sample built in tech-support demonstration | The Dojo Toolkit </title>
+ <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+ <script type="text/javascript" src="room.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.TitlePane");
+ dojo.require("dojo.parser");
+ dojo.require("dijit.form.Button");
+
+ // this puts our help box in the top/right corner on scroll and show
+ function _positionIt(evt){
+ if (helpNode.domNode.style.display == "block"){
+ dojo.style(helpNode.domNode,"top",(dijit.getViewport().t + 4) + "px");
+ }
+ }
+
+ var helpNode;
+ dojo.addOnLoad(function(){
+ dojo.parser.parse(dojo.body());
+ helpNode = dijit.byId('helpPane');
+ dojo.connect(window,"onscroll","_positionIt");
+ // this is not a public cometd server :)
+ dojox.cometd.init("http://comet.sitepen.com:9190/cometd");
+ });
+
+ </script>
+ <style type="text/css">
+ @import "chat.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../../tests/css/dijitTests.css";
+ </style>
+</head>
+<body class="tundra">
+
+<h1 class="testTitle">I am a <i>Sample</i> page</h1>
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam facilisis enim. Pellentesque in elit et lacus euismod dignissim. Aliquam dolor pede, convallis eget, dictum a, blandit ac, urna. Pellentesque sed nunc ut justo volutpat egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. In erat. Suspendisse potenti. Fusce faucibus nibh sed nisi. Phasellus faucibus, dui a cursus dapibus, mauris nulla euismod velit, a lobortis turpis arcu vel dui. Pellentesque fermentum ultrices pede. Donec auctor lectus eu arcu. Curabitur non orci eget est porta gravida. Aliquam pretium orci id nisi. Duis faucibus, mi non adipiscing venenatis, erat urna aliquet elit, eu fringilla lacus tellus quis erat. Nam tempus ornare lorem. Nullam feugiat.</p>
+
+<h3>Need help?</h3>
+<button dojoType="dijit.form.Button">
+Show / Hide Tech Support Chat
+ <script type="dojo/method" event="onClick">
+ // simple dojo/method example. this is like doing button onClick="javascript:" but more robust
+ var anim = dojo[(helpNode.open ? "fadeOut" : "fadeIn")]({ node: helpNode.domNode, duration: 400 });
+ dojo.connect(anim,(helpNode.open ? "onEnd" : "beforeBegin"),function(){
+ dojo.style(helpNode.domNode,"display",(helpNode.open ? "none" : "block"));
+ helpNode.toggle();
+ _positionIt();
+ });
+ anim.play();
+ </script>
+</button>
+
+
+ <p>Sed congue. Aenean blandit sollicitudin mi. Maecenas pellentesque. Vivamus ac urna. Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh. Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris, bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia ac, vehicula laoreet, elit. Sed interdum augue sit amet quam dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec quam.</p>
+ <p>Sed arcu magna, molestie at, fringilla in, sodales eu, elit. Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus ut elit convallis eleifend. Fusce tincidunt, justo quis tempus euismod, magna nulla viverra libero, sit amet lacinia odio diam id risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu, porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac, faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu, consequat quis, varius interdum, nulla. Donec neque tortor, sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean ut eros sit amet ante pharetra interdum.</p>
+ <p>Fusce rutrum pede eget quam. Praesent purus. Aenean at elit in sem volutpat facilisis. Nunc est augue, commodo at, pretium a, fermentum at, quam. Nam sit amet enim. Suspendisse potenti. Cras hendrerit rhoncus justo. Integer libero. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam erat volutpat. Sed adipiscing mi vel ipsum.</p>
+
+ <div title="Chat with Technical Support:" id="helpPane" dojoType="dijit.TitlePane"
+ style="width:275px; height:400px; position:absolute; top:4px; right:4px; margin:0; padding:0; display:none;" open="false" >
+ <div dojoType="dijit.demos.chat.Room" id="chatroom" isPrivate="true"></div>
+ </div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/demos/chat/community.html b/includes/js/dijit/demos/chat/community.html
new file mode 100644
index 0000000..4c208a0
--- /dev/null
+++ b/includes/js/dijit/demos/chat/community.html
@@ -0,0 +1,114 @@
+<html>
+<head>
+ <title>Cometd chat / Operator Page</title>
+
+ <style type="text/css">
+ @import "chat.css";
+ @import "../../tests/css/dijitTests.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../../../dojox/widget/SortList/SortList.css";
+
+ html, body { margin:0; padding:0; height:100%; width:100%; overflow:hidden; }
+
+ #status { position:absolute; top:5px; right:25px; }
+ #mainPane { background:#fff; }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+ <script type="text/javascript" src="../../../dijit/tests/_testCommon.js"></script>
+ <script type="text/javascript" src="room.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.layout.SplitContainer");
+ dojo.require("dijit.layout.LayoutContainer");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.Button");
+
+ // custom widget created for this demo:
+ dojo.require("dojox.widget.SortList");
+
+ dojo.require("dojo.parser");
+
+ // not for production use?
+ //dojox.cometd.init("http://comet.sitepen.com:9000/cometd");
+
+ var control = {
+ _chats: [],
+ _getAlert: function(e){
+ console.log(e);
+ if (!this._chats[(e.data.user)] && (operator != e.data.user)){
+ dojox.cometd.subscribe("/chat/demo/"+e.data.joined,this,"_privateChat");
+
+ var tabNode = document.createElement('div');
+ tabNode.id = "chatWith" + e.data.user;
+ var chatNode = document.createElement('div');
+ chatNode.id = e.data.user + "Widget";
+ tabNode.appendChild(chatNode);
+ var newTab = new dijit.layout.ContentPane({
+ title: e.data.user,
+ closable: true
+ },tabNode);
+ dijit.byId('tabView').addChild(newTab);
+ var chat = new dijit.demos.chat.Room({
+ roomId: e.data.joined,
+ registeredAs: operator
+ },chatNode);
+ chat.startup();
+ this._chats[(e.data.user)]=true;
+ }
+ },
+
+ _privateChat: function(e){
+ var thisChat = dijit.byId(e.data.user+"Widget") || false;
+ if (thisChat) { thisChat._chat(e); }
+ }
+ };
+
+ function registerOperator(){
+ dijit.byId('loginDialog').hide();
+
+ }
+
+ dojo.addOnLoad(function(){
+ dojo.parser.parse(dojo.body());
+ // dojox.cometd.subscribe("/chat/demo/poundDojo",control,"_getAlert");
+ var widget = dijit.byId('userList');
+ for (var i = 0; i<50; i++){
+ var node = document.createElement('li');
+ node.innerHTML = i+": list item sample";
+ widget.containerNode.appendChild(node);
+ }
+ widget.onSort();
+ });
+ </script>
+</head>
+<body>
+<div dojoType="dijit.layout.LayoutContainer" style="width:100%; height:100%;">
+ <div dojoType="dijit.layout.SplitContainer" orientation="vertical" style="height:100%" layoutAlign="client" sizerWidth="7">
+ <div dojoType="dijit.layout.SplitContainer" orientation="horizontal" sizerWidth="7" activeSizing="true" layoutAlign="top" sizeShare="80">
+ <div id="mainPane" dojoType="dijit.layout.ContentPane" title="Home" style="padding:8px;" sizeShare="80" layoutAlign="left" style="background:#fff;">
+ <h3>Dojo community chat demo</h3>
+ <h2>NON-WORKING PROTOTYPE</h2>
+
+ <button dojoType="dijit.form.Button">Login
+ <script type="dojo/method" event="onClick">
+ console.log('foo?');
+ dijit.byId('loginDialog').show();
+ </script>
+ </button>
+
+ </div>
+ <div title="Users in #dojo" id="userList" dojoType="dojox.widget.SortList" sizeShare="20" sizeMin="15" layoutAlign="right"></div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" sizeShare="20" layoutAlign="bottom">
+ bottom. (input area)
+ </div>
+ </div>
+</div>
+<div dojoType="dijit.Dialog" id="loginDialog" title="Select Username:">
+ Name: <input type="text" name="username" id="opName" value="" />
+ <input type="submit" value="login" onclick="registerOperator()"/>
+</div>
+</body>
+</html>
diff --git a/includes/js/dijit/demos/chat/operator.html b/includes/js/dijit/demos/chat/operator.html
new file mode 100644
index 0000000..594fc6e
--- /dev/null
+++ b/includes/js/dijit/demos/chat/operator.html
@@ -0,0 +1,83 @@
+<html>
+<head>
+ <title>Cometd chat / Operator Page</title>
+ <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad:false"></script>
+ <script type="text/javascript" src="room.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dojo.parser");
+ var control = {
+ _chats: {},
+ _getAlert: function(e){
+ console.log(e);
+ if (!this._chats[(e.data.user)] && (operator != e.data.user)){
+ dojox.cometd.subscribe("/chat/demo/"+e.data.joined,this,"_privateChat");
+
+ var tabNode = document.createElement('div');
+ tabNode.id = "chatWith" + e.data.user;
+ var chatNode = document.createElement('div');
+ chatNode.id = e.data.user + "Widget";
+ tabNode.appendChild(chatNode);
+ var newTab = new dijit.layout.ContentPane({
+ title: e.data.user,
+ closable: true
+ },tabNode);
+ dijit.byId('tabView').addChild(newTab);
+ var chat = new dijit.demos.chat.Room({
+ roomId: e.data.joined,
+ registeredAs: operator
+ },chatNode);
+ chat.startup();
+ this._chats[(e.data.user)]=true;
+ }
+ },
+
+ _privateChat: function(e){
+ var thisChat = dijit.byId(e.data.user+"Widget") || false;
+ if (thisChat) { /* thisChat._chat(e); */}
+ }
+ };
+
+ dojo.addOnLoad(function(){
+ dojo.parser.parse(dojo.body());
+
+ dojox.cometd.init("http://comet.sitepen.com:9190/cometd");
+ dojox.cometd.subscribe("/chat/demo",control,"_getAlert");
+
+ });
+
+ var operator;
+ function registerOperator(){
+ operator = dojo.byId('opName').value;
+ dojo.byId('login').style.display = "none";
+ dojo.byId('status').innerHTML = "You are: <b>"+operator+"</b>";
+ }
+
+ </script>
+ <style type="text/css">
+ @import "chat.css";
+ @import "../../tests/css/dijitTests.css";
+ @import "../../themes/tundra/tundra.css";
+ #status { position:absolute; top:5px; right:25px; }
+ </style>
+</head>
+<body class="tundra">
+
+<h1 class="testTitle">Tech Support Operator Page:</h1>
+
+<div id="tabView" dojoType="dijit.layout.TabContainer" style="width:100%; height:75%; ">
+
+ <div dojoType="dijit.layout.ContentPane" title="Home" style="padding:8px;" >
+ <h3>Welcome Operator</h3>
+ <p>It is your job to respond to incoming Support Requests. Sit here, and watch the screen.</p>
+ <p id="login">Please Login as an operator:
+ <br><br>
+ Name: <input type="text" name="username" id="opName" value="" /> <input type="submit" value="login" onclick="registerOperator()"/>
+ </p>
+ </div><!-- home tab -->
+
+</div><!-- tabContainer -->
+<div id="status"></div>
+</body>
+</html>
diff --git a/includes/js/dijit/demos/chat/room.js b/includes/js/dijit/demos/chat/room.js
new file mode 100644
index 0000000..b1847f4
--- /dev/null
+++ b/includes/js/dijit/demos/chat/room.js
@@ -0,0 +1,127 @@
+if(!dojo._hasResource["dijit.demos.chat.room"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.demos.chat.room"] = true;
+dojo.provide("dijit.demos.chat.room");
+
+dojo.require("dojox.cometd");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.demos.chat.Room",
+ [dijit._Widget,dijit._Templated],
+ {
+
+ _last: "",
+ _username: null,
+ roomId: "public",
+ isPrivate: false,
+ prompt: "Name:",
+
+ templateString: '<div id="${id}" class="chatroom">'
+ +'<div dojoAttachPoint="chatNode" class="chat"></div>'
+ +'<div dojoAttachPoint="input" class="input">'
+ +'<div dojoAttachPoint="joining">'
+ +'<span>${prompt}</span><input class="username" dojoAttachPoint="username" type="text" dojoAttachEvent="onkeyup: _join"> <input dojoAttachPoint="joinB" class="button" type="submit" name="join" value="Contact" dojoAttachEvent="onclick: _join"/>'
+ +'</div>'
+ +'<div dojoAttachPoint="joined" class="hidden">'
+ +'<input type="text" class="phrase" dojoAttachPoint="phrase" dojoAttachEvent="onkeyup: _cleanInput" />'
+ +'<input type="submit" class="button" value="Send" dojoAttachPoint="sendB" dojoAttachEvent="onclick: _sendPhrase"/>'
+ +'</div>'
+ +'</div>'
+ +'</div>',
+
+ join: function(name){
+ if(name == null || name.length==0){
+ alert('Please enter a username!');
+ }else{
+ if(this.isPrivate){ this.roomId = name; }
+ this._username=name;
+ this.joining.className='hidden';
+ this.joined.className='';
+ this.phrase.focus();
+ console.log(this.roomId);
+ dojox.cometd.subscribe("/chat/demo/" + this.roomId, this, "_chat");
+ dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, join: true, chat : this._username+" has joined the room."});
+ dojox.cometd.publish("/chat/demo", { user: this._username, joined: this.roomId });
+ }
+ },
+
+ _join: function(/* Event */e){
+ var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
+ if (key == dojo.keys.ENTER || e.type=="click"){
+ this.join(this.username.value);
+ }
+ },
+
+ leave: function(){
+ dojox.cometd.unsubscribe("/chat/demo/" + this.roomId, this, "_chat");
+ dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, leave: true, chat : this._username+" has left the chat."});
+
+ // switch the input form back to login mode
+ this.joining.className='';
+ this.joined.className='hidden';
+ this.username.focus();
+ this._username=null;
+ },
+
+ chat: function(text){
+ // summary: publish a text message to the room
+ if(text != null && text.length>0){
+ // lame attempt to prevent markup
+ text=text.replace(/</g,'&lt;');
+ text=text.replace(/>/g,'&gt;');
+ dojox.cometd.publish("/chat/demo/" + this.roomId, { user: this._username, chat: text});
+ }
+ },
+
+ _chat: function(message){
+ // summary: process an incoming message
+ if (!message.data){
+ console.warn("bad message format "+message);
+ return;
+ }
+ var from=message.data.user;
+ var special=message.data.join || message.data.leave;
+ var text=message.data.chat;
+ if(text!=null){
+ if(!special && from == this._last ){ from="...";
+ }else{
+ this._last=from;
+ from+=":";
+ }
+
+ if(special){
+ this.chatNode.innerHTML += "<span class=\"alert\"><span class=\"from\">"+from+"&nbsp;</span><span class=\"text\">"+text+"</span></span><br/>";
+ this._last="";
+ }else{
+ this.chatNode.innerHTML += "<span class=\"from\">"+from+"&nbsp;</span><span class=\"text\">"+text+"</span><br/>";
+ this.chatNode.scrollTop = this.chatNode.scrollHeight - this.chatNode.clientHeight;
+ }
+ }
+ },
+
+ startup: function(){
+ this.joining.className='';
+ this.joined.className='hidden';
+ //this.username.focus();
+ this.username.setAttribute("autocomplete","OFF");
+ if (this.registeredAs) { this.join(this.registeredAs); }
+ this.inherited("startup",arguments);
+ },
+
+ _cleanInput: function(/* Event */e){
+ var key = (e.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : e.keyCode);
+ if(key == dojo.keys.ENTER || key == 13){
+ this.chat(this.phrase.value);
+ this.phrase.value='';
+ }
+ },
+
+ _sendPhrase: function(/* Event */e){
+ if (this.phrase.value){
+ this.chat(this.phrase.value);
+ this.phrase.value='';
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/demos/form.html b/includes/js/dijit/demos/form.html
new file mode 100644
index 0000000..e8b238d
--- /dev/null
+++ b/includes/js/dijit/demos/form.html
@@ -0,0 +1,243 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo Form Widgets Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ @import "../themes/tundra/tundra_rtl.css";
+ @import "../tests/css/dijitTests.css";
+
+ .formQuestion {
+ background-color:#d0e3f5;
+ padding:0.3em;
+ font-weight:900;
+ font-family:Verdana, Arial, sans-serif;
+ font-size:0.8em;
+ color:#5a5a5a;
+ }
+ .formAnswer {
+ background-color:#f5eede;
+ padding:0.3em;
+ margin-bottom:1em;
+ width: 100%;
+ }
+ .pageSubContentTitle {
+ color:#8e8e8e;
+ font-size:1em;
+ font-family:Verdana, Arial, sans-serif;
+ margin-bottom:0.75em;
+ }
+ body .short {
+ width: 5em;
+ }
+ body .medium {
+ width: 10em;
+ }
+ body .long {
+ width: 20em;
+ }
+ .firstLabel {
+ display: inline-block;
+ display: -moz-inline-box;
+ width: 10em;
+ min-width: 10em;
+ }
+ .secondLabel {
+ width: auto;
+ margin-left: 5em;
+ margin-right: 1em;
+ }
+ fieldset label {
+ margin-right: 1em;
+ }
+ .noticeMessage {
+ display: block;
+ float: right;
+ font-weight: normal;
+ font-family:Arial, Verdana, sans-serif;
+ color:#663;
+ font-size:0.9em;
+ }
+ .dj_ie .dijitSlider .dijitRuleContainer {
+ z-index: 1;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: false, parseOnLoad: true"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.Slider");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.Editor");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // make dojo.toJson() print dates correctly (this feels a bit dirty)
+ Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
+ </script>
+ </head>
+ <body class="tundra">
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../tests/_data/states.json"></div>
+
+ <h2 class="pageSubContentTitle">Job Application Form</h2>
+ <p>This is just a little demo of dijit's form widgets</p>
+ <form dojoType="dijit.form.Form" id="myForm"
+ onsubmit="alert('Execute form w/values:\n'+dojo.toJson(this.getValues(),true));return confirm('Show form values in the URL?')">
+ <div class="formQuestion">
+ <span class="noticeMessage">
+ As you type in the text below, notice how your input is auto
+ corrected and also the auto completion on the state field.
+ </span>
+ <span>Name And Address</span>
+ </div>
+ <div class="formAnswer">
+ <label class="firstLabel" for="name">Name *</label>
+ <input type="text" id="name" name="name" class="medium"
+ dojoType="dijit.form.ValidationTextBox"
+ required="true"
+ ucfirst="true" invalidMessage=""/>
+ <br>
+
+ <label class="firstLabel" for="address">Address *</label>
+ <input type="text" id="address" name="address" class="long"
+ dojoType="dijit.form.ValidationTextBox"
+ required="true"
+ trim="true"
+ ucfirst="true" />
+ <br>
+
+ <label class="firstLabel" for="city">City *</label>
+ <select dojoType="dijit.form.ComboBox"
+ value=""
+ autocomplete="true"
+ hasDownArrow="false"
+ >
+ <option></option>
+ <option>Chicago</option>
+ <option>Los Angeles</option>
+ <option>New York</option>
+ <option>San Francisco</option>
+ <option>Seattle</option>
+ </select>
+
+ <label class="secondLabel" for="state">State</label>
+ <input dojoType="dijit.form.FilteringSelect"
+ store="stateStore" class="medium" id="state" name="state" />
+
+ <label class="secondLabel" for="zip">Zip *</label>
+ <input type="text" id="zip" name="zip" class="short"
+ dojoType="dijit.form.ValidationTextBox"
+ trim="true"
+ required="true"
+ regExp="[0-9][0-9][0-9][0-9][0-9]"
+ invalidMessage="5 digit zipcode (ex: 23245)"/>
+ <br>
+
+ <label class="firstLabel" for="dob">DOB *</label>
+ <input id="dob" name="dateOfBirth" dojoType="dijit.form.DateTextBox" required=true/>
+
+ </div>
+
+ <div class="formQuestion">
+ <span class="noticeMessage">Custom checkboxes and radio buttons...</span>
+ <span>Desired position</span>
+ </div>
+ <div class="formAnswer">
+ <label class="firstLabel" for="position">Position</label>
+ <fieldset id="position" class="dijitInline">
+ <input type="checkBox" name="position" id="it" value="it" dojoType="dijit.form.CheckBox" /> <label for="it">IT</label>
+ <input type="checkBox" name="position" id="marketing" value="marketing" dojoType="dijit.form.CheckBox" /> <label for="marketing">Marketing</label>
+ <input type="checkBox" name="position" id="business" value="business" dojoType="dijit.form.CheckBox" /> <label for="business" style="margin-right: 7em;">Business</label>
+ </fieldset>
+
+ <label class="secondLabel" for="hours">Hours</label>
+ <fieldset id="hours" class="dijitInline">
+ <input type="radio" name="hours" id="full" value="full" dojoType="dijit.form.RadioButton" /> <label for="full">Full time</label>
+ <input type="radio" name="hours" id="part" value="part" dojoType="dijit.form.RadioButton" /> <label for="part">Part time</label>
+ </fieldset>
+ </div>
+
+ <div class="formQuestion">
+ <span class="noticeMessage">slider and spinner ...</span>
+ <span>Education and Experience</span>
+ </div>
+ <div class="formAnswer">
+ <table class="dijitReset">
+ <tr>
+ <td>
+ <label class="firstLabel" for="school">Education level</label>
+ </td>
+ <td style="padding-left: 2em;">
+ <span dojoType="dijit.form.HorizontalSlider" id="school" name="school"
+ minimum="1"
+ value="2"
+ maximum="4"
+ discreteValues="4"
+ showButtons="false"
+ style="width:200px; height: 40px;"
+ >
+ <span dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=4 style="height:5px;"></span>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+ <li>high school</li>
+ <li>college</li>
+ <li>masters</li>
+ <li>PhD</li>
+ </ol>
+ </span>
+ </td>
+ <td>
+ <label class="secondLabel" for="experience">Work experience (years, 0-40)</label>
+ </td>
+ <td>
+ <input dojoType="dijit.form.NumberSpinner"
+ id="experience" name="experience" class="short"
+ value="1"
+ constraints="{min: 0, max:40, places:0}"
+ size=3>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="formQuestion">
+ <span class="noticeMessage">Rich text editor that expands as you type in text</span>
+ <label for="description">Self description</label>
+ </div>
+ <div class="formAnswer">
+ <textarea dojoType="dijit.Editor" minHeight="5em" id="description" name="description">
+ Write a brief summary of &lt;i&gt;your&lt;/i&gt; job skills... using &lt;b&gt;rich&lt;/b&gt; text.
+ </textarea>
+ </div>
+
+ <div class="formQuestion">
+ <span class="noticeMessage">Text area that expands as you type in text</span>
+ <label for="references">References</label>
+ </div>
+ <div class="formAnswer">
+ <textarea dojoType="dijit.form.Textarea" id="references" name="references">
+ Write your references here (plain text)
+ </textarea>
+ </div>
+
+ <center>
+ <button dojoType="dijit.form.Button" iconClass="dijitEditorIcon dijitEditorIconSave" type=submit>
+ OK
+ </button>
+ </center>
+ </form>
+ </body>
+</html>
+
diff --git a/includes/js/dijit/demos/i18n.html b/includes/js/dijit/demos/i18n.html
new file mode 100644
index 0000000..b99f6b9
--- /dev/null
+++ b/includes/js/dijit/demos/i18n.html
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit I18N Demo</title>
+
+ <script>
+ var djConfig = {parseOnLoad: true, isDebug: true},
+ locale,
+ lang,
+ bidi;
+
+ // read in HREF arguments
+ if(window.location.href.indexOf("?") > -1){
+ var str = window.location.href.substr(window.location.href.indexOf("?")+1);
+ var ary = str.split(/&/);
+ for(var i=0; i<ary.length; i++){
+ var split = ary[i].split(/=/),
+ key = split[0],
+ value = split[1];
+ switch(key){
+ case "locale":
+ djConfig.locale = locale = value;
+ lang = locale.replace(/-.*/, "");
+ break;
+ case "dir":
+ document.getElementsByTagName("html")[0].dir = value;
+ bidi = value;
+ break;
+ }
+ }
+ }
+ </script>
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ @import "../themes/tundra/tundra_rtl.css";
+ @import "../tests/css/dijitTests.css";
+ @import "i18n/flags.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit._Calendar");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser");
+ dojo.addOnLoad(function(){
+ dojo.byId("locale").innerHTML = locale || "default";
+ dojo.byId("dir").innerHTML = bidi || "default";
+ });
+ </script>
+
+</head>
+<body class="tundra">
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="store"
+ url="i18n/data.json"></div>
+ <div dojoType="dijit.tree.ForestStoreModel" jsId="model" store="store" childrenAttrs="languages">
+ <!-- Override all the data access functions to work from the I18N data store -->
+ <script type="dojo/method" event="getChildren" args="item, onComplete">
+ switch(item.root ? "top" : store.getValue(item, "type")){
+ case "top":
+ return store.fetch({query: {type:'continent'}, onComplete: onComplete});
+ case "continent":
+ return store.fetch({query: {continent: store.getValue(item, "iso")}, onComplete: onComplete});
+ case "country":
+ return dijit.tree.ForestStoreModel.prototype.getChildren.apply(this, arguments);
+ }
+ </script>
+ <script type="dojo/method" event="mayHaveChildren" args="item">
+ if(item.root){ return true; } // top level
+ var type = store.getValue(item, "type");
+ return (type == "continent" || type == "country");
+ </script>
+ </div>
+
+ <h1 class="testTitle" dir="ltr">Dijit I18N Demo (locale=<span id="locale"></span> dir=<span id="dir"></span>)</h1>
+
+ <table width="100%">
+ <tr>
+ <td width="30%" style="vertical-align: top;">
+ <div dojoType="dijit.Tree" id="mytree" model="model">
+ <!-- override functions for display of each node -->
+ <script type="dojo/method" event="getIconClass" args="item">
+ var icon =
+ (!item.root && store.getValue(item, "type") == "country") ?
+ ("countryIcon country" + store.getValue(item, "iso") + "Icon") :
+ dijit.Tree.prototype.getIconClass.apply(this, arguments);
+ return icon;
+ </script>
+ <script type="dojo/method" event="getLabel" args="item">
+ if(item.root){ return "Continents"; }
+ var localizedName = lang && store.getValue(item, lang);
+ return localizedName || (store.getLabel(item) + " \u202b" + "(" + store.getIdentity(item) + ")\u202c");
+ </script>
+
+ <!-- clicking a node refreshes the page with new locale setting -->
+ <script type="dojo/method" event="onClick" args="item, node">
+ var type = store.getValue(item, "type");
+ if(type == "language"){
+ var lang = store.getIdentity(item),
+ locale = lang + "-" + store.getIdentity(node.getParent().item).toLowerCase(),
+ dir = /ar|fa|he|ps|ur|yi/i.test(lang) ? "rtl" : "ltr";
+ window.location.href = window.location.href.replace(/\?.*/, "") + "?locale=" + locale + "&dir=" + dir;
+ }else{
+ alert("Please click a language, not a country or continent.");
+ }
+ </script>
+ </div>
+ </td>
+ <td style="vertical-align: top;">
+ <p dir="ltr">
+ Use the tree to select a language or a language/country combo; the page will reload
+ in the specified locale. Note that tree is also rerendered using the specified language for top level tree items.
+ Arabic and Hebrew display right-to-left so be sure to try those.
+ </p>
+ <input dojoType="dijit._Calendar"/>
+
+ <p>Some form controls:</p>
+
+ <label for="date">Date:</label>
+ <input id="date" dojoType="dijit.form.DateTextBox" value="2006-07-04"/>
+ <br/>
+ <label for="spinner">Number spinner:</label>
+ <input id="spinner" dojoType="dijit.form.NumberSpinner" value="123456789"/>
+ <br/>
+ <label for="currency">Currency:</label>
+ <input id="currency" type="text" name="income1" value="54775.53"
+ dojoType="dijit.form.CurrencyTextBox"
+ required="true"
+ constraints="{fractional:true}"
+ currency="USD"/>
+ <br/>
+
+ <label for="combo1">Simple Combo:</label>
+ <select id="combo1" dojoType="dijit.form.ComboBox">
+ <option>option #1</option>
+ <option>option #2</option>
+ <option>option #3</option>
+ </select>
+ <br/>
+ <label for="combo2">Combo on languages and countries:</label>
+ <input id="combo2" dojoType="dijit.form.ComboBox"
+ value=""
+ store="store"
+ searchAttr="name"
+ name="anything"/>
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/includes/js/dijit/demos/i18n/continents.json b/includes/js/dijit/demos/i18n/continents.json
new file mode 100644
index 0000000..994842b
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/continents.json
@@ -0,0 +1,9 @@
+[
+{ type: "continent", name: "Africa", iso: "Africa" },
+{ type: "continent", name: "Asia", iso: "Asia" },
+{ type: "continent", name: "Europe", iso: "Europe" },
+{ type: "continent", name: "North America", iso: "North America" },
+{ type: "continent", name: "South America", iso: "South America" },
+{ type: "continent", name: "Oceania", iso: "Oceania" },
+{ type: "continent", name: "Antarctica", iso: "Antarctica" }
+]
diff --git a/includes/js/dijit/demos/i18n/data.json b/includes/js/dijit/demos/i18n/data.json
new file mode 100644
index 0000000..f46855b
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/data.json
@@ -0,0 +1,8646 @@
+{ "identifier": 'iso',
+ "label": 'name',
+ "items":
+[
+ {
+ "type": "language",
+ "iso": "aa",
+ "name": "Qafar",
+ "countries": [
+ {
+ "_reference": "DJ"
+ },
+ {
+ "_reference": "ER"
+ },
+ {
+ "_reference": "ET"
+ }
+ ],
+ "am": "አፋርኛ",
+ "ar": "الأفارية",
+ "ca": "àfar",
+ "cs": "Afarština",
+ "da": "afar",
+ "de": "Afar",
+ "en": "Afar",
+ "es": "afar",
+ "fi": "afar",
+ "fr": "afar",
+ "ga": "Afar",
+ "he": "אתיופית",
+ "hi": "अफ़ार",
+ "hu": "afar",
+ "id": "Afar",
+ "it": "afar",
+ "ja": "アファル語",
+ "km": "ភាសាអាហ្វារ",
+ "ko": "아파르어",
+ "mr": "अफार",
+ "mt": "Afar",
+ "nb": "afar",
+ "nl": "Afar",
+ "nn": "afar",
+ "pt": "afar",
+ "ru": "афар",
+ "sv": "afar",
+ "ta": "அபார்",
+ "th": "อาฟา",
+ "tr": "Afar",
+ "uk": "Афарська",
+ "zh": "阿法文"
+ },
+ {
+ "type": "language",
+ "iso": "af",
+ "name": "Afrikaans",
+ "countries": [
+ {
+ "_reference": "NA"
+ },
+ {
+ "_reference": "ZA"
+ }
+ ],
+ "af": "Afrikaans",
+ "am": "አፍሪቃንስኛ",
+ "ar": "الأفريقية",
+ "bg": "Африканс",
+ "ca": "afrikaans",
+ "cs": "Afrikánština",
+ "da": "afrikaans",
+ "de": "Afrikaans",
+ "en": "Afrikaans",
+ "es": "afrikaans",
+ "fi": "afrikaans",
+ "fr": "afrikaans",
+ "ga": "Afracáinis",
+ "he": "אפריקנית",
+ "hi": "अफ्रीकी",
+ "hu": "afrikai",
+ "id": "Afrikaans",
+ "is": "Afríkanska",
+ "it": "afrikaans",
+ "ja": "アフリカーンス語",
+ "km": "ភាសាអាហ្វ្រីកាអាន",
+ "ko": "남아공 공용어",
+ "mr": "अफ्रिकान्स",
+ "mt": "Afrikans",
+ "nb": "afrikaans",
+ "nl": "Afrikaans",
+ "nn": "afrikaans",
+ "pt": "africâner",
+ "ru": "африкаанс",
+ "sr": "Африканерски",
+ "sv": "afrikaans",
+ "ta": "ஆப்ரிகன்ஸ்",
+ "th": "แอฟริกัน",
+ "tr": "Afrikaan Dili",
+ "uk": "Африканс",
+ "zh": "南非荷兰文"
+ },
+ {
+ "type": "language",
+ "iso": "am",
+ "name": "አማርኛ",
+ "countries": [
+ {
+ "_reference": "ET"
+ }
+ ],
+ "am": "አማርኛ",
+ "ar": "الأمهرية",
+ "bg": "Амхарски",
+ "ca": "amhàric",
+ "cs": "Amharština",
+ "da": "amharisk",
+ "de": "Amharisch",
+ "en": "Amharic",
+ "es": "amárico",
+ "fi": "amhara",
+ "fr": "amharique",
+ "he": "אמהרית",
+ "hi": "अम्हारिक्",
+ "hu": "amhara",
+ "id": "Amharik",
+ "is": "Amharíska",
+ "it": "amarico",
+ "ja": "アムハラ語",
+ "ko": "암하라어",
+ "mr": "अमहारिक",
+ "mt": "Amħariku",
+ "nb": "amharisk",
+ "nl": "Amhaars",
+ "nn": "amharisk",
+ "pt": "amárico",
+ "ru": "амхарский",
+ "sv": "amhariska",
+ "ta": "அம்ஹாரிக்",
+ "th": "อัมฮาริค",
+ "tr": "Amharik",
+ "uk": "Амхарік",
+ "zh": "阿姆哈拉文"
+ },
+ {
+ "type": "language",
+ "iso": "ar",
+ "name": "العربية",
+ "countries": [
+ {
+ "_reference": "AE"
+ },
+ {
+ "_reference": "BH"
+ },
+ {
+ "_reference": "DZ"
+ },
+ {
+ "_reference": "EG"
+ },
+ {
+ "_reference": "IQ"
+ },
+ {
+ "_reference": "JO"
+ },
+ {
+ "_reference": "KW"
+ },
+ {
+ "_reference": "LB"
+ },
+ {
+ "_reference": "LY"
+ },
+ {
+ "_reference": "MA"
+ },
+ {
+ "_reference": "OM"
+ },
+ {
+ "_reference": "QA"
+ },
+ {
+ "_reference": "SA"
+ },
+ {
+ "_reference": "SD"
+ },
+ {
+ "_reference": "SY"
+ },
+ {
+ "_reference": "TN"
+ },
+ {
+ "_reference": "YE"
+ }
+ ],
+ "am": "ዐርቢኛ",
+ "ar": "العربية",
+ "be": "арабскі",
+ "bg": "Арабски",
+ "ca": "àrab",
+ "cs": "Arabština",
+ "cy": "Arabeg",
+ "da": "arabisk",
+ "de": "Arabisch",
+ "el": "Αραβικά",
+ "en": "Arabic",
+ "es": "árabe",
+ "et": "Araabia",
+ "fi": "arabia",
+ "fr": "arabe",
+ "ga": "Araibis",
+ "he": "ערבית",
+ "hi": "अरबी",
+ "hr": "arapski",
+ "hu": "arab",
+ "id": "Arab",
+ "is": "Arabíska",
+ "it": "arabo",
+ "ja": "アラビア語",
+ "km": "ភាសាអារ៉ាប់",
+ "ko": "아랍어",
+ "lt": "Arabų",
+ "lv": "arābu",
+ "mr": "अरेबिक",
+ "mt": "Għarbi",
+ "nb": "arabisk",
+ "nl": "Arabisch",
+ "nn": "arabisk",
+ "pl": "arabski",
+ "ps": "عربي",
+ "pt": "árabe",
+ "ro": "Arabă",
+ "ru": "арабский",
+ "sk": "arabský",
+ "sl": "Arabščina",
+ "sq": "Arabisht",
+ "sr": "Арапски",
+ "sv": "arabiska",
+ "ta": "அரபு",
+ "te": "అరబిక్",
+ "tr": "Arapça",
+ "uk": "Арабська",
+ "vi": "Tiếng A-rập",
+ "zh": "阿拉伯文"
+ },
+ {
+ "type": "language",
+ "iso": "as",
+ "name": "অসমীয়া",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "አሳሜዛዊ",
+ "ar": "الأسامية",
+ "as": "অসমীয়া",
+ "ca": "assamès",
+ "cs": "Assaméština",
+ "da": "assamesisk",
+ "de": "Assamesisch",
+ "en": "Assamese",
+ "es": "asamés",
+ "fi": "assami",
+ "fr": "assamais",
+ "ga": "Asaimis",
+ "he": "אסאמית",
+ "hi": "असामी",
+ "hu": "asszámi",
+ "id": "Assam",
+ "is": "Assamska",
+ "it": "assamese",
+ "ja": "アッサム語",
+ "ko": "아샘어",
+ "mr": "असामी",
+ "mt": "Assamese",
+ "nb": "assamisk",
+ "nl": "Assamees",
+ "nn": "assamisk",
+ "pt": "assamês",
+ "ru": "ассамский",
+ "sv": "assamesiska",
+ "ta": "அஸ்ஸாமி",
+ "th": "อัสสัมมิส",
+ "uk": "Ассамська",
+ "zh": "阿萨姆文"
+ },
+ {
+ "type": "language",
+ "iso": "az",
+ "name": "azərbaycanca",
+ "countries": [
+ {
+ "_reference": "AZ"
+ }
+ ],
+ "am": "አዜርባይጃንኛ",
+ "ar": "الأذرية",
+ "az": "azərbaycanca",
+ "bg": "Азърбайджански",
+ "ca": "àzeri",
+ "cs": "Azerbajdžánština",
+ "da": "aserbajdsjansk",
+ "de": "Aserbaidschanisch",
+ "en": "Azerbaijani",
+ "es": "azerí",
+ "fa": "ترکی آذربایجانی",
+ "fi": "azeri",
+ "fr": "azéri",
+ "ga": "Asarbaiseáinis",
+ "he": "אזרית",
+ "hi": "अज़रबैंजानी",
+ "hu": "azerbajdzsáni",
+ "id": "Azerbaijan",
+ "is": "Aserska",
+ "it": "azerbaigiano",
+ "ja": "アゼルバイジャン語",
+ "km": "ភាសាអាហ៊្សែរបែហ្សង់",
+ "ko": "아제르바이잔어",
+ "mr": "अज़रबाइजानी",
+ "mt": "Ażerbajġani",
+ "nb": "aserbajdsjansk",
+ "nl": "Azerbeidzjaans",
+ "nn": "aserbajdsjansk",
+ "pt": "azerbaijano",
+ "ru": "азербайджанский",
+ "sv": "azerbajdzjanska",
+ "ta": "அசர்பாய்ஜானி",
+ "th": "อาเซอร์ไบจานี",
+ "tr": "Azerice",
+ "uk": "Азербайджанська",
+ "vi": "Tiếng Ai-déc-bai-gian",
+ "zh": "阿塞拜疆文"
+ },
+ {
+ "type": "language",
+ "iso": "be",
+ "name": "Беларускі",
+ "countries": [
+ {
+ "_reference": "BY"
+ }
+ ],
+ "am": "ቤላራሻኛ",
+ "ar": "البيلوروسية",
+ "be": "Беларускі",
+ "bg": "Беларуски",
+ "ca": "bielorús",
+ "cs": "Běloruština",
+ "da": "hviderussisk",
+ "de": "Weißrussisch",
+ "el": "Λευκορωσικά",
+ "en": "Belarusian",
+ "es": "bielorruso",
+ "fi": "valkovenäjä",
+ "fr": "biélorusse",
+ "ga": "Bealarúisis",
+ "he": "בלארוסית",
+ "hi": "बैलोरूशियन्",
+ "hr": "bjeloruski",
+ "hu": "belorusz",
+ "id": "Belarusia",
+ "is": "Hvítrússneska",
+ "it": "bielorusso",
+ "ja": "ベラルーシ語",
+ "km": "ភាសាបេឡារុស្ស",
+ "ko": "벨로루시어",
+ "mr": "बैलोरुसियन",
+ "mt": "Belarussu",
+ "nb": "hviterussisk",
+ "nl": "Wit-Russisch",
+ "nn": "kviterussisk",
+ "pt": "bielo-russo",
+ "ru": "белорусский",
+ "sr": "Белоруски",
+ "sv": "vitryska",
+ "ta": "பைலோருஷ்ன்",
+ "th": "บายโลรัสเซีย",
+ "tr": "Beyaz Rusça",
+ "uk": "Білоруська",
+ "vi": "Tiếng Bê-la-rút",
+ "zh": "白俄罗斯文"
+ },
+ {
+ "type": "language",
+ "iso": "bg",
+ "name": "Български",
+ "countries": [
+ {
+ "_reference": "BG"
+ }
+ ],
+ "am": "ቡልጋሪኛ",
+ "ar": "البلغارية",
+ "bg": "Български",
+ "ca": "búlgar",
+ "cs": "Bulharština",
+ "da": "bulgarsk",
+ "de": "Bulgarisch",
+ "el": "Βουλγαρικά",
+ "en": "Bulgarian",
+ "es": "búlgaro",
+ "et": "Bulgaaria",
+ "fi": "bulgaria",
+ "fr": "bulgare",
+ "ga": "Bulgáiris",
+ "he": "בולגרית",
+ "hi": "बल्गेरियन्",
+ "hr": "bugarski",
+ "hu": "bolgár",
+ "id": "Bulgaria",
+ "is": "Búlgarska",
+ "it": "bulgaro",
+ "ja": "ブルガリア語",
+ "km": "ភាសាប៊ុលហ្ការី",
+ "ko": "불가리아어",
+ "lt": "Bulgarų",
+ "lv": "bulgāru",
+ "mr": "बल्गेरियन",
+ "mt": "Bulgaru",
+ "nb": "bulgarsk",
+ "nl": "Bulgaars",
+ "nn": "bulgarsk",
+ "pl": "bułgarski",
+ "pt": "búlgaro",
+ "ro": "Bulgară",
+ "ru": "болгарский",
+ "sk": "bulharský",
+ "sl": "Bolgarščina",
+ "sr": "Бугарски",
+ "sv": "bulgariska",
+ "ta": "பல்கேரியன்",
+ "th": "บัลแกเรีย",
+ "tr": "Bulgarca",
+ "uk": "Болгарська",
+ "vi": "Tiếng Bun-ga-ri",
+ "zh": "保加利亚文"
+ },
+ {
+ "type": "language",
+ "iso": "bn",
+ "name": "বাংলা",
+ "countries": [
+ {
+ "_reference": "BD"
+ },
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "በንጋሊኛ",
+ "ar": "البنغالية",
+ "bg": "Бенгалски",
+ "bn": "বাংলা",
+ "ca": "bengalí",
+ "cs": "Bengálština",
+ "da": "bengalsk",
+ "de": "Bengalisch",
+ "el": "Μπενγκάλι",
+ "en": "Bengali",
+ "es": "bengalí",
+ "fi": "bengali",
+ "fr": "bengali",
+ "ga": "Beangálais",
+ "he": "בנגלית",
+ "hi": "बँगाली",
+ "hu": "bengáli",
+ "id": "Bengal",
+ "is": "Bengalska",
+ "it": "bengalese",
+ "ja": "ベンガル語",
+ "km": "ភាសាបេន្កាលី",
+ "ko": "벵골어",
+ "lt": "Bengalų",
+ "mr": "बंगाली",
+ "mt": "Bengali",
+ "nb": "bengali",
+ "nl": "Bengalees",
+ "nn": "bengali",
+ "pl": "bengalski",
+ "pt": "bengali",
+ "ru": "бенгальский",
+ "sv": "bengali",
+ "ta": "வங்காளம்",
+ "tr": "Bengal Dili",
+ "uk": "Бенгальська",
+ "zh": "孟加拉文"
+ },
+ {
+ "type": "language",
+ "iso": "ca",
+ "name": "català",
+ "countries": [
+ {
+ "_reference": "ES"
+ }
+ ],
+ "am": "ካታላንኛ",
+ "ar": "الكاتالوينية",
+ "bg": "Каталонски",
+ "ca": "català",
+ "cs": "Katalánština",
+ "da": "katalansk",
+ "de": "Katalanisch",
+ "el": "Καταλανικά",
+ "en": "Catalan",
+ "es": "catalán",
+ "fi": "katalaani",
+ "fr": "catalan",
+ "ga": "Catalóinis",
+ "he": "קטלונית",
+ "hi": "कातालान",
+ "hu": "katalán",
+ "id": "Catalan",
+ "is": "Katalónska",
+ "it": "catalano",
+ "ja": "カタロニア語",
+ "km": "ភាសាកាតាឡាន",
+ "ko": "카탈로니아어",
+ "mr": "कटलन",
+ "mt": "Katalan",
+ "nb": "katalansk",
+ "nl": "Catalaans",
+ "nn": "katalansk",
+ "pl": "kataloński",
+ "pt": "catalão",
+ "ru": "каталанский",
+ "sr": "Каталонски",
+ "sv": "katalanska",
+ "ta": "காடலான்",
+ "th": "แคตาแลน",
+ "tr": "Katalan Dili",
+ "uk": "Каталонська",
+ "vi": "Tiếng Ca-ta-lăng",
+ "zh": "加泰罗尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "cs",
+ "name": "Čeština",
+ "countries": [
+ {
+ "_reference": "CZ"
+ }
+ ],
+ "am": "ቼክኛ",
+ "ar": "التشيكية",
+ "bg": "Чешки",
+ "ca": "txec",
+ "cs": "Čeština",
+ "da": "Tjekkisk",
+ "de": "Tschechisch",
+ "el": "Τσεχικά",
+ "en": "Czech",
+ "es": "checo",
+ "et": "Tiehhi",
+ "fi": "tšekki",
+ "fr": "tchèque",
+ "ga": "Seicis",
+ "he": "צ׳כית",
+ "hi": "चेक",
+ "hr": "češki",
+ "hu": "cseh",
+ "id": "Ceko",
+ "is": "Tékkneska",
+ "it": "ceco",
+ "ja": "チェコ語",
+ "km": "ភាសាឆេក",
+ "ko": "체코어",
+ "lt": "Čekų",
+ "lv": "čehu",
+ "mr": "ज़ेक",
+ "mt": "Ċek",
+ "nb": "tsjekkisk",
+ "nl": "Tsjechisch",
+ "nn": "tsjekkisk",
+ "pl": "czeski",
+ "pt": "tcheco",
+ "ro": "Cehă",
+ "ru": "чешский",
+ "sk": "český",
+ "sl": "Češčina",
+ "sr": "Чешки",
+ "sv": "tjeckiska",
+ "ta": "செக்",
+ "tr": "Çekçe",
+ "uk": "Чеська",
+ "vi": "Tiếng Séc",
+ "zh": "捷克文"
+ },
+ {
+ "type": "language",
+ "iso": "cy",
+ "name": "Cymraeg",
+ "countries": [
+ {
+ "_reference": "GB"
+ }
+ ],
+ "am": "ወልሽ",
+ "ar": "الولزية",
+ "bg": "Уелски",
+ "ca": "gal·lès",
+ "cs": "Velština",
+ "cy": "Cymraeg",
+ "da": "Walisisk",
+ "de": "Kymrisch",
+ "el": "Ουαλικά",
+ "en": "Welsh",
+ "es": "galés",
+ "fi": "kymri",
+ "fr": "gallois",
+ "ga": "Breatnais",
+ "he": "וולשית",
+ "hi": "वेल्श",
+ "hr": "velški",
+ "hu": "walesi",
+ "id": "Welsh",
+ "is": "Velska",
+ "it": "gallese",
+ "ja": "ウェールズ語",
+ "ko": "웨일스어",
+ "mr": "वेल्ष",
+ "mt": "Welx",
+ "nb": "walisisk",
+ "nl": "Welsh",
+ "nn": "walisisk",
+ "pl": "walijski",
+ "pt": "galês",
+ "ru": "валлийский",
+ "sv": "walesiska",
+ "ta": "வெல்ஷ்",
+ "th": "เวลส์",
+ "tr": "Gal Dili",
+ "uk": "Валлійська",
+ "zh": "威尔士文"
+ },
+ {
+ "type": "language",
+ "iso": "da",
+ "name": "Dansk",
+ "countries": [
+ {
+ "_reference": "DK"
+ }
+ ],
+ "am": "ዴኒሽ",
+ "ar": "الدانماركية",
+ "bg": "Датски",
+ "ca": "danès",
+ "cs": "Dánština",
+ "da": "Dansk",
+ "de": "Dänisch",
+ "el": "Δανικά",
+ "en": "Danish",
+ "es": "danés",
+ "et": "Taani",
+ "fi": "tanska",
+ "fr": "danois",
+ "ga": "Danmhairgis",
+ "he": "דנית",
+ "hi": "डैनीश",
+ "hr": "danski",
+ "hu": "dán",
+ "id": "Denmark",
+ "is": "Danska",
+ "it": "danese",
+ "ja": "デンマーク語",
+ "km": "ភាសាដាណឺម៉ាក",
+ "ko": "덴마크어",
+ "lt": "Danų",
+ "lv": "dāņu",
+ "mr": "डानिष",
+ "mt": "Daniż",
+ "nb": "dansk",
+ "nl": "Deens",
+ "nn": "dansk",
+ "pl": "duński",
+ "pt": "dinamarquês",
+ "ro": "Daneză",
+ "ru": "датский",
+ "sk": "dánsky",
+ "sl": "Danščina",
+ "sr": "Дански",
+ "sv": "danska",
+ "ta": "டானிஷ்",
+ "th": "เดนมาร์ก",
+ "tr": "Danca",
+ "uk": "Датська",
+ "vi": "Tiếng Đan Mạch",
+ "zh": "丹麦文"
+ },
+ {
+ "type": "language",
+ "iso": "de",
+ "name": "Deutsch",
+ "countries": [
+ {
+ "_reference": "AT"
+ },
+ {
+ "_reference": "BE"
+ },
+ {
+ "_reference": "CH"
+ },
+ {
+ "_reference": "DE"
+ },
+ {
+ "_reference": "LI"
+ },
+ {
+ "_reference": "LU"
+ }
+ ],
+ "am": "ጀርመን",
+ "ar": "الألمانية",
+ "be": "нямецкі",
+ "bg": "Немски",
+ "ca": "alemany",
+ "cs": "Němčina",
+ "cy": "Almaeneg",
+ "da": "Tysk",
+ "de": "Deutsch",
+ "el": "Γερμανικά",
+ "en": "German",
+ "es": "alemán",
+ "et": "Saksa",
+ "eu": "alemanera",
+ "fi": "saksa",
+ "fr": "allemand",
+ "ga": "Gearmáinis",
+ "he": "גרמנית",
+ "hi": "ज़र्मन",
+ "hr": "njemački",
+ "hu": "német",
+ "id": "Jerman",
+ "is": "Þýska",
+ "it": "tedesco",
+ "ja": "ドイツ語",
+ "ka": "გერმანული",
+ "km": "ភាសាអាល្លឺម៉ង់",
+ "ko": "독일어",
+ "ky": "немисче",
+ "lt": "Vokiečių",
+ "lv": "vācu",
+ "mk": "германски",
+ "mn": "герман",
+ "mr": "जर्मन",
+ "mt": "Ġermaniż",
+ "nb": "tysk",
+ "nl": "Duits",
+ "nn": "tysk",
+ "pl": "niemiecki",
+ "ps": "الماني",
+ "pt": "alemão",
+ "ro": "Germană",
+ "ru": "немецкий",
+ "sk": "nemecký",
+ "sl": "Nemščina",
+ "sq": "Gjermanisht",
+ "sr": "Немачки",
+ "sv": "tyska",
+ "sw": "kijerumani",
+ "ta": "ஜெர்மன்",
+ "te": "ఙర్మన్",
+ "th": "เยอรมัน",
+ "tr": "Almanca",
+ "uk": "Німецька",
+ "vi": "Tiếng Đức",
+ "zh": "德文"
+ },
+ {
+ "type": "language",
+ "iso": "dv",
+ "name": "ދިވެހިބަސް",
+ "countries": [
+ {
+ "_reference": "MV"
+ }
+ ],
+ "ar": "المالديفية",
+ "bg": "Дивехи",
+ "da": "Divehi",
+ "de": "Maledivisch",
+ "en": "Divehi",
+ "es": "divehi",
+ "fi": "divehi",
+ "fr": "maldivien",
+ "he": "דיבהי",
+ "id": "Divehi",
+ "is": "Dívehí",
+ "it": "divehi",
+ "ja": "ディベヒ語",
+ "ko": "디베히어",
+ "mt": "Diveħi",
+ "nb": "divehi",
+ "nl": "Divehi",
+ "nn": "divehi",
+ "pt": "divehi",
+ "sv": "divehi",
+ "th": "ดิเวฮิ",
+ "zh": "迪维希文"
+ },
+ {
+ "type": "language",
+ "iso": "dz",
+ "name": "རྫོང་ཁ",
+ "countries": [
+ {
+ "_reference": "BT"
+ }
+ ],
+ "am": "ድዞንግኻኛ",
+ "ar": "الزونخاية",
+ "ca": "bhutanès",
+ "cs": "Bhútánština",
+ "da": "Dzongkha",
+ "de": "Bhutanisch",
+ "en": "Dzongkha",
+ "fi": "dzongkha",
+ "fr": "dzongkha",
+ "hi": "भुटानी",
+ "hu": "butáni",
+ "id": "Dzongkha",
+ "is": "Dsongka",
+ "it": "dzongkha",
+ "ja": "ゾンカ語",
+ "km": "ភាសាប៊ូតាន",
+ "ko": "부탄어",
+ "mr": "भूटानी",
+ "mt": "Dżongka",
+ "nb": "dzongkha",
+ "nl": "Dzongkha",
+ "nn": "dzongkha",
+ "pt": "dzonga",
+ "ru": "дзонг-кэ",
+ "sv": "bhutanesiska",
+ "ta": "புடானி",
+ "th": "ดซองคา",
+ "tr": "Bhutan Dili",
+ "uk": "Дзонг-ке",
+ "zh": "不丹文"
+ },
+ {
+ "type": "language",
+ "iso": "el",
+ "name": "Ελληνικά",
+ "countries": [
+ {
+ "_reference": "CY"
+ },
+ {
+ "_reference": "GR"
+ }
+ ],
+ "am": "ግሪክኛ",
+ "ar": "اليونانية",
+ "bg": "Гръцки",
+ "ca": "grec",
+ "cs": "Řečtina",
+ "da": "Græsk",
+ "de": "Griechisch",
+ "el": "Ελληνικά",
+ "en": "Greek",
+ "es": "griego",
+ "et": "Kreeka",
+ "fi": "kreikka",
+ "fr": "grec",
+ "ga": "Gréigis",
+ "he": "יוונית",
+ "hi": "ग्रीक",
+ "hr": "grčki",
+ "hu": "görög",
+ "id": "Yunani",
+ "is": "Nýgríska (1453-)",
+ "it": "greco",
+ "ja": "ギリシャ語",
+ "km": "ភាសាក្រិច",
+ "ko": "그리스어",
+ "lt": "Graikų",
+ "lv": "grieķu",
+ "mr": "ग्रीक",
+ "mt": "Grieg",
+ "nb": "gresk",
+ "nl": "Grieks",
+ "nn": "gresk",
+ "pl": "grecki",
+ "ps": "یوناني",
+ "pt": "grego",
+ "ro": "Greacă",
+ "ru": "греческий",
+ "sk": "grécky",
+ "sl": "Grščina",
+ "sr": "Грчки",
+ "sv": "grekiska",
+ "ta": "கிரேக்கம்",
+ "th": "กรีก",
+ "tr": "Yunanca",
+ "uk": "Грецька",
+ "vi": "Tiếng Hy Lạp",
+ "zh": "希腊文"
+ },
+ {
+ "type": "language",
+ "iso": "en",
+ "name": "English",
+ "countries": [
+ {
+ "_reference": "AS"
+ },
+ {
+ "_reference": "AU"
+ },
+ {
+ "_reference": "BE"
+ },
+ {
+ "_reference": "BW"
+ },
+ {
+ "_reference": "BZ"
+ },
+ {
+ "_reference": "CA"
+ },
+ {
+ "_reference": "GB"
+ },
+ {
+ "_reference": "GU"
+ },
+ {
+ "_reference": "HK"
+ },
+ {
+ "_reference": "IE"
+ },
+ {
+ "_reference": "IN"
+ },
+ {
+ "_reference": "JM"
+ },
+ {
+ "_reference": "MH"
+ },
+ {
+ "_reference": "MP"
+ },
+ {
+ "_reference": "MT"
+ },
+ {
+ "_reference": "NA"
+ },
+ {
+ "_reference": "NZ"
+ },
+ {
+ "_reference": "PH"
+ },
+ {
+ "_reference": "PK"
+ },
+ {
+ "_reference": "SG"
+ },
+ {
+ "_reference": "TT"
+ },
+ {
+ "_reference": "UM"
+ },
+ {
+ "_reference": "US"
+ },
+ {
+ "_reference": "VI"
+ },
+ {
+ "_reference": "ZA"
+ },
+ {
+ "_reference": "ZW"
+ }
+ ],
+ "am": "እንግሊዝኛ",
+ "ar": "الانجليزية",
+ "be": "англійскі",
+ "bg": "Английски",
+ "ca": "anglès",
+ "cs": "Angličtina",
+ "cy": "Saesneg",
+ "da": "Engelsk",
+ "de": "Englisch",
+ "el": "Αγγλικά",
+ "en": "English",
+ "es": "inglés",
+ "et": "Inglise",
+ "eu": "ingelera",
+ "fi": "englanti",
+ "fr": "anglais",
+ "ga": "Béarla",
+ "he": "אנגלית",
+ "hi": "अंग्रेजी",
+ "hr": "engleski",
+ "hu": "angol",
+ "id": "Inggris",
+ "is": "Enska",
+ "it": "inglese",
+ "ja": "英語",
+ "ka": "ინგლისური",
+ "km": "ភាសាអង់គ្លេស",
+ "ko": "영어",
+ "ky": "англисче",
+ "lt": "Anglų",
+ "lv": "angļu",
+ "mk": "англиски",
+ "mn": "англи",
+ "mr": "इंग्रेजी",
+ "mt": "Ingliż",
+ "nb": "engelsk",
+ "nl": "Engels",
+ "nn": "engelsk",
+ "pl": "angielski",
+ "ps": "انګلیسي",
+ "pt": "inglês",
+ "ro": "Engleză",
+ "ru": "английский",
+ "sk": "anglický",
+ "sl": "Angleščina",
+ "sq": "Anglisht",
+ "sr": "Енглески",
+ "sv": "engelska",
+ "sw": "kiingereza",
+ "ta": "ஆங்கிலம்",
+ "te": "ఆంగ్లం",
+ "th": "อังกฤษ",
+ "tr": "İngilizce",
+ "uk": "Англійська",
+ "vi": "Tiếng Anh",
+ "zh": "英文"
+ },
+ {
+ "type": "language",
+ "iso": "es",
+ "name": "español",
+ "countries": [
+ {
+ "_reference": "AR"
+ },
+ {
+ "_reference": "BO"
+ },
+ {
+ "_reference": "CL"
+ },
+ {
+ "_reference": "CO"
+ },
+ {
+ "_reference": "CR"
+ },
+ {
+ "_reference": "DO"
+ },
+ {
+ "_reference": "EC"
+ },
+ {
+ "_reference": "ES"
+ },
+ {
+ "_reference": "GT"
+ },
+ {
+ "_reference": "HN"
+ },
+ {
+ "_reference": "MX"
+ },
+ {
+ "_reference": "NI"
+ },
+ {
+ "_reference": "PA"
+ },
+ {
+ "_reference": "PE"
+ },
+ {
+ "_reference": "PR"
+ },
+ {
+ "_reference": "PY"
+ },
+ {
+ "_reference": "SV"
+ },
+ {
+ "_reference": "US"
+ },
+ {
+ "_reference": "UY"
+ },
+ {
+ "_reference": "VE"
+ }
+ ],
+ "af": "Spaans",
+ "am": "ስፓኒሽ",
+ "ar": "الأسبانية",
+ "be": "іспанскі",
+ "bg": "Испански",
+ "ca": "espanyol",
+ "cs": "Španělština",
+ "cy": "Sbaeneg",
+ "da": "Spansk",
+ "de": "Spanisch",
+ "el": "Ισπανικά",
+ "en": "Spanish",
+ "es": "español",
+ "et": "Hispaania",
+ "eu": "espainiera",
+ "fi": "espanja",
+ "fr": "espagnol",
+ "ga": "Spáinnis",
+ "he": "ספרדית",
+ "hi": "स्पेनिश",
+ "hr": "španjolski",
+ "hu": "spanyol",
+ "id": "Spanyol",
+ "is": "Spænska",
+ "it": "spagnolo",
+ "ja": "スペイン語",
+ "ka": "ესპანური",
+ "km": "ភាសាអេស្ប៉ាញ",
+ "ko": "스페인어",
+ "ky": "испанча",
+ "lt": "Ispanų",
+ "lv": "spāņu",
+ "mk": "шпански",
+ "mn": "испани",
+ "mr": "स्पानिष",
+ "mt": "Spanjol",
+ "nb": "spansk",
+ "nl": "Spaans",
+ "nn": "spansk",
+ "pl": "hiszpański",
+ "pt": "espanhol",
+ "ro": "Spaniolă",
+ "ru": "испанский",
+ "sk": "španielsky",
+ "sl": "Španščina",
+ "sq": "Spanjisht",
+ "sr": "Шпански",
+ "sv": "spanska",
+ "sw": "kihispania",
+ "ta": "ஸ்பேனிஷ்",
+ "te": "స్పానిష్",
+ "th": "สเปน",
+ "tr": "İspanyolca",
+ "uk": "Іспанська",
+ "vi": "Tiếng Tây Ban Nha",
+ "zh": "西班牙文"
+ },
+ {
+ "type": "language",
+ "iso": "et",
+ "name": "Eesti",
+ "countries": [
+ {
+ "_reference": "EE"
+ }
+ ],
+ "am": "ኤስቶኒአን",
+ "ar": "الأستونية",
+ "bg": "Естонски",
+ "ca": "estonià",
+ "cs": "Estonština",
+ "da": "Estisk",
+ "de": "Estnisch",
+ "el": "Εσθονικά",
+ "en": "Estonian",
+ "es": "estonio",
+ "et": "Eesti",
+ "fi": "viro",
+ "fr": "estonien",
+ "ga": "Eastóinis",
+ "he": "אסטונית",
+ "hi": "ऐस्तोनियन्",
+ "hr": "estonijski",
+ "hu": "észt",
+ "id": "Estonian",
+ "is": "Eistneska",
+ "it": "estone",
+ "ja": "エストニア語",
+ "km": "ភាសាអេស្តូនី",
+ "ko": "에스토니아어",
+ "lt": "Estų",
+ "lv": "igauņu",
+ "mr": "इस्टोनियन्",
+ "mt": "Estonjan",
+ "nb": "estisk",
+ "nl": "Estlands",
+ "nn": "estisk",
+ "pl": "estoński",
+ "ps": "حبشي",
+ "pt": "estoniano",
+ "ro": "Estoniană",
+ "ru": "эстонский",
+ "sk": "estónsky",
+ "sl": "Estonščina",
+ "sr": "Естонски",
+ "sv": "estniska",
+ "ta": "எஸ்டோனியன்",
+ "th": "เอสโตเนีย",
+ "tr": "Estonya Dili",
+ "uk": "Естонська",
+ "vi": "Tiếng E-xtô-ni-a",
+ "zh": "爱沙尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "eu",
+ "name": "euskara",
+ "countries": [
+ {
+ "_reference": "ES"
+ }
+ ],
+ "am": "ባስክኛ",
+ "ar": "لغة الباسك",
+ "bg": "Баски",
+ "ca": "basc",
+ "cs": "Baskičtina",
+ "da": "baskisk",
+ "de": "Baskisch",
+ "el": "Βασκικά",
+ "en": "Basque",
+ "es": "vasco",
+ "eu": "euskara",
+ "fi": "baski",
+ "fr": "basque",
+ "ga": "Bascais",
+ "he": "בסקית",
+ "hi": "बास्क्",
+ "hu": "baszk",
+ "id": "Basque",
+ "is": "Baskneska",
+ "it": "basco",
+ "ja": "バスク語",
+ "km": "ភាសាបាស្កេ",
+ "ko": "바스크어",
+ "mr": "बास्क",
+ "mt": "Bask",
+ "nb": "baskisk",
+ "nl": "Baskisch",
+ "nn": "baskisk",
+ "pl": "baskijski",
+ "pt": "basco",
+ "ru": "баскский",
+ "sr": "Баскијски",
+ "sv": "baskiska",
+ "ta": "பஸ்க்",
+ "th": "แบสก์",
+ "tr": "Bask Dili",
+ "uk": "Басків",
+ "zh": "巴斯克文"
+ },
+ {
+ "type": "language",
+ "iso": "fa",
+ "name": "فارسی",
+ "countries": [
+ {
+ "_reference": "AF"
+ },
+ {
+ "_reference": "IR"
+ }
+ ],
+ "am": "ፐርሲያኛ",
+ "ar": "الفارسية",
+ "bg": "Персийски",
+ "ca": "persa",
+ "cs": "Perština",
+ "da": "Persisk",
+ "de": "Persisch",
+ "el": "Περσικά",
+ "en": "Persian",
+ "es": "farsi",
+ "fr": "persan",
+ "ga": "Peirsis",
+ "he": "פרסית",
+ "hi": "पर्शियन्",
+ "hr": "perzijski",
+ "hu": "perzsa",
+ "id": "Persia",
+ "is": "Persneska",
+ "it": "persiano",
+ "ja": "ペルシア語",
+ "ko": "이란어",
+ "mr": "पर्षियन्",
+ "mt": "Persjan",
+ "nb": "persisk",
+ "nl": "Perzisch",
+ "nn": "persisk",
+ "ps": "فارسي",
+ "pt": "persa",
+ "ru": "персидский",
+ "sr": "Персијски",
+ "sv": "persiska",
+ "ta": "பர்ஸியன்",
+ "th": "เปอร์เซีย",
+ "tr": "Farsça",
+ "uk": "Перська",
+ "vi": "Tiếng Ba Tư",
+ "zh": "波斯文"
+ },
+ {
+ "type": "language",
+ "iso": "fi",
+ "name": "suomi",
+ "countries": [
+ {
+ "_reference": "FI"
+ }
+ ],
+ "am": "ፊኒሽ",
+ "ar": "الفنلندية",
+ "bg": "Фински",
+ "ca": "finès",
+ "cs": "Finština",
+ "da": "Finsk",
+ "de": "Finnisch",
+ "el": "Φινλανδικά",
+ "en": "Finnish",
+ "es": "finés",
+ "et": "Soome",
+ "fi": "suomi",
+ "fr": "finnois",
+ "ga": "Fionnlainnis",
+ "he": "פינית",
+ "hi": "फिनिश",
+ "hr": "finski",
+ "hu": "finn",
+ "id": "Finlandia",
+ "is": "Finnska",
+ "it": "finlandese",
+ "ja": "フィンランド語",
+ "km": "ភាសាហ្វាំងឡង់",
+ "ko": "핀란드어",
+ "lt": "Suomių",
+ "lv": "somu",
+ "mr": "फिन्निष",
+ "mt": "Finlandiż",
+ "nb": "finsk",
+ "nl": "Fins",
+ "nn": "finsk",
+ "pl": "fiński",
+ "ps": "فینلنډي",
+ "pt": "finlandês",
+ "ro": "Finlandeză",
+ "ru": "финский",
+ "sk": "fínsky",
+ "sl": "Finščina",
+ "sr": "Фински",
+ "sv": "finska",
+ "ta": "பின்னிஷ்",
+ "th": "ฟิน",
+ "tr": "Fince",
+ "uk": "Фінська",
+ "vi": "Tiếng Phần Lan",
+ "zh": "芬兰文"
+ },
+ {
+ "type": "language",
+ "iso": "fo",
+ "name": "føroyskt",
+ "countries": [
+ {
+ "_reference": "FO"
+ }
+ ],
+ "am": "ፋሮኛ",
+ "ar": "الفارويز",
+ "ca": "feroès",
+ "cs": "Faerština",
+ "da": "Færøsk",
+ "de": "Färöisch",
+ "en": "Faroese",
+ "es": "feroés",
+ "fi": "fääri",
+ "fo": "føroyskt",
+ "fr": "féroïen",
+ "ga": "Faróis",
+ "he": "פארואזית",
+ "hi": "फिरोज़ी",
+ "hu": "feröeri",
+ "id": "Faro",
+ "is": "Færeyska",
+ "it": "faroese",
+ "ja": "フェロー語",
+ "ko": "페로스어",
+ "mr": "फेरोस्",
+ "mt": "Fawriż",
+ "nb": "færøysk",
+ "nl": "Faeröers",
+ "nn": "færøysk",
+ "pt": "feroês",
+ "ru": "фарерский",
+ "sv": "färöiska",
+ "ta": "பைரோஸி",
+ "th": "ฟาโรส",
+ "tr": "Faroe Dili",
+ "uk": "Фарерська",
+ "zh": "法罗文"
+ },
+ {
+ "type": "language",
+ "iso": "fr",
+ "name": "français",
+ "countries": [
+ {
+ "_reference": "BE"
+ },
+ {
+ "_reference": "CA"
+ },
+ {
+ "_reference": "CH"
+ },
+ {
+ "_reference": "FR"
+ },
+ {
+ "_reference": "LU"
+ },
+ {
+ "_reference": "MC"
+ }
+ ],
+ "am": "ፈረንሳይኛ",
+ "ar": "الفرنسية",
+ "be": "французскі",
+ "bg": "Френски",
+ "ca": "francès",
+ "cs": "Francouzština",
+ "cy": "Ffrangeg",
+ "da": "Fransk",
+ "de": "Französisch",
+ "el": "Γαλλικά",
+ "en": "French",
+ "es": "francés",
+ "et": "Prantsuse",
+ "eu": "frantsesera",
+ "fi": "ranska",
+ "fr": "français",
+ "ga": "Fraincis",
+ "he": "צרפתית",
+ "hi": "फ्रेंच",
+ "hr": "francuski",
+ "hu": "francia",
+ "id": "Perancis",
+ "is": "Franska",
+ "it": "francese",
+ "ja": "フランス語",
+ "ka": "ფრანგული",
+ "km": "ភាសាបារាំង",
+ "ko": "프랑스어",
+ "ky": "французча",
+ "lt": "Prancūzų",
+ "lv": "franču",
+ "mk": "француски",
+ "mn": "франц",
+ "mr": "फ्रेन्च",
+ "mt": "Franċiż",
+ "nb": "fransk",
+ "nl": "Frans",
+ "nn": "fransk",
+ "pl": "francuski",
+ "ps": "فرانسوي",
+ "pt": "francês",
+ "ro": "Franceză",
+ "ru": "французский",
+ "sk": "francúzsky",
+ "sl": "Francoščina",
+ "sq": "Frengjisht",
+ "sr": "Француски",
+ "sv": "franska",
+ "sw": "kifaransa",
+ "ta": "பிரெஞ்சு",
+ "te": "ఫ్రెంచ్",
+ "th": "ฝรั่งเศส",
+ "tr": "Fransızca",
+ "uk": "Французька",
+ "vi": "Tiếng Pháp",
+ "zh": "法文"
+ },
+ {
+ "type": "language",
+ "iso": "ga",
+ "name": "Gaeilge",
+ "countries": [
+ {
+ "_reference": "IE"
+ }
+ ],
+ "am": "አይሪሽ",
+ "ar": "الأيرلندية",
+ "bg": "Ирландски",
+ "ca": "irlandès",
+ "cs": "Irština",
+ "da": "Irsk",
+ "de": "Irisch",
+ "el": "Ιρλανδικά",
+ "en": "Irish",
+ "es": "irlandés",
+ "fi": "iiri",
+ "fr": "irlandais",
+ "ga": "Gaeilge",
+ "he": "אירית",
+ "hi": "आईरिश",
+ "hr": "irski",
+ "hu": "ír",
+ "id": "Irlandia",
+ "is": "Írska",
+ "it": "irlandese",
+ "ja": "アイルランド語",
+ "km": "ភាសាហ្កែលិគ",
+ "ko": "아일랜드어",
+ "mr": "ऐरिष",
+ "mt": "Irlandiż",
+ "nb": "irsk",
+ "nl": "Iers",
+ "nn": "irsk",
+ "pt": "irlandês",
+ "ru": "ирландский",
+ "sr": "Ирски",
+ "ta": "ஐரிஷ்",
+ "th": "ไอริช",
+ "tr": "İrlanda Dili",
+ "uk": "Ірландська",
+ "vi": "Tiếng Ai-len",
+ "zh": "爱尔兰文"
+ },
+ {
+ "type": "language",
+ "iso": "gl",
+ "name": "galego",
+ "countries": [
+ {
+ "_reference": "ES"
+ }
+ ],
+ "am": "ጋለጋኛ",
+ "ar": "الجاليكية",
+ "ca": "gallec",
+ "cs": "Haličština",
+ "da": "Galicisk",
+ "de": "Galizisch",
+ "en": "Galician",
+ "es": "gallego",
+ "fi": "galicia",
+ "fr": "galicien",
+ "gl": "galego",
+ "he": "גליציאנית",
+ "hi": "गैलिशियन्",
+ "hu": "galíciai",
+ "id": "Gallegan",
+ "is": "Gallegska",
+ "it": "galiziano",
+ "ja": "ガリシア語",
+ "km": "ភាសាហ្កាលីស៉ី",
+ "ko": "갈리시아어",
+ "mr": "गेलीशियन",
+ "mt": "Gallegjan",
+ "nb": "galicisk",
+ "nl": "Galicisch",
+ "nn": "galicisk",
+ "pt": "galego",
+ "ru": "галисийский",
+ "sv": "galiciska",
+ "ta": "கெலிஸியன்",
+ "th": "กะลีเชีย",
+ "tr": "Galiçya Dili",
+ "uk": "Галісійська",
+ "zh": "加利西亚文"
+ },
+ {
+ "type": "language",
+ "iso": "gu",
+ "name": "ગુજરાતી",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ጉጃርቲኛ",
+ "ar": "الغوجاراتية",
+ "bg": "Гуджарати",
+ "ca": "gujarati",
+ "cs": "Gujaratština",
+ "da": "Gujaratisk",
+ "de": "Gujarati",
+ "en": "Gujarati",
+ "es": "gujarati",
+ "fr": "goudjrati",
+ "ga": "Gúisearáitis",
+ "gu": "ગુજરાતી",
+ "he": "גוג'ראטית",
+ "hi": "गुज़राती",
+ "hu": "gudzsaráti",
+ "id": "Gujarati",
+ "is": "Gújaratí",
+ "it": "gujarati",
+ "ja": "グジャラート語",
+ "km": "ភាសាហ្កុយ៉ារាទី",
+ "ko": "구자라트어",
+ "mr": "गुजराती",
+ "mt": "Guġarati",
+ "nb": "gujarati",
+ "nl": "Gujarati",
+ "nn": "gujarati",
+ "pt": "guzerate",
+ "ru": "гуджарати",
+ "sv": "gujarati",
+ "ta": "குஜராத்தி",
+ "th": "กูจาราติ",
+ "tr": "Gujarati",
+ "uk": "Гуяраті",
+ "zh": "古加拉提文"
+ },
+ {
+ "type": "language",
+ "iso": "gv",
+ "name": "Gaelg",
+ "countries": [
+ {
+ "_reference": "GB"
+ }
+ ],
+ "ar": "المنكية",
+ "cs": "Manština",
+ "da": "Manx",
+ "de": "Manx",
+ "en": "Manx",
+ "es": "gaélico manés",
+ "fi": "manx",
+ "fr": "manx",
+ "ga": "Mannainis",
+ "gv": "Gaelg",
+ "id": "Manx",
+ "is": "Manx",
+ "it": "manx",
+ "ja": "マン島語",
+ "ko": "맹크스어",
+ "mt": "Manks",
+ "nb": "manx",
+ "nl": "Manx",
+ "nn": "manx",
+ "pt": "manx",
+ "ru": "мэнский",
+ "sv": "manx",
+ "th": "มานซ์",
+ "zh": "马恩岛文"
+ },
+ {
+ "type": "language",
+ "iso": "he",
+ "name": "עברית",
+ "countries": [
+ {
+ "_reference": "IL"
+ }
+ ],
+ "am": "ዕብራስጥ",
+ "ar": "العبرية",
+ "bg": "Иврит",
+ "ca": "hebreu",
+ "cs": "Hebrejština",
+ "da": "Hebraisk",
+ "de": "Hebräisch",
+ "el": "Εβραϊκά",
+ "en": "Hebrew",
+ "es": "hebreo",
+ "et": "Heebrea",
+ "fi": "heprea",
+ "fr": "hébreu",
+ "ga": "Eabhrais",
+ "he": "עברית",
+ "hi": "हिब्रीऊ",
+ "hr": "hebrejski",
+ "hu": "héber",
+ "id": "Ibrani",
+ "is": "Hebreska",
+ "it": "ebraico",
+ "ja": "ヘブライ語",
+ "km": "ភាសាហេប្រិ",
+ "ko": "히브리어",
+ "lt": "Hebrajų",
+ "lv": "ivrits",
+ "mr": "हेबृ",
+ "mt": "Ebrajk",
+ "nb": "hebraisk",
+ "nl": "Hebreeuws",
+ "nn": "hebraisk",
+ "pl": "hebrajski",
+ "ps": "عبري",
+ "pt": "hebraico",
+ "ro": "Ebraică",
+ "ru": "иврит",
+ "sk": "hebrejský",
+ "sl": "Hebrejščina",
+ "sr": "Хебрејски",
+ "sv": "hebreiska",
+ "ta": "ஹுப்ரு",
+ "th": "ฮิบรู",
+ "tr": "İbranice",
+ "uk": "Іврит",
+ "vi": "Tiếng Hê-brơ",
+ "zh": "希伯来文"
+ },
+ {
+ "type": "language",
+ "iso": "hi",
+ "name": "हिंदी",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ሐንድኛ",
+ "ar": "الهندية",
+ "be": "хіндзі",
+ "bg": "Хинди",
+ "ca": "hindi",
+ "cs": "Hindština",
+ "cy": "Hindi",
+ "da": "Hindi",
+ "de": "Hindi",
+ "el": "Χίντι",
+ "en": "Hindi",
+ "es": "hindi",
+ "fi": "hindi",
+ "fr": "hindi",
+ "ga": "Hiondúis",
+ "he": "הינדית",
+ "hi": "हिंदी",
+ "hu": "hindi",
+ "id": "Hindi",
+ "is": "Hindí",
+ "it": "hindi",
+ "ja": "ヒンディー語",
+ "km": "ភាសាហ៉ិនឌី",
+ "ko": "힌디어",
+ "lt": "Hindi",
+ "mr": "हिन्दी",
+ "mt": "Ħindi",
+ "nb": "hindi",
+ "nl": "Hindi",
+ "nn": "hindi",
+ "pl": "hindi",
+ "ps": "هندي",
+ "pt": "hindi",
+ "ru": "хинди",
+ "sq": "Hindi",
+ "sr": "Хинди",
+ "sv": "hindi",
+ "ta": "இந்தி",
+ "te": "హిందీ",
+ "th": "ฮินดี",
+ "tr": "Hint Dili",
+ "uk": "Гінді",
+ "vi": "Tiếng Hin-đi",
+ "zh": "印地文"
+ },
+ {
+ "type": "language",
+ "iso": "hr",
+ "name": "hrvatski",
+ "countries": [
+ {
+ "_reference": "HR"
+ }
+ ],
+ "am": "ክሮሽያንኛ",
+ "ar": "الكرواتية",
+ "bg": "Хърватски",
+ "ca": "croat",
+ "cs": "Chorvatština",
+ "da": "Kroatisk",
+ "de": "Kroatisch",
+ "el": "Κροατικά",
+ "en": "Croatian",
+ "es": "croata",
+ "et": "Horvaadi",
+ "fi": "kroatia",
+ "fr": "croate",
+ "ga": "Cróitis",
+ "he": "קרואטית",
+ "hi": "क्रोएशन्",
+ "hr": "hrvatski",
+ "hu": "horvát",
+ "id": "Kroasia",
+ "is": "Króatíska",
+ "it": "croato",
+ "ja": "クロアチア語",
+ "ko": "크로아티아어",
+ "lt": "Kroatų",
+ "lv": "horvātu",
+ "mr": "क्रोयेषियन्",
+ "mt": "Kroat",
+ "nb": "kroatisk",
+ "nl": "Kroatisch",
+ "nn": "kroatisk",
+ "pl": "chorwacki",
+ "pt": "croata",
+ "ro": "Croată",
+ "ru": "хорватский",
+ "sk": "chorvátsky",
+ "sl": "Hrvaščina",
+ "sr": "Хрватски",
+ "sv": "kroatiska",
+ "ta": "கரோஷியன்",
+ "th": "โครเอเทีย",
+ "tr": "Hırvatça",
+ "uk": "Хорватська",
+ "vi": "Tiếng Crô-a-ti-a",
+ "zh": "克罗地亚文"
+ },
+ {
+ "type": "language",
+ "iso": "hu",
+ "name": "magyar",
+ "countries": [
+ {
+ "_reference": "HU"
+ }
+ ],
+ "am": "ሀንጋሪኛ",
+ "ar": "الهنغارية",
+ "bg": "Унгарски",
+ "ca": "hongarès",
+ "cs": "Maďarština",
+ "da": "Ungarsk",
+ "de": "Ungarisch",
+ "el": "Ουγγρικά",
+ "en": "Hungarian",
+ "es": "húngaro",
+ "et": "Ungari",
+ "fi": "unkari",
+ "fr": "hongrois",
+ "ga": "Ungáiris",
+ "he": "הונגרית",
+ "hi": "हंगेरी",
+ "hr": "mađarski",
+ "hu": "magyar",
+ "id": "Hungaria",
+ "is": "Ungverska",
+ "it": "ungherese",
+ "ja": "ハンガリー語",
+ "km": "ភាសាហុងគ្រី",
+ "ko": "헝가리어",
+ "lt": "Vengrų",
+ "lv": "ungāru",
+ "mr": "हंगेरियन्",
+ "mt": "Ungeriż",
+ "nb": "ungarsk",
+ "nl": "Hongaars",
+ "nn": "ungarsk",
+ "pl": "węgierski",
+ "pt": "húngaro",
+ "ro": "Maghiară",
+ "ru": "венгерский",
+ "sk": "maďarský",
+ "sl": "Madžarščina",
+ "sr": "Мађарски",
+ "sv": "ungerska",
+ "ta": "ஹங்கேரியன்",
+ "th": "ฮังการี",
+ "tr": "Macarca",
+ "uk": "Угорська",
+ "vi": "Tiếng Hung-ga-ri",
+ "zh": "匈牙利文"
+ },
+ {
+ "type": "language",
+ "iso": "hy",
+ "name": "Հայերէն",
+ "countries": [
+ {
+ "_reference": "AM"
+ }
+ ],
+ "am": "አርመናዊ",
+ "ar": "الأرمينية",
+ "bg": "Арменски",
+ "ca": "armeni",
+ "cs": "Arménština",
+ "da": "armensk",
+ "de": "Armenisch",
+ "el": "Αρμενικά",
+ "en": "Armenian",
+ "es": "armenio",
+ "fi": "armenia",
+ "fr": "arménien",
+ "ga": "Airméinis",
+ "he": "ארמנית",
+ "hi": "अरमेनियन्",
+ "hr": "armenski",
+ "hu": "örmény",
+ "hy": "Հայերէն",
+ "id": "Armenia",
+ "is": "Armenska",
+ "it": "armeno",
+ "ja": "アルメニア語",
+ "km": "ភាសាអារមេនី",
+ "ko": "아르메니아어",
+ "mr": "आर्मीनियन्",
+ "mt": "Armenjan",
+ "nb": "armensk",
+ "nl": "Armeens",
+ "nn": "armensk",
+ "ps": "ارمني",
+ "pt": "armênio",
+ "ru": "армянский",
+ "sr": "Арменски",
+ "sv": "armeniska",
+ "ta": "ஆர்மேனியன்",
+ "th": "อาร์มีเนีย",
+ "tr": "Ermenice",
+ "uk": "Вірменська",
+ "vi": "Tiếng Ác-mê-ni",
+ "zh": "亚美尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "id",
+ "name": "Bahasa Indonesia",
+ "countries": [
+ {
+ "_reference": "ID"
+ }
+ ],
+ "am": "እንዶኒሲኛ",
+ "ar": "الأندونيسية",
+ "bg": "Индонезийски",
+ "ca": "indonesi",
+ "cs": "Indonéština",
+ "da": "Indonesisk",
+ "de": "Indonesisch",
+ "el": "Ινδονησιακά",
+ "en": "Indonesian",
+ "es": "indonesio",
+ "fi": "indonesia",
+ "fr": "indonésien",
+ "ga": "Indinéisis",
+ "he": "אינדונזית",
+ "hi": "इन्डोनेशियन्",
+ "hu": "indonéz",
+ "id": "Bahasa Indonesia",
+ "is": "Indónesíska",
+ "it": "indonesiano",
+ "ja": "インドネシア語",
+ "km": "ភាសាឥណ្ឌូនេស៊ី",
+ "ko": "인도네시아어",
+ "mr": "इन्डोनेषियन",
+ "mt": "Indoneżjan",
+ "nb": "indonesisk",
+ "nl": "Indonesisch",
+ "nn": "indonesisk",
+ "pt": "indonésio",
+ "ru": "индонезийский",
+ "sr": "Индонезијски",
+ "sv": "indonesiska",
+ "ta": "இந்தோனேஷியன்",
+ "th": "อินโดนีเชีย",
+ "tr": "Endonezya Dili",
+ "uk": "Індонезійська",
+ "vi": "Tiếng In-đô-nê-xia",
+ "zh": "印度尼西亚文"
+ },
+ {
+ "type": "language",
+ "iso": "is",
+ "name": "Íslenska",
+ "countries": [
+ {
+ "_reference": "IS"
+ }
+ ],
+ "am": "አይስላንድኛ",
+ "ar": "الأيسلاندية",
+ "bg": "Исландски",
+ "ca": "islandès",
+ "cs": "Islandština",
+ "da": "Islandsk",
+ "de": "Isländisch",
+ "el": "Ισλανδικά",
+ "en": "Icelandic",
+ "es": "islandés",
+ "fi": "islanti",
+ "fr": "islandais",
+ "ga": "Íoslainnais",
+ "he": "איסלנדית",
+ "hi": "आईस्लैंडिक्",
+ "hr": "islandski",
+ "hu": "izlandi",
+ "id": "Icelandic",
+ "is": "Íslenska",
+ "it": "islandese",
+ "ja": "アイスランド語",
+ "km": "ភាសាអ៉ីស្លង់",
+ "ko": "아이슬란드어",
+ "mr": "आईसलान्डिक",
+ "mt": "Iżlandiż",
+ "nb": "islandsk",
+ "nl": "IJslands",
+ "nn": "islandsk",
+ "pt": "islandês",
+ "ru": "исландский",
+ "sr": "Исландски",
+ "sv": "isländska",
+ "ta": "ஐஸ்லென்டிக்",
+ "th": "ไอซ์แลนด์ดิค",
+ "tr": "İzlandaca",
+ "uk": "Ісландська",
+ "vi": "Tiếng Ai-xơ-len",
+ "zh": "冰岛文"
+ },
+ {
+ "type": "language",
+ "iso": "it",
+ "name": "italiano",
+ "countries": [
+ {
+ "_reference": "CH"
+ },
+ {
+ "_reference": "IT"
+ }
+ ],
+ "am": "ጣሊያንኛ",
+ "ar": "الايطالية",
+ "be": "італьянскі",
+ "bg": "Италиански",
+ "ca": "italià",
+ "cs": "Italština",
+ "cy": "Eidaleg",
+ "da": "Italiensk",
+ "de": "Italienisch",
+ "el": "Ιταλικά",
+ "en": "Italian",
+ "es": "italiano",
+ "et": "Itaalia",
+ "eu": "italiera",
+ "fi": "italia",
+ "fr": "italien",
+ "ga": "Iodáilis",
+ "he": "איטלקית",
+ "hi": "ईटालियन्",
+ "hr": "talijanski",
+ "hu": "olasz",
+ "id": "Italian",
+ "is": "Ítalska",
+ "it": "italiano",
+ "ja": "イタリア語",
+ "ka": "იტალიური",
+ "km": "ភាសាអ៊ីតាលី",
+ "ko": "이탈리아어",
+ "ky": "италиянча",
+ "lt": "Italų",
+ "lv": "itāliešu",
+ "mk": "италијански",
+ "mn": "итали",
+ "mr": "इटालियन",
+ "mt": "Taljan",
+ "nb": "italiensk",
+ "nl": "Italiaans",
+ "nn": "italiensk",
+ "pl": "włoski",
+ "ps": "ایټالوي",
+ "pt": "italiano",
+ "ro": "Italiană",
+ "ru": "итальянский",
+ "sk": "taliansky",
+ "sl": "Italijanščina",
+ "sq": "Italisht",
+ "sr": "Италијански",
+ "sv": "italienska",
+ "sw": "kiitaliano",
+ "ta": "இத்தாலியன்",
+ "te": "ఇటాలియన్ భాష",
+ "th": "อิตาลี",
+ "tr": "İtalyanca",
+ "uk": "Італійська",
+ "vi": "Tiếng Ý",
+ "zh": "意大利文"
+ },
+ {
+ "type": "language",
+ "iso": "ja",
+ "name": "日本語",
+ "countries": [
+ {
+ "_reference": "JP"
+ }
+ ],
+ "am": "ጃፓንኛ",
+ "ar": "اليابانية",
+ "be": "японскі",
+ "bg": "Японски",
+ "ca": "japonès",
+ "cs": "Japonština",
+ "cy": "Siapaneeg",
+ "da": "Japansk",
+ "de": "Japanisch",
+ "el": "Ιαπωνικά",
+ "en": "Japanese",
+ "es": "japonés",
+ "et": "Jaapani",
+ "eu": "japoniera",
+ "fi": "japani",
+ "fr": "japonais",
+ "ga": "Seapáinis",
+ "he": "יפנית",
+ "hi": "जापानी",
+ "hr": "japanski",
+ "hu": "japán",
+ "id": "Japanese",
+ "is": "Japanska",
+ "it": "giapponese",
+ "ja": "日本語",
+ "ka": "იაპონური",
+ "km": "ភាសាជប៉ុន",
+ "ko": "일본어",
+ "ky": "япончо",
+ "lt": "Japonų",
+ "lv": "japāņu",
+ "mk": "јапонски",
+ "mn": "япон",
+ "mr": "जापनीस्",
+ "mt": "Ġappuniż",
+ "nb": "japansk",
+ "nl": "Japans",
+ "nn": "japansk",
+ "pl": "japoński",
+ "ps": "جاپانی",
+ "pt": "japonês",
+ "ro": "Japoneză",
+ "ru": "японский",
+ "sk": "japonský",
+ "sl": "Japonščina",
+ "sq": "Japanisht",
+ "sr": "Јапански",
+ "sv": "japanska",
+ "sw": "kijapani",
+ "ta": "ஜப்பானீஸ்",
+ "te": "జపాను భాష",
+ "th": "ญี่ปุ่น",
+ "tr": "Japonca",
+ "uk": "Японська",
+ "vi": "Tiếng Nhật",
+ "zh": "日文"
+ },
+ {
+ "type": "language",
+ "iso": "ka",
+ "name": "ქართული",
+ "countries": [
+ {
+ "_reference": "GE"
+ }
+ ],
+ "am": "ጊዮርጊያን",
+ "ar": "الجورجية",
+ "bg": "Грузински",
+ "ca": "georgià",
+ "cs": "Gruzínština",
+ "da": "Georgisk",
+ "de": "Georgisch",
+ "el": "Γεωργιανά",
+ "en": "Georgian",
+ "es": "georgiano",
+ "fi": "georgia",
+ "fr": "géorgien",
+ "ga": "Seoirsis",
+ "he": "גרוזינית",
+ "hi": "जॉर्जीयन्",
+ "hu": "grúz",
+ "id": "Georgian",
+ "is": "Georgíska",
+ "it": "georgiano",
+ "ja": "グルジア語",
+ "ka": "ქართული",
+ "km": "ភាសាហ្សកហ្ស៉ី",
+ "ko": "그루지야어",
+ "mr": "जार्जियन्",
+ "mt": "Ġorġjan",
+ "nb": "georgisk",
+ "nl": "Georgisch",
+ "nn": "georgisk",
+ "pt": "georgiano",
+ "ru": "грузинский",
+ "sr": "Грузијски",
+ "sv": "georgiska",
+ "ta": "கன்னடம்",
+ "th": "จอร์เจียน",
+ "tr": "Gürcüce",
+ "uk": "Грузинська",
+ "zh": "格鲁吉亚文"
+ },
+ {
+ "type": "language",
+ "iso": "kk",
+ "name": "Қазақ",
+ "countries": [
+ {
+ "_reference": "KZ"
+ }
+ ],
+ "am": "ካዛክኛ",
+ "ar": "الكازاخستانية",
+ "bg": "Казахски",
+ "ca": "kazakh",
+ "cs": "Kazachština",
+ "da": "Kasakhisk",
+ "de": "Kasachisch",
+ "en": "Kazakh",
+ "es": "kazajo",
+ "fi": "kazakki",
+ "fr": "kazakh",
+ "ga": "Casachais",
+ "he": "קזחית",
+ "hi": "कज़ाख",
+ "hu": "kazah",
+ "id": "Kazakh",
+ "is": "Kasakska",
+ "it": "kazako",
+ "ja": "カザフ語",
+ "kk": "Қазақ",
+ "km": "ភាសាកាហ្សាក់ស្តង់់",
+ "ko": "카자흐어",
+ "mr": "कज़क",
+ "mt": "Każak",
+ "nb": "kasakhisk",
+ "nl": "Kazachs",
+ "nn": "kasakhisk",
+ "pt": "cazaque",
+ "ru": "казахский",
+ "sv": "kazakstanska",
+ "ta": "கசாக்",
+ "th": "คาซัค",
+ "tr": "Kazak Dili",
+ "uk": "Казахська",
+ "zh": "哈萨克文"
+ },
+ {
+ "type": "language",
+ "iso": "kl",
+ "name": "kalaallisut",
+ "countries": [
+ {
+ "_reference": "GL"
+ }
+ ],
+ "am": "ካላሊሱትኛ",
+ "ar": "الكالاليست",
+ "ca": "greenlandès",
+ "cs": "Grónština",
+ "da": "Kalaallisut",
+ "de": "Grönländisch",
+ "en": "Kalaallisut",
+ "es": "groenlandés",
+ "fi": "kalaallisut; grönlanti",
+ "fr": "groenlandais",
+ "hi": "ग्रीनलैंडिक",
+ "hu": "grönlandi",
+ "id": "Kalaallisut",
+ "is": "Grænlenska",
+ "it": "kalaallisut",
+ "ja": "グリーンランド語",
+ "kl": "kalaallisut",
+ "ko": "그린랜드어",
+ "mr": "ग्रीनलान्डिक",
+ "mt": "Kalallisut",
+ "nl": "Kalaallisut",
+ "nn": "kalaallisut; grønlandsk",
+ "pt": "groenlandês",
+ "ru": "эскимосский (гренландский)",
+ "sv": "grönländska",
+ "ta": "கிரின்லென்டிக்",
+ "th": "กรีนแลนด์ดิค",
+ "tr": "Grönland Dili",
+ "uk": "Калааллісут",
+ "zh": "格陵兰文"
+ },
+ {
+ "type": "language",
+ "iso": "km",
+ "name": "ភាសាខ្មែរ",
+ "countries": [
+ {
+ "_reference": "KH"
+ }
+ ],
+ "am": "ክመርኛ",
+ "ar": "الخميرية",
+ "bg": "Кхмерски",
+ "ca": "cambodjà",
+ "cs": "Kambodžština",
+ "da": "Khmer",
+ "de": "Kambodschanisch",
+ "en": "Khmer",
+ "es": "jemer",
+ "fi": "khmer",
+ "fr": "khmer",
+ "hi": "कैम्बोडियन्",
+ "hr": "kmerski",
+ "hu": "kambodzsai",
+ "id": "Khmer",
+ "is": "Kmer",
+ "it": "khmer",
+ "ja": "クメール語",
+ "km": "ភាសាខ្មែរ",
+ "ko": "캄보디아어",
+ "mr": "कंबोडियन",
+ "mt": "Kmer",
+ "nb": "khmer",
+ "nl": "Khmer",
+ "nn": "khmer",
+ "pt": "cmer",
+ "ru": "кхмерский",
+ "sr": "Кмерски",
+ "sv": "kambodjanska; khmeriska",
+ "ta": "கம்போடியன்",
+ "th": "เขมร",
+ "tr": "Kamboçya Dili",
+ "uk": "Кхмерська",
+ "vi": "Tiếng Campuchia",
+ "zh": "柬埔寨文"
+ },
+ {
+ "type": "language",
+ "iso": "kn",
+ "name": "ಕನ್ನಡ",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ካናዳኛ",
+ "ar": "الكانادا",
+ "ca": "kannada",
+ "cs": "Kannadština",
+ "da": "Kannaresisk",
+ "de": "Kannada",
+ "en": "Kannada",
+ "es": "canarés",
+ "fi": "kannada",
+ "fr": "kannada",
+ "ga": "Cannadais",
+ "hi": "कन्नड़",
+ "hu": "kannada",
+ "id": "Kannada",
+ "is": "Kannada",
+ "it": "kannada",
+ "ja": "カンナダ語",
+ "km": "ភាសាកិណាដា",
+ "kn": "ಕನ್ನಡ",
+ "ko": "카나다어",
+ "mr": "कन्नड",
+ "mt": "Kannada",
+ "nb": "kannada",
+ "nl": "Kannada",
+ "nn": "kannada",
+ "pt": "canarês",
+ "ru": "каннада",
+ "sv": "kanaresiska; kannada",
+ "ta": "கன்னடா",
+ "th": "กานาดา",
+ "tr": "Kannada",
+ "uk": "Каннада",
+ "vi": "Tiếng Kan-na-đa",
+ "zh": "埃纳德文"
+ },
+ {
+ "type": "language",
+ "iso": "ko",
+ "name": "한국어",
+ "countries": [
+ {
+ "_reference": "KR"
+ }
+ ],
+ "am": "ኮሪያኛ",
+ "ar": "الكورية",
+ "bg": "Корейски",
+ "ca": "coreà",
+ "cs": "Korejština",
+ "da": "Koreansk",
+ "de": "Koreanisch",
+ "el": "Κορεατικά",
+ "en": "Korean",
+ "es": "coreano",
+ "et": "Korea",
+ "fi": "korea",
+ "fr": "coréen",
+ "ga": "Cóiréis",
+ "he": "קוריאנית",
+ "hi": "कोरीयन्",
+ "hr": "korejski",
+ "hu": "koreai",
+ "id": "Korea",
+ "is": "Kóreska",
+ "it": "coreano",
+ "ja": "韓国語",
+ "km": "ភាសាកូរ៉េ",
+ "ko": "한국어",
+ "lt": "Korėjiečių",
+ "lv": "korejiešu",
+ "mr": "कोरियन्",
+ "mt": "Korejan",
+ "nb": "koreansk",
+ "nl": "Koreaans",
+ "nn": "koreansk",
+ "pl": "koreański",
+ "pt": "coreano",
+ "ro": "Coreeană",
+ "ru": "корейский",
+ "sk": "kórejský",
+ "sl": "Korejščina",
+ "sr": "Корејски",
+ "sv": "koreanska",
+ "ta": "கொரியன்",
+ "th": "เกาหลี",
+ "tr": "Korece",
+ "uk": "Корейська",
+ "vi": "Tiếng Hàn Quốc",
+ "zh": "韩文"
+ },
+ {
+ "type": "language",
+ "iso": "ku",
+ "name": "kurdî",
+ "countries": [
+ {
+ "_reference": "IQ"
+ },
+ {
+ "_reference": "IR"
+ },
+ {
+ "_reference": "SY"
+ },
+ {
+ "_reference": "TR"
+ }
+ ],
+ "am": "ኩርድሽኛ",
+ "ar": "الكردية",
+ "bg": "Кюрдски",
+ "ca": "kurd",
+ "cs": "Kurdština",
+ "da": "Kurdisk",
+ "de": "Kurdisch",
+ "en": "Kurdish",
+ "es": "kurdo",
+ "fi": "kurdi",
+ "fr": "kurde",
+ "he": "כורדית",
+ "hi": "कुरदीश",
+ "hu": "kurd",
+ "id": "Kurdi",
+ "is": "Kúrdneska",
+ "it": "curdo",
+ "ja": "クルド語",
+ "km": "ភាសាឃឺដ",
+ "ko": "크르드어",
+ "mr": "कुर्दिष",
+ "mt": "Kurdiż",
+ "nb": "kurdisk",
+ "nl": "Koerdisch",
+ "nn": "kurdisk",
+ "ps": "کردي",
+ "pt": "curdo",
+ "ru": "курдский",
+ "sr": "Курдски",
+ "sv": "kurdiska",
+ "ta": "குர்திஷ்",
+ "th": "เคิด",
+ "tr": "Kürtçe",
+ "uk": "Курдська",
+ "zh": "库尔德文"
+ },
+ {
+ "type": "language",
+ "iso": "kw",
+ "name": "kernewek",
+ "countries": [
+ {
+ "_reference": "GB"
+ }
+ ],
+ "ar": "الكورنية",
+ "da": "Cornisk",
+ "de": "Kornisch",
+ "en": "Cornish",
+ "es": "córnico",
+ "fi": "korni",
+ "fr": "cornique",
+ "ga": "Cornais",
+ "id": "Cornish",
+ "is": "Korníska",
+ "it": "cornico",
+ "ja": "コーンウォール語",
+ "ko": "콘월어",
+ "kw": "kernewek",
+ "mt": "Korniku",
+ "nb": "kornisk",
+ "nl": "Cornish",
+ "nn": "kornisk",
+ "pt": "córnico",
+ "ru": "корнийский",
+ "sv": "korniska",
+ "th": "คอร์นิส",
+ "zh": "凯尔特文"
+ },
+ {
+ "type": "language",
+ "iso": "ky",
+ "name": "Кыргыз",
+ "countries": [
+ {
+ "_reference": "KG"
+ }
+ ],
+ "am": "ኪርጊዝኛ",
+ "ar": "القيرغستانية",
+ "bg": "Киргизски",
+ "ca": "kirguís",
+ "cs": "Kirgizština",
+ "da": "Kirgisisk",
+ "de": "Kirgisisch",
+ "en": "Kirghiz",
+ "es": "kirghiz",
+ "fi": "kirgiisi",
+ "fr": "kirghize",
+ "ga": "Cirgeasais",
+ "hi": "किरघिज़",
+ "hu": "kirgiz",
+ "id": "Kirghiz",
+ "is": "Kirgiska",
+ "it": "kirghiso",
+ "ja": "キルギス語",
+ "km": "ភាសាគៀរហ្គីស្តង់",
+ "ko": "키르기스어",
+ "mr": "किर्गिज़",
+ "mt": "Kirgiż",
+ "nb": "kirgisisk",
+ "nl": "Kirgizisch",
+ "nn": "kirgisisk",
+ "pt": "quirguiz",
+ "ru": "киргизский",
+ "sr": "Киргиски",
+ "sv": "kirgisiska",
+ "ta": "கிர்கிஷ்",
+ "th": "เคอร์กิซ",
+ "tr": "Kırgızca",
+ "uk": "Киргизька",
+ "zh": "吉尔吉斯文"
+ },
+ {
+ "type": "language",
+ "iso": "ln",
+ "name": "lingála",
+ "countries": [
+ {
+ "_reference": "CD"
+ },
+ {
+ "_reference": "CG"
+ }
+ ],
+ "am": "ሊንጋላኛ",
+ "ar": "اللينجالا",
+ "ca": "lingala",
+ "cs": "Lingalština",
+ "da": "Lingala",
+ "de": "Lingala",
+ "en": "Lingala",
+ "es": "lingala",
+ "fi": "lingala",
+ "fr": "lingala",
+ "hi": "लिंगाला",
+ "hu": "lingala",
+ "id": "Lingala",
+ "is": "Lingala",
+ "it": "lingala",
+ "ja": "リンガラ語",
+ "ko": "링갈라어",
+ "mr": "लिंगाला",
+ "mt": "Lingaljan",
+ "nb": "lingala",
+ "nl": "Lingala",
+ "nn": "lingala",
+ "pt": "lingala",
+ "ru": "лингала",
+ "sv": "lingala",
+ "ta": "லிங்காலா",
+ "th": "ลิงกาลา",
+ "tr": "Lingala",
+ "uk": "Лінгала",
+ "zh": "林加拉文"
+ },
+ {
+ "type": "language",
+ "iso": "lo",
+ "name": "ລາວ",
+ "countries": [
+ {
+ "_reference": "LA"
+ }
+ ],
+ "am": "ላውስኛ",
+ "ar": "اللاوية",
+ "bg": "Лаоски",
+ "ca": "laosià",
+ "cs": "Laoština",
+ "da": "Lao",
+ "de": "Laotisch",
+ "en": "Lao",
+ "es": "laosiano",
+ "fi": "lao",
+ "fr": "lao",
+ "ga": "Laosais",
+ "hi": "लाओथीयन्",
+ "hu": "laoszi",
+ "id": "Lao",
+ "is": "Laó",
+ "it": "lao",
+ "ja": "ラオ語",
+ "km": "ភាសាឡាវ",
+ "ko": "라오어",
+ "mr": "लाओतियन्",
+ "mt": "Lao",
+ "nb": "laotisk",
+ "nl": "Lao",
+ "nn": "laotisk",
+ "pt": "laosiano",
+ "ru": "лаосский",
+ "sv": "laotiska",
+ "ta": "லோத்தியன்",
+ "th": "ลาว",
+ "tr": "Laos Dili",
+ "uk": "Лаоська",
+ "vi": "Tiếng Lào",
+ "zh": "老挝文"
+ },
+ {
+ "type": "language",
+ "iso": "lt",
+ "name": "Lietuvių",
+ "countries": [
+ {
+ "_reference": "LT"
+ }
+ ],
+ "am": "ሊቱአኒያን",
+ "ar": "اللتوانية",
+ "bg": "Литовски",
+ "ca": "lituà",
+ "cs": "Litevština",
+ "da": "Litauisk",
+ "de": "Litauisch",
+ "el": "Λιθουανικά",
+ "en": "Lithuanian",
+ "es": "lituano",
+ "et": "Leedu",
+ "fi": "liettua",
+ "fr": "lituanien",
+ "ga": "Liotuáinis",
+ "he": "ליטאית",
+ "hi": "लिथुनियन्",
+ "hr": "litvanski",
+ "hu": "litván",
+ "id": "Lithuania",
+ "is": "Litháíska",
+ "it": "lituano",
+ "ja": "リトアニア語",
+ "km": "ភាសាលីទុយអានី",
+ "ko": "리투아니아어",
+ "lt": "Lietuvių",
+ "lv": "lietuviešu",
+ "mr": "लिथुआनियन्",
+ "mt": "Litwanjan",
+ "nb": "litauisk",
+ "nl": "Litouws",
+ "nn": "litauisk",
+ "pl": "litewski",
+ "pt": "lituano",
+ "ro": "Lituaniană",
+ "ru": "литовский",
+ "sk": "litovský",
+ "sl": "Litovščina",
+ "sr": "Литвански",
+ "sv": "litauiska",
+ "ta": "லுத்தேனியன்",
+ "th": "ลิธัวเนีย",
+ "tr": "Litvanya Dili",
+ "uk": "Литовська",
+ "vi": "Tiếng Lít-va",
+ "zh": "立陶宛文"
+ },
+ {
+ "type": "language",
+ "iso": "lv",
+ "name": "latviešu",
+ "countries": [
+ {
+ "_reference": "LV"
+ }
+ ],
+ "am": "ላትቪያን",
+ "ar": "اللاتفية",
+ "bg": "Латвийски",
+ "ca": "letó",
+ "cs": "Lotyština",
+ "da": "Lettisk",
+ "de": "Lettisch",
+ "el": "Λετονικά",
+ "en": "Latvian",
+ "es": "letón",
+ "et": "Läti",
+ "fi": "latvia",
+ "fr": "letton",
+ "ga": "Laitvis",
+ "he": "לטבית",
+ "hi": "लाटवियन् (लेट्टीश)",
+ "hr": "latvijski",
+ "hu": "lett",
+ "id": "Latvian",
+ "is": "Lettneska",
+ "it": "lettone",
+ "ja": "ラトビア語",
+ "km": "ភាសាឡាតវីយ៉ា",
+ "ko": "라트비아어",
+ "lt": "Latvių",
+ "lv": "latviešu",
+ "mr": "लाट्वियन् (लेट्टिष)",
+ "mt": "Latvjan (Lettix)",
+ "nb": "latvisk",
+ "nl": "Letlands",
+ "nn": "latvisk",
+ "pl": "łotewski",
+ "pt": "letão",
+ "ro": "Letonă",
+ "ru": "латышский",
+ "sk": "lotyšský",
+ "sl": "Letonščina",
+ "sr": "Летонски",
+ "sv": "lettiska",
+ "ta": "லேட்வியன் (லேட்டிஷ்)",
+ "th": "แลตเวีย (เลททิสช์)",
+ "tr": "Letonya Dili",
+ "uk": "Латвійська",
+ "vi": "Tiếng Lát-vi-a",
+ "zh": "拉脫維亞文"
+ },
+ {
+ "type": "language",
+ "iso": "mk",
+ "name": "македонски",
+ "countries": [
+ {
+ "_reference": "MK"
+ }
+ ],
+ "am": "ማከዶኒኛ",
+ "ar": "المقدونية",
+ "bg": "Македонски",
+ "ca": "macedoni",
+ "cs": "Makedonština",
+ "da": "Makedonsk",
+ "de": "Mazedonisch",
+ "el": "Σλαβομακεδονικά",
+ "en": "Macedonian",
+ "es": "macedonio",
+ "fi": "makedonia",
+ "fr": "macédonien",
+ "ga": "Macadóinis",
+ "he": "מקדונית",
+ "hi": "मैसेडोनियन्",
+ "hr": "makedonski",
+ "hu": "macedón",
+ "id": "Macedonian",
+ "is": "Makedónska",
+ "it": "macedone",
+ "ja": "マケドニア語",
+ "km": "ភាសាម៉ាសេដូនី",
+ "ko": "마케도니아어",
+ "mk": "македонски",
+ "mr": "मसीडोनियन्",
+ "mt": "Maċedonjan",
+ "nb": "makedonsk",
+ "nl": "Macedonisch",
+ "nn": "makedonsk",
+ "ps": "مقدوني",
+ "pt": "macedônio",
+ "ru": "македонский",
+ "sr": "Македонски",
+ "sv": "makedonska",
+ "ta": "மெக்கடோனியன்",
+ "th": "แมซีโดเนีย",
+ "tr": "Makedonca",
+ "uk": "Македонська",
+ "vi": "Tiếng Ma-xê-đô-ni-a",
+ "zh": "马其顿文"
+ },
+ {
+ "type": "language",
+ "iso": "ml",
+ "name": "മലയാളം",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ማላያላምኛ",
+ "ar": "الماليالام",
+ "bg": "Малаялам",
+ "ca": "malaialam",
+ "cs": "Malabarština",
+ "da": "Malayalam",
+ "de": "Malayalam",
+ "en": "Malayalam",
+ "es": "malayalam",
+ "fi": "malajalam",
+ "fr": "malayalam",
+ "ga": "Mailéalaimis",
+ "hi": "मलयालम",
+ "hu": "malajalam",
+ "id": "Malayalam",
+ "is": "Malajalam",
+ "it": "malayalam",
+ "ja": "マラヤーラム語",
+ "km": "ភាសាម៉ាឡាឡាយ៉ាន",
+ "ko": "말라얄람어",
+ "mr": "मलियालम",
+ "mt": "Malajalam",
+ "nb": "malayalam",
+ "nl": "Malayalam",
+ "nn": "malayalam",
+ "pt": "malaiala",
+ "ru": "малаялам",
+ "sv": "malayalam",
+ "ta": "மலையாளம்",
+ "th": "มาลายาลัม",
+ "tr": "Malayalam",
+ "uk": "Малайялам",
+ "zh": "马来亚拉姆文"
+ },
+ {
+ "type": "language",
+ "iso": "mn",
+ "name": "Монгол хэл",
+ "countries": [
+ {
+ "_reference": "MN"
+ }
+ ],
+ "am": "ሞንጎላዊኛ",
+ "ar": "المنغولية",
+ "bg": "Монголски",
+ "ca": "mongol",
+ "cs": "Mongolština",
+ "da": "Mongolsk",
+ "de": "Mongolisch",
+ "el": "Μογγολικά",
+ "en": "Mongolian",
+ "es": "mongol",
+ "fi": "mongoli",
+ "fr": "mongol",
+ "ga": "Mongóilis",
+ "he": "מונגולית",
+ "hi": "मोंगोलियन",
+ "hr": "mongolski",
+ "hu": "mongol",
+ "id": "Mongolian",
+ "is": "Mongólska",
+ "it": "mongolo",
+ "ja": "モンゴル語",
+ "km": "ភាសាម៉ុងហ្គោលី",
+ "ko": "몽골어",
+ "mr": "मंगोलियन्",
+ "mt": "Mongoljan",
+ "nb": "mongolsk",
+ "nl": "Mongools",
+ "nn": "mongolsk",
+ "ps": "مغولي",
+ "pt": "mongol",
+ "ru": "монгольский",
+ "sr": "Монголски",
+ "sv": "mongoliska",
+ "ta": "மங்கோலியன்",
+ "th": "มองโกล",
+ "tr": "Moğol Dili",
+ "uk": "Монгольська",
+ "vi": "Tiếng Mông Cổ",
+ "zh": "蒙古文"
+ },
+ {
+ "type": "language",
+ "iso": "mr",
+ "name": "मराठी",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ማራዚኛ",
+ "ar": "الماراثى",
+ "ca": "marathi",
+ "cs": "Marathi",
+ "da": "Marathisk",
+ "de": "Marathi",
+ "en": "Marathi",
+ "es": "marathi",
+ "fi": "marathi",
+ "fr": "marathe",
+ "ga": "Maraitis",
+ "he": "מארתית",
+ "hi": "मराठी",
+ "hu": "marati",
+ "id": "Marathi",
+ "is": "Maratí",
+ "it": "marathi",
+ "ja": "マラーティー語",
+ "km": "ភាសាម៉ារាធី",
+ "ko": "마라티어",
+ "mr": "मराठी",
+ "mt": "Marati",
+ "nb": "marathi",
+ "nl": "Marathi",
+ "nn": "marathi",
+ "pt": "marata",
+ "ru": "маратхи",
+ "sv": "marathi",
+ "ta": "மராத்தி",
+ "th": "มาราที",
+ "tr": "Marathi",
+ "uk": "Маратхі",
+ "zh": "马拉地文"
+ },
+ {
+ "type": "language",
+ "iso": "ms",
+ "name": "Bahasa Melayu",
+ "countries": [
+ {
+ "_reference": "BN"
+ },
+ {
+ "_reference": "MY"
+ }
+ ],
+ "am": "ማላይኛ",
+ "ar": "لغة الملايو",
+ "bg": "Малайски",
+ "ca": "malai",
+ "cs": "Malajština",
+ "da": "Malay",
+ "de": "Malaiisch",
+ "en": "Malay",
+ "es": "malayo",
+ "fi": "malaiji",
+ "fr": "malais",
+ "hi": "मलय",
+ "hu": "maláj",
+ "id": "Malay",
+ "is": "Malaíska",
+ "it": "malese",
+ "ja": "マレー語",
+ "km": "ភាសាម៉ាលេស៉ី",
+ "ko": "말레이어",
+ "mr": "मलय",
+ "ms": "Bahasa Melayu",
+ "mt": "Malajan",
+ "nb": "malayisk",
+ "nl": "Maleis",
+ "nn": "malayisk",
+ "ps": "ملایا",
+ "pt": "malaio",
+ "ru": "малайский",
+ "sv": "malajiska",
+ "ta": "மலாய்",
+ "th": "มลายู",
+ "tr": "Malay",
+ "uk": "Малайська",
+ "vi": "Tiếng Ma-lay-xi-a",
+ "zh": "马来文"
+ },
+ {
+ "type": "language",
+ "iso": "mt",
+ "name": "Malti",
+ "countries": [
+ {
+ "_reference": "MT"
+ }
+ ],
+ "am": "ማልቲስኛ",
+ "ar": "المالطية",
+ "bg": "Малтийски",
+ "ca": "maltès",
+ "cs": "Maltština",
+ "da": "Maltesisk",
+ "de": "Maltesisch",
+ "el": "Μαλτεζικά",
+ "en": "Maltese",
+ "es": "maltés",
+ "fi": "malta",
+ "fr": "maltais",
+ "ga": "Maltais",
+ "he": "מלטזית",
+ "hi": "मालटिस्",
+ "hr": "malteški",
+ "hu": "máltai",
+ "id": "Maltese",
+ "is": "Maltneska",
+ "it": "maltese",
+ "ja": "マルタ語",
+ "km": "ភាសាម៉ាល់តា",
+ "ko": "몰타어",
+ "mr": "मालतीस्",
+ "mt": "Malti",
+ "nb": "maltesisk",
+ "nl": "Maltees",
+ "nn": "maltesisk",
+ "pl": "maltański",
+ "pt": "maltês",
+ "ru": "мальтийский",
+ "sv": "maltesiska",
+ "ta": "மால்டிஸ்",
+ "th": "มอลตา",
+ "tr": "Malta Dili",
+ "uk": "Мальтійська",
+ "zh": "马耳他文"
+ },
+ {
+ "type": "language",
+ "iso": "nb",
+ "name": "bokmål",
+ "countries": [
+ {
+ "_reference": "NO"
+ }
+ ],
+ "ar": "البوكمالية النرويجية",
+ "da": "Norsk Bokmål",
+ "de": "Norwegisch Bokmål",
+ "en": "Norwegian Bokmål",
+ "es": "bokmal noruego",
+ "fi": "norja (bokmål)",
+ "fr": "bokmål norvégien",
+ "ga": "Ioruais Bokmål",
+ "he": "נורבגית שפת הספר (בוקמול)",
+ "id": "Norwegian Bokmål",
+ "is": "Norskt bókmál",
+ "ja": "ノルウェー語 (ブークモール)",
+ "ko": "보크말 노르웨이어",
+ "mt": "Bokmahal Norveġiż",
+ "nb": "bokmål",
+ "nl": "Noors - Bokmål",
+ "nn": "bokmål",
+ "pt": "bokmål norueguês",
+ "ru": "норвежский",
+ "sv": "norska (bokmål)",
+ "th": "นอร์เวย์บอกมอล",
+ "tr": "Norveç Kitap Dili",
+ "zh": "挪威博克马尔文"
+ },
+ {
+ "type": "language",
+ "iso": "nl",
+ "name": "Nederlands",
+ "countries": [
+ {
+ "_reference": "BE"
+ },
+ {
+ "_reference": "NL"
+ }
+ ],
+ "am": "ደች",
+ "ar": "الهولندية",
+ "bg": "Холандски",
+ "ca": "neerlandès",
+ "da": "Hollandsk",
+ "de": "Niederländisch",
+ "el": "Ολλανδικά",
+ "en": "Dutch",
+ "et": "Hollandi",
+ "fi": "hollanti",
+ "fr": "néerlandais",
+ "ga": "Ollainnais",
+ "he": "הולנדית",
+ "hi": "डच्",
+ "hr": "nizozemski",
+ "hu": "holland",
+ "id": "Belanda",
+ "is": "Hollenska",
+ "it": "olandese",
+ "ja": "オランダ語",
+ "km": "ភាសាហុល្លង់",
+ "ko": "네덜란드어",
+ "lt": "Olandų",
+ "lv": "holandiešu",
+ "mr": "डच",
+ "mt": "Olandiż",
+ "nb": "nederlandsk",
+ "nl": "Nederlands",
+ "nn": "nederlandsk",
+ "pl": "niderlandzki",
+ "pt": "holandês",
+ "ro": "Olandeză",
+ "ru": "голландский",
+ "sk": "holandský",
+ "sl": "Nizozemščina",
+ "sr": "Холандски",
+ "ta": "டச்சு",
+ "th": "ฮอลันดา",
+ "tr": "Hollanda Dili",
+ "uk": "Голландська",
+ "vi": "Tiếng Hà Lan",
+ "zh": "荷兰文"
+ },
+ {
+ "type": "language",
+ "iso": "nn",
+ "name": "nynorsk",
+ "countries": [
+ {
+ "_reference": "NO"
+ }
+ ],
+ "ar": "النينورسك النرويجي",
+ "da": "Nynorsk",
+ "de": "Norwegisch Nynorsk",
+ "en": "Norwegian Nynorsk",
+ "es": "nynorsk noruego",
+ "fi": "norja (nynorsk)",
+ "fr": "nynorsk norvégien",
+ "ga": "Ioruais Nynorsk",
+ "he": "נורבגית חדשה (נינורשק)",
+ "id": "Norwegian Nynorsk",
+ "is": "Nýnorska",
+ "it": "norvegese nynorsk",
+ "ja": "ノルウェー語 (ニーノシュク)",
+ "ko": "뉘노르스크 노르웨이어",
+ "mt": "Ninorsk Norveġiż",
+ "nb": "nynorsk",
+ "nl": "Noors - Nynorsk",
+ "nn": "nynorsk",
+ "pt": "nynorsk norueguês",
+ "ru": "новонорвежский",
+ "sv": "nynorska",
+ "th": "นอร์เวย์ไนนอรส์ก",
+ "tr": "Norveççe Nynorsk",
+ "zh": "挪威尼诺斯克文"
+ },
+ {
+ "type": "language",
+ "iso": "om",
+ "name": "Oromoo",
+ "countries": [
+ {
+ "_reference": "ET"
+ },
+ {
+ "_reference": "KE"
+ }
+ ],
+ "am": "ኦሮምኛ",
+ "ar": "الأورومو",
+ "ca": "oromo (afan)",
+ "cs": "Oromo (Afan)",
+ "da": "Oromo",
+ "de": "Oromo",
+ "en": "Oromo",
+ "es": "oromo",
+ "fi": "oromo",
+ "fr": "galla",
+ "hi": "ओरोमो (अफ़ान)",
+ "hu": "oromói",
+ "id": "Oromo",
+ "is": "Órómó",
+ "it": "oromo",
+ "ja": "オロモ語",
+ "ko": "오로모어 (아판)",
+ "mr": "ओरोमो (अफान)",
+ "mt": "Oromo (Afan)",
+ "nb": "oromo",
+ "nl": "Oromo",
+ "nn": "oromo",
+ "om": "Oromoo",
+ "pt": "oromo",
+ "ru": "оромо",
+ "sv": "oromo",
+ "ta": "ஒரோம (அபன்)",
+ "th": "โอโรโม (อาฟาน)",
+ "tr": "Oromo (Afan)",
+ "uk": "Оромо",
+ "zh": "阿曼文"
+ },
+ {
+ "type": "language",
+ "iso": "or",
+ "name": "ଓଡ଼ିଆ",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ኦሪያኛ",
+ "ar": "الأورييا",
+ "ca": "oriya",
+ "cs": "Oriya",
+ "da": "Oriya",
+ "de": "Orija",
+ "en": "Oriya",
+ "es": "oriya",
+ "fi": "orija",
+ "fr": "oriya",
+ "hi": "उड़िया",
+ "hu": "orija",
+ "id": "Oriya",
+ "is": "Óría",
+ "it": "oriya",
+ "ja": "オリヤー語",
+ "km": "ភាសាអូរីយ៉ា",
+ "ko": "오리야어",
+ "mr": "ओरिया",
+ "mt": "Orija",
+ "nb": "oriya",
+ "nl": "Oriya",
+ "nn": "oriya",
+ "pt": "oriya",
+ "ru": "ория",
+ "sv": "oriya",
+ "ta": "ஒரியா",
+ "th": "โอริยา",
+ "tr": "Oriya",
+ "uk": "Орія",
+ "zh": "欧里亚文"
+ },
+ {
+ "type": "language",
+ "iso": "pa",
+ "name": "ਪੰਜਾਬੀ",
+ "countries": [
+ {
+ "_reference": "IN"
+ },
+ {
+ "_reference": "PK"
+ }
+ ],
+ "am": "ፓንጃቢኛ",
+ "ar": "البنجابية",
+ "bg": "Пенджабски",
+ "ca": "panjabi",
+ "cs": "Paňdžábština",
+ "da": "Punjabi",
+ "de": "Pandschabisch",
+ "en": "Punjabi",
+ "es": "punjabí",
+ "fi": "pandžabi",
+ "fr": "pendjabi",
+ "ga": "Puinseaibis",
+ "hi": "पंजाबी",
+ "hu": "pandzsábi",
+ "id": "Punjabi",
+ "is": "Púnjabí",
+ "it": "punjabi",
+ "ja": "パンジャブ語",
+ "km": "ភាសាពូនយ៉ាប៊ី",
+ "ko": "펀잡어",
+ "mr": "पंजाबी",
+ "mt": "Punġabi",
+ "nb": "panjabi",
+ "nl": "Punjabi",
+ "nn": "panjabi",
+ "pa": "ਪੰਜਾਬੀ",
+ "pt": "panjabi",
+ "ru": "панджаби (пенджаби)",
+ "sv": "punjabi",
+ "ta": "பஞ்சாபி",
+ "th": "ปัญจาป",
+ "tr": "Pencap Dili",
+ "uk": "Панджабі",
+ "zh": "旁遮普文"
+ },
+ {
+ "type": "language",
+ "iso": "pl",
+ "name": "polski",
+ "countries": [
+ {
+ "_reference": "PL"
+ }
+ ],
+ "am": "ፖሊሽ",
+ "ar": "البولندية",
+ "bg": "Полски",
+ "ca": "polonès",
+ "cs": "Polština",
+ "da": "Polsk",
+ "de": "Polnisch",
+ "el": "Πολωνικά",
+ "en": "Polish",
+ "es": "polaco",
+ "et": "Poola",
+ "fi": "puola",
+ "fr": "polonais",
+ "ga": "Polainnis",
+ "he": "פולנית",
+ "hi": "पॉलिश",
+ "hr": "poljski",
+ "hu": "lengyel",
+ "id": "Polish",
+ "is": "Pólska",
+ "it": "polacco",
+ "ja": "ポーランド語",
+ "km": "ភាសាប៉ូឡូញ",
+ "ko": "폴란드어",
+ "lt": "Lenkų",
+ "lv": "poļu",
+ "mr": "पोलिष",
+ "mt": "Pollakk",
+ "nb": "polsk",
+ "nl": "Pools",
+ "nn": "polsk",
+ "pl": "polski",
+ "ps": "پولنډي",
+ "pt": "polonês",
+ "ro": "Poloneză",
+ "ru": "польский",
+ "sk": "poľský",
+ "sl": "Poljščina",
+ "sr": "Пољски",
+ "sv": "polska",
+ "ta": "போலிஷ்",
+ "th": "โปแลนด์",
+ "tr": "Polonya Dili",
+ "uk": "Польська",
+ "vi": "Tiếng Ba Lan",
+ "zh": "波兰文"
+ },
+ {
+ "type": "language",
+ "iso": "ps",
+ "name": "پښتو",
+ "countries": [
+ {
+ "_reference": "AF"
+ }
+ ],
+ "am": "ፑሽቶኛ",
+ "ar": "البشتونية",
+ "bg": "Пущу",
+ "ca": "paixto",
+ "cs": "Pashto (Pushto)",
+ "da": "Pashto (Pushto)",
+ "de": "Afghanisch (Paschtu)",
+ "es": "pashto",
+ "fi": "paštu",
+ "fr": "pachto",
+ "ga": "Paisteo",
+ "he": "פאשטו",
+ "hi": "पॉशतो (पुशतो)",
+ "hu": "pastu (afgán)",
+ "id": "Pashto (Pushto)",
+ "is": "Pastú",
+ "it": "pashto",
+ "ja": "パシュトゥー語",
+ "ko": "파시토어 (푸시토)",
+ "mr": "पष्टो (पुष्टो)",
+ "mt": "Paxtun",
+ "nb": "pashto",
+ "nl": "Pashto",
+ "nn": "pashto",
+ "ps": "پښتو",
+ "pt": "pashto (pushto)",
+ "ru": "пашто (пушту)",
+ "sv": "pashto; afghanska",
+ "ta": "பேஷ்டோ (புஷ்டோ)",
+ "th": "พาสช์โต (พุสช์โต)",
+ "tr": "Peştun Dili",
+ "uk": "Пашто",
+ "zh": "普什图文"
+ },
+ {
+ "type": "language",
+ "iso": "pt",
+ "name": "português",
+ "countries": [
+ {
+ "_reference": "BR"
+ },
+ {
+ "_reference": "PT"
+ }
+ ],
+ "af": "Portugees",
+ "am": "ፖርቱጋሊኛ",
+ "ar": "البرتغالية",
+ "be": "партугальскі",
+ "bg": "Португалски",
+ "ca": "portuguès",
+ "cs": "Portugalština",
+ "cy": "Portiwgaleg",
+ "da": "Portugisisk",
+ "de": "Portugiesisch",
+ "el": "Πορτογαλικά",
+ "en": "Portuguese",
+ "es": "portugués",
+ "et": "Portugali",
+ "eu": "portugalera",
+ "fi": "portugali",
+ "fr": "portugais",
+ "ga": "Portaingéilis",
+ "he": "פורטוגזית",
+ "hi": "पुर्तुगी",
+ "hr": "portugalski",
+ "hu": "portugál",
+ "id": "Portugis",
+ "is": "Portúgalska",
+ "it": "portoghese",
+ "ja": "ポルトガル語",
+ "ka": "პორტუგალიური",
+ "km": "ភាសាព័រទុយហ្កាល់",
+ "ko": "포르투칼어",
+ "ky": "португалча",
+ "lt": "Portugalų",
+ "lv": "portugāļu",
+ "mk": "португалски",
+ "mn": "португали",
+ "mr": "पोर्चुगीस्",
+ "mt": "Portugiż",
+ "nb": "portugisisk",
+ "nl": "Portugees",
+ "nn": "portugisisk",
+ "pl": "portugalski",
+ "ps": "پورتګالي",
+ "pt": "português",
+ "ro": "Portugheză",
+ "ru": "португальский",
+ "sk": "portugalský",
+ "sl": "Portugalščina",
+ "sq": "Portugeze",
+ "sr": "Португалски",
+ "sv": "portugisiska",
+ "sw": "kireno",
+ "ta": "போர்த்துகீஸ்",
+ "te": "పొర్చుగల్ భాష",
+ "th": "โปรตุเกส",
+ "tr": "Portekizce",
+ "uk": "Португальська",
+ "vi": "Tiếng Bồ Đào Nha",
+ "zh": "葡萄牙文"
+ },
+ {
+ "type": "language",
+ "iso": "ro",
+ "name": "Română",
+ "countries": [
+ {
+ "_reference": "RO"
+ }
+ ],
+ "am": "ሮማኒያን",
+ "ar": "الرومانية",
+ "bg": "Румънски",
+ "ca": "romanès",
+ "cs": "Rumunština",
+ "da": "Rumænsk",
+ "de": "Rumänisch",
+ "el": "Ρουμανικά",
+ "en": "Romanian",
+ "es": "rumano",
+ "et": "Rumeenia",
+ "fi": "romania",
+ "fr": "roumain",
+ "ga": "Romáinis",
+ "he": "רומנית",
+ "hi": "रूमानीयन्",
+ "hr": "rumunjski",
+ "hu": "román",
+ "id": "Romanian",
+ "is": "Rúmenska",
+ "it": "rumeno",
+ "ja": "ルーマニア語",
+ "km": "ភាសារូម៉ានី",
+ "ko": "루마니아어",
+ "lt": "Rumunų",
+ "lv": "rumāņu",
+ "mr": "रोमानियन्",
+ "mt": "Rumen",
+ "nb": "rumensk",
+ "nl": "Roemeens",
+ "nn": "rumensk",
+ "pl": "rumuński",
+ "pt": "romeno",
+ "ro": "Română",
+ "ru": "румынский",
+ "sk": "rumunský",
+ "sl": "Romunščina",
+ "sr": "Румунски",
+ "sv": "rumänska",
+ "ta": "ரோமேனியன்",
+ "th": "โรมัน",
+ "tr": "Romence",
+ "uk": "Румунська",
+ "vi": "Tiếng Ru-ma-ni",
+ "zh": "罗马尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "ru",
+ "name": "русский",
+ "countries": [
+ {
+ "_reference": "RU"
+ },
+ {
+ "_reference": "UA"
+ }
+ ],
+ "af": "Russies",
+ "am": "ራሽኛ",
+ "ar": "الروسية",
+ "be": "рускі",
+ "bg": "Руски",
+ "ca": "rus",
+ "cs": "Ruština",
+ "cy": "Rwsieg",
+ "da": "Russisk",
+ "de": "Russisch",
+ "el": "Ρωσικά",
+ "en": "Russian",
+ "es": "ruso",
+ "et": "Vene",
+ "eu": "errusiera",
+ "fi": "venäjä",
+ "fr": "russe",
+ "ga": "Rúisis",
+ "he": "רוסית",
+ "hi": "रुसी",
+ "hr": "ruski",
+ "hu": "orosz",
+ "id": "Russian",
+ "is": "Rússneska",
+ "it": "russo",
+ "ja": "ロシア語",
+ "ka": "რუსული",
+ "km": "ភាសាรัរូស្ស៉ី",
+ "ko": "러시아어",
+ "ky": "орусча",
+ "lt": "Rusų",
+ "lv": "krievu",
+ "mk": "руски",
+ "mn": "орос",
+ "mr": "रष्यन्",
+ "mt": "Russu",
+ "nb": "russisk",
+ "nl": "Russisch",
+ "nn": "russisk",
+ "pl": "rosyjski",
+ "ps": "روسي",
+ "pt": "russo",
+ "ro": "Rusă",
+ "ru": "русский",
+ "sk": "ruský",
+ "sl": "Ruščina",
+ "sq": "Rusisht",
+ "sr": "Руски",
+ "sv": "ryska",
+ "sw": "kirusi",
+ "ta": "ரஷியன்",
+ "te": "రష్యన్ భాష",
+ "th": "รัสเซีย",
+ "tr": "Rusça",
+ "uk": "Російська",
+ "vi": "Tiếng Nga",
+ "zh": "俄文"
+ },
+ {
+ "type": "language",
+ "iso": "sa",
+ "name": "संस्कृत",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ሳንስክሪትኛ",
+ "ar": "السنسكريتية",
+ "bg": "Санкскритски",
+ "ca": "sànscrit",
+ "cs": "Sanskrt",
+ "da": "Sanskrit",
+ "de": "Sanskrit",
+ "en": "Sanskrit",
+ "es": "sánscrito",
+ "fi": "sanskrit",
+ "fr": "sanskrit",
+ "ga": "Sanscrait",
+ "he": "סנסקרית",
+ "hi": "संस्कृत",
+ "hu": "szanszkrit",
+ "id": "Sanskrit",
+ "is": "Sanskrít",
+ "it": "sanscrito",
+ "ja": "サンスクリット語",
+ "km": "ភាសាសំស្ក្រឹត",
+ "ko": "산스크리트어",
+ "mr": "संस्कृत",
+ "mt": "Sanskrit",
+ "nb": "sanskrit",
+ "nl": "Sanskrit",
+ "nn": "sanskrit",
+ "ps": "سنسکریټ",
+ "pt": "sânscrito",
+ "ru": "санскрит",
+ "sr": "Санскрит",
+ "sv": "sanskrit",
+ "ta": "சமஸ்கிருதம்",
+ "th": "สันสกฤต",
+ "tr": "Sanskritçe",
+ "uk": "Санскрит",
+ "vi": "Tiếng Phạn",
+ "zh": "梵文"
+ },
+ {
+ "type": "language",
+ "iso": "sk",
+ "name": "slovenský",
+ "countries": [
+ {
+ "_reference": "SK"
+ }
+ ],
+ "am": "ስሎቫክኛ",
+ "ar": "السلوفاكية",
+ "bg": "Словашки",
+ "ca": "eslovac",
+ "cs": "Slovenština",
+ "da": "Slovakisk",
+ "de": "Slowakisch",
+ "el": "Σλοβακικά",
+ "en": "Slovak",
+ "es": "eslovaco",
+ "et": "Slovaki",
+ "fi": "slovakki",
+ "fr": "slovaque",
+ "ga": "Slóvacais",
+ "he": "סלובקית",
+ "hi": "स्लोवाक्",
+ "hr": "slovački",
+ "hu": "szlovák",
+ "id": "Slovak",
+ "is": "Slóvakíska",
+ "it": "slovacco",
+ "ja": "スロバキア語",
+ "km": "ភាសាស្លូវ៉ាគី",
+ "ko": "슬로바키아어",
+ "lt": "Slovakų",
+ "lv": "slovāku",
+ "mr": "स्लोवाक",
+ "mt": "Slovakk",
+ "nb": "slovakisk",
+ "nl": "Slowaaks",
+ "nn": "slovakisk",
+ "pl": "słowacki",
+ "pt": "eslovaco",
+ "ro": "Slovacă",
+ "ru": "словацкий",
+ "sk": "slovenský",
+ "sl": "Slovaščina",
+ "sr": "Словачки",
+ "sv": "slovakiska",
+ "ta": "ஸ்லோவெக்",
+ "th": "สโลวัค",
+ "tr": "Slovakça",
+ "uk": "Словацька",
+ "vi": "Tiếng Xlô-vác",
+ "zh": "斯洛伐克文"
+ },
+ {
+ "type": "language",
+ "iso": "sl",
+ "name": "Slovenščina",
+ "countries": [
+ {
+ "_reference": "SI"
+ }
+ ],
+ "am": "ስሎቪኛ",
+ "ar": "السلوفانية",
+ "bg": "Словенски",
+ "ca": "eslovè",
+ "cs": "Slovinština",
+ "da": "Slovensk",
+ "de": "Slowenisch",
+ "el": "Σλοβενικά",
+ "en": "Slovenian",
+ "es": "esloveno",
+ "et": "Sloveeni",
+ "fi": "sloveeni",
+ "fr": "slovène",
+ "ga": "Slóvéinis",
+ "he": "סלובנית",
+ "hi": "स्लोवेनियन्",
+ "hr": "slovenski",
+ "hu": "szlovén",
+ "id": "Slovenian",
+ "is": "Slóvenska",
+ "it": "sloveno",
+ "ja": "スロベニア語",
+ "km": "ភាសាស្លូវ៉ានី",
+ "ko": "슬로베니아어",
+ "lt": "Slovėnų",
+ "lv": "slovēņu",
+ "mr": "स्लोवेनियन्",
+ "mt": "Sloven",
+ "nb": "slovensk",
+ "nl": "Sloveens",
+ "nn": "slovensk",
+ "pl": "słoweński",
+ "pt": "eslovênio",
+ "ro": "Slovenă",
+ "ru": "словенский",
+ "sk": "slovinský",
+ "sl": "Slovenščina",
+ "sr": "Словеначки",
+ "sv": "slovenska",
+ "ta": "ஸ்லோவினேயின்",
+ "th": "สโลเวเนีย",
+ "tr": "Slovence",
+ "uk": "Словенська",
+ "vi": "Tiếng Xlô-ven",
+ "zh": "斯洛文尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "so",
+ "name": "Soomaali",
+ "countries": [
+ {
+ "_reference": "DJ"
+ },
+ {
+ "_reference": "ET"
+ },
+ {
+ "_reference": "KE"
+ },
+ {
+ "_reference": "SO"
+ }
+ ],
+ "am": "ሱማልኛ",
+ "ar": "الصومالية",
+ "bg": "Сомалийски",
+ "ca": "somali",
+ "cs": "Somálština",
+ "da": "Somalisk",
+ "de": "Somali",
+ "en": "Somali",
+ "es": "somalí",
+ "fi": "somali",
+ "fr": "somali",
+ "ga": "Somálais",
+ "he": "סומלית",
+ "hi": "सोमाली",
+ "hu": "szomáli",
+ "id": "Somali",
+ "is": "Sómalska",
+ "it": "somalo",
+ "ja": "ソマリ語",
+ "km": "ភាសាសូម៉ាលី",
+ "ko": "소말리아어",
+ "mr": "सोमाली",
+ "mt": "Somali",
+ "nl": "Somalisch",
+ "nn": "somali",
+ "pt": "somali",
+ "ru": "сомали",
+ "so": "Soomaali",
+ "sv": "somaliska",
+ "ta": "சோமாலி",
+ "th": "โซมาลี",
+ "tr": "Somali Dili",
+ "uk": "Сомалі",
+ "vi": "Tiếng Xô-ma-li",
+ "zh": "索马里文"
+ },
+ {
+ "type": "language",
+ "iso": "sq",
+ "name": "shqipe",
+ "countries": [
+ {
+ "_reference": "AL"
+ }
+ ],
+ "am": "ልቤኒኛ",
+ "ar": "الألبانية",
+ "bg": "Албански",
+ "ca": "albanès",
+ "cs": "Albánština",
+ "da": "albansk",
+ "de": "Albanisch",
+ "el": "Αλβανικά",
+ "en": "Albanian",
+ "es": "albanés",
+ "fi": "albania",
+ "fr": "albanais",
+ "ga": "Albáinis",
+ "he": "אלבנית",
+ "hi": "अल्बेनियन्",
+ "hr": "albanski",
+ "hu": "albán",
+ "id": "Albanian",
+ "is": "Albanska",
+ "it": "albanese",
+ "ja": "アルバニア語",
+ "km": "ភាសាអាល់បានី",
+ "ko": "알바니아어",
+ "mr": "आल्बेनियन्",
+ "mt": "Albaniż",
+ "nb": "albansk",
+ "nl": "Albanees",
+ "nn": "albansk",
+ "pt": "albanês",
+ "ru": "албанский",
+ "sq": "shqipe",
+ "sr": "Албански",
+ "sv": "albanska",
+ "ta": "அல்பெனியன்",
+ "th": "แอลเบเนีย",
+ "tr": "Arnavutça",
+ "uk": "Албанська",
+ "vi": "Tiếng An-ba-ni",
+ "zh": "阿尔巴尼亚文"
+ },
+ {
+ "type": "language",
+ "iso": "sr",
+ "name": "Српски",
+ "countries": [
+ {
+ "_reference": "BA"
+ },
+ {
+ "_reference": "CS"
+ },
+ {
+ "_reference": "YU"
+ }
+ ],
+ "am": "ሰርቢኛ",
+ "ar": "الصربية",
+ "bg": "Сръбски",
+ "ca": "serbi",
+ "cs": "Srbština",
+ "da": "Serbisk",
+ "de": "Serbisch",
+ "el": "Σερβικά",
+ "en": "Serbian",
+ "es": "serbio",
+ "fi": "serbia",
+ "fr": "serbe",
+ "ga": "Seirbis",
+ "he": "סרבית",
+ "hi": "सर्बियन्",
+ "hr": "srpski",
+ "hu": "szerb",
+ "id": "Serbian",
+ "is": "Serbneska",
+ "it": "serbo",
+ "ja": "セルビア語",
+ "ko": "세르비아어",
+ "mr": "सेर्बियन्",
+ "mt": "Serb",
+ "nb": "serbisk",
+ "nl": "Servisch",
+ "nn": "serbisk",
+ "pt": "sérvio",
+ "ru": "сербский",
+ "sr": "Српски",
+ "sv": "serbiska",
+ "ta": "சர்பியன்",
+ "th": "เซอร์เบีย",
+ "tr": "Sırpça",
+ "uk": "Сербська",
+ "vi": "Tiếng Séc-bi",
+ "zh": "塞尔维亚文"
+ },
+ {
+ "type": "language",
+ "iso": "sv",
+ "name": "svenska",
+ "countries": [
+ {
+ "_reference": "FI"
+ },
+ {
+ "_reference": "SE"
+ }
+ ],
+ "am": "ስዊድንኛ",
+ "ar": "السويدية",
+ "bg": "Шведски",
+ "ca": "suec",
+ "cs": "Švédština",
+ "da": "Svensk",
+ "de": "Schwedisch",
+ "el": "Σουηδικά",
+ "en": "Swedish",
+ "es": "sueco",
+ "et": "Rootsi",
+ "fi": "ruotsi",
+ "fr": "suédois",
+ "ga": "Sualainnis",
+ "he": "שוודית",
+ "hi": "स्विडिश",
+ "hr": "švedski",
+ "hu": "svéd",
+ "id": "Swedia",
+ "is": "Sænska",
+ "it": "svedese",
+ "ja": "スウェーデン語",
+ "km": "ភាសាស៊ុយអែដ",
+ "ko": "스웨덴어",
+ "lt": "Švedų",
+ "lv": "zviedru",
+ "mr": "स्वीडिष",
+ "mt": "Svediż",
+ "nb": "svensk",
+ "nl": "Zweeds",
+ "nn": "svensk",
+ "pl": "szwedzki",
+ "ps": "سویډنی",
+ "pt": "sueco",
+ "ro": "Suedeză",
+ "ru": "шведский",
+ "sk": "švédsky",
+ "sl": "Švedščina",
+ "sr": "Шведски",
+ "sv": "svenska",
+ "ta": "ஷீவிடிஸ்",
+ "th": "สวีเดน",
+ "tr": "İsveççe",
+ "uk": "Шведська",
+ "vi": "Tiếng Thụy Điển",
+ "zh": "瑞典文"
+ },
+ {
+ "type": "language",
+ "iso": "sw",
+ "name": "Kiswahili",
+ "countries": [
+ {
+ "_reference": "KE"
+ },
+ {
+ "_reference": "TZ"
+ }
+ ],
+ "am": "ስዋሂሊኛ",
+ "ar": "السواحلية",
+ "bg": "Суахили",
+ "ca": "swahili",
+ "cs": "Svahilština",
+ "da": "Swahili",
+ "de": "Suaheli",
+ "en": "Swahili",
+ "es": "swahili",
+ "fi": "swahili",
+ "fr": "swahili",
+ "ga": "Svahaílis",
+ "he": "סווהילית",
+ "hi": "स्वाहिली",
+ "hu": "szuahéli",
+ "id": "Swahili",
+ "is": "Svahílí",
+ "it": "swahili",
+ "ja": "スワヒリ語",
+ "km": "ភាសាស្វាហ៉ីលី",
+ "ko": "스와힐리어",
+ "mr": "स्वाहिली",
+ "mt": "Swaħili",
+ "nb": "swahili",
+ "nl": "Swahili",
+ "nn": "swahili",
+ "pt": "suaíli",
+ "ru": "суахили",
+ "sr": "Свахили",
+ "sv": "swahili",
+ "sw": "Kiswahili",
+ "ta": "சுவாஹிலி",
+ "th": "ซวาฮิรี",
+ "tr": "Swahili",
+ "uk": "Суахілі",
+ "zh": "斯瓦希里文"
+ },
+ {
+ "type": "language",
+ "iso": "ta",
+ "name": "தமிழ்",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ታሚልኛ",
+ "ar": "التاميلية",
+ "bg": "Тамилски",
+ "ca": "tàmil",
+ "cs": "Tamilština",
+ "da": "Tamilsk",
+ "de": "Tamilisch",
+ "en": "Tamil",
+ "es": "tamil",
+ "fi": "tamil",
+ "fr": "tamoul",
+ "ga": "Tamailis",
+ "he": "טמילית",
+ "hi": "तमिल",
+ "hu": "tamil",
+ "id": "Tamil",
+ "is": "Tamílska",
+ "it": "tamil",
+ "ja": "タミール語",
+ "km": "ភាសាតាមីល",
+ "ko": "타밀어",
+ "mr": "तमिळ",
+ "mt": "Tamil",
+ "nb": "tamil",
+ "nl": "Tamil",
+ "nn": "tamil",
+ "pt": "tâmil",
+ "ru": "тамильский",
+ "sv": "tamil",
+ "ta": "தமிழ்",
+ "th": "ทมิฬ",
+ "tr": "Tamil",
+ "uk": "Тамільська",
+ "zh": "泰米尔文"
+ },
+ {
+ "type": "language",
+ "iso": "te",
+ "name": "తెలుగు",
+ "countries": [
+ {
+ "_reference": "IN"
+ }
+ ],
+ "am": "ተሉጉኛ",
+ "ar": "التيلجو",
+ "bg": "Телугу",
+ "ca": "telugu",
+ "cs": "Telugština",
+ "da": "Telugu",
+ "de": "Telugu",
+ "en": "Telugu",
+ "es": "telugu",
+ "fi": "telugu",
+ "fr": "télougou",
+ "hi": "तेलेगु",
+ "hu": "telugu",
+ "id": "Telugu",
+ "is": "Telúgú",
+ "it": "telugu",
+ "ja": "テルグ語",
+ "km": "ភាសាតេលូហ្គូ",
+ "ko": "텔루구어",
+ "mr": "तेलंगू",
+ "mt": "Telugu",
+ "nb": "telugu",
+ "nl": "Teloegoe",
+ "nn": "telugu",
+ "pt": "telugu",
+ "ru": "телугу",
+ "sv": "telugiska",
+ "ta": "தெலுங்கு",
+ "te": "తెలుగు",
+ "th": "ทิลูกู",
+ "tr": "Telugu",
+ "uk": "Телугу",
+ "zh": "泰卢固文"
+ },
+ {
+ "type": "language",
+ "iso": "th",
+ "name": "ไทย",
+ "countries": [
+ {
+ "_reference": "TH"
+ }
+ ],
+ "am": "ታይኛ",
+ "ar": "التايلاندية",
+ "bg": "Таи",
+ "ca": "thai",
+ "cs": "Thajština",
+ "da": "Thailandsk",
+ "de": "Thai",
+ "el": "Ταϊλανδικά",
+ "en": "Thai",
+ "es": "tailandés",
+ "fi": "thai",
+ "fr": "thaï",
+ "ga": "Téalainnis",
+ "he": "תאי",
+ "hi": "थाई",
+ "hu": "thai",
+ "id": "Thai",
+ "is": "Taílenska",
+ "it": "thai",
+ "ja": "タイ語",
+ "km": "ភាសាថៃ",
+ "ko": "태국어",
+ "lt": "Tajų",
+ "mr": "थाई",
+ "mt": "Tajlandiż",
+ "nb": "thai",
+ "nl": "Thai",
+ "nn": "thai",
+ "pl": "tajski",
+ "pt": "tailandês",
+ "ru": "тайский",
+ "sv": "thailändska",
+ "ta": "தாய்",
+ "th": "ไทย",
+ "tr": "Tay Dili",
+ "uk": "Тайська",
+ "vi": "Tiếng Thái",
+ "zh": "泰文"
+ },
+ {
+ "type": "language",
+ "iso": "tr",
+ "name": "Türkçe",
+ "countries": [
+ {
+ "_reference": "TR"
+ }
+ ],
+ "am": "ቱርክኛ",
+ "ar": "التركية",
+ "bg": "Турски",
+ "ca": "turc",
+ "cs": "Turečtina",
+ "da": "Tyrkisk",
+ "de": "Türkisch",
+ "el": "Τουρκικά",
+ "en": "Turkish",
+ "es": "turco",
+ "et": "Türgi",
+ "fa": "ترکی استانبولی",
+ "fi": "turkki",
+ "fr": "turc",
+ "ga": "Tuircis",
+ "he": "טורקית",
+ "hi": "तुक्रीश",
+ "hr": "turski",
+ "hu": "török",
+ "id": "Turkish",
+ "is": "Tyrkneska",
+ "it": "turco",
+ "ja": "トルコ語",
+ "km": "ភាសាទួរគី",
+ "ko": "터키어",
+ "lt": "Turkų",
+ "lv": "turku",
+ "mr": "तुर्किष",
+ "mt": "Tork",
+ "nb": "tyrkisk",
+ "nl": "Turks",
+ "nn": "tyrkisk",
+ "pl": "turecki",
+ "pt": "turco",
+ "ro": "Turcă",
+ "ru": "турецкий",
+ "sk": "turecký",
+ "sl": "Turščina",
+ "sr": "Турски",
+ "sv": "turkiska",
+ "ta": "டர்கிஷ்",
+ "th": "ตุรกี",
+ "tr": "Türkçe",
+ "uk": "Турецька",
+ "vi": "Tiếng Thổ Nhĩ Kỳ",
+ "zh": "土耳其文"
+ },
+ {
+ "type": "language",
+ "iso": "tt",
+ "name": "Татар",
+ "countries": [
+ {
+ "_reference": "RU"
+ }
+ ],
+ "am": "ታታርኛ",
+ "ar": "التتارية",
+ "bg": "Татарски",
+ "ca": "tàtar",
+ "cs": "Tatarština",
+ "da": "Tatarisk",
+ "de": "Tatarisch",
+ "en": "Tatar",
+ "fi": "tataari",
+ "fr": "tatar",
+ "ga": "Tatarais",
+ "hi": "टाटर",
+ "hu": "tatár",
+ "id": "Tatar",
+ "is": "Tatarska",
+ "it": "tatarico",
+ "ja": "タタール語",
+ "km": "ភាសាតាតារ",
+ "ko": "타타르어",
+ "mr": "टटार",
+ "mt": "Tatar",
+ "nb": "tatarisk",
+ "nl": "Tataars",
+ "nn": "tatarisk",
+ "ps": "تاتار",
+ "pt": "tatar",
+ "ru": "татарский",
+ "sv": "tatariska",
+ "ta": "டாடர்",
+ "th": "ตาด",
+ "tr": "Tatarca",
+ "uk": "Татарська",
+ "zh": "鞑靼文"
+ },
+ {
+ "type": "language",
+ "iso": "uk",
+ "name": "Українська",
+ "countries": [
+ {
+ "_reference": "UA"
+ }
+ ],
+ "am": "ዩክረኒኛ",
+ "ar": "الأوكرانية",
+ "bg": "Украински",
+ "ca": "ucraïnès",
+ "cs": "Ukrajinština",
+ "da": "Ukrainsk",
+ "de": "Ukrainisch",
+ "el": "Ουκρανικά",
+ "en": "Ukrainian",
+ "es": "ucraniano",
+ "fi": "ukraina",
+ "fr": "ukrainien",
+ "ga": "Úcráinis",
+ "he": "אוקראינית",
+ "hi": "यूक्रेनियन्",
+ "hr": "ukrajinski",
+ "hu": "ukrán",
+ "id": "Ukrainian",
+ "is": "Úkraínska",
+ "it": "ucraino",
+ "ja": "ウクライナ語",
+ "km": "ភាសាអ៊ុយក្រែន",
+ "ko": "우크라이나어",
+ "mr": "युक्रेनियन्",
+ "mt": "Ukranjan",
+ "nb": "ukrainsk",
+ "nl": "Oekraïens",
+ "nn": "ukrainsk",
+ "pt": "ucraniano",
+ "ru": "украинский",
+ "sr": "Украјински",
+ "sv": "ukrainska",
+ "ta": "உக்ரேனியன்",
+ "th": "ยูเครน",
+ "tr": "Ukraynaca",
+ "uk": "Українська",
+ "vi": "Tiếng U-crai-na",
+ "zh": "乌克兰文"
+ },
+ {
+ "type": "language",
+ "iso": "ur",
+ "name": "اردو",
+ "countries": [
+ {
+ "_reference": "IN"
+ },
+ {
+ "_reference": "PK"
+ }
+ ],
+ "am": "ኡርዱኛ",
+ "ar": "الأردية",
+ "bg": "Урду",
+ "ca": "urdú",
+ "cs": "Urdština",
+ "da": "Urdu",
+ "de": "Urdu",
+ "en": "Urdu",
+ "es": "urdu",
+ "fi": "urdu",
+ "fr": "ourdou",
+ "ga": "Urdais",
+ "he": "אורדו",
+ "hi": "ऊर्दु",
+ "hu": "urdu",
+ "id": "Urdu",
+ "is": "Úrdú",
+ "it": "urdu",
+ "ja": "ウルドゥー語",
+ "km": "ភាសាអ៊ូរ្ឌូ",
+ "ko": "우르두어",
+ "mr": "उर्दू",
+ "mt": "Urdu",
+ "nb": "urdu",
+ "nl": "Urdu",
+ "nn": "urdu",
+ "pt": "urdu",
+ "ru": "урду",
+ "sv": "urdu",
+ "ta": "உருது",
+ "th": "อิรดู",
+ "tr": "Urduca",
+ "uk": "Урду",
+ "ur": "اردو",
+ "zh": "乌尔都文"
+ },
+ {
+ "type": "language",
+ "iso": "uz",
+ "name": "Ўзбек",
+ "countries": [
+ {
+ "_reference": "AF"
+ },
+ {
+ "_reference": "UZ"
+ }
+ ],
+ "am": "ኡዝበክኛ",
+ "ar": "الاوزباكية",
+ "bg": "Узбекски",
+ "ca": "uzbek",
+ "cs": "Uzbečtina",
+ "da": "Usbekisk",
+ "de": "Usbekisch",
+ "en": "Uzbek",
+ "es": "uzbeko",
+ "fi": "uzbekki",
+ "fr": "ouzbek",
+ "ga": "Úisbéicis",
+ "he": "אוזבקית",
+ "hi": "उज़बेक्",
+ "hu": "üzbég",
+ "id": "Uzbek",
+ "is": "Úsbekska",
+ "it": "usbeco",
+ "ja": "ウズベク語",
+ "km": "ភាសាអ៊ូហ្សបេគីស្តង់",
+ "ko": "우즈베크어",
+ "mr": "उज़बेक",
+ "mt": "Użbek",
+ "nb": "usbekisk",
+ "nl": "Oezbeeks",
+ "nn": "usbekisk",
+ "ps": "ازبکي",
+ "pt": "usbeque",
+ "ru": "узбекский",
+ "sv": "uzbekiska",
+ "ta": "உஸ்பெக்",
+ "th": "อุสเบค",
+ "tr": "Özbekçe",
+ "uk": "Узбецька",
+ "vi": "Tiếng U-dơ-bếch",
+ "zh": "乌兹别克文"
+ },
+ {
+ "type": "language",
+ "iso": "vi",
+ "name": "Tiếng Việt",
+ "countries": [
+ {
+ "_reference": "VN"
+ }
+ ],
+ "am": "ቪትናምኛ",
+ "ar": "الفيتنامية",
+ "bg": "Виетнамски",
+ "ca": "vietnamita",
+ "cs": "Vietnamština",
+ "da": "Vietnamesisk",
+ "de": "Vietnamesisch",
+ "el": "Βιετναμεζικά",
+ "en": "Vietnamese",
+ "es": "vietnamita",
+ "fi": "vietnam",
+ "fr": "vietnamien",
+ "ga": "Vítneamais",
+ "he": "ויאטנמית",
+ "hi": "वियेतनामी",
+ "hr": "vijetnamski",
+ "hu": "vietnámi",
+ "id": "Vietnamese",
+ "is": "Víetnamska",
+ "it": "vietnamita",
+ "ja": "ベトナム語",
+ "km": "ភាសាវៀតណាម",
+ "ko": "베트남어",
+ "mr": "वियत्नामीज़",
+ "mt": "Vjetnamiż",
+ "nb": "vietnamesisk",
+ "nl": "Vietnamees",
+ "nn": "vietnamesisk",
+ "pt": "vietnamita",
+ "ru": "вьетнамский",
+ "sr": "Вијетнамски",
+ "sv": "vietnamesiska",
+ "ta": "வியட்நாமிஸ்",
+ "th": "เวียดนาม",
+ "tr": "Vietnam Dili",
+ "uk": "Вʼєтнамська",
+ "vi": "Tiếng Việt",
+ "zh": "越南文"
+ },
+ {
+ "type": "language",
+ "iso": "zh",
+ "name": "中文",
+ "countries": [
+ {
+ "_reference": "CN"
+ },
+ {
+ "_reference": "HK"
+ },
+ {
+ "_reference": "MO"
+ },
+ {
+ "_reference": "SG"
+ },
+ {
+ "_reference": "TW"
+ }
+ ],
+ "af": "Sjinees",
+ "am": "ቻይንኛ",
+ "ar": "الصينية",
+ "be": "кітайскі",
+ "bg": "Китайски",
+ "ca": "xinés",
+ "cs": "Čínština",
+ "cy": "Tseineeg",
+ "da": "Kinesisk",
+ "de": "Chinesisch",
+ "el": "Κινεζικά",
+ "en": "Chinese",
+ "es": "chino",
+ "et": "Hiina",
+ "eu": "txinera",
+ "fi": "kiina",
+ "fr": "chinois",
+ "ga": "Sínis",
+ "he": "סינית",
+ "hi": "चीनी",
+ "hr": "kineski",
+ "hu": "kínai",
+ "id": "Cina",
+ "is": "Kínverska",
+ "it": "cinese",
+ "ja": "中国語",
+ "ka": "ჩინური",
+ "km": "ភាសាចិន",
+ "ko": "중국어",
+ "ky": "кытайча",
+ "lt": "Kinų",
+ "lv": "ķīniešu",
+ "mk": "кинески",
+ "mn": "хятад",
+ "mr": "चिनीस्",
+ "mt": "Ċiniż",
+ "nb": "kinesisk",
+ "nl": "Chinees",
+ "nn": "kinesisk",
+ "pl": "chiński",
+ "ps": "چیني",
+ "pt": "chinês",
+ "ro": "Chineză",
+ "ru": "китайский",
+ "sk": "čínsky",
+ "sl": "Kitajščina",
+ "sq": "Kineze",
+ "sr": "Кинески",
+ "sv": "kinesiska",
+ "sw": "kichina",
+ "ta": "சீனம்",
+ "te": "చైనా భాష",
+ "th": "จีน",
+ "tr": "Çince",
+ "uk": "Китайська",
+ "vi": "Tiếng Trung Quốc",
+ "zh": "中文"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "aa",
+ "country": "DJ",
+ "iso": "aa_DJ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "aa",
+ "country": "ER",
+ "iso": "aa_ER"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "aa",
+ "country": "ET",
+ "iso": "aa_ET"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "af",
+ "country": "NA",
+ "iso": "af_NA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "af",
+ "country": "ZA",
+ "iso": "af_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ak",
+ "country": "GH",
+ "iso": "ak_GH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "am",
+ "country": "ET",
+ "iso": "am_ET"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "AE",
+ "iso": "ar_AE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "BH",
+ "iso": "ar_BH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "DZ",
+ "iso": "ar_DZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "EG",
+ "iso": "ar_EG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "IQ",
+ "iso": "ar_IQ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "JO",
+ "iso": "ar_JO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "KW",
+ "iso": "ar_KW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "LB",
+ "iso": "ar_LB"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "LY",
+ "iso": "ar_LY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "MA",
+ "iso": "ar_MA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "OM",
+ "iso": "ar_OM"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "QA",
+ "iso": "ar_QA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "SA",
+ "iso": "ar_SA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "SD",
+ "iso": "ar_SD"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "SY",
+ "iso": "ar_SY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "TN",
+ "iso": "ar_TN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ar",
+ "country": "YE",
+ "iso": "ar_YE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "as",
+ "country": "IN",
+ "iso": "as_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "az",
+ "country": "AZ",
+ "iso": "az_AZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "be",
+ "country": "BY",
+ "iso": "be_BY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "bg",
+ "country": "BG",
+ "iso": "bg_BG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "bn",
+ "country": "BD",
+ "iso": "bn_BD"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "bn",
+ "country": "IN",
+ "iso": "bn_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "bs",
+ "country": "BA",
+ "iso": "bs_BA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ca",
+ "country": "ES",
+ "iso": "ca_ES"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "cs",
+ "country": "CZ",
+ "iso": "cs_CZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "cy",
+ "country": "GB",
+ "iso": "cy_GB"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "da",
+ "country": "DK",
+ "iso": "da_DK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "AT",
+ "iso": "de_AT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "BE",
+ "iso": "de_BE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "CH",
+ "iso": "de_CH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "DE",
+ "iso": "de_DE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "LI",
+ "iso": "de_LI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "de",
+ "country": "LU",
+ "iso": "de_LU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "dv",
+ "country": "MV",
+ "iso": "dv_MV"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "dz",
+ "country": "BT",
+ "iso": "dz_BT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ee",
+ "country": "GH",
+ "iso": "ee_GH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ee",
+ "country": "TG",
+ "iso": "ee_TG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "el",
+ "country": "CY",
+ "iso": "el_CY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "el",
+ "country": "GR",
+ "iso": "el_GR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "AS",
+ "iso": "en_AS"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "AU",
+ "iso": "en_AU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "BE",
+ "iso": "en_BE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "BW",
+ "iso": "en_BW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "BZ",
+ "iso": "en_BZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "CA",
+ "iso": "en_CA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "GB",
+ "iso": "en_GB"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "GU",
+ "iso": "en_GU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "HK",
+ "iso": "en_HK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "IE",
+ "iso": "en_IE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "IN",
+ "iso": "en_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "JM",
+ "iso": "en_JM"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "MH",
+ "iso": "en_MH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "MP",
+ "iso": "en_MP"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "MT",
+ "iso": "en_MT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "NA",
+ "iso": "en_NA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "NZ",
+ "iso": "en_NZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "PH",
+ "iso": "en_PH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "PK",
+ "iso": "en_PK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "SG",
+ "iso": "en_SG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "TT",
+ "iso": "en_TT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "UM",
+ "iso": "en_UM"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "US",
+ "iso": "en_US"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "VI",
+ "iso": "en_VI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "ZA",
+ "iso": "en_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "en",
+ "country": "ZW",
+ "iso": "en_ZW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "AR",
+ "iso": "es_AR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "BO",
+ "iso": "es_BO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "CL",
+ "iso": "es_CL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "CO",
+ "iso": "es_CO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "CR",
+ "iso": "es_CR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "DO",
+ "iso": "es_DO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "EC",
+ "iso": "es_EC"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "ES",
+ "iso": "es_ES"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "GT",
+ "iso": "es_GT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "HN",
+ "iso": "es_HN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "MX",
+ "iso": "es_MX"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "NI",
+ "iso": "es_NI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "PA",
+ "iso": "es_PA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "PE",
+ "iso": "es_PE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "PR",
+ "iso": "es_PR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "PY",
+ "iso": "es_PY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "SV",
+ "iso": "es_SV"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "US",
+ "iso": "es_US"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "UY",
+ "iso": "es_UY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "es",
+ "country": "VE",
+ "iso": "es_VE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "et",
+ "country": "EE",
+ "iso": "et_EE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "eu",
+ "country": "ES",
+ "iso": "eu_ES"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fa",
+ "country": "AF",
+ "iso": "fa_AF"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fa",
+ "country": "IR",
+ "iso": "fa_IR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fi",
+ "country": "FI",
+ "iso": "fi_FI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fo",
+ "country": "FO",
+ "iso": "fo_FO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "BE",
+ "iso": "fr_BE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "CA",
+ "iso": "fr_CA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "CH",
+ "iso": "fr_CH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "FR",
+ "iso": "fr_FR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "LU",
+ "iso": "fr_LU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "fr",
+ "country": "MC",
+ "iso": "fr_MC"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ga",
+ "country": "IE",
+ "iso": "ga_IE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "gl",
+ "country": "ES",
+ "iso": "gl_ES"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "gu",
+ "country": "IN",
+ "iso": "gu_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "gv",
+ "country": "GB",
+ "iso": "gv_GB"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ha",
+ "country": "GH",
+ "iso": "ha_GH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ha",
+ "country": "NE",
+ "iso": "ha_NE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ha",
+ "country": "NG",
+ "iso": "ha_NG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "he",
+ "country": "IL",
+ "iso": "he_IL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "hi",
+ "country": "IN",
+ "iso": "hi_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "hr",
+ "country": "HR",
+ "iso": "hr_HR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "hu",
+ "country": "HU",
+ "iso": "hu_HU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "hy",
+ "country": "AM",
+ "iso": "hy_AM"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "id",
+ "country": "ID",
+ "iso": "id_ID"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ig",
+ "country": "NG",
+ "iso": "ig_NG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "is",
+ "country": "IS",
+ "iso": "is_IS"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "it",
+ "country": "CH",
+ "iso": "it_CH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "it",
+ "country": "IT",
+ "iso": "it_IT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ja",
+ "country": "JP",
+ "iso": "ja_JP"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ka",
+ "country": "GE",
+ "iso": "ka_GE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "kk",
+ "country": "KZ",
+ "iso": "kk_KZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "kl",
+ "country": "GL",
+ "iso": "kl_GL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "km",
+ "country": "KH",
+ "iso": "km_KH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "kn",
+ "country": "IN",
+ "iso": "kn_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ko",
+ "country": "KR",
+ "iso": "ko_KR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ku",
+ "country": "IQ",
+ "iso": "ku_IQ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ku",
+ "country": "IR",
+ "iso": "ku_IR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ku",
+ "country": "SY",
+ "iso": "ku_SY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ku",
+ "country": "TR",
+ "iso": "ku_TR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "kw",
+ "country": "GB",
+ "iso": "kw_GB"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ky",
+ "country": "KG",
+ "iso": "ky_KG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ln",
+ "country": "CD",
+ "iso": "ln_CD"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ln",
+ "country": "CG",
+ "iso": "ln_CG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "lo",
+ "country": "LA",
+ "iso": "lo_LA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "lt",
+ "country": "LT",
+ "iso": "lt_LT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "lv",
+ "country": "LV",
+ "iso": "lv_LV"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "mk",
+ "country": "MK",
+ "iso": "mk_MK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ml",
+ "country": "IN",
+ "iso": "ml_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "mn",
+ "country": "MN",
+ "iso": "mn_MN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "mr",
+ "country": "IN",
+ "iso": "mr_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ms",
+ "country": "BN",
+ "iso": "ms_BN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ms",
+ "country": "MY",
+ "iso": "ms_MY"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "mt",
+ "country": "MT",
+ "iso": "mt_MT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "nb",
+ "country": "NO",
+ "iso": "nb_NO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ne",
+ "country": "NP",
+ "iso": "ne_NP"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "nl",
+ "country": "BE",
+ "iso": "nl_BE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "nl",
+ "country": "NL",
+ "iso": "nl_NL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "nn",
+ "country": "NO",
+ "iso": "nn_NO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "nr",
+ "country": "ZA",
+ "iso": "nr_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ny",
+ "country": "MW",
+ "iso": "ny_MW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "om",
+ "country": "ET",
+ "iso": "om_ET"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "om",
+ "country": "KE",
+ "iso": "om_KE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "or",
+ "country": "IN",
+ "iso": "or_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "pa",
+ "country": "IN",
+ "iso": "pa_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "pa",
+ "country": "PK",
+ "iso": "pa_PK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "pl",
+ "country": "PL",
+ "iso": "pl_PL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ps",
+ "country": "AF",
+ "iso": "ps_AF"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "pt",
+ "country": "BR",
+ "iso": "pt_BR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "pt",
+ "country": "PT",
+ "iso": "pt_PT"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ro",
+ "country": "RO",
+ "iso": "ro_RO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ru",
+ "country": "RU",
+ "iso": "ru_RU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ru",
+ "country": "UA",
+ "iso": "ru_UA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "rw",
+ "country": "RW",
+ "iso": "rw_RW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sa",
+ "country": "IN",
+ "iso": "sa_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "se",
+ "country": "NO",
+ "iso": "se_NO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sh",
+ "country": "BA",
+ "iso": "sh_BA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sh",
+ "country": "CS",
+ "iso": "sh_CS"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sh",
+ "country": "YU",
+ "iso": "sh_YU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sk",
+ "country": "SK",
+ "iso": "sk_SK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sl",
+ "country": "SI",
+ "iso": "sl_SI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "so",
+ "country": "DJ",
+ "iso": "so_DJ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "so",
+ "country": "ET",
+ "iso": "so_ET"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "so",
+ "country": "KE",
+ "iso": "so_KE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "so",
+ "country": "SO",
+ "iso": "so_SO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sq",
+ "country": "AL",
+ "iso": "sq_AL"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sr",
+ "country": "BA",
+ "iso": "sr_BA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sr",
+ "country": "CS",
+ "iso": "sr_CS"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sr",
+ "country": "YU",
+ "iso": "sr_YU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ss",
+ "country": "ZA",
+ "iso": "ss_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "st",
+ "country": "ZA",
+ "iso": "st_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sv",
+ "country": "FI",
+ "iso": "sv_FI"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sv",
+ "country": "SE",
+ "iso": "sv_SE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sw",
+ "country": "KE",
+ "iso": "sw_KE"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "sw",
+ "country": "TZ",
+ "iso": "sw_TZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ta",
+ "country": "IN",
+ "iso": "ta_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "te",
+ "country": "IN",
+ "iso": "te_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "tg",
+ "country": "TJ",
+ "iso": "tg_TJ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "th",
+ "country": "TH",
+ "iso": "th_TH"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ti",
+ "country": "ER",
+ "iso": "ti_ER"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ti",
+ "country": "ET",
+ "iso": "ti_ET"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "tn",
+ "country": "ZA",
+ "iso": "tn_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "tr",
+ "country": "TR",
+ "iso": "tr_TR"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ts",
+ "country": "ZA",
+ "iso": "ts_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "tt",
+ "country": "RU",
+ "iso": "tt_RU"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "uk",
+ "country": "UA",
+ "iso": "uk_UA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ur",
+ "country": "IN",
+ "iso": "ur_IN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ur",
+ "country": "PK",
+ "iso": "ur_PK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "uz",
+ "country": "AF",
+ "iso": "uz_AF"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "uz",
+ "country": "UZ",
+ "iso": "uz_UZ"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "ve",
+ "country": "ZA",
+ "iso": "ve_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "vi",
+ "country": "VN",
+ "iso": "vi_VN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "xh",
+ "country": "ZA",
+ "iso": "xh_ZA"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "yo",
+ "country": "NG",
+ "iso": "yo_NG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zh",
+ "country": "CN",
+ "iso": "zh_CN"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zh",
+ "country": "HK",
+ "iso": "zh_HK"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zh",
+ "country": "MO",
+ "iso": "zh_MO"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zh",
+ "country": "SG",
+ "iso": "zh_SG"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zh",
+ "country": "TW",
+ "iso": "zh_TW"
+ },
+ {
+ "type": "languageCountryMap",
+ "language": "zu",
+ "country": "ZA",
+ "iso": "zu_ZA"
+ },
+ {
+ "type": "continent",
+ "name": "Africa",
+ "iso": "Africa"
+ },
+ {
+ "type": "continent",
+ "name": "Asia",
+ "iso": "Asia"
+ },
+ {
+ "type": "continent",
+ "name": "Europe",
+ "iso": "Europe"
+ },
+ {
+ "type": "continent",
+ "name": "North America",
+ "iso": "North America"
+ },
+ {
+ "type": "continent",
+ "name": "South America",
+ "iso": "South America"
+ },
+ {
+ "type": "continent",
+ "name": "Oceania",
+ "iso": "Oceania"
+ },
+ {
+ "type": "continent",
+ "name": "Antarctica",
+ "iso": "Antarctica"
+ },
+ {
+ "type": "country",
+ "iso": "AF",
+ "name": "Afghanistan",
+ "href": "http://en.wikipedia.org/wiki/Afghanistan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "fa"
+ },
+ {
+ "_reference": "ps"
+ },
+ {
+ "_reference": "uz"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AX",
+ "name": "Åland Islands",
+ "href": "http://en.wikipedia.org/wiki/%C3%85land",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AL",
+ "name": "Albania",
+ "href": "http://en.wikipedia.org/wiki/Albania",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "sq"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DZ",
+ "name": "Algeria",
+ "href": "http://en.wikipedia.org/wiki/Algeria",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AS",
+ "name": "American Samoa",
+ "href": "http://en.wikipedia.org/wiki/American_Samoa",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AD",
+ "name": "Andorra",
+ "href": "http://en.wikipedia.org/wiki/Andorra",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AO",
+ "name": "Angola",
+ "href": "http://en.wikipedia.org/wiki/Angola",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AI",
+ "name": "Anguilla",
+ "href": "http://en.wikipedia.org/wiki/Anguilla",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AQ",
+ "name": "Antarctica",
+ "href": "http://en.wikipedia.org/wiki/Antarctica",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AG",
+ "name": "Antigua and Barbuda",
+ "href": "http://en.wikipedia.org/wiki/Antigua_and_Barbuda",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AR",
+ "name": "Argentina",
+ "href": "http://en.wikipedia.org/wiki/Argentina",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AM",
+ "name": "Armenia",
+ "href": "http://en.wikipedia.org/wiki/Armenia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "hy"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AW",
+ "name": "Aruba",
+ "href": "http://en.wikipedia.org/wiki/Aruba",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AU",
+ "name": "Australia",
+ "href": "http://en.wikipedia.org/wiki/Australia",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AT",
+ "name": "Austria",
+ "href": "http://en.wikipedia.org/wiki/Austria",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AZ",
+ "name": "Azerbaijan",
+ "href": "http://en.wikipedia.org/wiki/Azerbaijan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "az"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BS",
+ "name": "Bahamas",
+ "href": "http://en.wikipedia.org/wiki/The_Bahamas",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BH",
+ "name": "Bahrain",
+ "href": "http://en.wikipedia.org/wiki/Bahrain",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BD",
+ "name": "Bangladesh",
+ "href": "http://en.wikipedia.org/wiki/Bangladesh",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "bn"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BB",
+ "name": "Barbados",
+ "href": "http://en.wikipedia.org/wiki/Barbados",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BY",
+ "name": "Belarus",
+ "href": "http://en.wikipedia.org/wiki/Belarus",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "be"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BE",
+ "name": "Belgium",
+ "href": "http://en.wikipedia.org/wiki/Belgium",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ },
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "fr"
+ },
+ {
+ "_reference": "nl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BZ",
+ "name": "Belize",
+ "href": "http://en.wikipedia.org/wiki/Belize",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BJ",
+ "name": "Benin",
+ "href": "http://en.wikipedia.org/wiki/Benin",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BM",
+ "name": "Bermuda",
+ "href": "http://en.wikipedia.org/wiki/Bermuda",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BT",
+ "name": "Bhutan",
+ "href": "http://en.wikipedia.org/wiki/Bhutan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "dz"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BO",
+ "name": "Bolivia",
+ "href": "http://en.wikipedia.org/wiki/Bolivia",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BA",
+ "name": "Bosnia and Herzegovina",
+ "href": "http://en.wikipedia.org/wiki/Bosnia_and_Herzegovina",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "bs"
+ },
+ {
+ "_reference": "sh"
+ },
+ {
+ "_reference": "sr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BW",
+ "name": "Botswana",
+ "href": "http://en.wikipedia.org/wiki/Botswana",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BV",
+ "name": "Bouvet Island",
+ "href": "http://en.wikipedia.org/wiki/Bouvet_Island",
+ "continent": "Antarctica",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BR",
+ "name": "Brazil",
+ "href": "http://en.wikipedia.org/wiki/Brazil",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "pt"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IO",
+ "name": "British Indian Ocean Territory",
+ "href": "http://en.wikipedia.org/wiki/British_Indian_Ocean_Territory",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BN",
+ "name": "Brunei Darussalam",
+ "href": "http://en.wikipedia.org/wiki/Brunei",
+ "languages": [
+ {
+ "_reference": "ms"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BG",
+ "name": "Bulgaria",
+ "href": "http://en.wikipedia.org/wiki/Bulgaria",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "bg"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BF",
+ "name": "Burkina Faso",
+ "href": "http://en.wikipedia.org/wiki/Burkina_Faso",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "BI",
+ "name": "Burundi",
+ "href": "http://en.wikipedia.org/wiki/Burundi",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KH",
+ "name": "Cambodia",
+ "href": "http://en.wikipedia.org/wiki/Cambodia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "km"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CM",
+ "name": "Cameroon",
+ "href": "http://en.wikipedia.org/wiki/Cameroon",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CA",
+ "name": "Canada",
+ "href": "http://en.wikipedia.org/wiki/Canada",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "fr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CV",
+ "name": "Cape Verde",
+ "href": "http://en.wikipedia.org/wiki/Cape_Verde",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KY",
+ "name": "Cayman Islands",
+ "href": "http://en.wikipedia.org/wiki/Cayman_Islands",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CF",
+ "name": "Central African Republic",
+ "href": "http://en.wikipedia.org/wiki/Central_African_Republic",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TD",
+ "name": "Chad",
+ "href": "http://en.wikipedia.org/wiki/Chad",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CL",
+ "name": "Chile",
+ "href": "http://en.wikipedia.org/wiki/Chile",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CN",
+ "name": "China",
+ "continent": "Asia",
+ "href": "http://en.wikipedia.org/wiki/People%27s_Republic_of_China",
+ "languages": [
+ {
+ "_reference": "zh"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CX",
+ "name": "Christmas Island",
+ "href": "http://en.wikipedia.org/wiki/Christmas_Island",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CC",
+ "name": "Cocos (Keeling) Islands",
+ "href": "http://en.wikipedia.org/wiki/Cocos_%28Keeling%29_Islands",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CO",
+ "name": "Colombia",
+ "href": "http://en.wikipedia.org/wiki/Colombia",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KM",
+ "name": "Comoros",
+ "href": "http://en.wikipedia.org/wiki/Comoros",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CG",
+ "name": "Congo",
+ "href": "http://en.wikipedia.org/wiki/Republic_of_the_Congo",
+ "languages": [
+ {
+ "_reference": "ln"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CD",
+ "name": "Congo, Democratic Republic of the",
+ "href": "http://en.wikipedia.org/wiki/Democratic_Republic_of_the_Congo",
+ "languages": [
+ {
+ "_reference": "ln"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CK",
+ "name": "Cook Islands",
+ "href": "http://en.wikipedia.org/wiki/Cook_Islands",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CR",
+ "name": "Costa Rica",
+ "href": "http://en.wikipedia.org/wiki/Costa_Rica",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CI",
+ "name": "Côte d'Ivoire",
+ "href": "http://en.wikipedia.org/wiki/C%C3%B4te_d%27Ivoire",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HR",
+ "name": "Croatia",
+ "href": "http://en.wikipedia.org/wiki/Croatia",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "hr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CU",
+ "name": "Cuba",
+ "href": "http://en.wikipedia.org/wiki/Cuba",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CY",
+ "name": "Cyprus",
+ "href": "http://en.wikipedia.org/wiki/Cyprus",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "el"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CZ",
+ "name": "Czech Republic",
+ "href": "http://en.wikipedia.org/wiki/Czech_Republic",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "cs"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DK",
+ "name": "Denmark",
+ "href": "http://en.wikipedia.org/wiki/Denmark",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "da"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DJ",
+ "name": "Djibouti",
+ "href": "http://en.wikipedia.org/wiki/Djibouti",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "aa"
+ },
+ {
+ "_reference": "so"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DM",
+ "name": "Dominica",
+ "href": "http://en.wikipedia.org/wiki/Dominica",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DO",
+ "name": "Dominican Republic",
+ "href": "http://en.wikipedia.org/wiki/Dominican_Republic",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "EC",
+ "name": "Ecuador",
+ "href": "http://en.wikipedia.org/wiki/Ecuador",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "EG",
+ "name": "Egypt",
+ "href": "http://en.wikipedia.org/wiki/Egypt",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SV",
+ "name": "El Salvador",
+ "href": "http://en.wikipedia.org/wiki/El_Salvador",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GQ",
+ "name": "Equatorial Guinea",
+ "href": "http://en.wikipedia.org/wiki/Equatorial_Guinea",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ER",
+ "name": "Eritrea",
+ "href": "http://en.wikipedia.org/wiki/Eritrea",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "aa"
+ },
+ {
+ "_reference": "ti"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "EE",
+ "name": "Estonia",
+ "href": "http://en.wikipedia.org/wiki/Estonia",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "et"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ET",
+ "name": "Ethiopia",
+ "href": "http://en.wikipedia.org/wiki/Ethiopia",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "aa"
+ },
+ {
+ "_reference": "am"
+ },
+ {
+ "_reference": "om"
+ },
+ {
+ "_reference": "so"
+ },
+ {
+ "_reference": "ti"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FK",
+ "name": "Falkland Islands (Malvinas)",
+ "href": "http://en.wikipedia.org/wiki/Falkland_Islands",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FO",
+ "name": "Faroe Islands",
+ "href": "http://en.wikipedia.org/wiki/Faroe_Islands",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "fo"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FJ",
+ "name": "Fiji",
+ "href": "http://en.wikipedia.org/wiki/Fiji",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FI",
+ "name": "Finland",
+ "href": "http://en.wikipedia.org/wiki/Finland",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "fi"
+ },
+ {
+ "_reference": "sv"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FR",
+ "name": "France",
+ "href": "http://en.wikipedia.org/wiki/France",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "fr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GF",
+ "name": "French Guiana",
+ "href": "http://en.wikipedia.org/wiki/French_Guiana",
+ "continent": "South America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PF",
+ "name": "French Polynesia",
+ "href": "http://en.wikipedia.org/wiki/French_Polynesia",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TF",
+ "name": "French Southern Territories",
+ "href": "http://en.wikipedia.org/wiki/French_Southern_and_Antarctic_Lands",
+ "continent": "Antarctica",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GA",
+ "name": "Gabon",
+ "href": "http://en.wikipedia.org/wiki/Gabon",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GM",
+ "name": "Gambia",
+ "href": "http://en.wikipedia.org/wiki/The_Gambia",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GE",
+ "name": "Georgia",
+ "href": "http://en.wikipedia.org/wiki/Georgia_%28country%29",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ka"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "DE",
+ "name": "Germany",
+ "href": "http://en.wikipedia.org/wiki/Germany",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GH",
+ "name": "Ghana",
+ "href": "http://en.wikipedia.org/wiki/Ghana",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ak"
+ },
+ {
+ "_reference": "ee"
+ },
+ {
+ "_reference": "ha"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GI",
+ "name": "Gibraltar",
+ "href": "http://en.wikipedia.org/wiki/Gibraltar",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GR",
+ "name": "Greece",
+ "href": "http://en.wikipedia.org/wiki/Greece",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "el"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GL",
+ "name": "Greenland",
+ "href": "http://en.wikipedia.org/wiki/Greenland",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "kl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GD",
+ "name": "Grenada",
+ "href": "http://en.wikipedia.org/wiki/Grenada",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GP",
+ "name": "Guadeloupe",
+ "href": "http://en.wikipedia.org/wiki/Guadeloupe",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GU",
+ "name": "Guam",
+ "href": "http://en.wikipedia.org/wiki/Guam",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GT",
+ "name": "Guatemala",
+ "href": "http://en.wikipedia.org/wiki/Guatemala",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GG",
+ "name": "Guernsey",
+ "href": "http://en.wikipedia.org/wiki/Guernsey",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GN",
+ "name": "Guinea",
+ "href": "http://en.wikipedia.org/wiki/Guinea",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GW",
+ "name": "Guinea-Bissau",
+ "href": "http://en.wikipedia.org/wiki/Guinea-Bissau",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GY",
+ "name": "Guyana",
+ "href": "http://en.wikipedia.org/wiki/Guyana",
+ "continent": "South America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HT",
+ "name": "Haiti",
+ "href": "http://en.wikipedia.org/wiki/Haiti",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HM",
+ "name": "Heard Island and McDonald Islands",
+ "href": "http://en.wikipedia.org/wiki/Heard_Island_and_McDonald_Islands",
+ "continent": "Antarctica",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VA",
+ "name": "Holy See (Vatican City State)",
+ "href": "http://en.wikipedia.org/wiki/Vatican_City",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HN",
+ "name": "Honduras",
+ "href": "http://en.wikipedia.org/wiki/Honduras",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HK",
+ "name": "Hong Kong",
+ "href": "http://en.wikipedia.org/wiki/Hong_Kong",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "zh"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "HU",
+ "name": "Hungary",
+ "href": "http://en.wikipedia.org/wiki/Hungary",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "hu"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IS",
+ "name": "Iceland",
+ "href": "http://en.wikipedia.org/wiki/Iceland",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "is"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IN",
+ "name": "India",
+ "href": "http://en.wikipedia.org/wiki/India",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "as"
+ },
+ {
+ "_reference": "bn"
+ },
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "gu"
+ },
+ {
+ "_reference": "hi"
+ },
+ {
+ "_reference": "kn"
+ },
+ {
+ "_reference": "ml"
+ },
+ {
+ "_reference": "mr"
+ },
+ {
+ "_reference": "or"
+ },
+ {
+ "_reference": "pa"
+ },
+ {
+ "_reference": "sa"
+ },
+ {
+ "_reference": "ta"
+ },
+ {
+ "_reference": "te"
+ },
+ {
+ "_reference": "ur"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ID",
+ "name": "Indonesia",
+ "href": "http://en.wikipedia.org/wiki/Indonesia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "id"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IR",
+ "name": "Iran, Islamic Republic of",
+ "href": "http://en.wikipedia.org/wiki/Iran",
+ "languages": [
+ {
+ "_reference": "fa"
+ },
+ {
+ "_reference": "ku"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IQ",
+ "name": "Iraq",
+ "href": "http://en.wikipedia.org/wiki/Iraq",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ },
+ {
+ "_reference": "ku"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IE",
+ "name": "Ireland",
+ "href": "http://en.wikipedia.org/wiki/Republic_of_Ireland",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "ga"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IM",
+ "name": "Isle of Man",
+ "href": "http://en.wikipedia.org/wiki/Isle_of_Man",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IL",
+ "name": "Israel",
+ "href": "http://en.wikipedia.org/wiki/Israel",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "he"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "IT",
+ "name": "Italy",
+ "href": "http://en.wikipedia.org/wiki/Italy",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "it"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "JM",
+ "name": "Jamaica",
+ "href": "http://en.wikipedia.org/wiki/Jamaica",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "JP",
+ "name": "Japan",
+ "href": "http://en.wikipedia.org/wiki/Japan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ja"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "JE",
+ "name": "Jersey",
+ "href": "http://en.wikipedia.org/wiki/Jersey",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "JO",
+ "name": "Jordan",
+ "href": "http://en.wikipedia.org/wiki/Jordan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KZ",
+ "name": "Kazakhstan",
+ "href": "http://en.wikipedia.org/wiki/Kazakhstan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "kk"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KE",
+ "name": "Kenya",
+ "href": "http://en.wikipedia.org/wiki/Kenya",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "om"
+ },
+ {
+ "_reference": "so"
+ },
+ {
+ "_reference": "sw"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KI",
+ "name": "Kiribati",
+ "href": "http://en.wikipedia.org/wiki/Kiribati",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KP",
+ "name": "Korea, Democratic People's Republic of",
+ "href": "http://en.wikipedia.org/wiki/North_Korea",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KR",
+ "name": "Korea, Republic of",
+ "href": "http://en.wikipedia.org/wiki/South_Korea",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ko"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KW",
+ "name": "Kuwait",
+ "href": "http://en.wikipedia.org/wiki/Kuwait",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KG",
+ "name": "Kyrgyzstan",
+ "href": "http://en.wikipedia.org/wiki/Kyrgyzstan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ky"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LA",
+ "name": "Lao People's Democratic Republic",
+ "href": "http://en.wikipedia.org/wiki/Laos",
+ "languages": [
+ {
+ "_reference": "lo"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LV",
+ "name": "Latvia",
+ "href": "http://en.wikipedia.org/wiki/Latvia",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "lv"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LB",
+ "name": "Lebanon",
+ "href": "http://en.wikipedia.org/wiki/Lebanon",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LS",
+ "name": "Lesotho",
+ "href": "http://en.wikipedia.org/wiki/Lesotho",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LR",
+ "name": "Liberia",
+ "href": "http://en.wikipedia.org/wiki/Liberia",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LY",
+ "name": "Libyan Arab Jamahiriya",
+ "href": "http://en.wikipedia.org/wiki/Libya",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LI",
+ "name": "Liechtenstein",
+ "href": "http://en.wikipedia.org/wiki/Liechtenstein",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LT",
+ "name": "Lithuania",
+ "href": "http://en.wikipedia.org/wiki/Lithuania",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "lt"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LU",
+ "name": "Luxembourg",
+ "href": "http://en.wikipedia.org/wiki/Luxembourg",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ },
+ {
+ "_reference": "fr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MO",
+ "name": "Macao",
+ "href": "http://en.wikipedia.org/wiki/Macau",
+ "languages": [
+ {
+ "_reference": "zh"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MK",
+ "name": "Macedonia, the former Yugoslav Republic of",
+ "href": "http://en.wikipedia.org/wiki/Republic_of_Macedonia",
+ "languages": [
+ {
+ "_reference": "mk"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MG",
+ "name": "Madagascar",
+ "href": "http://en.wikipedia.org/wiki/Madagascar",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MW",
+ "name": "Malawi",
+ "href": "http://en.wikipedia.org/wiki/Malawi",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ny"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MY",
+ "name": "Malaysia",
+ "href": "http://en.wikipedia.org/wiki/Malaysia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ms"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MV",
+ "name": "Maldives",
+ "href": "http://en.wikipedia.org/wiki/Maldives",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "dv"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ML",
+ "name": "Mali",
+ "href": "http://en.wikipedia.org/wiki/Mali",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MT",
+ "name": "Malta",
+ "href": "http://en.wikipedia.org/wiki/Malta",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "mt"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MH",
+ "name": "Marshall Islands",
+ "href": "http://en.wikipedia.org/wiki/Marshall_Islands",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MQ",
+ "name": "Martinique",
+ "href": "http://en.wikipedia.org/wiki/Martinique",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MR",
+ "name": "Mauritania",
+ "href": "http://en.wikipedia.org/wiki/Mauritania",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MU",
+ "name": "Mauritius",
+ "href": "http://en.wikipedia.org/wiki/Mauritius",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "YT",
+ "name": "Mayotte",
+ "href": "http://en.wikipedia.org/wiki/Mayotte",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MX",
+ "name": "Mexico",
+ "href": "http://en.wikipedia.org/wiki/Mexico",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "FM",
+ "name": "Micronesia, Federated States of",
+ "href": "http://en.wikipedia.org/wiki/Federated_States_of_Micronesia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MD",
+ "name": "Moldova, Republic of",
+ "href": "http://en.wikipedia.org/wiki/Moldova",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MC",
+ "name": "Monaco",
+ "href": "http://en.wikipedia.org/wiki/Monaco",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "fr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MN",
+ "name": "Mongolia",
+ "href": "http://en.wikipedia.org/wiki/Mongolia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "mn"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ME",
+ "name": "Montenegro",
+ "href": "http://en.wikipedia.org/wiki/Montenegro",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MS",
+ "name": "Montserrat",
+ "href": "http://en.wikipedia.org/wiki/Montserrat",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MA",
+ "name": "Morocco",
+ "href": "http://en.wikipedia.org/wiki/Morocco",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MZ",
+ "name": "Mozambique",
+ "href": "http://en.wikipedia.org/wiki/Mozambique",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MM",
+ "name": "Myanmar",
+ "href": "http://en.wikipedia.org/wiki/Myanmar",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NA",
+ "name": "Namibia",
+ "href": "http://en.wikipedia.org/wiki/Namibia",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "af"
+ },
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NR",
+ "name": "Nauru",
+ "href": "http://en.wikipedia.org/wiki/Nauru",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NP",
+ "name": "Nepal",
+ "href": "http://en.wikipedia.org/wiki/Nepal",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ne"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NL",
+ "name": "Netherlands",
+ "href": "http://en.wikipedia.org/wiki/Netherlands",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "nl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AN",
+ "name": "Netherlands Antilles",
+ "href": "http://en.wikipedia.org/wiki/Netherlands_Antilles",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NC",
+ "name": "New Caledonia",
+ "href": "http://en.wikipedia.org/wiki/New_Caledonia",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NZ",
+ "name": "New Zealand",
+ "href": "http://en.wikipedia.org/wiki/New_Zealand",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NI",
+ "name": "Nicaragua",
+ "href": "http://en.wikipedia.org/wiki/Nicaragua",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NE",
+ "name": "Niger",
+ "href": "http://en.wikipedia.org/wiki/Niger",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ha"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NG",
+ "name": "Nigeria",
+ "href": "http://en.wikipedia.org/wiki/Nigeria",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ha"
+ },
+ {
+ "_reference": "ig"
+ },
+ {
+ "_reference": "yo"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NU",
+ "name": "Niue",
+ "href": "http://en.wikipedia.org/wiki/Niue",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NF",
+ "name": "Norfolk Island",
+ "href": "http://en.wikipedia.org/wiki/Norfolk_Island",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "MP",
+ "name": "Northern Mariana Islands",
+ "href": "http://en.wikipedia.org/wiki/Northern_Mariana_Islands",
+ "continent": "Oceania",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "NO",
+ "name": "Norway",
+ "href": "http://en.wikipedia.org/wiki/Norway",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "nb"
+ },
+ {
+ "_reference": "nn"
+ },
+ {
+ "_reference": "se"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "OM",
+ "name": "Oman",
+ "href": "http://en.wikipedia.org/wiki/Oman",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PK",
+ "name": "Pakistan",
+ "href": "http://en.wikipedia.org/wiki/Pakistan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "pa"
+ },
+ {
+ "_reference": "ur"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PW",
+ "name": "Palau",
+ "href": "http://en.wikipedia.org/wiki/Palau",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PS",
+ "name": "Palestinian Territory, Occupied",
+ "href": "http://en.wikipedia.org/wiki/Palestinian_territories",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PA",
+ "name": "Panama",
+ "href": "http://en.wikipedia.org/wiki/Panama",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PG",
+ "name": "Papua New Guinea",
+ "href": "http://en.wikipedia.org/wiki/Papua_New_Guinea",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PY",
+ "name": "Paraguay",
+ "href": "http://en.wikipedia.org/wiki/Paraguay",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PE",
+ "name": "Peru",
+ "href": "http://en.wikipedia.org/wiki/Peru",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PH",
+ "name": "Philippines",
+ "href": "http://en.wikipedia.org/wiki/Philippines",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PN",
+ "name": "Pitcairn",
+ "href": "http://en.wikipedia.org/wiki/Pitcairn_Islands",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PL",
+ "name": "Poland",
+ "href": "http://en.wikipedia.org/wiki/Poland",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "pl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PT",
+ "name": "Portugal",
+ "href": "http://en.wikipedia.org/wiki/Portugal",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "pt"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PR",
+ "name": "Puerto Rico",
+ "href": "http://en.wikipedia.org/wiki/Puerto_Rico",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "QA",
+ "name": "Qatar",
+ "href": "http://en.wikipedia.org/wiki/Qatar",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "RE",
+ "name": "Réunion",
+ "href": "http://en.wikipedia.org/wiki/R%C3%A9union",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "RO",
+ "name": "Romania",
+ "href": "http://en.wikipedia.org/wiki/Romania",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "ro"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "RU",
+ "name": "Russian Federation",
+ "href": "http://en.wikipedia.org/wiki/Russia",
+ "languages": [
+ {
+ "_reference": "ru"
+ },
+ {
+ "_reference": "tt"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "RW",
+ "name": "Rwanda",
+ "href": "http://en.wikipedia.org/wiki/Rwanda",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "rw"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SH",
+ "name": "Saint Helena",
+ "href": "http://en.wikipedia.org/wiki/Saint_Helena",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "KN",
+ "name": "Saint Kitts and Nevis",
+ "href": "http://en.wikipedia.org/wiki/Saint_Kitts_and_Nevis",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LC",
+ "name": "Saint Lucia",
+ "href": "http://en.wikipedia.org/wiki/Saint_Lucia",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "PM",
+ "name": "Saint Pierre and Miquelon",
+ "href": "http://en.wikipedia.org/wiki/Saint_Pierre_and_Miquelon",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VC",
+ "name": "Saint Vincent and the Grenadines",
+ "href": "http://en.wikipedia.org/wiki/Saint_Vincent_and_the_Grenadines",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "WS",
+ "name": "Samoa",
+ "href": "http://en.wikipedia.org/wiki/Samoa",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SM",
+ "name": "San Marino",
+ "href": "http://en.wikipedia.org/wiki/San_Marino",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ST",
+ "name": "Sao Tome and Principe",
+ "href": "http://en.wikipedia.org/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SA",
+ "name": "Saudi Arabia",
+ "href": "http://en.wikipedia.org/wiki/Saudi_Arabia",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SN",
+ "name": "Senegal",
+ "href": "http://en.wikipedia.org/wiki/Senegal",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "RS",
+ "name": "Serbia",
+ "href": "http://en.wikipedia.org/wiki/Serbia",
+ "continent": "Europe",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SC",
+ "name": "Seychelles",
+ "href": "http://en.wikipedia.org/wiki/Seychelles",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SL",
+ "name": "Sierra Leone",
+ "href": "http://en.wikipedia.org/wiki/Sierra_Leone",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SG",
+ "name": "Singapore",
+ "href": "http://en.wikipedia.org/wiki/Singapore",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "zh"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SK",
+ "name": "Slovakia",
+ "href": "http://en.wikipedia.org/wiki/Slovakia",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "sk"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SI",
+ "name": "Slovenia",
+ "href": "http://en.wikipedia.org/wiki/Slovenia",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "sl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SB",
+ "name": "Solomon Islands",
+ "href": "http://en.wikipedia.org/wiki/Solomon_Islands",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SO",
+ "name": "Somalia",
+ "href": "http://en.wikipedia.org/wiki/Somalia",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "so"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ZA",
+ "name": "South Africa",
+ "href": "http://en.wikipedia.org/wiki/South_Africa",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "af"
+ },
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "nr"
+ },
+ {
+ "_reference": "ss"
+ },
+ {
+ "_reference": "st"
+ },
+ {
+ "_reference": "tn"
+ },
+ {
+ "_reference": "ts"
+ },
+ {
+ "_reference": "ve"
+ },
+ {
+ "_reference": "xh"
+ },
+ {
+ "_reference": "zu"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GS",
+ "name": "South Georgia and the South Sandwich Islands",
+ "href": "http://en.wikipedia.org/wiki/South_Georgia_and_the_South_Sandwich_Islands",
+ "continent": "Antarctica",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ES",
+ "name": "Spain",
+ "href": "http://en.wikipedia.org/wiki/Spain",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "ca"
+ },
+ {
+ "_reference": "es"
+ },
+ {
+ "_reference": "eu"
+ },
+ {
+ "_reference": "gl"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "LK",
+ "name": "Sri Lanka",
+ "href": "http://en.wikipedia.org/wiki/Sri_Lanka",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SD",
+ "name": "Sudan",
+ "href": "http://en.wikipedia.org/wiki/Sudan",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SR",
+ "name": "Suriname",
+ "href": "http://en.wikipedia.org/wiki/Suriname",
+ "continent": "South America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SJ",
+ "name": "Svalbard and Jan Mayen",
+ "href": "http://en.wikipedia.org/wiki/Svalbard_and_Jan_Mayen",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SZ",
+ "name": "Swaziland",
+ "href": "http://en.wikipedia.org/wiki/Swaziland",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SE",
+ "name": "Sweden",
+ "href": "http://en.wikipedia.org/wiki/Sweden",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "sv"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "CH",
+ "name": "Switzerland",
+ "href": "http://en.wikipedia.org/wiki/Switzerland",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "de"
+ },
+ {
+ "_reference": "fr"
+ },
+ {
+ "_reference": "it"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "SY",
+ "name": "Syrian Arab Republic",
+ "href": "http://en.wikipedia.org/wiki/Syria",
+ "languages": [
+ {
+ "_reference": "ar"
+ },
+ {
+ "_reference": "ku"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TW",
+ "name": "Taiwan, Province of China",
+ "href": "http://en.wikipedia.org/wiki/Republic_of_China",
+ "languages": [
+ {
+ "_reference": "zh"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TJ",
+ "name": "Tajikistan",
+ "href": "http://en.wikipedia.org/wiki/Tajikistan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "tg"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TZ",
+ "name": "Tanzania, United Republic of",
+ "href": "http://en.wikipedia.org/wiki/Tanzania",
+ "languages": [
+ {
+ "_reference": "sw"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TH",
+ "name": "Thailand",
+ "href": "http://en.wikipedia.org/wiki/Thailand",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "th"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TL",
+ "name": "Timor-Leste",
+ "href": "http://en.wikipedia.org/wiki/East_Timor",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TG",
+ "name": "Togo",
+ "href": "http://en.wikipedia.org/wiki/Togo",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ee"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TK",
+ "name": "Tokelau",
+ "href": "http://en.wikipedia.org/wiki/Tokelau",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TO",
+ "name": "Tonga",
+ "href": "http://en.wikipedia.org/wiki/Tonga",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TT",
+ "name": "Trinidad and Tobago",
+ "href": "http://en.wikipedia.org/wiki/Trinidad_and_Tobago",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TN",
+ "name": "Tunisia",
+ "href": "http://en.wikipedia.org/wiki/Tunisia",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TR",
+ "name": "Turkey",
+ "href": "http://en.wikipedia.org/wiki/Turkey",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ku"
+ },
+ {
+ "_reference": "tr"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TM",
+ "name": "Turkmenistan",
+ "href": "http://en.wikipedia.org/wiki/Turkmenistan",
+ "continent": "Asia",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TC",
+ "name": "Turks and Caicos Islands",
+ "href": "http://en.wikipedia.org/wiki/Turks_and_Caicos_Islands",
+ "continent": "North America",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "TV",
+ "name": "Tuvalu",
+ "href": "http://en.wikipedia.org/wiki/Tuvalu",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "UG",
+ "name": "Uganda",
+ "href": "http://en.wikipedia.org/wiki/Uganda",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "UA",
+ "name": "Ukraine",
+ "href": "http://en.wikipedia.org/wiki/Ukraine",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "ru"
+ },
+ {
+ "_reference": "uk"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "AE",
+ "name": "United Arab Emirates",
+ "href": "http://en.wikipedia.org/wiki/United_Arab_Emirates",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "GB",
+ "name": "United Kingdom",
+ "href": "http://en.wikipedia.org/wiki/United_Kingdom",
+ "continent": "Europe",
+ "languages": [
+ {
+ "_reference": "cy"
+ },
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "gv"
+ },
+ {
+ "_reference": "kw"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "US",
+ "name": "United States",
+ "href": "http://en.wikipedia.org/wiki/United_States",
+ "continent": "North America",
+ "languages": [
+ {
+ "_reference": "en"
+ },
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "UM",
+ "name": "United States Minor Outlying Islands",
+ "href": "http://en.wikipedia.org/wiki/United_States_Minor_Outlying_Islands",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "UY",
+ "name": "Uruguay",
+ "href": "http://en.wikipedia.org/wiki/Uruguay",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "UZ",
+ "name": "Uzbekistan",
+ "href": "http://en.wikipedia.org/wiki/Uzbekistan",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "uz"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VU",
+ "name": "Vanuatu",
+ "href": "http://en.wikipedia.org/wiki/Vanuatu",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VE",
+ "name": "Venezuela",
+ "href": "http://en.wikipedia.org/wiki/Venezuela",
+ "continent": "South America",
+ "languages": [
+ {
+ "_reference": "es"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VN",
+ "name": "Viet Nam",
+ "href": "http://en.wikipedia.org/wiki/Vietnam",
+ "languages": [
+ {
+ "_reference": "vi"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VG",
+ "name": "Virgin Islands, British",
+ "href": "http://en.wikipedia.org/wiki/British_Virgin_Islands",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "VI",
+ "name": "Virgin Islands, U.S.",
+ "href": "http://en.wikipedia.org/wiki/United_States_Virgin_Islands",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "WF",
+ "name": "Wallis and Futuna",
+ "href": "http://en.wikipedia.org/wiki/Wallis_and_Futuna",
+ "continent": "Oceania",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "EH",
+ "name": "Western Sahara",
+ "href": "http://en.wikipedia.org/wiki/Western_Sahara",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "YE",
+ "name": "Yemen",
+ "href": "http://en.wikipedia.org/wiki/Yemen",
+ "continent": "Asia",
+ "languages": [
+ {
+ "_reference": "ar"
+ }
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ZM",
+ "name": "Zambia",
+ "href": "http://en.wikipedia.org/wiki/Zambia",
+ "continent": "Africa",
+ "languages": [
+ ]
+ },
+ {
+ "type": "country",
+ "iso": "ZW",
+ "name": "Zimbabwe",
+ "href": "http://en.wikipedia.org/wiki/Zimbabwe",
+ "continent": "Africa",
+ "languages": [
+ {
+ "_reference": "en"
+ }
+ ]
+ }
+]
+} \ No newline at end of file
diff --git a/includes/js/dijit/demos/i18n/flags.css b/includes/js/dijit/demos/i18n/flags.css
new file mode 100644
index 0000000..a0916b6
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/flags.css
@@ -0,0 +1,1223 @@
+.countryIcon {
+ background-image: url('flags.png');
+}
+.countryAFIcon {
+ background-position: 0px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAXIcon {
+ background-position: -22px -1px;
+ width: 22px;
+ height: 14px;
+}
+.countryALIcon {
+ background-position: -44px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryDZIcon {
+ background-position: -66px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryASIcon {
+ background-position: -88px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryADIcon {
+ background-position: -110px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAOIcon {
+ background-position: -132px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAIIcon {
+ background-position: -154px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryAQIcon {
+ background-position: -176px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAGIcon {
+ background-position: -198px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryARIcon {
+ background-position: -220px -1px;
+ width: 22px;
+ height: 14px;
+}
+.countryAMIcon {
+ background-position: -242px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryAWIcon {
+ background-position: -264px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAUIcon {
+ background-position: -286px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryATIcon {
+ background-position: -308px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAZIcon {
+ background-position: -330px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryBSIcon {
+ background-position: -352px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryBHIcon {
+ background-position: -374px -2px;
+ width: 22px;
+ height: 13px;
+}
+.countryBDIcon {
+ background-position: -396px -2px;
+ width: 22px;
+ height: 13px;
+}
+.countryBBIcon {
+ background-position: -418px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryBYIcon {
+ background-position: 0px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBEIcon {
+ background-position: -22px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBZIcon {
+ background-position: -44px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBJIcon {
+ background-position: -66px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBMIcon {
+ background-position: -88px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBTIcon {
+ background-position: -110px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBOIcon {
+ background-position: -132px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBAIcon {
+ background-position: -154px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBWIcon {
+ background-position: -176px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBVIcon {
+ background-position: -198px -19px;
+ width: 22px;
+ height: 16px;
+}
+.countryBRIcon {
+ background-position: -220px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryIOIcon {
+ background-position: -242px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBNIcon {
+ background-position: -264px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBGIcon {
+ background-position: -286px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryBFIcon {
+ background-position: -308px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBIIcon {
+ background-position: -330px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryKHIcon {
+ background-position: -352px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryCMIcon {
+ background-position: -374px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryCAIcon {
+ background-position: -396px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryCVIcon {
+ background-position: -418px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryKYIcon {
+ background-position: 0px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCFIcon {
+ background-position: -22px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryTDIcon {
+ background-position: -44px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCLIcon {
+ background-position: -66px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCNIcon {
+ background-position: -88px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCXIcon {
+ background-position: -110px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCCIcon {
+ background-position: -132px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCOIcon {
+ background-position: -154px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryKMIcon {
+ background-position: -176px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCGIcon {
+ background-position: -198px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCDIcon {
+ background-position: -220px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCKIcon {
+ background-position: -242px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCRIcon {
+ background-position: -264px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCIIcon {
+ background-position: -286px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryHRIcon {
+ background-position: -308px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCUIcon {
+ background-position: -330px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCYIcon {
+ background-position: -352px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCZIcon {
+ background-position: -374px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryDKIcon {
+ background-position: -396px -39px;
+ width: 22px;
+ height: 17px;
+}
+.countryDJIcon {
+ background-position: -418px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryDMIcon {
+ background-position: 0px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryDOIcon {
+ background-position: -22px -63px;
+ width: 22px;
+ height: 14px;
+}
+.countryECIcon {
+ background-position: -44px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryEGIcon {
+ background-position: -66px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countrySVIcon {
+ background-position: -88px -65px;
+ width: 22px;
+ height: 12px;
+}
+.countryGQIcon {
+ background-position: -110px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryERIcon {
+ background-position: -132px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryEEIcon {
+ background-position: -154px -63px;
+ width: 22px;
+ height: 14px;
+}
+.countryETIcon {
+ background-position: -176px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFKIcon {
+ background-position: -198px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFOIcon {
+ background-position: -220px -61px;
+ width: 22px;
+ height: 16px;
+}
+.countryFJIcon {
+ background-position: -242px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFIIcon {
+ background-position: -264px -64px;
+ width: 22px;
+ height: 13px;
+}
+.countryFRIcon {
+ background-position: -286px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGFIcon {
+ background-position: -308px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryPFIcon {
+ background-position: -330px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryTFIcon {
+ background-position: -352px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGAIcon {
+ background-position: -374px -60px;
+ width: 22px;
+ height: 17px;
+}
+.countryGMIcon {
+ background-position: -396px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGEIcon {
+ background-position: -418px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryDEIcon {
+ background-position: 0px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGHIcon {
+ background-position: -22px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGIIcon {
+ background-position: -44px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryGRIcon {
+ background-position: -66px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGLIcon {
+ background-position: -88px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGDIcon {
+ background-position: -110px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGPIcon {
+ background-position: -132px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGUIcon {
+ background-position: -154px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGTIcon {
+ background-position: -176px -87px;
+ width: 22px;
+ height: 14px;
+}
+.countryGGIcon {
+ background-position: -198px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGNIcon {
+ background-position: -220px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGWIcon {
+ background-position: -242px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryGYIcon {
+ background-position: -264px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryHTIcon {
+ background-position: -286px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryHMIcon {
+ background-position: -308px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryVAIcon {
+ background-position: -330px -81px;
+ width: 20px;
+ height: 20px;
+}
+.countryHNIcon {
+ background-position: -350px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryHKIcon {
+ background-position: -372px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryHUIcon {
+ background-position: -394px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryISIcon {
+ background-position: -416px -85px;
+ width: 22px;
+ height: 16px;
+}
+.countryINIcon {
+ background-position: 0px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIDIcon {
+ background-position: -22px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIRIcon {
+ background-position: -44px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryIQIcon {
+ background-position: -66px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIEIcon {
+ background-position: -88px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryIMIcon {
+ background-position: -110px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryILIcon {
+ background-position: -132px -105px;
+ width: 22px;
+ height: 16px;
+}
+.countryITIcon {
+ background-position: -154px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryJMIcon {
+ background-position: -176px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryJPIcon {
+ background-position: -198px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryJEIcon {
+ background-position: -220px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryJOIcon {
+ background-position: -242px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKZIcon {
+ background-position: -264px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKEIcon {
+ background-position: -286px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryKIIcon {
+ background-position: -308px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKPIcon {
+ background-position: -330px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKRIcon {
+ background-position: -352px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryKWIcon {
+ background-position: -374px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKGIcon {
+ background-position: -396px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryLAIcon {
+ background-position: -418px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryLVIcon {
+ background-position: 0px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryLBIcon {
+ background-position: -22px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryLSIcon {
+ background-position: -44px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryLRIcon {
+ background-position: -66px -128px;
+ width: 22px;
+ height: 12px;
+}
+.countryLYIcon {
+ background-position: -88px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryLIIcon {
+ background-position: -110px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryLTIcon {
+ background-position: -132px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryLUIcon {
+ background-position: -154px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryMOIcon {
+ background-position: -176px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMKIcon {
+ background-position: -198px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryMGIcon {
+ background-position: -220px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMWIcon {
+ background-position: -242px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMYIcon {
+ background-position: -264px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryMVIcon {
+ background-position: -286px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMLIcon {
+ background-position: -308px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMTIcon {
+ background-position: -330px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMHIcon {
+ background-position: -352px -128px;
+ width: 22px;
+ height: 12px;
+}
+.countryMQIcon {
+ background-position: -374px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMRIcon {
+ background-position: -396px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMUIcon {
+ background-position: -418px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryYTIcon {
+ background-position: 0px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMXIcon {
+ background-position: -22px -151px;
+ width: 22px;
+ height: 13px;
+}
+.countryFMIcon {
+ background-position: -44px -152px;
+ width: 22px;
+ height: 12px;
+}
+.countryMDIcon {
+ background-position: -66px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMCIcon {
+ background-position: -88px -146px;
+ width: 22px;
+ height: 18px;
+}
+.countryMNIcon {
+ background-position: -110px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMEIcon {
+ background-position: -132px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMSIcon {
+ background-position: -154px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMAIcon {
+ background-position: -176px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMZIcon {
+ background-position: -198px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMMIcon {
+ background-position: -220px -152px;
+ width: 22px;
+ height: 12px;
+}
+.countryNAIcon {
+ background-position: -242px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNRIcon {
+ background-position: -264px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryNPIcon {
+ background-position: -286px -144px;
+ width: 16px;
+ height: 20px;
+}
+.countryNLIcon {
+ background-position: -302px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryANIcon {
+ background-position: -324px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNCIcon {
+ background-position: -346px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNZIcon {
+ background-position: -368px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryNIIcon {
+ background-position: -390px -151px;
+ width: 22px;
+ height: 13px;
+}
+.countryNEIcon {
+ background-position: -412px -145px;
+ width: 22px;
+ height: 19px;
+}
+.countryNGIcon {
+ background-position: 0px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNUIcon {
+ background-position: -22px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNFIcon {
+ background-position: -44px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryMPIcon {
+ background-position: -66px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNOIcon {
+ background-position: -88px -169px;
+ width: 22px;
+ height: 16px;
+}
+.countryOMIcon {
+ background-position: -110px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPKIcon {
+ background-position: -132px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPWIcon {
+ background-position: -154px -171px;
+ width: 22px;
+ height: 14px;
+}
+.countryPSIcon {
+ background-position: -176px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPAIcon {
+ background-position: -198px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPGIcon {
+ background-position: -220px -168px;
+ width: 22px;
+ height: 17px;
+}
+.countryPYIcon {
+ background-position: -242px -172px;
+ width: 22px;
+ height: 13px;
+}
+.countryPEIcon {
+ background-position: -264px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPHIcon {
+ background-position: -286px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPNIcon {
+ background-position: -308px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPLIcon {
+ background-position: -330px -171px;
+ width: 22px;
+ height: 14px;
+}
+.countryPTIcon {
+ background-position: -352px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPRIcon {
+ background-position: -374px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryQAIcon {
+ background-position: -396px -176px;
+ width: 22px;
+ height: 9px;
+}
+.countryREIcon {
+ background-position: -418px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryROIcon {
+ background-position: 0px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRUIcon {
+ background-position: -22px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRWIcon {
+ background-position: -44px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySHIcon {
+ background-position: -66px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countryKNIcon {
+ background-position: -88px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryLCIcon {
+ background-position: -110px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countryPMIcon {
+ background-position: -132px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryVCIcon {
+ background-position: -154px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryWSIcon {
+ background-position: -176px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySMIcon {
+ background-position: -198px -189px;
+ width: 22px;
+ height: 17px;
+}
+.countrySTIcon {
+ background-position: -220px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySAIcon {
+ background-position: -242px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySNIcon {
+ background-position: -264px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRSIcon {
+ background-position: -286px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySCIcon {
+ background-position: -308px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySLIcon {
+ background-position: -330px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySGIcon {
+ background-position: -352px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySKIcon {
+ background-position: -374px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySIIcon {
+ background-position: -396px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySBIcon {
+ background-position: -418px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySOIcon {
+ background-position: 0px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryZAIcon {
+ background-position: -22px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryGSIcon {
+ background-position: -44px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryESIcon {
+ background-position: -66px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryLKIcon {
+ background-position: -88px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countrySDIcon {
+ background-position: -110px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countrySRIcon {
+ background-position: -132px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countrySJIcon {
+ background-position: -154px -214px;
+ width: 22px;
+ height: 16px;
+}
+.countrySZIcon {
+ background-position: -176px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countrySEIcon {
+ background-position: -198px -216px;
+ width: 22px;
+ height: 14px;
+}
+.countryCHIcon {
+ background-position: -220px -210px;
+ width: 20px;
+ height: 20px;
+}
+.countrySYIcon {
+ background-position: -240px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTWIcon {
+ background-position: -262px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTJIcon {
+ background-position: -284px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTZIcon {
+ background-position: -306px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTHIcon {
+ background-position: -328px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTLIcon {
+ background-position: -350px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTGIcon {
+ background-position: -372px -216px;
+ width: 22px;
+ height: 14px;
+}
+.countryTKIcon {
+ background-position: -394px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTOIcon {
+ background-position: -416px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTTIcon {
+ background-position: 0px -236px;
+ width: 22px;
+ height: 13px;
+}
+.countryTNIcon {
+ background-position: -22px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTRIcon {
+ background-position: -44px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTMIcon {
+ background-position: -66px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTCIcon {
+ background-position: -88px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryTVIcon {
+ background-position: -110px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryUGIcon {
+ background-position: -132px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryUAIcon {
+ background-position: -154px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryAEIcon {
+ background-position: -176px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryGBIcon {
+ background-position: -198px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryUSIcon {
+ background-position: -220px -237px;
+ width: 22px;
+ height: 12px;
+}
+.countryUMIcon {
+ background-position: -242px -237px;
+ width: 22px;
+ height: 12px;
+}
+.countryUYIcon {
+ background-position: -264px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryUZIcon {
+ background-position: -286px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryVUIcon {
+ background-position: -308px -236px;
+ width: 22px;
+ height: 13px;
+}
+.countryVEIcon {
+ background-position: -330px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryVNIcon {
+ background-position: -352px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryVGIcon {
+ background-position: -374px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryVIIcon {
+ background-position: -396px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryWFIcon {
+ background-position: -418px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryEHIcon {
+ background-position: 0px -257px;
+ width: 22px;
+ height: 11px;
+}
+.countryYEIcon {
+ background-position: -22px -253px;
+ width: 22px;
+ height: 15px;
+}
+.countryZMIcon {
+ background-position: -44px -253px;
+ width: 22px;
+ height: 15px;
+}
+.countryZWIcon {
+ background-position: -66px -257px;
+ width: 22px;
+ height: 11px;
+}
diff --git a/includes/js/dijit/demos/i18n/flags.css.commented.css b/includes/js/dijit/demos/i18n/flags.css.commented.css
new file mode 100644
index 0000000..551ffe5
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/flags.css.commented.css
@@ -0,0 +1,1224 @@
+.countryIcon {
+ background-image: url('flags.png');
+}
+
+.countryAFIcon {
+ background-position: 0px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAXIcon {
+ background-position: -22px -1px;
+ width: 22px;
+ height: 14px;
+}
+.countryALIcon {
+ background-position: -44px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryDZIcon {
+ background-position: -66px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryASIcon {
+ background-position: -88px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryADIcon {
+ background-position: -110px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAOIcon {
+ background-position: -132px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAIIcon {
+ background-position: -154px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryAQIcon {
+ background-position: -176px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAGIcon {
+ background-position: -198px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryARIcon {
+ background-position: -220px -1px;
+ width: 22px;
+ height: 14px;
+}
+.countryAMIcon {
+ background-position: -242px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryAWIcon {
+ background-position: -264px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAUIcon {
+ background-position: -286px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryATIcon {
+ background-position: -308px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryAZIcon {
+ background-position: -330px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryBSIcon {
+ background-position: -352px -4px;
+ width: 22px;
+ height: 11px;
+}
+.countryBHIcon {
+ background-position: -374px -2px;
+ width: 22px;
+ height: 13px;
+}
+.countryBDIcon {
+ background-position: -396px -2px;
+ width: 22px;
+ height: 13px;
+}
+.countryBBIcon {
+ background-position: -418px 0px;
+ width: 22px;
+ height: 15px;
+}
+.countryBYIcon {
+ background-position: 0px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBEIcon {
+ background-position: -22px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBZIcon {
+ background-position: -44px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBJIcon {
+ background-position: -66px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBMIcon {
+ background-position: -88px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBTIcon {
+ background-position: -110px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBOIcon {
+ background-position: -132px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBAIcon {
+ background-position: -154px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBWIcon {
+ background-position: -176px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBVIcon {
+ background-position: -198px -19px;
+ width: 22px;
+ height: 16px;
+}
+.countryBRIcon {
+ background-position: -220px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryIOIcon {
+ background-position: -242px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBNIcon {
+ background-position: -264px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryBGIcon {
+ background-position: -286px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryBFIcon {
+ background-position: -308px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryBIIcon {
+ background-position: -330px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryKHIcon {
+ background-position: -352px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryCMIcon {
+ background-position: -374px -20px;
+ width: 22px;
+ height: 15px;
+}
+.countryCAIcon {
+ background-position: -396px -24px;
+ width: 22px;
+ height: 11px;
+}
+.countryCVIcon {
+ background-position: -418px -22px;
+ width: 22px;
+ height: 13px;
+}
+.countryKYIcon {
+ background-position: 0px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCFIcon {
+ background-position: -22px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryTDIcon {
+ background-position: -44px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCLIcon {
+ background-position: -66px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCNIcon {
+ background-position: -88px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCXIcon {
+ background-position: -110px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCCIcon {
+ background-position: -132px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCOIcon {
+ background-position: -154px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryKMIcon {
+ background-position: -176px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCGIcon {
+ background-position: -198px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCDIcon {
+ background-position: -220px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryCKIcon {
+ background-position: -242px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCRIcon {
+ background-position: -264px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCIIcon {
+ background-position: -286px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryHRIcon {
+ background-position: -308px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCUIcon {
+ background-position: -330px -45px;
+ width: 22px;
+ height: 11px;
+}
+.countryCYIcon {
+ background-position: -352px -43px;
+ width: 22px;
+ height: 13px;
+}
+.countryCZIcon {
+ background-position: -374px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryDKIcon {
+ background-position: -396px -39px;
+ width: 22px;
+ height: 17px;
+}
+.countryDJIcon {
+ background-position: -418px -41px;
+ width: 22px;
+ height: 15px;
+}
+.countryDMIcon {
+ background-position: 0px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryDOIcon {
+ background-position: -22px -63px;
+ width: 22px;
+ height: 14px;
+}
+.countryECIcon {
+ background-position: -44px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryEGIcon {
+ background-position: -66px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countrySVIcon {
+ background-position: -88px -65px;
+ width: 22px;
+ height: 12px;
+}
+.countryGQIcon {
+ background-position: -110px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryERIcon {
+ background-position: -132px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryEEIcon {
+ background-position: -154px -63px;
+ width: 22px;
+ height: 14px;
+}
+.countryETIcon {
+ background-position: -176px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFKIcon {
+ background-position: -198px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFOIcon {
+ background-position: -220px -61px;
+ width: 22px;
+ height: 16px;
+}
+.countryFJIcon {
+ background-position: -242px -66px;
+ width: 22px;
+ height: 11px;
+}
+.countryFIIcon {
+ background-position: -264px -64px;
+ width: 22px;
+ height: 13px;
+}
+.countryFRIcon {
+ background-position: -286px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGFIcon {
+ background-position: -308px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryPFIcon {
+ background-position: -330px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryTFIcon {
+ background-position: -352px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGAIcon {
+ background-position: -374px -60px;
+ width: 22px;
+ height: 17px;
+}
+.countryGMIcon {
+ background-position: -396px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryGEIcon {
+ background-position: -418px -62px;
+ width: 22px;
+ height: 15px;
+}
+.countryDEIcon {
+ background-position: 0px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGHIcon {
+ background-position: -22px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGIIcon {
+ background-position: -44px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryGRIcon {
+ background-position: -66px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGLIcon {
+ background-position: -88px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGDIcon {
+ background-position: -110px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGPIcon {
+ background-position: -132px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGUIcon {
+ background-position: -154px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryGTIcon {
+ background-position: -176px -87px;
+ width: 22px;
+ height: 14px;
+}
+.countryGGIcon {
+ background-position: -198px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGNIcon {
+ background-position: -220px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryGWIcon {
+ background-position: -242px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryGYIcon {
+ background-position: -264px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryHTIcon {
+ background-position: -286px -88px;
+ width: 22px;
+ height: 13px;
+}
+.countryHMIcon {
+ background-position: -308px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryVAIcon {
+ background-position: -330px -81px;
+ width: 20px;
+ height: 20px;
+}
+.countryHNIcon {
+ background-position: -350px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryHKIcon {
+ background-position: -372px -86px;
+ width: 22px;
+ height: 15px;
+}
+.countryHUIcon {
+ background-position: -394px -90px;
+ width: 22px;
+ height: 11px;
+}
+.countryISIcon {
+ background-position: -416px -85px;
+ width: 22px;
+ height: 16px;
+}
+.countryINIcon {
+ background-position: 0px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIDIcon {
+ background-position: -22px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIRIcon {
+ background-position: -44px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryIQIcon {
+ background-position: -66px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryIEIcon {
+ background-position: -88px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryIMIcon {
+ background-position: -110px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryILIcon {
+ background-position: -132px -105px;
+ width: 22px;
+ height: 16px;
+}
+.countryITIcon {
+ background-position: -154px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryJMIcon {
+ background-position: -176px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryJPIcon {
+ background-position: -198px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryJEIcon {
+ background-position: -220px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryJOIcon {
+ background-position: -242px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKZIcon {
+ background-position: -264px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKEIcon {
+ background-position: -286px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryKIIcon {
+ background-position: -308px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKPIcon {
+ background-position: -330px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKRIcon {
+ background-position: -352px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryKWIcon {
+ background-position: -374px -110px;
+ width: 22px;
+ height: 11px;
+}
+.countryKGIcon {
+ background-position: -396px -108px;
+ width: 22px;
+ height: 13px;
+}
+.countryLAIcon {
+ background-position: -418px -106px;
+ width: 22px;
+ height: 15px;
+}
+.countryLVIcon {
+ background-position: 0px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryLBIcon {
+ background-position: -22px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryLSIcon {
+ background-position: -44px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryLRIcon {
+ background-position: -66px -128px;
+ width: 22px;
+ height: 12px;
+}
+.countryLYIcon {
+ background-position: -88px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryLIIcon {
+ background-position: -110px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryLTIcon {
+ background-position: -132px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryLUIcon {
+ background-position: -154px -127px;
+ width: 22px;
+ height: 13px;
+}
+.countryMOIcon {
+ background-position: -176px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMKIcon {
+ background-position: -198px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryMGIcon {
+ background-position: -220px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMWIcon {
+ background-position: -242px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMYIcon {
+ background-position: -264px -129px;
+ width: 22px;
+ height: 11px;
+}
+.countryMVIcon {
+ background-position: -286px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMLIcon {
+ background-position: -308px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMTIcon {
+ background-position: -330px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMHIcon {
+ background-position: -352px -128px;
+ width: 22px;
+ height: 12px;
+}
+.countryMQIcon {
+ background-position: -374px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMRIcon {
+ background-position: -396px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryMUIcon {
+ background-position: -418px -125px;
+ width: 22px;
+ height: 15px;
+}
+.countryYTIcon {
+ background-position: 0px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMXIcon {
+ background-position: -22px -151px;
+ width: 22px;
+ height: 13px;
+}
+.countryFMIcon {
+ background-position: -44px -152px;
+ width: 22px;
+ height: 12px;
+}
+.countryMDIcon {
+ background-position: -66px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMCIcon {
+ background-position: -88px -146px;
+ width: 22px;
+ height: 18px;
+}
+.countryMNIcon {
+ background-position: -110px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMEIcon {
+ background-position: -132px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMSIcon {
+ background-position: -154px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryMAIcon {
+ background-position: -176px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMZIcon {
+ background-position: -198px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryMMIcon {
+ background-position: -220px -152px;
+ width: 22px;
+ height: 12px;
+}
+.countryNAIcon {
+ background-position: -242px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNRIcon {
+ background-position: -264px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryNPIcon {
+ background-position: -286px -144px;
+ width: 16px;
+ height: 20px;
+}
+.countryNLIcon {
+ background-position: -302px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryANIcon {
+ background-position: -324px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNCIcon {
+ background-position: -346px -149px;
+ width: 22px;
+ height: 15px;
+}
+.countryNZIcon {
+ background-position: -368px -153px;
+ width: 22px;
+ height: 11px;
+}
+.countryNIIcon {
+ background-position: -390px -151px;
+ width: 22px;
+ height: 13px;
+}
+.countryNEIcon {
+ background-position: -412px -145px;
+ width: 22px;
+ height: 19px;
+}
+.countryNGIcon {
+ background-position: 0px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNUIcon {
+ background-position: -22px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNFIcon {
+ background-position: -44px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryMPIcon {
+ background-position: -66px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryNOIcon {
+ background-position: -88px -169px;
+ width: 22px;
+ height: 16px;
+}
+.countryOMIcon {
+ background-position: -110px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPKIcon {
+ background-position: -132px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPWIcon {
+ background-position: -154px -171px;
+ width: 22px;
+ height: 14px;
+}
+.countryPSIcon {
+ background-position: -176px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPAIcon {
+ background-position: -198px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPGIcon {
+ background-position: -220px -168px;
+ width: 22px;
+ height: 17px;
+}
+.countryPYIcon {
+ background-position: -242px -172px;
+ width: 22px;
+ height: 13px;
+}
+.countryPEIcon {
+ background-position: -264px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPHIcon {
+ background-position: -286px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPNIcon {
+ background-position: -308px -174px;
+ width: 22px;
+ height: 11px;
+}
+.countryPLIcon {
+ background-position: -330px -171px;
+ width: 22px;
+ height: 14px;
+}
+.countryPTIcon {
+ background-position: -352px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryPRIcon {
+ background-position: -374px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryQAIcon {
+ background-position: -396px -176px;
+ width: 22px;
+ height: 9px;
+}
+.countryREIcon {
+ background-position: -418px -170px;
+ width: 22px;
+ height: 15px;
+}
+.countryROIcon {
+ background-position: 0px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRUIcon {
+ background-position: -22px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRWIcon {
+ background-position: -44px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySHIcon {
+ background-position: -66px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countryKNIcon {
+ background-position: -88px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryLCIcon {
+ background-position: -110px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countryPMIcon {
+ background-position: -132px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryVCIcon {
+ background-position: -154px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryWSIcon {
+ background-position: -176px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySMIcon {
+ background-position: -198px -189px;
+ width: 22px;
+ height: 17px;
+}
+.countrySTIcon {
+ background-position: -220px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySAIcon {
+ background-position: -242px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySNIcon {
+ background-position: -264px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countryRSIcon {
+ background-position: -286px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySCIcon {
+ background-position: -308px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySLIcon {
+ background-position: -330px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySGIcon {
+ background-position: -352px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySKIcon {
+ background-position: -374px -191px;
+ width: 22px;
+ height: 15px;
+}
+.countrySIIcon {
+ background-position: -396px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySBIcon {
+ background-position: -418px -195px;
+ width: 22px;
+ height: 11px;
+}
+.countrySOIcon {
+ background-position: 0px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryZAIcon {
+ background-position: -22px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryGSIcon {
+ background-position: -44px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryESIcon {
+ background-position: -66px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryLKIcon {
+ background-position: -88px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countrySDIcon {
+ background-position: -110px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countrySRIcon {
+ background-position: -132px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countrySJIcon {
+ background-position: -154px -214px;
+ width: 22px;
+ height: 16px;
+}
+.countrySZIcon {
+ background-position: -176px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countrySEIcon {
+ background-position: -198px -216px;
+ width: 22px;
+ height: 14px;
+}
+.countryCHIcon {
+ background-position: -220px -210px;
+ width: 20px;
+ height: 20px;
+}
+.countrySYIcon {
+ background-position: -240px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTWIcon {
+ background-position: -262px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTJIcon {
+ background-position: -284px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTZIcon {
+ background-position: -306px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTHIcon {
+ background-position: -328px -215px;
+ width: 22px;
+ height: 15px;
+}
+.countryTLIcon {
+ background-position: -350px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTGIcon {
+ background-position: -372px -216px;
+ width: 22px;
+ height: 14px;
+}
+.countryTKIcon {
+ background-position: -394px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTOIcon {
+ background-position: -416px -219px;
+ width: 22px;
+ height: 11px;
+}
+.countryTTIcon {
+ background-position: 0px -236px;
+ width: 22px;
+ height: 13px;
+}
+.countryTNIcon {
+ background-position: -22px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTRIcon {
+ background-position: -44px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTMIcon {
+ background-position: -66px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryTCIcon {
+ background-position: -88px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryTVIcon {
+ background-position: -110px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryUGIcon {
+ background-position: -132px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryUAIcon {
+ background-position: -154px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryAEIcon {
+ background-position: -176px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryGBIcon {
+ background-position: -198px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryUSIcon {
+ background-position: -220px -237px;
+ width: 22px;
+ height: 12px;
+}
+.countryUMIcon {
+ background-position: -242px -237px;
+ width: 22px;
+ height: 12px;
+}
+.countryUYIcon {
+ background-position: -264px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryUZIcon {
+ background-position: -286px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryVUIcon {
+ background-position: -308px -236px;
+ width: 22px;
+ height: 13px;
+}
+.countryVEIcon {
+ background-position: -330px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryVNIcon {
+ background-position: -352px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryVGIcon {
+ background-position: -374px -238px;
+ width: 22px;
+ height: 11px;
+}
+.countryVIIcon {
+ background-position: -396px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryWFIcon {
+ background-position: -418px -234px;
+ width: 22px;
+ height: 15px;
+}
+.countryEHIcon {
+ background-position: 0px -257px;
+ width: 22px;
+ height: 11px;
+}
+.countryYEIcon {
+ background-position: -22px -253px;
+ width: 22px;
+ height: 15px;
+}
+.countryZMIcon {
+ background-position: -44px -253px;
+ width: 22px;
+ height: 15px;
+}
+.countryZWIcon {
+ background-position: -66px -257px;
+ width: 22px;
+ height: 11px;
+}
diff --git a/includes/js/dijit/demos/i18n/flags.png b/includes/js/dijit/demos/i18n/flags.png
new file mode 100644
index 0000000..e8eaace
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/flags.png
Binary files differ
diff --git a/includes/js/dijit/demos/i18n/generate.html b/includes/js/dijit/demos/i18n/generate.html
new file mode 100644
index 0000000..39f703d
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/generate.html
@@ -0,0 +1,2353 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script>
+ dojo.require("dijit.layout.ContentPane");
+ </script>
+ <script>
+
+ function t(node){ return node.innerText || node.textContent; };
+
+ var languages, langCountryMap, continents, countries;
+
+ // Call this first, to load JSON data from files (have to wait for load to finish)
+ function load(){
+ // Load list of continents
+ var d = dojo.xhrGet({url: "continents.json", handleAs: "json-comment-optional"});
+ d.addCallback(function(data){
+ continents = data;
+ });
+
+ // Load mapping between countries and languages
+ var d = dojo.xhrGet({url: "langCountryMap.json", handleAs: "json-comment-optional"});
+ d.addCallback(function(data){
+ langCountryMap = data;
+ dojo.forEach(langCountryMap, function(entry){
+ entry.iso = entry.language + "_" + entry.country;
+ });
+ });
+
+ // Load list of languages
+ var d2 = dojo.xhrGet({url: "languages.json", handleAs: "json-comment-optional"});
+ d2.addCallback(function(data){
+ data = dojo.filter(data, function(item){
+ return item.name && item.countries.length;
+ });
+
+ // each data item X now contains a list every language, as written in
+ // language X, but actually need to invert that for this demo
+ languages = dojo.map(data, function(l){
+ var item = {type: "language", iso: l.iso, name: l.name, countries: l.countries};
+ dojo.forEach(data, function(fl){
+ if(fl[l.iso]){
+ if(item.iso=="en") console.log("in " + fl.name + " the language " + l.name + "/" + l.iso + " is spelled as " + fl[l.iso]);
+ item[fl.iso]=fl[l.iso];
+ }
+ });
+ if(item.iso == "en") console.log(item);
+ return item;
+ });
+ });
+ }
+
+ function generate(){
+ // mapping from country to continent
+ var country2continent = {};
+ dojo.query("tr", "continents").forEach(function(row){
+ var continent = t(dojo.query("td", row)[0]);
+ var country = t(dojo.query("a", row)[1]);
+ country2continent[country] = continent;
+ });
+
+ // Generate country items
+ countries = dojo.query("tr", "source").
+ filter(function(row){ return dojo.query("a", row).length && dojo.query("td", row).length; } ).
+ map(function(row){
+ var iso = dojo.query("td", row)[3];
+ iso = t(iso);
+ var a = dojo.query("td:nth-child(1) a:nth-child(2)", row)[0];
+ var name = t(a);
+ var country = {
+ type: "country",
+ iso: iso,
+ name: name,
+ href: "http://en.wikipedia.org/wiki" + a.href.replace(/.*\/wiki/, "")
+ };
+ if(country2continent[name]){
+ country.continent = country2continent[name];
+ }
+ country.languages = dojo.filter(langCountryMap, function(x){
+ return x.country==iso;
+ }).map(function(x){
+ return {_reference: x.language};
+ });
+ return country;
+ });
+
+ // generate json for data
+ var out = dojo.byId("json");
+ console.debug(countries);
+ var json = [].concat(languages, langCountryMap, continents, dojo.map(countries, function(x){return x;}));
+ out.value = dojo.toJson(json, true);
+ }
+ </script>
+</head>
+<body>
+<h1> Country / Language JSON Database Generator </h1>
+<p>push step #1 then wait, then step #2</p>
+<button onclick="load();">Step #1</button>
+<button onclick="generate();">Step #2</button>
+
+<h1>JSON</h1>
+<textarea id="json" cols=100 rows=20></textarea>
+
+
+<h1>Country names, flags, and ISO code</h1>
+<p>data taken from <a href="http://en.wikipedia.org/wiki/ISO_3166-1">wikipedia ISO 3166-1 site</a></p>
+<table id="source" style="height: 300px; overflow: auto;">
+<tbody>
+
+<tr>
+<th width="300">Official country names used by the ISO 3166/MA</th>
+<th><a href="/wiki/ISO_3166-1_numeric" title="ISO 3166-1 numeric">Numeric</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-3" title="ISO 3166-1 alpha-3">Alpha-3</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-2" title="ISO 3166-1 alpha-2">Alpha-2</a></th>
+<th>Local ISO codes</th>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></td>
+<td>004</td>
+
+<td>AFG</td>
+<td id="AF">AF</td>
+<td><a href="/wiki/ISO_3166-2:AF" title="ISO 3166-2:AF">ISO 3166-2:AF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aaland.svg" class="image" title="Flag of Åland"></a>&nbsp;<a href="/wiki/%C3%85land" title="Åland">Åland Islands</a></td>
+<td>248</td>
+<td>ALA</td>
+<td id="AX">AX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AX&amp;action=edit" class="new" title="ISO 3166-2:AX">ISO 3166-2:AX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></td>
+<td>008</td>
+<td>ALB</td>
+<td id="AL">AL</td>
+<td><a href="/wiki/ISO_3166-2:AL" title="ISO 3166-2:AL">ISO 3166-2:AL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></td>
+<td>012</td>
+
+<td>DZA</td>
+<td id="DZ">DZ</td>
+<td><a href="/wiki/ISO_3166-2:DZ" title="ISO 3166-2:DZ">ISO 3166-2:DZ</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></td>
+<td>016</td>
+<td>ASM</td>
+<td id="AS">AS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AS&amp;action=edit" class="new" title="ISO 3166-2:AS">ISO 3166-2:AS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></td>
+<td>020</td>
+<td>AND</td>
+<td id="AD">AD</td>
+<td><a href="/wiki/ISO_3166-2:AD" title="ISO 3166-2:AD">ISO 3166-2:AD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></td>
+<td>024</td>
+
+<td>AGO</td>
+<td id="AO">AO</td>
+<td><a href="/wiki/ISO_3166-2:AO" title="ISO 3166-2:AO">ISO 3166-2:AO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></td>
+<td>660</td>
+<td>AIA</td>
+<td id="AI">AI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AI&amp;action=edit" class="new" title="ISO 3166-2:AI">ISO 3166-2:AI</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antarctica.svg" class="image" title="Flag of Antarctica"></a>&nbsp;<a href="/wiki/Antarctica" title="Antarctica">Antarctica</a></td>
+<td>010</td>
+<td>ATA</td>
+<td id="AQ">AQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AQ&amp;action=edit" class="new" title="ISO 3166-2:AQ">ISO 3166-2:AQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></td>
+<td>028</td>
+
+<td>ATG</td>
+<td id="AG">AG</td>
+<td><a href="/wiki/ISO_3166-2:AG" title="ISO 3166-2:AG">ISO 3166-2:AG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></td>
+<td>032</td>
+<td>ARG</td>
+<td id="AR">AR</td>
+<td><a href="/wiki/ISO_3166-2:AR" title="ISO 3166-2:AR">ISO 3166-2:AR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></td>
+<td>051</td>
+<td>ARM</td>
+<td id="AM">AM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AM&amp;action=edit" class="new" title="ISO 3166-2:AM">ISO 3166-2:AM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></td>
+<td>533</td>
+
+<td>ABW</td>
+<td id="AW">AW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AW&amp;action=edit" class="new" title="ISO 3166-2:AW">ISO 3166-2:AW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></td>
+<td>036</td>
+<td>AUS</td>
+<td id="AU">AU</td>
+<td><a href="/wiki/ISO_3166-2:AU" title="ISO 3166-2:AU">ISO 3166-2:AU</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></td>
+<td>040</td>
+<td>AUT</td>
+<td id="AT">AT</td>
+<td><a href="/wiki/ISO_3166-2:AT" title="ISO 3166-2:AT">ISO 3166-2:AT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></td>
+<td>031</td>
+
+<td>AZE</td>
+<td id="AZ">AZ</td>
+<td><a href="/wiki/ISO_3166-2:AZ" title="ISO 3166-2:AZ">ISO 3166-2:AZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></td>
+<td>044</td>
+<td>BHS</td>
+
+<td id="BS">BS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BS&amp;action=edit" class="new" title="ISO 3166-2:BS">ISO 3166-2:BS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></td>
+<td>048</td>
+<td>BHR</td>
+<td id="BH">BH</td>
+<td><a href="/wiki/ISO_3166-2:BH" title="ISO 3166-2:BH">ISO 3166-2:BH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></td>
+<td>050</td>
+<td>BGD</td>
+<td id="BD">BD</td>
+<td><a href="/wiki/ISO_3166-2:BD" title="ISO 3166-2:BD">ISO 3166-2:BD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></td>
+<td>052</td>
+
+<td>BRB</td>
+<td id="BB">BB</td>
+<td><a href="/wiki/ISO_3166-2:BB" title="ISO 3166-2:BB">ISO 3166-2:BB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></td>
+<td>112</td>
+<td>BLR</td>
+<td id="BY">BY</td>
+<td><a href="/wiki/ISO_3166-2:BY" title="ISO 3166-2:BY">ISO 3166-2:BY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></td>
+<td>056</td>
+<td>BEL</td>
+<td id="BE">BE</td>
+<td><a href="/wiki/ISO_3166-2:BE" title="ISO 3166-2:BE">ISO 3166-2:BE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></td>
+<td>084</td>
+
+<td>BLZ</td>
+<td id="BZ">BZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BZ&amp;action=edit" class="new" title="ISO 3166-2:BZ">ISO 3166-2:BZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></td>
+<td>204</td>
+<td>BEN</td>
+<td id="BJ">BJ</td>
+<td><a href="/wiki/ISO_3166-2:BJ" title="ISO 3166-2:BJ">ISO 3166-2:BJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></td>
+<td>060</td>
+<td>BMU</td>
+<td id="BM">BM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BM&amp;action=edit" class="new" title="ISO 3166-2:BM">ISO 3166-2:BM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></td>
+<td>064</td>
+
+<td>BTN</td>
+<td id="BT">BT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BT&amp;action=edit" class="new" title="ISO 3166-2:BT">ISO 3166-2:BT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></td>
+<td>068</td>
+<td>BOL</td>
+<td id="BO">BO</td>
+<td><a href="/wiki/ISO_3166-2:BO" title="ISO 3166-2:BO">ISO 3166-2:BO</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></td>
+<td>070</td>
+<td>BIH</td>
+<td id="BA">BA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BA&amp;action=edit" class="new" title="ISO 3166-2:BA">ISO 3166-2:BA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></td>
+<td>072</td>
+
+<td>BWA</td>
+<td id="BW">BW</td>
+<td><a href="/wiki/ISO_3166-2:BW" title="ISO 3166-2:BW">ISO 3166-2:BW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></td>
+<td>074</td>
+<td>BVT</td>
+<td id="BV">BV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BV&amp;action=edit" class="new" title="ISO 3166-2:BV">ISO 3166-2:BV</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></td>
+<td>076</td>
+<td>BRA</td>
+<td id="BR">BR</td>
+<td><a href="/wiki/ISO_3166-2:BR" title="ISO 3166-2:BR">ISO 3166-2:BR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></td>
+<td>086</td>
+
+<td>IOT</td>
+<td id="IO">IO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IO&amp;action=edit" class="new" title="ISO 3166-2:IO">ISO 3166-2:IO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei Darussalam</a></td>
+<td>096</td>
+<td>BRN</td>
+<td id="BN">BN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BN&amp;action=edit" class="new" title="ISO 3166-2:BN">ISO 3166-2:BN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></td>
+<td>100</td>
+<td>BGR</td>
+<td id="BG">BG</td>
+<td><a href="/wiki/ISO_3166-2:BG" title="ISO 3166-2:BG">ISO 3166-2:BG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></td>
+<td>854</td>
+
+<td>BFA</td>
+<td id="BF">BF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BF&amp;action=edit" class="new" title="ISO 3166-2:BF">ISO 3166-2:BF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></td>
+<td>108</td>
+<td>BDI</td>
+<td id="BI">BI</td>
+<td><a href="/wiki/ISO_3166-2:BI" title="ISO 3166-2:BI">ISO 3166-2:BI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></td>
+<td>116</td>
+<td>KHM</td>
+<td id="KH">KH</td>
+<td><a href="/wiki/ISO_3166-2:KH" title="ISO 3166-2:KH">ISO 3166-2:KH</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></td>
+<td>120</td>
+<td>CMR</td>
+<td id="CM">CM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CM&amp;action=edit" class="new" title="ISO 3166-2:CM">ISO 3166-2:CM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></td>
+<td>124</td>
+<td>CAN</td>
+
+<td id="CA">CA</td>
+<td><a href="/wiki/ISO_3166-2:CA" title="ISO 3166-2:CA">ISO 3166-2:CA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></td>
+<td>132</td>
+<td>CPV</td>
+<td id="CV">CV</td>
+<td><a href="/wiki/ISO_3166-2:CV" title="ISO 3166-2:CV">ISO 3166-2:CV</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></td>
+<td>136</td>
+<td>CYM</td>
+<td id="KY">KY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KY&amp;action=edit" class="new" title="ISO 3166-2:KY">ISO 3166-2:KY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></td>
+<td>140</td>
+
+<td>CAF</td>
+<td id="CF">CF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CF&amp;action=edit" class="new" title="ISO 3166-2:CF">ISO 3166-2:CF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></td>
+<td>148</td>
+<td>TCD</td>
+<td id="TD">TD</td>
+<td><a href="/wiki/ISO_3166-2:TD" title="ISO 3166-2:TD">ISO 3166-2:TD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></td>
+<td>152</td>
+<td>CHL</td>
+<td id="CL">CL</td>
+<td><a href="/wiki/ISO_3166-2:CL" title="ISO 3166-2:CL">ISO 3166-2:CL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China</a></td>
+<td>156</td>
+
+<td>CHN</td>
+<td id="CN">CN</td>
+<td><a href="/wiki/ISO_3166-2:CN" title="ISO 3166-2:CN">ISO 3166-2:CN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></td>
+<td>162</td>
+<td>CXR</td>
+<td id="CX">CX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CX&amp;action=edit" class="new" title="ISO 3166-2:CX">ISO 3166-2:CX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></td>
+<td>166</td>
+<td>CCK</td>
+<td id="CC">CC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CC&amp;action=edit" class="new" title="ISO 3166-2:CC">ISO 3166-2:CC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></td>
+<td>170</td>
+
+<td>COL</td>
+<td id="CO">CO</td>
+<td><a href="/wiki/ISO_3166-2:CO" title="ISO 3166-2:CO">ISO 3166-2:CO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></td>
+<td>174</td>
+<td>COM</td>
+<td id="KM">KM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KM&amp;action=edit" class="new" title="ISO 3166-2:KM">ISO 3166-2:KM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo</a></td>
+<td>178</td>
+<td>COG</td>
+<td id="CG">CG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CG&amp;action=edit" class="new" title="ISO 3166-2:CG">ISO 3166-2:CG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of the</a></td>
+<td>180</td>
+
+<td>COD</td>
+<td id="CD">CD</td>
+<td><a href="/wiki/ISO_3166-2:CD" title="ISO 3166-2:CD">ISO 3166-2:CD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></td>
+<td>184</td>
+<td>COK</td>
+<td id="CK">CK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CK&amp;action=edit" class="new" title="ISO 3166-2:CK">ISO 3166-2:CK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></td>
+<td>188</td>
+<td>CRI</td>
+<td id="CR">CR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CR&amp;action=edit" class="new" title="ISO 3166-2:CR">ISO 3166-2:CR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></td>
+<td>384</td>
+
+<td>CIV</td>
+<td id="CI">CI</td>
+<td><a href="/wiki/ISO_3166-2:CI" title="ISO 3166-2:CI">ISO 3166-2:CI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></td>
+<td>191</td>
+<td>HRV</td>
+<td id="HR">HR</td>
+<td><a href="/wiki/ISO_3166-2:HR" title="ISO 3166-2:HR">ISO 3166-2:HR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></td>
+<td>192</td>
+<td>CUB</td>
+<td id="CU">CU</td>
+<td><a href="/wiki/ISO_3166-2:CU" title="ISO 3166-2:CU">ISO 3166-2:CU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></td>
+<td>196</td>
+
+<td>CYP</td>
+<td id="CY">CY</td>
+<td><a href="/wiki/ISO_3166-2:CY" title="ISO 3166-2:CY">ISO 3166-2:CY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></td>
+<td>203</td>
+<td>CZE</td>
+<td id="CZ">CZ</td>
+<td><a href="/wiki/ISO_3166-2:CZ" title="ISO 3166-2:CZ">ISO 3166-2:CZ</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></td>
+<td>208</td>
+<td>DNK</td>
+<td id="DK">DK</td>
+<td><a href="/wiki/ISO_3166-2:DK" title="ISO 3166-2:DK">ISO 3166-2:DK</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></td>
+<td>262</td>
+<td>DJI</td>
+<td id="DJ">DJ</td>
+<td><a href="/wiki/ISO_3166-2:DJ" title="ISO 3166-2:DJ">ISO 3166-2:DJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></td>
+<td>212</td>
+<td>DMA</td>
+
+<td id="DM">DM</td>
+<td><a href="/wiki/ISO_3166-2:DM" title="ISO 3166-2:DM">ISO 3166-2:DM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></td>
+<td>214</td>
+<td>DOM</td>
+<td id="DO">DO</td>
+<td><a href="/wiki/ISO_3166-2:DO" title="ISO 3166-2:DO">ISO 3166-2:DO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></td>
+<td>218</td>
+<td>ECU</td>
+<td id="EC">EC</td>
+<td><a href="/wiki/ISO_3166-2:EC" title="ISO 3166-2:EC">ISO 3166-2:EC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></td>
+
+<td>818</td>
+<td>EGY</td>
+<td id="EG">EG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EG&amp;action=edit" class="new" title="ISO 3166-2:EG">ISO 3166-2:EG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></td>
+<td>222</td>
+<td>SLV</td>
+<td id="SV">SV</td>
+
+<td><a href="/wiki/ISO_3166-2:SV" title="ISO 3166-2:SV">ISO 3166-2:SV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></td>
+<td>226</td>
+<td>GNQ</td>
+<td id="GQ">GQ</td>
+<td><a href="/wiki/ISO_3166-2:GQ" title="ISO 3166-2:GQ">ISO 3166-2:GQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></td>
+
+<td>232</td>
+<td>ERI</td>
+<td id="ER">ER</td>
+<td><a href="/wiki/ISO_3166-2:ER" title="ISO 3166-2:ER">ISO 3166-2:ER</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></td>
+<td>233</td>
+<td>EST</td>
+<td id="EE">EE</td>
+
+<td><a href="/wiki/ISO_3166-2:EE" title="ISO 3166-2:EE">ISO 3166-2:EE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></td>
+<td>231</td>
+<td>ETH</td>
+<td id="ET">ET</td>
+<td><a href="/wiki/ISO_3166-2:ET" title="ISO 3166-2:ET">ISO 3166-2:ET</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands (Malvinas)</a></td>
+<td>238</td>
+<td>FLK</td>
+<td id="FK">FK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FK&amp;action=edit" class="new" title="ISO 3166-2:FK">ISO 3166-2:FK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></td>
+<td>234</td>
+
+<td>FRO</td>
+<td id="FO">FO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FO&amp;action=edit" class="new" title="ISO 3166-2:FO">ISO 3166-2:FO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></td>
+<td>242</td>
+<td>FJI</td>
+<td id="FJ">FJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FJ&amp;action=edit" class="new" title="ISO 3166-2:FJ">ISO 3166-2:FJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></td>
+<td>246</td>
+<td>FIN</td>
+<td id="FI">FI</td>
+<td><a href="/wiki/ISO_3166-2:FI" title="ISO 3166-2:FI">ISO 3166-2:FI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a>&nbsp;<a href="/wiki/France" title="France">France</a></td>
+<td>250</td>
+
+<td>FRA</td>
+<td id="FR">FR</td>
+<td><a href="/wiki/ISO_3166-2:FR" title="ISO 3166-2:FR">ISO 3166-2:FR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></td>
+<td>254</td>
+<td>GUF</td>
+<td id="GF">GF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GF&amp;action=edit" class="new" title="ISO 3166-2:GF">ISO 3166-2:GF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></td>
+<td>258</td>
+<td>PYF</td>
+<td id="PF">PF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PF&amp;action=edit" class="new" title="ISO 3166-2:PF">ISO 3166-2:PF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></td>
+<td>260</td>
+
+<td>ATF</td>
+<td id="TF">TF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TF&amp;action=edit" class="new" title="ISO 3166-2:TF">ISO 3166-2:TF</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></td>
+<td>266</td>
+<td>GAB</td>
+
+<td id="GA">GA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GA&amp;action=edit" class="new" title="ISO 3166-2:GA">ISO 3166-2:GA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></td>
+<td>270</td>
+<td>GMB</td>
+<td id="GM">GM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GM&amp;action=edit" class="new" title="ISO 3166-2:GM">ISO 3166-2:GM</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></td>
+<td>268</td>
+<td>GEO</td>
+<td id="GE">GE</td>
+<td><a href="/wiki/ISO_3166-2:GE" title="ISO 3166-2:GE">ISO 3166-2:GE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></td>
+<td>276</td>
+
+<td>DEU</td>
+<td id="DE">DE</td>
+<td><a href="/wiki/ISO_3166-2:DE" title="ISO 3166-2:DE">ISO 3166-2:DE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></td>
+<td>288</td>
+<td>GHA</td>
+<td id="GH">GH</td>
+<td><a href="/wiki/ISO_3166-2:GH" title="ISO 3166-2:GH">ISO 3166-2:GH</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></td>
+<td>292</td>
+<td>GIB</td>
+<td id="GI">GI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GI&amp;action=edit" class="new" title="ISO 3166-2:GI">ISO 3166-2:GI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></td>
+<td>300</td>
+
+<td>GRC</td>
+<td id="GR">GR</td>
+<td><a href="/wiki/ISO_3166-2:GR" title="ISO 3166-2:GR">ISO 3166-2:GR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></td>
+<td>304</td>
+<td>GRL</td>
+<td id="GL">GL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GL&amp;action=edit" class="new" title="ISO 3166-2:GL">ISO 3166-2:GL</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></td>
+<td>308</td>
+<td>GRD</td>
+<td id="GD">GD</td>
+<td><a href="/wiki/ISO_3166-2:GD" title="ISO 3166-2:GD">ISO 3166-2:GD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a><span class="reference plainlinksneverexpand" id="ref_COM"><sup><a href="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM" class="external autonumber" title="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM" rel="nofollow">[2]</a></sup></span></td>
+
+<td>312</td>
+<td>GLP</td>
+<td id="GP">GP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GP&amp;action=edit" class="new" title="ISO 3166-2:GP">ISO 3166-2:GP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></td>
+<td>316</td>
+<td>GUM</td>
+<td id="GU">GU</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:GU&amp;action=edit" class="new" title="ISO 3166-2:GU">ISO 3166-2:GU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></td>
+<td>320</td>
+<td>GTM</td>
+<td id="GT">GT</td>
+<td><a href="/wiki/ISO_3166-2:GT" title="ISO 3166-2:GT">ISO 3166-2:GT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></td>
+
+<td>831</td>
+<td>GGY</td>
+<td id="GG">GG</td>
+<td><a href="/wiki/ISO_3166-2:GG" title="ISO 3166-2:GG">ISO 3166-2:GG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></td>
+<td>324</td>
+<td>GIN</td>
+<td id="GN">GN</td>
+
+<td><a href="/wiki/ISO_3166-2:GN" title="ISO 3166-2:GN">ISO 3166-2:GN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></td>
+<td>624</td>
+<td>GNB</td>
+<td id="GW">GW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GW&amp;action=edit" class="new" title="ISO 3166-2:GW">ISO 3166-2:GW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></td>
+
+<td>328</td>
+<td>GUY</td>
+<td id="GY">GY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GY&amp;action=edit" class="new" title="ISO 3166-2:GY">ISO 3166-2:GY</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></td>
+<td>332</td>
+
+<td>HTI</td>
+<td id="HT">HT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HT&amp;action=edit" class="new" title="ISO 3166-2:HT">ISO 3166-2:HT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></td>
+<td>334</td>
+<td>HMD</td>
+<td id="HM">HM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HM&amp;action=edit" class="new" title="ISO 3166-2:HM">ISO 3166-2:HM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Holy See (Vatican City State)</a></td>
+<td>336</td>
+<td>VAT</td>
+<td id="VA">VA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VA&amp;action=edit" class="new" title="ISO 3166-2:VA">ISO 3166-2:VA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></td>
+<td>340</td>
+
+<td>HND</td>
+<td id="HN">HN</td>
+<td><a href="/wiki/ISO_3166-2:HN" title="ISO 3166-2:HN">ISO 3166-2:HN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></td>
+<td>344</td>
+<td>HKG</td>
+<td id="HK">HK</td>
+<td><a href="/wiki/ISO_3166-2:HK" title="ISO 3166-2:HK">ISO 3166-2:HK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></td>
+<td>348</td>
+<td>HUN</td>
+<td id="HU">HU</td>
+<td><a href="/wiki/ISO_3166-2:HU" title="ISO 3166-2:HU">ISO 3166-2:HU</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></td>
+<td>352</td>
+<td>ISL</td>
+<td id="IS">IS</td>
+<td><a href="/wiki/ISO_3166-2:IS" title="ISO 3166-2:IS">ISO 3166-2:IS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"></a>&nbsp;<a href="/wiki/India" title="India">India</a></td>
+<td>356</td>
+<td>IND</td>
+
+<td id="IN">IN</td>
+<td><a href="/wiki/ISO_3166-2:IN" title="ISO 3166-2:IN">ISO 3166-2:IN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></td>
+<td>360</td>
+<td>IDN</td>
+<td id="ID">ID</td>
+<td><a href="/wiki/ISO_3166-2:ID" title="ISO 3166-2:ID">ISO 3166-2:ID</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran, Islamic Republic of</a></td>
+<td>364</td>
+<td>IRN</td>
+<td id="IR">IR</td>
+<td><a href="/wiki/ISO_3166-2:IR" title="ISO 3166-2:IR">ISO 3166-2:IR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></td>
+<td>368</td>
+
+<td>IRQ</td>
+<td id="IQ">IQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IQ&amp;action=edit" class="new" title="ISO 3166-2:IQ">ISO 3166-2:IQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></td>
+<td>372</td>
+<td>IRL</td>
+<td id="IE">IE</td>
+<td><a href="/wiki/ISO_3166-2:IE" title="ISO 3166-2:IE">ISO 3166-2:IE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></td>
+<td>833</td>
+<td>IMN</td>
+<td id="IM">IM</td>
+<td><a href="/wiki/ISO_3166-2:IM" title="ISO 3166-2:IM">ISO 3166-2:IM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></td>
+<td>376</td>
+
+<td>ISR</td>
+<td id="IL">IL</td>
+<td><a href="/wiki/ISO_3166-2:IL" title="ISO 3166-2:IL">ISO 3166-2:IL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></td>
+<td>380</td>
+<td>ITA</td>
+<td id="IT">IT</td>
+<td><a href="/wiki/ISO_3166-2:IT" title="ISO 3166-2:IT">ISO 3166-2:IT</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></td>
+<td>388</td>
+<td>JAM</td>
+<td id="JM">JM</td>
+<td><a href="/wiki/ISO_3166-2:JM" title="ISO 3166-2:JM">ISO 3166-2:JM</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></td>
+<td>392</td>
+<td>JPN</td>
+<td id="JP">JP</td>
+<td><a href="/wiki/ISO_3166-2:JP" title="ISO 3166-2:JP">ISO 3166-2:JP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></td>
+<td>832</td>
+<td>JEY</td>
+
+<td id="JE">JE</td>
+<td><a href="/wiki/ISO_3166-2:JE" title="ISO 3166-2:JE">ISO 3166-2:JE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></td>
+<td>400</td>
+<td>JOR</td>
+<td id="JO">JO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:JO&amp;action=edit" class="new" title="ISO 3166-2:JO">ISO 3166-2:JO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></td>
+<td>398</td>
+<td>KAZ</td>
+<td id="KZ">KZ</td>
+<td><a href="/wiki/ISO_3166-2:KZ" title="ISO 3166-2:KZ">ISO 3166-2:KZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></td>
+
+<td>404</td>
+<td>KEN</td>
+<td id="KE">KE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KE&amp;action=edit" class="new" title="ISO 3166-2:KE">ISO 3166-2:KE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></td>
+<td>296</td>
+<td>KIR</td>
+<td id="KI">KI</td>
+
+<td><a href="/wiki/ISO_3166-2:KI" title="ISO 3166-2:KI">ISO 3166-2:KI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></td>
+<td>408</td>
+<td>PRK</td>
+<td id="KP">KP</td>
+<td><a href="/wiki/ISO_3166-2:KP" title="ISO 3166-2:KP">ISO 3166-2:KP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></td>
+
+<td>410</td>
+<td>KOR</td>
+<td id="KR">KR</td>
+<td><a href="/wiki/ISO_3166-2:KR" title="ISO 3166-2:KR">ISO 3166-2:KR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></td>
+<td>414</td>
+<td>KWT</td>
+<td id="KW">KW</td>
+
+<td><a href="/wiki/ISO_3166-2:KW" title="ISO 3166-2:KW">ISO 3166-2:KW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></td>
+<td>417</td>
+<td>KGZ</td>
+<td id="KG">KG</td>
+<td><a href="/wiki/ISO_3166-2:KG" title="ISO 3166-2:KG">ISO 3166-2:KG</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Lao People's Democratic Republic</a></td>
+<td>418</td>
+<td>LAO</td>
+<td id="LA">LA</td>
+<td><a href="/wiki/ISO_3166-2:LA" title="ISO 3166-2:LA">ISO 3166-2:LA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></td>
+<td>428</td>
+
+<td>LVA</td>
+<td id="LV">LV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LV&amp;action=edit" class="new" title="ISO 3166-2:LV">ISO 3166-2:LV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></td>
+<td>422</td>
+<td>LBN</td>
+<td id="LB">LB</td>
+<td><a href="/wiki/ISO_3166-2:LB" title="ISO 3166-2:LB">ISO 3166-2:LB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></td>
+<td>426</td>
+<td>LSO</td>
+<td id="LS">LS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LS&amp;action=edit" class="new" title="ISO 3166-2:LS">ISO 3166-2:LS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></td>
+<td>430</td>
+
+<td>LBR</td>
+<td id="LR">LR</td>
+<td><a href="/wiki/ISO_3166-2:LR" title="ISO 3166-2:LR">ISO 3166-2:LR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libyan Arab Jamahiriya</a></td>
+<td>434</td>
+<td>LBY</td>
+<td id="LY">LY</td>
+<td><a href="/wiki/ISO_3166-2:LY" title="ISO 3166-2:LY">ISO 3166-2:LY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></td>
+<td>438</td>
+<td>LIE</td>
+<td id="LI">LI</td>
+<td><a href="/wiki/ISO_3166-2:LI" title="ISO 3166-2:LI">ISO 3166-2:LI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></td>
+<td>440</td>
+
+<td>LTU</td>
+<td id="LT">LT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LT&amp;action=edit" class="new" title="ISO 3166-2:LT">ISO 3166-2:LT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></td>
+<td>442</td>
+<td>LUX</td>
+<td id="LU">LU</td>
+<td><a href="/wiki/ISO_3166-2:LU" title="ISO 3166-2:LU">ISO 3166-2:LU</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macao</a></td>
+<td>446</td>
+<td>MAC</td>
+<td id="MO">MO</td>
+<td><a href="/wiki/ISO_3166-2:MO" title="ISO 3166-2:MO">ISO 3166-2:MO</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia, the former Yugoslav Republic of</a></td>
+<td>807</td>
+<td>MKD</td>
+<td id="MK">MK</td>
+<td><a href="/wiki/ISO_3166-2:MK" title="ISO 3166-2:MK">ISO 3166-2:MK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></td>
+<td>450</td>
+<td>MDG</td>
+
+<td id="MG">MG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MG&amp;action=edit" class="new" title="ISO 3166-2:MG">ISO 3166-2:MG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></td>
+<td>454</td>
+<td>MWI</td>
+<td id="MW">MW</td>
+<td><a href="/wiki/ISO_3166-2:MW" title="ISO 3166-2:MW">ISO 3166-2:MW</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></td>
+<td>458</td>
+<td>MYS</td>
+<td id="MY">MY</td>
+<td><a href="/wiki/ISO_3166-2:MY" title="ISO 3166-2:MY">ISO 3166-2:MY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></td>
+<td>462</td>
+
+<td>MDV</td>
+<td id="MV">MV</td>
+<td><a href="/wiki/ISO_3166-2:MV" title="ISO 3166-2:MV">ISO 3166-2:MV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></td>
+<td>466</td>
+<td>MLI</td>
+<td id="ML">ML</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ML&amp;action=edit" class="new" title="ISO 3166-2:ML">ISO 3166-2:ML</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></td>
+<td>470</td>
+<td>MLT</td>
+<td id="MT">MT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MT&amp;action=edit" class="new" title="ISO 3166-2:MT">ISO 3166-2:MT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></td>
+<td>584</td>
+
+<td>MHL</td>
+<td id="MH">MH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MH&amp;action=edit" class="new" title="ISO 3166-2:MH">ISO 3166-2:MH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></td>
+<td>474</td>
+<td>MTQ</td>
+<td id="MQ">MQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MQ&amp;action=edit" class="new" title="ISO 3166-2:MQ">ISO 3166-2:MQ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></td>
+<td>478</td>
+<td>MRT</td>
+<td id="MR">MR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MR&amp;action=edit" class="new" title="ISO 3166-2:MR">ISO 3166-2:MR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></td>
+<td>480</td>
+
+<td>MUS</td>
+<td id="MU">MU</td>
+<td><a href="/wiki/ISO_3166-2:MU" title="ISO 3166-2:MU">ISO 3166-2:MU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></td>
+<td>175</td>
+<td>MYT</td>
+<td id="YT">YT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:YT&amp;action=edit" class="new" title="ISO 3166-2:YT">ISO 3166-2:YT</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></td>
+<td>484</td>
+<td>MEX</td>
+<td id="MX">MX</td>
+<td><a href="/wiki/ISO_3166-2:MX" title="ISO 3166-2:MX">ISO 3166-2:MX</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia, Federated States of</a></td>
+<td>583</td>
+
+<td>FSM</td>
+<td id="FM">FM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FM&amp;action=edit" class="new" title="ISO 3166-2:FM">ISO 3166-2:FM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova, Republic of</a></td>
+<td>498</td>
+<td>MDA</td>
+<td id="MD">MD</td>
+<td><a href="/wiki/ISO_3166-2:MD" title="ISO 3166-2:MD">ISO 3166-2:MD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></td>
+<td>492</td>
+<td>MCO</td>
+<td id="MC">MC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MC&amp;action=edit" class="new" title="ISO 3166-2:MC">ISO 3166-2:MC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></td>
+<td>496</td>
+
+<td>MNG</td>
+<td id="MN">MN</td>
+<td><a href="/wiki/ISO_3166-2:MN" title="ISO 3166-2:MN">ISO 3166-2:MN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></td>
+<td>499</td>
+<td>MNE</td>
+<td id="ME">ME</td>
+<td><a href="/wiki/ISO_3166-2:ME" title="ISO 3166-2:ME">ISO 3166-2:ME</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></td>
+<td>500</td>
+<td>MSR</td>
+<td id="MS">MS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MS&amp;action=edit" class="new" title="ISO 3166-2:MS">ISO 3166-2:MS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></td>
+<td>504</td>
+
+<td>MAR</td>
+<td id="MA">MA</td>
+<td><a href="/wiki/ISO_3166-2:MA" title="ISO 3166-2:MA">ISO 3166-2:MA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></td>
+<td>508</td>
+<td>MOZ</td>
+<td id="MZ">MZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MZ&amp;action=edit" class="new" title="ISO 3166-2:MZ">ISO 3166-2:MZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></td>
+<td>104</td>
+<td>MMR</td>
+<td id="MM">MM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MM&amp;action=edit" class="new" title="ISO 3166-2:MM">ISO 3166-2:MM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></td>
+<td>516</td>
+<td>NAM</td>
+<td id="NA">NA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NA&amp;action=edit" class="new" title="ISO 3166-2:NA">ISO 3166-2:NA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></td>
+<td>520</td>
+<td>NRU</td>
+
+<td id="NR">NR</td>
+<td><a href="/wiki/ISO_3166-2:NR" title="ISO 3166-2:NR">ISO 3166-2:NR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></td>
+<td>524</td>
+<td>NPL</td>
+<td id="NP">NP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NP&amp;action=edit" class="new" title="ISO 3166-2:NP">ISO 3166-2:NP</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td>
+<td>528</td>
+<td>NLD</td>
+<td id="NL">NL</td>
+<td><a href="/wiki/ISO_3166-2:NL" title="ISO 3166-2:NL">ISO 3166-2:NL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></td>
+<td>530</td>
+
+<td>ANT</td>
+<td id="AN">AN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AN&amp;action=edit" class="new" title="ISO 3166-2:AN">ISO 3166-2:AN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></td>
+<td>540</td>
+<td>NCL</td>
+<td id="NC">NC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NC&amp;action=edit" class="new" title="ISO 3166-2:NC">ISO 3166-2:NC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></td>
+<td>554</td>
+<td>NZL</td>
+<td id="NZ">NZ</td>
+<td><a href="/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">ISO 3166-2:NZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></td>
+<td>558</td>
+
+<td>NIC</td>
+<td id="NI">NI</td>
+<td><a href="/wiki/ISO_3166-2:NI" title="ISO 3166-2:NI">ISO 3166-2:NI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></td>
+<td>562</td>
+<td>NER</td>
+<td id="NE">NE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NE&amp;action=edit" class="new" title="ISO 3166-2:NE">ISO 3166-2:NE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></td>
+<td>566</td>
+<td>NGA</td>
+<td id="NG">NG</td>
+<td><a href="/wiki/ISO_3166-2:NG" title="ISO 3166-2:NG">ISO 3166-2:NG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></td>
+<td>570</td>
+
+<td>NIU</td>
+<td id="NU">NU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NU&amp;action=edit" class="new" title="ISO 3166-2:NU">ISO 3166-2:NU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></td>
+<td>574</td>
+<td>NFK</td>
+<td id="NF">NF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NF&amp;action=edit" class="new" title="ISO 3166-2:NF">ISO 3166-2:NF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></td>
+<td>580</td>
+<td>MNP</td>
+<td id="MP">MP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MP&amp;action=edit" class="new" title="ISO 3166-2:MP">ISO 3166-2:MP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></td>
+<td>578</td>
+
+<td>NOR</td>
+<td id="NO">NO</td>
+<td><a href="/wiki/ISO_3166-2:NO" title="ISO 3166-2:NO">ISO 3166-2:NO</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></td>
+<td>512</td>
+<td>OMN</td>
+
+<td id="OM">OM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:OM&amp;action=edit" class="new" title="ISO 3166-2:OM">ISO 3166-2:OM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></td>
+<td>586</td>
+<td>PAK</td>
+<td id="PK">PK</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PK&amp;action=edit" class="new" title="ISO 3166-2:PK">ISO 3166-2:PK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></td>
+<td>585</td>
+<td>PLW</td>
+<td id="PW">PW</td>
+<td><a href="/wiki/ISO_3166-2:PW" title="ISO 3166-2:PW">ISO 3166-2:PW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian Territory, Occupied</a></td>
+
+<td>275</td>
+<td>PSE</td>
+<td id="PS">PS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PS&amp;action=edit" class="new" title="ISO 3166-2:PS">ISO 3166-2:PS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></td>
+<td>591</td>
+<td>PAN</td>
+<td id="PA">PA</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PA&amp;action=edit" class="new" title="ISO 3166-2:PA">ISO 3166-2:PA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></td>
+<td>598</td>
+<td>PNG</td>
+<td id="PG">PG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PG&amp;action=edit" class="new" title="ISO 3166-2:PG">ISO 3166-2:PG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></td>
+
+<td>600</td>
+<td>PRY</td>
+<td id="PY">PY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PY&amp;action=edit" class="new" title="ISO 3166-2:PY">ISO 3166-2:PY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></td>
+<td>604</td>
+<td>PER</td>
+<td id="PE">PE</td>
+
+<td><a href="/wiki/ISO_3166-2:PE" title="ISO 3166-2:PE">ISO 3166-2:PE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></td>
+<td>608</td>
+<td>PHL</td>
+<td id="PH">PH</td>
+<td><a href="/wiki/ISO_3166-2:PH" title="ISO 3166-2:PH">ISO 3166-2:PH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn</a></td>
+
+<td>612</td>
+<td>PCN</td>
+<td id="PN">PN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PN&amp;action=edit" class="new" title="ISO 3166-2:PN">ISO 3166-2:PN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></td>
+<td>616</td>
+<td>POL</td>
+<td id="PL">PL</td>
+
+<td><a href="/wiki/ISO_3166-2:PL" title="ISO 3166-2:PL">ISO 3166-2:PL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></td>
+<td>620</td>
+<td>PRT</td>
+<td id="PT">PT</td>
+<td><a href="/wiki/ISO_3166-2:PT" title="ISO 3166-2:PT">ISO 3166-2:PT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></td>
+
+<td>630</td>
+<td>PRI</td>
+<td id="PR">PR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PR&amp;action=edit" class="new" title="ISO 3166-2:PR">ISO 3166-2:PR</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></td>
+<td>634</td>
+
+<td>QAT</td>
+<td id="QA">QA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:QA&amp;action=edit" class="new" title="ISO 3166-2:QA">ISO 3166-2:QA</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></td>
+<td>638</td>
+<td>REU</td>
+
+<td id="RE">RE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:RE&amp;action=edit" class="new" title="ISO 3166-2:RE">ISO 3166-2:RE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></td>
+<td>642</td>
+<td>ROU</td>
+<td id="RO">RO</td>
+<td><a href="/wiki/ISO_3166-2:RO" title="ISO 3166-2:RO">ISO 3166-2:RO</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russian Federation</a></td>
+<td>643</td>
+<td>RUS</td>
+<td id="RU">RU</td>
+<td><a href="/wiki/ISO_3166-2:RU" title="ISO 3166-2:RU">ISO 3166-2:RU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></td>
+<td>646</td>
+
+<td>RWA</td>
+<td id="RW">RW</td>
+<td><a href="/wiki/ISO_3166-2:RW" title="ISO 3166-2:RW">ISO 3166-2:RW</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></td>
+<td>654</td>
+<td>SHN</td>
+
+<td id="SH">SH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SH&amp;action=edit" class="new" title="ISO 3166-2:SH">ISO 3166-2:SH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></td>
+<td>659</td>
+<td>KNA</td>
+<td id="KN">KN</td>
+<td><a href="/wiki/ISO_3166-2:KN" title="ISO 3166-2:KN">ISO 3166-2:KN</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></td>
+<td>662</td>
+<td>LCA</td>
+<td id="LC">LC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LC&amp;action=edit" class="new" title="ISO 3166-2:LC">ISO 3166-2:LC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></td>
+<td>666</td>
+
+<td>SPM</td>
+<td id="PM">PM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PM&amp;action=edit" class="new" title="ISO 3166-2:PM">ISO 3166-2:PM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></td>
+<td>670</td>
+<td>VCT</td>
+<td id="VC">VC</td>
+<td><a href="/wiki/ISO_3166-2:VC" title="ISO 3166-2:VC">ISO 3166-2:VC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></td>
+<td>882</td>
+<td>WSM</td>
+<td id="WS">WS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WS&amp;action=edit" class="new" title="ISO 3166-2:WS">ISO 3166-2:WS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></td>
+<td>674</td>
+
+<td>SMR</td>
+<td id="SM">SM</td>
+<td><a href="/wiki/ISO_3166-2:SM" title="ISO 3166-2:SM">ISO 3166-2:SM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></td>
+<td>678</td>
+<td>STP</td>
+<td id="ST">ST</td>
+<td><a href="/wiki/ISO_3166-2:ST" title="ISO 3166-2:ST">ISO 3166-2:ST</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></td>
+<td>682</td>
+<td>SAU</td>
+<td id="SA">SA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SA&amp;action=edit" class="new" title="ISO 3166-2:SA">ISO 3166-2:SA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></td>
+<td>686</td>
+
+<td>SEN</td>
+<td id="SN">SN</td>
+<td><a href="/wiki/ISO_3166-2:SN" title="ISO 3166-2:SN">ISO 3166-2:SN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></td>
+<td>688</td>
+<td>SRB</td>
+<td id="RS">RS</td>
+<td><a href="/wiki/ISO_3166-2:RS" title="ISO 3166-2:RS">ISO 3166-2:RS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></td>
+<td>690</td>
+<td>SYC</td>
+<td id="SC">SC</td>
+<td><a href="/wiki/ISO_3166-2:SC" title="ISO 3166-2:SC">ISO 3166-2:SC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></td>
+<td>694</td>
+
+<td>SLE</td>
+<td id="SL">SL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SL&amp;action=edit" class="new" title="ISO 3166-2:SL">ISO 3166-2:SL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></td>
+<td>702</td>
+<td>SGP</td>
+<td id="SG">SG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SG&amp;action=edit" class="new" title="ISO 3166-2:SG">ISO 3166-2:SG</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></td>
+<td>703</td>
+<td>SVK</td>
+<td id="SK">SK</td>
+<td><a href="/wiki/ISO_3166-2:SK" title="ISO 3166-2:SK">ISO 3166-2:SK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></td>
+<td>705</td>
+
+<td>SVN</td>
+<td id="SI">SI</td>
+<td><a href="/wiki/ISO_3166-2:SI" title="ISO 3166-2:SI">ISO 3166-2:SI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></td>
+<td>090</td>
+<td>SLB</td>
+<td id="SB">SB</td>
+<td><a href="/wiki/ISO_3166-2:SB" title="ISO 3166-2:SB">ISO 3166-2:SB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></td>
+<td>706</td>
+<td>SOM</td>
+<td id="SO">SO</td>
+<td><a href="/wiki/ISO_3166-2:SO" title="ISO 3166-2:SO">ISO 3166-2:SO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></td>
+<td>710</td>
+
+<td>ZAF</td>
+<td id="ZA">ZA</td>
+<td><a href="/wiki/ISO_3166-2:ZA" title="ISO 3166-2:ZA">ISO 3166-2:ZA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></td>
+<td>239</td>
+<td>SGS</td>
+<td id="GS">GS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GS&amp;action=edit" class="new" title="ISO 3166-2:GS">ISO 3166-2:GS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></td>
+<td>724</td>
+<td>ESP</td>
+<td id="ES">ES</td>
+<td><a href="/wiki/ISO_3166-2:ES" title="ISO 3166-2:ES">ISO 3166-2:ES</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></td>
+<td>144</td>
+
+<td>LKA</td>
+<td id="LK">LK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LK&amp;action=edit" class="new" title="ISO 3166-2:LK">ISO 3166-2:LK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></td>
+<td>736</td>
+<td>SDN</td>
+<td id="SD">SD</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SD&amp;action=edit" class="new" title="ISO 3166-2:SD">ISO 3166-2:SD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></td>
+<td>740</td>
+<td>SUR</td>
+<td id="SR">SR</td>
+<td><a href="/wiki/ISO_3166-2:SR" title="ISO 3166-2:SR">ISO 3166-2:SR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Svalbard and Jan Mayen"></a>&nbsp;<a href="/wiki/Svalbard_and_Jan_Mayen" title="Svalbard and Jan Mayen">Svalbard and Jan Mayen</a></td>
+<td>744</td>
+
+<td>SJM</td>
+<td id="SJ">SJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SJ&amp;action=edit" class="new" title="ISO 3166-2:SJ">ISO 3166-2:SJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></td>
+<td>748</td>
+<td>SWZ</td>
+<td id="SZ">SZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SZ&amp;action=edit" class="new" title="ISO 3166-2:SZ">ISO 3166-2:SZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></td>
+<td>752</td>
+<td>SWE</td>
+<td id="SE">SE</td>
+<td><a href="/wiki/ISO_3166-2:SE" title="ISO 3166-2:SE">ISO 3166-2:SE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></td>
+<td>756</td>
+
+<td>CHE</td>
+<td id="CH">CH</td>
+<td><a href="/wiki/ISO_3166-2:CH" title="ISO 3166-2:CH">ISO 3166-2:CH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syrian Arab Republic</a></td>
+<td>760</td>
+<td>SYR</td>
+<td id="SY">SY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SY&amp;action=edit" class="new" title="ISO 3166-2:SY">ISO 3166-2:SY</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">Taiwan, Province of China</a></td>
+<td>158</td>
+<td>TWN</td>
+<td id="TW">TW</td>
+<td><a href="/wiki/ISO_3166-2:TW" title="ISO 3166-2:TW">ISO 3166-2:TW</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></td>
+<td>762</td>
+<td>TJK</td>
+<td id="TJ">TJ</td>
+<td><a href="/wiki/ISO_3166-2:TJ" title="ISO 3166-2:TJ">ISO 3166-2:TJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania, United Republic of</a></td>
+<td>834</td>
+<td>TZA</td>
+
+<td id="TZ">TZ</td>
+<td><a href="/wiki/ISO_3166-2:TZ" title="ISO 3166-2:TZ">ISO 3166-2:TZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></td>
+<td>764</td>
+<td>THA</td>
+<td id="TH">TH</td>
+<td><a href="/wiki/ISO_3166-2:TH" title="ISO 3166-2:TH">ISO 3166-2:TH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></td>
+<td>626</td>
+<td>TLS</td>
+<td id="TL">TL</td>
+<td><a href="/wiki/ISO_3166-2:TL" title="ISO 3166-2:TL">ISO 3166-2:TL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></td>
+<td>768</td>
+
+<td>TGO</td>
+<td id="TG">TG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TG&amp;action=edit" class="new" title="ISO 3166-2:TG">ISO 3166-2:TG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></td>
+<td>772</td>
+<td>TKL</td>
+<td id="TK">TK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TK&amp;action=edit" class="new" title="ISO 3166-2:TK">ISO 3166-2:TK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></td>
+<td>776</td>
+<td>TON</td>
+<td id="TO">TO</td>
+<td><a href="/wiki/ISO_3166-2:TO" title="ISO 3166-2:TO">ISO 3166-2:TO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></td>
+<td>780</td>
+
+<td>TTO</td>
+<td id="TT">TT</td>
+<td><a href="/wiki/ISO_3166-2:TT" title="ISO 3166-2:TT">ISO 3166-2:TT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></td>
+<td>788</td>
+<td>TUN</td>
+<td id="TN">TN</td>
+<td><a href="/wiki/ISO_3166-2:TN" title="ISO 3166-2:TN">ISO 3166-2:TN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></td>
+<td>792</td>
+<td>TUR</td>
+<td id="TR">TR</td>
+<td><a href="/wiki/ISO_3166-2:TR" title="ISO 3166-2:TR">ISO 3166-2:TR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></td>
+<td>795</td>
+
+<td>TKM</td>
+<td id="TM">TM</td>
+<td><a href="/wiki/ISO_3166-2:TM" title="ISO 3166-2:TM">ISO 3166-2:TM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></td>
+<td>796</td>
+<td>TCA</td>
+<td id="TC">TC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TC&amp;action=edit" class="new" title="ISO 3166-2:TC">ISO 3166-2:TC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></td>
+<td>798</td>
+<td>TUV</td>
+<td id="TV">TV</td>
+<td><a href="/wiki/ISO_3166-2:TV" title="ISO 3166-2:TV">ISO 3166-2:TV</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></td>
+<td>800</td>
+<td>UGA</td>
+<td id="UG">UG</td>
+<td><a href="/wiki/ISO_3166-2:UG" title="ISO 3166-2:UG">ISO 3166-2:UG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></td>
+<td>804</td>
+<td>UKR</td>
+
+<td id="UA">UA</td>
+<td><a href="/wiki/ISO_3166-2:UA" title="ISO 3166-2:UA">ISO 3166-2:UA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></td>
+<td>784</td>
+<td>ARE</td>
+<td id="AE">AE</td>
+<td><a href="/wiki/ISO_3166-2:AE" title="ISO 3166-2:AE">ISO 3166-2:AE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></td>
+<td>826</td>
+<td>GBR</td>
+<td id="GB">GB</td>
+<td><a href="/wiki/ISO_3166-2:GB" title="ISO 3166-2:GB">ISO 3166-2:GB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></td>
+<td>840</td>
+
+<td>USA</td>
+<td id="US">US</td>
+<td><a href="/wiki/ISO_3166-2:US" title="ISO 3166-2:US">ISO 3166-2:US</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of United States Minor Outlying Islands"></a>&nbsp;<a href="/wiki/United_States_Minor_Outlying_Islands" title="United States Minor Outlying Islands">United States Minor Outlying Islands</a></td>
+<td>581</td>
+<td>UMI</td>
+<td id="UM">UM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UM&amp;action=edit" class="new" title="ISO 3166-2:UM">ISO 3166-2:UM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></td>
+<td>858</td>
+<td>URY</td>
+<td id="UY">UY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UY&amp;action=edit" class="new" title="ISO 3166-2:UY">ISO 3166-2:UY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></td>
+<td>860</td>
+
+<td>UZB</td>
+<td id="UZ">UZ</td>
+<td><a href="/wiki/ISO_3166-2:UZ" title="ISO 3166-2:UZ">ISO 3166-2:UZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></td>
+<td>548</td>
+<td>VUT</td>
+
+<td id="VU">VU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VU&amp;action=edit" class="new" title="ISO 3166-2:VU">ISO 3166-2:VU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></td>
+<td>862</td>
+<td>VEN</td>
+<td id="VE">VE</td>
+<td><a href="/wiki/ISO_3166-2:VE" title="ISO 3166-2:VE">ISO 3166-2:VE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Viet Nam</a></td>
+<td>704</td>
+<td>VNM</td>
+<td id="VN">VN</td>
+<td><a href="/wiki/ISO_3166-2:VN" title="ISO 3166-2:VN">ISO 3166-2:VN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">Virgin Islands, British</a></td>
+<td>092</td>
+
+<td>VGB</td>
+<td id="VG">VG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VG&amp;action=edit" class="new" title="ISO 3166-2:VG">ISO 3166-2:VG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">Virgin Islands, U.S.</a></td>
+<td>850</td>
+<td>VIR</td>
+<td id="VI">VI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VI&amp;action=edit" class="new" title="ISO 3166-2:VI">ISO 3166-2:VI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></td>
+<td>876</td>
+<td>WLF</td>
+<td id="WF">WF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WF&amp;action=edit" class="new" title="ISO 3166-2:WF">ISO 3166-2:WF</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></td>
+<td>732</td>
+<td>ESH</td>
+<td id="EH">EH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EH&amp;action=edit" class="new" title="ISO 3166-2:EH">ISO 3166-2:EH</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></td>
+
+<td>887</td>
+<td>YEM</td>
+<td id="YE">YE</td>
+<td><a href="/wiki/ISO_3166-2:YE" title="ISO 3166-2:YE">ISO 3166-2:YE</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></td>
+<td>894</td>
+
+<td>ZMB</td>
+<td id="ZM">ZM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ZM&amp;action=edit" class="new" title="ISO 3166-2:ZM">ISO 3166-2:ZM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></td>
+<td>716</td>
+<td>ZWE</td>
+<td id="ZW">ZW</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:ZW&amp;action=edit" class="new" title="ISO 3166-2:ZW">ISO 3166-2:ZW</a></td>
+</tr>
+
+</tbody>
+</table>
+
+
+<h1>Country Continent Mapping</h1>
+<p>abstracted from <a href="http://en.wikipedia.org/wiki/List_of_countries_by_continent">wikipedia continent country page</a></p>
+<table id="continents">
+<!-- Africa -->
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></b> – <a href="/wiki/Algiers" title="Algiers">Algiers</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></b> – <a href="/wiki/Luanda" title="Luanda">Luanda</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></b> – <a href="/wiki/Porto-Novo" title="Porto-Novo">Porto-Novo</a> (seat of government at <a href="/wiki/Cotonou" title="Cotonou">Cotonou</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></b> – <a href="/wiki/Gaborone" title="Gaborone">Gaborone</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></b> – <a href="/wiki/Ouagadougou" title="Ouagadougou">Ouagadougou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></b> – <a href="/wiki/Bujumbura" title="Bujumbura">Bujumbura</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></b> – <a href="/wiki/Yaound%C3%A9" title="Yaoundé">Yaoundé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></b> – <a href="/wiki/Praia" title="Praia">Praia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></b> – <a href="/wiki/Bangui" title="Bangui">Bangui</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></b> – <a href="/wiki/N%27Djamena" title="N'Djamena">N'Djamena</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></b> – <a href="/wiki/Moroni%2C_Comoros" title="Moroni, Comoros">Moroni</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of</a></b> (also known as <b>Congo-Kinshasa</b>, formerly known as <b>Zaire</b>) – <a href="/wiki/Kinshasa" title="Kinshasa">Kinshasa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo, Republic of</a></b> (also known as <b>Congo-Brazzaville</b>) – <a href="/wiki/Brazzaville" title="Brazzaville">Brazzaville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></b> (commonly known as <b>Ivory Coast</b>) – <a href="/wiki/Yamoussoukro" title="Yamoussoukro">Yamoussoukro</a> (seat of government at <a href="/wiki/Abidjan" title="Abidjan">Abidjan</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></b> – <a href="/wiki/Djibouti%2C_Djibouti" title="Djibouti, Djibouti">Djibouti</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></b> – <a href="/wiki/Cairo" title="Cairo">Cairo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></b> – <a href="/wiki/Malabo" title="Malabo">Malabo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></b> – <a href="/wiki/Asmara" title="Asmara">Asmara</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></b> – <a href="/wiki/Addis_Ababa" title="Addis Ababa">Addis Ababa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></b> – <a href="/wiki/Libreville" title="Libreville">Libreville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></b> – <a href="/wiki/Banjul" title="Banjul">Banjul</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></b> – <a href="/wiki/Accra" title="Accra">Accra</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></b> – <a href="/wiki/Conakry" title="Conakry">Conakry</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></b> – <a href="/wiki/Bissau" title="Bissau">Bissau</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></b> – <a href="/wiki/Nairobi" title="Nairobi">Nairobi</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></b> – <a href="/wiki/Maseru" title="Maseru">Maseru</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></b> – <a href="/wiki/Monrovia" title="Monrovia">Monrovia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libya</a></b> – <a href="/wiki/Tripoli" title="Tripoli">Tripoli</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></b> – <a href="/wiki/Antananarivo" title="Antananarivo">Antananarivo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></b> – <a href="/wiki/Lilongwe" title="Lilongwe">Lilongwe</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></b> – <a href="/wiki/Bamako" title="Bamako">Bamako</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></b> – <a href="/wiki/Nouakchott" title="Nouakchott">Nouakchott</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></b> – <a href="/wiki/Port_Louis" title="Port Louis">Port Louis</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mamoudzou" title="Mamoudzou">Mamoudzou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></b> – <a href="/wiki/Rabat" title="Rabat">Rabat</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></b> – <a href="/wiki/Maputo" title="Maputo">Maputo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></b> – <a href="/wiki/Windhoek" title="Windhoek">Windhoek</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></b> – <a href="/wiki/Niamey" title="Niamey">Niamey</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></b> – <a href="/wiki/Abuja" title="Abuja">Abuja</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Saint-Denis%2C_R%C3%A9union" title="Saint-Denis, Réunion">Saint-Denis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></b> – <a href="/wiki/Kigali" title="Kigali">Kigali</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Jamestown%2C_Saint_Helena" title="Jamestown, Saint Helena">Jamestown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></b> – <a href="/wiki/S%C3%A3o_Tom%C3%A9" title="São Tomé">São Tomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></b> – <a href="/wiki/Dakar" title="Dakar">Dakar</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></b> – <a href="/wiki/Victoria%2C_Seychelles" title="Victoria, Seychelles">Victoria</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></b> – <a href="/wiki/Freetown" title="Freetown">Freetown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></b> – <a href="/wiki/Mogadishu" title="Mogadishu">Mogadishu</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></b> – <a href="/wiki/Pretoria" title="Pretoria">Pretoria</a> (administrative), <a href="/wiki/Cape_Town" title="Cape Town">Cape Town</a> (legislative), <a href="/wiki/Bloemfontein" title="Bloemfontein">Bloemfontein</a> (judicial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></b> – <a href="/wiki/Khartoum" title="Khartoum">Khartoum</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></b> – <a href="/wiki/Mbabane" title="Mbabane">Mbabane</a> (administrative), <a href="/wiki/Lobamba" title="Lobamba">Lobamba</a> (royal and legislative)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania</a></b> – <a href="/wiki/Dodoma" title="Dodoma">Dodoma</a> (seat of government at <a href="/wiki/Dar_es_Salaam" title="Dar es Salaam">Dar es Salaam</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></b> – <a href="/wiki/Lom%C3%A9" title="Lomé">Lomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></b> – <a href="/wiki/Tunis" title="Tunis">Tunis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></b> – <a href="/wiki/Kampala" title="Kampala">Kampala</a></td></tr>
+<tr><td>Africa</td><td><i><b><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></b></i> – <a href="/wiki/El_Aai%C3%BAn" title="El Aaiún">El Aaiún</a> (unofficial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></b> – <a href="/wiki/Lusaka" title="Lusaka">Lusaka</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></b> – <a href="/wiki/Harare" title="Harare">Harare</a></td></tr>
+
+<!-- Eurasia: Asia -->
+
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></b> – <a href="/wiki/Kabul" title="Kabul">Kabul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></b><sup id="_ref-europe_0" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Yerevan" title="Yerevan">Yerevan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></b><sup id="_ref-europe_1" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Baku" title="Baku">Baku</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></b> – <a href="/wiki/Manama" title="Manama">Manama</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></b> – <a href="/wiki/Dhaka" title="Dhaka">Dhaka</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></b> – <a href="/wiki/Thimphu" title="Thimphu">Thimphu</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></i><sup id="_ref-1" class="reference"><a href="#_note-1" title="">[3]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei</a></b> – <a href="/wiki/Bandar_Seri_Begawan" title="Bandar Seri Begawan">Bandar Seri Begawan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></b> – <a href="/wiki/Phnom_Penh" title="Phnom Penh">Phnom Penh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China, People's Republic of</a></b> – <a href="/wiki/Beijing" title="Beijing">Beijing</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">China, Republic of</a></b> (commonly known as <b>Taiwan</b>) – <a href="/wiki/Taipei" title="Taipei">Taipei</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></i><sup id="_ref-australia_0" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></i><sup id="_ref-australia_1" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></b><sup id="_ref-europe_2" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Nicosia" title="Nicosia">Nicosia</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></b><sup id="_ref-europe_3" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Tbilisi" title="Tbilisi">Tbilisi</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"></a>&nbsp;<a href="/wiki/India" title="India">India</a></b> – <a href="/wiki/New_Delhi" title="New Delhi">New Delhi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></b> – <a href="/wiki/Jakarta" title="Jakarta">Jakarta</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran</a></b> – <a href="/wiki/Tehran" title="Tehran">Tehran</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></b> – <a href="/wiki/Baghdad" title="Baghdad">Baghdad</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></b> – <a href="/wiki/Jerusalem" title="Jerusalem">Jerusalem</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></b> – <a href="/wiki/Tokyo" title="Tokyo">Tokyo</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></b> – <a href="/wiki/Amman" title="Amman">Amman</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></b> – <a href="/wiki/Astana" title="Astana">Astana</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></b> (commonly known as <b>North Korea</b>) – <a href="/wiki/Pyongyang" title="Pyongyang">Pyongyang</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></b> (commonly known as <b>South Korea</b>) – <a href="/wiki/Seoul" title="Seoul">Seoul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></b> – <a href="/wiki/Kuwait_City" title="Kuwait City">Kuwait City</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></b> – <a href="/wiki/Bishkek" title="Bishkek">Bishkek</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Laos</a></b> – <a href="/wiki/Vientiane" title="Vientiane">Vientiane</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></b> – <a href="/wiki/Beirut" title="Beirut">Beirut</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macau</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></b> – <a href="/wiki/Kuala_Lumpur" title="Kuala Lumpur">Kuala Lumpur</a> (seat of government at <a href="/wiki/Putrajaya" title="Putrajaya">Putrajaya</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></b> – <a href="/wiki/Mal%C3%A9" title="Malé">Malé</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></b> – <a href="/wiki/Ulaanbaatar" title="Ulaanbaatar">Ulaanbaatar</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></b> (formerly known as <b>Burma</b>) – <a href="/wiki/Naypyidaw" title="Naypyidaw">Naypyidaw</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></b> – <a href="/wiki/Kathmandu" title="Kathmandu">Kathmandu</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></b> – <a href="/wiki/Muscat%2C_Oman" title="Muscat, Oman">Muscat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></b> – <a href="/wiki/Islamabad" title="Islamabad">Islamabad</a></td></tr>
+<tr><td>Asia</td><td><i><b><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian territories</a></b></i> (collectively the territories of the <a href="/wiki/West_Bank" title="West Bank">West Bank</a> and the <a href="/wiki/Gaza_Strip" title="Gaza Strip">Gaza Strip</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></b> – <a href="/wiki/Manila" title="Manila">Manila</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></b> – <a href="/wiki/Doha" title="Doha">Doha</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></b> – <a href="/wiki/Riyadh" title="Riyadh">Riyadh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></b> – Singapore<sup id="_ref-city-state_0" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></b> – <a href="/wiki/Sri_Jayawardenepura" title="Sri Jayawardenepura">Sri Jayawardenepura</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syria</a></b> – <a href="/wiki/Damascus" title="Damascus">Damascus</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></b> – <a href="/wiki/Dushanbe" title="Dushanbe">Dushanbe</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></b> – <a href="/wiki/Bangkok" title="Bangkok">Bangkok</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></b> (commonly known as <b>East Timor</b>) – <a href="/wiki/Dili" title="Dili">Dili</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></b><sup id="_ref-europe_4" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Ankara" title="Ankara">Ankara</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></b> – <a href="/wiki/Ashgabat" title="Ashgabat">Ashgabat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></b> – <a href="/wiki/Abu_Dhabi" title="Abu Dhabi">Abu Dhabi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></b> – <a href="/wiki/Tashkent" title="Tashkent">Tashkent</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Vietnam</a></b> – <a href="/wiki/Hanoi" title="Hanoi">Hanoi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></b> – <a href="/wiki/Sana%27a" title="Sana'a">Sana'a</a></td></tr>
+
+<!-- Eurasia: Europe -->
+
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></b> – <a href="/wiki/Tirana" title="Tirana">Tirana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></b> – <a href="/wiki/Andorra_la_Vella" title="Andorra la Vella">Andorra la Vella</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></b> – <a href="/wiki/Vienna" title="Vienna">Vienna</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></b> – <a href="/wiki/Minsk" title="Minsk">Minsk</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></b> – <a href="/wiki/Brussels" title="Brussels">Brussels</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></b> – <a href="/wiki/Sarajevo" title="Sarajevo">Sarajevo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></b> – <a href="/wiki/Sofia" title="Sofia">Sofia</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></b> – <a href="/wiki/Zagreb" title="Zagreb">Zagreb</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></b> – <a href="/wiki/Prague" title="Prague">Prague</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></b> – <a href="/wiki/Copenhagen" title="Copenhagen">Copenhagen</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></b> – <a href="/wiki/Tallinn" title="Tallinn">Tallinn</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></i> (overseas territory of Denmark) – <a href="/wiki/T%C3%B3rshavn" title="Tórshavn">Tórshavn</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></b> – <a href="/wiki/Helsinki" title="Helsinki">Helsinki</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a>&nbsp;<a href="/wiki/France" title="France">France</a></b> – <a href="/wiki/Paris" title="Paris">Paris</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></b> – <a href="/wiki/Berlin" title="Berlin">Berlin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – Gibraltar<sup id="_ref-city-state_1" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></b> – <a href="/wiki/Athens" title="Athens">Athens</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Peter_Port" title="Saint Peter Port">Saint Peter Port</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></b> – <a href="/wiki/Budapest" title="Budapest">Budapest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></b> – <a href="/wiki/Reykjav%C3%ADk" title="Reykjavík">Reykjavík</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></b> – <a href="/wiki/Dublin" title="Dublin">Dublin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Douglas%2C_Isle_of_Man" title="Douglas, Isle of Man">Douglas</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></b> – <a href="/wiki/Rome" title="Rome">Rome</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Helier" title="Saint Helier">Saint Helier</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></b> – <a href="/wiki/Riga" title="Riga">Riga</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></b> – <a href="/wiki/Vaduz" title="Vaduz">Vaduz</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></b> – <a href="/wiki/Vilnius" title="Vilnius">Vilnius</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></b> – <a href="/wiki/Luxembourg%2C_Luxembourg" title="Luxembourg, Luxembourg">Luxembourg</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia</a></b> – <a href="/wiki/Skopje" title="Skopje">Skopje</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></b> – <a href="/wiki/Valletta" title="Valletta">Valletta</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova</a></b> – <a href="/wiki/Chi%C5%9Fin%C4%83u" title="Chişinău">Chişinău</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></b> – Monaco<sup id="_ref-city-state_2" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></b> – <a href="/wiki/Podgorica" title="Podgorica">Podgorica</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></b> – <a href="/wiki/Amsterdam" title="Amsterdam">Amsterdam</a> (seat of government at <a href="/wiki/The_Hague" title="The Hague">The Hague</a>)</td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></b> – <a href="/wiki/Oslo" title="Oslo">Oslo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></b> – <a href="/wiki/Warsaw" title="Warsaw">Warsaw</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></b> – <a href="/wiki/Lisbon" title="Lisbon">Lisbon</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></b> – <a href="/wiki/Bucharest" title="Bucharest">Bucharest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russia</a></b><sup id="_ref-2" class="reference"><a href="#_note-2" title="">[6]</a></sup> – <a href="/wiki/Moscow" title="Moscow">Moscow</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></b> – <a href="/wiki/San_Marino%2C_San_Marino" title="San Marino, San Marino">San Marino</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></b> – <a href="/wiki/Belgrade" title="Belgrade">Belgrade</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></b> – <a href="/wiki/Bratislava" title="Bratislava">Bratislava</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></b> – <a href="/wiki/Ljubljana" title="Ljubljana">Ljubljana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></b> – <a href="/wiki/Madrid" title="Madrid">Madrid</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></b> – <a href="/wiki/Stockholm" title="Stockholm">Stockholm</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></b> – <a href="/wiki/Berne" title="Berne">Berne</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></b> – <a href="/wiki/Kiev" title="Kiev">Kiev</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></b> – <a href="/wiki/London" title="London">London</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Vatican City</a></b> – Vatican City<sup id="_ref-city-state_3" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+
+<!-- Americas: North_America -->
+
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/The_Valley%2C_Anguilla" title="The Valley, Anguilla">The Valley</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></b> – <a href="/wiki/Saint_John%27s%2C_Antigua_and_Barbuda" title="Saint John's, Antigua and Barbuda">Saint John's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Oranjestad%2C_Aruba" title="Oranjestad, Aruba">Oranjestad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></b> – <a href="/wiki/Nassau%2C_Bahamas" title="Nassau, Bahamas">Nassau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></b> – <a href="/wiki/Bridgetown" title="Bridgetown">Bridgetown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></b> – <a href="/wiki/Belmopan" title="Belmopan">Belmopan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Hamilton%2C_Bermuda" title="Hamilton, Bermuda">Hamilton</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Road_Town" title="Road Town">Road Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></b> – <a href="/wiki/Ottawa" title="Ottawa">Ottawa</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/George_Town%2C_Cayman_Islands" title="George Town, Cayman Islands">George Town</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"></a> <a href="/wiki/Clipperton_Island" title="Clipperton Island">Clipperton Island</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></b> – <a href="/wiki/San_Jos%C3%A9%2C_Costa_Rica" title="San José, Costa Rica">San José</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></b> – <a href="/wiki/Havana" title="Havana">Havana</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></b> – <a href="/wiki/Roseau" title="Roseau">Roseau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></b> – <a href="/wiki/Santo_Domingo" title="Santo Domingo">Santo Domingo</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></b> – <a href="/wiki/San_Salvador" title="San Salvador">San Salvador</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></i> (overseas territory of Denmark) – <a href="/wiki/Nuuk" title="Nuuk">Nuuk</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></b> – <a href="/wiki/Saint_George%27s%2C_Grenada" title="Saint George's, Grenada">Saint George's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Basse-Terre" title="Basse-Terre">Basse-Terre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></b> – <a href="/wiki/Guatemala_City" title="Guatemala City">Guatemala City</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></b> – <a href="/wiki/Port-au-Prince" title="Port-au-Prince">Port-au-Prince</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></b> – <a href="/wiki/Tegucigalpa" title="Tegucigalpa">Tegucigalpa</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></b> – <a href="/wiki/Kingston%2C_Jamaica" title="Kingston, Jamaica">Kingston</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Fort-de-France" title="Fort-de-France">Fort-de-France</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></b> – <a href="/wiki/Mexico_City" title="Mexico City">Mexico City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Plymouth%2C_Montserrat" title="Plymouth, Montserrat">Plymouth</a> (seat of government at <a href="/wiki/Brades" title="Brades">Brades</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of Navassa Island"></a>&nbsp;<a href="/wiki/Navassa_Island" title="Navassa Island">Navassa Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Willemstad%2C_Netherlands_Antilles" title="Willemstad, Netherlands Antilles">Willemstad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></b> – <a href="/wiki/Managua" title="Managua">Managua</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></b> – <a href="/wiki/Panama_City" title="Panama City">Panama City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/San_Juan%2C_Puerto_Rico" title="San Juan, Puerto Rico">San Juan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Barthelemy"></a>&nbsp;<a href="/wiki/Saint_Barthelemy" title="Saint Barthelemy">Saint Barthelemy</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Gustavia%2C_Saint_Barthelemy" title="Gustavia, Saint Barthelemy">Gustavia</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></b> – <a href="/wiki/Basseterre" title="Basseterre">Basseterre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></b> – <a href="/wiki/Castries" title="Castries">Castries</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Martin (France)"></a>&nbsp;<a href="/wiki/Saint_Martin_%28France%29" title="Saint Martin (France)">Saint Martin</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Marigot%2C_Saint_Martin" title="Marigot, Saint Martin">Marigot</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Saint-Pierre%2C_Saint_Pierre_and_Miquelon" title="Saint-Pierre, Saint Pierre and Miquelon">Saint-Pierre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></b> – <a href="/wiki/Kingstown" title="Kingstown">Kingstown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></b> – <a href="/wiki/Port_of_Spain" title="Port of Spain">Port of Spain</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Cockburn_Town" title="Cockburn Town">Cockburn Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></b> – <a href="/wiki/Washington%2C_D.C." title="Washington, D.C.">Washington, D.C.</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">United States Virgin Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Charlotte_Amalie%2C_United_States_Virgin_Islands" title="Charlotte Amalie, United States Virgin Islands">Charlotte Amalie</a></td></tr>
+
+<!-- Americas: South America -->
+
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></b> – <a href="/wiki/Buenos_Aires" title="Buenos Aires">Buenos Aires</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></b> – <a href="/wiki/Sucre" title="Sucre">Sucre</a> (seat of government at <a href="/wiki/La_Paz" title="La Paz">La Paz</a>)</td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></b> – <a href="/wiki/Bras%C3%ADlia" title="Brasília">Brasília</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></b> – <a href="/wiki/Santiago%2C_Chile" title="Santiago, Chile">Santiago</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></b> – <a href="/wiki/Bogot%C3%A1" title="Bogotá">Bogotá</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></b> – <a href="/wiki/Quito" title="Quito">Quito</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Stanley%2C_Falkland_Islands" title="Stanley, Falkland Islands">Stanley</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Cayenne" title="Cayenne">Cayenne</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></b> – <a href="/wiki/Georgetown%2C_Guyana" title="Georgetown, Guyana">Georgetown</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></b> – <a href="/wiki/Asunci%C3%B3n" title="Asunción">Asunción</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></b> – <a href="/wiki/Lima" title="Lima">Lima</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></b> – <a href="/wiki/Paramaribo" title="Paramaribo">Paramaribo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></b> – <a href="/wiki/Montevideo" title="Montevideo">Montevideo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></b> – <a href="/wiki/Caracas" title="Caracas">Caracas</a></td></tr>
+
+<!-- Americas: Oceania -->
+
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Pago_Pago" title="Pago Pago">Pago Pago</a> (seat of government at <a href="/wiki/Fagatogo" title="Fagatogo">Fagatogo</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></b> – <a href="/wiki/Canberra" title="Canberra">Canberra</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Baker_Island" title="Baker Island">Baker Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Avarua" title="Avarua">Avarua</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></b> – <a href="/wiki/Suva" title="Suva">Suva</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Papeete" title="Papeete">Papeete</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Hag%C3%A5t%C3%B1a" title="Hagåtña">Hagåtña</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Howland_Island" title="Howland Island">Howland Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Jarvis_Island" title="Jarvis Island">Jarvis Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Johnston_Atoll" title="Johnston Atoll">Johnston Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Kingman_Reef" title="Kingman Reef">Kingman Reef</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></b> – <a href="/wiki/South_Tarawa" title="South Tarawa">South Tarawa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></b> – <a href="/wiki/Majuro" title="Majuro">Majuro</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia</a></b> – <a href="/wiki/Palikir" title="Palikir">Palikir</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Midway_Atoll" title="Midway Atoll">Midway Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></b> – no official capital (seat of government at <a href="/wiki/Yaren" title="Yaren">Yaren</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Noum%C3%A9a" title="Nouméa">Nouméa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></b> – <a href="/wiki/Wellington" title="Wellington">Wellington</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Alofi" title="Alofi">Alofi</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></i> (overseas territory of Australia) – <a href="/wiki/Kingston%2C_Norfolk_Island" title="Kingston, Norfolk Island">Kingston</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Saipan" title="Saipan">Saipan</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></b> – <a href="/wiki/Melekeok" title="Melekeok">Melekeok</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Palmyra_Atoll" title="Palmyra Atoll">Palmyra Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></b> – <a href="/wiki/Port_Moresby" title="Port Moresby">Port Moresby</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Adamstown%2C_Pitcairn_Island" title="Adamstown, Pitcairn Island">Adamstown</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></b> – <a href="/wiki/Apia" title="Apia">Apia</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></b> – <a href="/wiki/Honiara" title="Honiara">Honiara</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></i> (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></b> – <a href="/wiki/Nuku%27alofa" title="Nuku'alofa">Nuku'alofa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></b> – <a href="/wiki/Funafuti" title="Funafuti">Funafuti</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></b> – <a href="/wiki/Port_Vila" title="Port Vila">Port Vila</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"></a> <a href="/wiki/Wake_Island" title="Wake Island">Wake Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mata-Utu" title="Mata-Utu">Mata-Utu</a></td></tr>
+
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></i> (overseas territory of Norway)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></i> (overseas territory of Australia)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></i><sup id="_ref-3" class="reference"><a href="#_note-3" title="">[7]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+</table>
+
+</body>
+</html>
diff --git a/includes/js/dijit/demos/i18n/langCountryMap.json b/includes/js/dijit/demos/i18n/langCountryMap.json
new file mode 100644
index 0000000..3730bad
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/langCountryMap.json
@@ -0,0 +1,215 @@
+[
+{ type: "languageCountryMap", language: "aa", country: "DJ"},
+{ type: "languageCountryMap", language: "aa", country: "ER"},
+{ type: "languageCountryMap", language: "aa", country: "ET"},
+{ type: "languageCountryMap", language: "af", country: "NA"},
+{ type: "languageCountryMap", language: "af", country: "ZA"},
+{ type: "languageCountryMap", language: "ak", country: "GH"},
+{ type: "languageCountryMap", language: "am", country: "ET"},
+{ type: "languageCountryMap", language: "ar", country: "AE"},
+{ type: "languageCountryMap", language: "ar", country: "BH"},
+{ type: "languageCountryMap", language: "ar", country: "DZ"},
+{ type: "languageCountryMap", language: "ar", country: "EG"},
+{ type: "languageCountryMap", language: "ar", country: "IQ"},
+{ type: "languageCountryMap", language: "ar", country: "JO"},
+{ type: "languageCountryMap", language: "ar", country: "KW"},
+{ type: "languageCountryMap", language: "ar", country: "LB"},
+{ type: "languageCountryMap", language: "ar", country: "LY"},
+{ type: "languageCountryMap", language: "ar", country: "MA"},
+{ type: "languageCountryMap", language: "ar", country: "OM"},
+{ type: "languageCountryMap", language: "ar", country: "QA"},
+{ type: "languageCountryMap", language: "ar", country: "SA"},
+{ type: "languageCountryMap", language: "ar", country: "SD"},
+{ type: "languageCountryMap", language: "ar", country: "SY"},
+{ type: "languageCountryMap", language: "ar", country: "TN"},
+{ type: "languageCountryMap", language: "ar", country: "YE"},
+{ type: "languageCountryMap", language: "as", country: "IN"},
+{ type: "languageCountryMap", language: "az", country: "AZ"},
+{ type: "languageCountryMap", language: "be", country: "BY"},
+{ type: "languageCountryMap", language: "bg", country: "BG"},
+{ type: "languageCountryMap", language: "bn", country: "BD"},
+{ type: "languageCountryMap", language: "bn", country: "IN"},
+{ type: "languageCountryMap", language: "bs", country: "BA"},
+{ type: "languageCountryMap", language: "ca", country: "ES"},
+{ type: "languageCountryMap", language: "cs", country: "CZ"},
+{ type: "languageCountryMap", language: "cy", country: "GB"},
+{ type: "languageCountryMap", language: "da", country: "DK"},
+{ type: "languageCountryMap", language: "de", country: "AT"},
+{ type: "languageCountryMap", language: "de", country: "BE"},
+{ type: "languageCountryMap", language: "de", country: "CH"},
+{ type: "languageCountryMap", language: "de", country: "DE"},
+{ type: "languageCountryMap", language: "de", country: "LI"},
+{ type: "languageCountryMap", language: "de", country: "LU"},
+{ type: "languageCountryMap", language: "dv", country: "MV"},
+{ type: "languageCountryMap", language: "dz", country: "BT"},
+{ type: "languageCountryMap", language: "ee", country: "GH"},
+{ type: "languageCountryMap", language: "ee", country: "TG"},
+{ type: "languageCountryMap", language: "el", country: "CY"},
+{ type: "languageCountryMap", language: "el", country: "GR"},
+{ type: "languageCountryMap", language: "en", country: "AS"},
+{ type: "languageCountryMap", language: "en", country: "AU"},
+{ type: "languageCountryMap", language: "en", country: "BE"},
+{ type: "languageCountryMap", language: "en", country: "BW"},
+{ type: "languageCountryMap", language: "en", country: "BZ"},
+{ type: "languageCountryMap", language: "en", country: "CA"},
+{ type: "languageCountryMap", language: "en", country: "GB"},
+{ type: "languageCountryMap", language: "en", country: "GU"},
+{ type: "languageCountryMap", language: "en", country: "HK"},
+{ type: "languageCountryMap", language: "en", country: "IE"},
+{ type: "languageCountryMap", language: "en", country: "IN"},
+{ type: "languageCountryMap", language: "en", country: "JM"},
+{ type: "languageCountryMap", language: "en", country: "MH"},
+{ type: "languageCountryMap", language: "en", country: "MP"},
+{ type: "languageCountryMap", language: "en", country: "MT"},
+{ type: "languageCountryMap", language: "en", country: "NA"},
+{ type: "languageCountryMap", language: "en", country: "NZ"},
+{ type: "languageCountryMap", language: "en", country: "PH"},
+{ type: "languageCountryMap", language: "en", country: "PK"},
+{ type: "languageCountryMap", language: "en", country: "SG"},
+{ type: "languageCountryMap", language: "en", country: "TT"},
+{ type: "languageCountryMap", language: "en", country: "UM"},
+{ type: "languageCountryMap", language: "en", country: "US"},
+{ type: "languageCountryMap", language: "en", country: "VI"},
+{ type: "languageCountryMap", language: "en", country: "ZA"},
+{ type: "languageCountryMap", language: "en", country: "ZW"},
+{ type: "languageCountryMap", language: "es", country: "AR"},
+{ type: "languageCountryMap", language: "es", country: "BO"},
+{ type: "languageCountryMap", language: "es", country: "CL"},
+{ type: "languageCountryMap", language: "es", country: "CO"},
+{ type: "languageCountryMap", language: "es", country: "CR"},
+{ type: "languageCountryMap", language: "es", country: "DO"},
+{ type: "languageCountryMap", language: "es", country: "EC"},
+{ type: "languageCountryMap", language: "es", country: "ES"},
+{ type: "languageCountryMap", language: "es", country: "GT"},
+{ type: "languageCountryMap", language: "es", country: "HN"},
+{ type: "languageCountryMap", language: "es", country: "MX"},
+{ type: "languageCountryMap", language: "es", country: "NI"},
+{ type: "languageCountryMap", language: "es", country: "PA"},
+{ type: "languageCountryMap", language: "es", country: "PE"},
+{ type: "languageCountryMap", language: "es", country: "PR"},
+{ type: "languageCountryMap", language: "es", country: "PY"},
+{ type: "languageCountryMap", language: "es", country: "SV"},
+{ type: "languageCountryMap", language: "es", country: "US"},
+{ type: "languageCountryMap", language: "es", country: "UY"},
+{ type: "languageCountryMap", language: "es", country: "VE"},
+{ type: "languageCountryMap", language: "et", country: "EE"},
+{ type: "languageCountryMap", language: "eu", country: "ES"},
+{ type: "languageCountryMap", language: "fa", country: "AF"},
+{ type: "languageCountryMap", language: "fa", country: "IR"},
+{ type: "languageCountryMap", language: "fi", country: "FI"},
+{ type: "languageCountryMap", language: "fo", country: "FO"},
+{ type: "languageCountryMap", language: "fr", country: "BE"},
+{ type: "languageCountryMap", language: "fr", country: "CA"},
+{ type: "languageCountryMap", language: "fr", country: "CH"},
+{ type: "languageCountryMap", language: "fr", country: "FR"},
+{ type: "languageCountryMap", language: "fr", country: "LU"},
+{ type: "languageCountryMap", language: "fr", country: "MC"},
+{ type: "languageCountryMap", language: "ga", country: "IE"},
+{ type: "languageCountryMap", language: "gl", country: "ES"},
+{ type: "languageCountryMap", language: "gu", country: "IN"},
+{ type: "languageCountryMap", language: "gv", country: "GB"},
+{ type: "languageCountryMap", language: "ha", country: "GH"},
+{ type: "languageCountryMap", language: "ha", country: "NE"},
+{ type: "languageCountryMap", language: "ha", country: "NG"},
+{ type: "languageCountryMap", language: "he", country: "IL"},
+{ type: "languageCountryMap", language: "hi", country: "IN"},
+{ type: "languageCountryMap", language: "hr", country: "HR"},
+{ type: "languageCountryMap", language: "hu", country: "HU"},
+{ type: "languageCountryMap", language: "hy", country: "AM"},
+{ type: "languageCountryMap", language: "id", country: "ID"},
+{ type: "languageCountryMap", language: "ig", country: "NG"},
+{ type: "languageCountryMap", language: "is", country: "IS"},
+{ type: "languageCountryMap", language: "it", country: "CH"},
+{ type: "languageCountryMap", language: "it", country: "IT"},
+{ type: "languageCountryMap", language: "ja", country: "JP"},
+{ type: "languageCountryMap", language: "ka", country: "GE"},
+{ type: "languageCountryMap", language: "kk", country: "KZ"},
+{ type: "languageCountryMap", language: "kl", country: "GL"},
+{ type: "languageCountryMap", language: "km", country: "KH"},
+{ type: "languageCountryMap", language: "kn", country: "IN"},
+{ type: "languageCountryMap", language: "ko", country: "KR"},
+{ type: "languageCountryMap", language: "ku", country: "IQ"},
+{ type: "languageCountryMap", language: "ku", country: "IR"},
+{ type: "languageCountryMap", language: "ku", country: "SY"},
+{ type: "languageCountryMap", language: "ku", country: "TR"},
+{ type: "languageCountryMap", language: "kw", country: "GB"},
+{ type: "languageCountryMap", language: "ky", country: "KG"},
+{ type: "languageCountryMap", language: "ln", country: "CD"},
+{ type: "languageCountryMap", language: "ln", country: "CG"},
+{ type: "languageCountryMap", language: "lo", country: "LA"},
+{ type: "languageCountryMap", language: "lt", country: "LT"},
+{ type: "languageCountryMap", language: "lv", country: "LV"},
+{ type: "languageCountryMap", language: "mk", country: "MK"},
+{ type: "languageCountryMap", language: "ml", country: "IN"},
+{ type: "languageCountryMap", language: "mn", country: "MN"},
+{ type: "languageCountryMap", language: "mr", country: "IN"},
+{ type: "languageCountryMap", language: "ms", country: "BN"},
+{ type: "languageCountryMap", language: "ms", country: "MY"},
+{ type: "languageCountryMap", language: "mt", country: "MT"},
+{ type: "languageCountryMap", language: "nb", country: "NO"},
+{ type: "languageCountryMap", language: "ne", country: "NP"},
+{ type: "languageCountryMap", language: "nl", country: "BE"},
+{ type: "languageCountryMap", language: "nl", country: "NL"},
+{ type: "languageCountryMap", language: "nn", country: "NO"},
+{ type: "languageCountryMap", language: "nr", country: "ZA"},
+{ type: "languageCountryMap", language: "ny", country: "MW"},
+{ type: "languageCountryMap", language: "om", country: "ET"},
+{ type: "languageCountryMap", language: "om", country: "KE"},
+{ type: "languageCountryMap", language: "or", country: "IN"},
+{ type: "languageCountryMap", language: "pa", country: "IN"},
+{ type: "languageCountryMap", language: "pa", country: "PK"},
+{ type: "languageCountryMap", language: "pl", country: "PL"},
+{ type: "languageCountryMap", language: "ps", country: "AF"},
+{ type: "languageCountryMap", language: "pt", country: "BR"},
+{ type: "languageCountryMap", language: "pt", country: "PT"},
+{ type: "languageCountryMap", language: "ro", country: "RO"},
+{ type: "languageCountryMap", language: "ru", country: "RU"},
+{ type: "languageCountryMap", language: "ru", country: "UA"},
+{ type: "languageCountryMap", language: "rw", country: "RW"},
+{ type: "languageCountryMap", language: "sa", country: "IN"},
+{ type: "languageCountryMap", language: "se", country: "NO"},
+{ type: "languageCountryMap", language: "sh", country: "BA"},
+{ type: "languageCountryMap", language: "sh", country: "CS"},
+{ type: "languageCountryMap", language: "sh", country: "YU"},
+{ type: "languageCountryMap", language: "sk", country: "SK"},
+{ type: "languageCountryMap", language: "sl", country: "SI"},
+{ type: "languageCountryMap", language: "so", country: "DJ"},
+{ type: "languageCountryMap", language: "so", country: "ET"},
+{ type: "languageCountryMap", language: "so", country: "KE"},
+{ type: "languageCountryMap", language: "so", country: "SO"},
+{ type: "languageCountryMap", language: "sq", country: "AL"},
+{ type: "languageCountryMap", language: "sr", country: "BA"},
+{ type: "languageCountryMap", language: "sr", country: "CS"},
+{ type: "languageCountryMap", language: "sr", country: "YU"},
+{ type: "languageCountryMap", language: "ss", country: "ZA"},
+{ type: "languageCountryMap", language: "st", country: "ZA"},
+{ type: "languageCountryMap", language: "sv", country: "FI"},
+{ type: "languageCountryMap", language: "sv", country: "SE"},
+{ type: "languageCountryMap", language: "sw", country: "KE"},
+{ type: "languageCountryMap", language: "sw", country: "TZ"},
+{ type: "languageCountryMap", language: "ta", country: "IN"},
+{ type: "languageCountryMap", language: "te", country: "IN"},
+{ type: "languageCountryMap", language: "tg", country: "TJ"},
+{ type: "languageCountryMap", language: "th", country: "TH"},
+{ type: "languageCountryMap", language: "ti", country: "ER"},
+{ type: "languageCountryMap", language: "ti", country: "ET"},
+{ type: "languageCountryMap", language: "tn", country: "ZA"},
+{ type: "languageCountryMap", language: "tr", country: "TR"},
+{ type: "languageCountryMap", language: "ts", country: "ZA"},
+{ type: "languageCountryMap", language: "tt", country: "RU"},
+{ type: "languageCountryMap", language: "uk", country: "UA"},
+{ type: "languageCountryMap", language: "ur", country: "IN"},
+{ type: "languageCountryMap", language: "ur", country: "PK"},
+{ type: "languageCountryMap", language: "uz", country: "AF"},
+{ type: "languageCountryMap", language: "uz", country: "UZ"},
+{ type: "languageCountryMap", language: "ve", country: "ZA"},
+{ type: "languageCountryMap", language: "vi", country: "VN"},
+{ type: "languageCountryMap", language: "xh", country: "ZA"},
+{ type: "languageCountryMap", language: "yo", country: "NG"},
+{ type: "languageCountryMap", language: "zh", country: "CN"},
+{ type: "languageCountryMap", language: "zh", country: "HK"},
+{ type: "languageCountryMap", language: "zh", country: "MO"},
+{ type: "languageCountryMap", language: "zh", country: "SG"},
+{ type: "languageCountryMap", language: "zh", country: "TW"},
+{ type: "languageCountryMap", language: "zu", country: "ZA"}
+]
diff --git a/includes/js/dijit/demos/i18n/languages.json b/includes/js/dijit/demos/i18n/languages.json
new file mode 100644
index 0000000..bc4955b
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/languages.json
@@ -0,0 +1,7045 @@
+[
+{ type: "language", iso: "aa",
+countries: [
+{_reference: "DJ"},
+{_reference: "ER"},
+{_reference: "ET"},
+],
+name: "Qafar",
+},
+{ type: "language", iso: "af",
+countries: [
+{_reference: "NA"},
+{_reference: "ZA"},
+],
+name: "Afrikaans",
+"af": "Afrikaans",
+"es": "Spaans",
+"pt": "Portugees",
+"ru": "Russies",
+"zh": "Sjinees",
+},
+{ type: "language", iso: "ak",
+countries: [
+{_reference: "GH"},
+],
+},
+{ type: "language", iso: "am",
+countries: [
+{_reference: "ET"},
+],
+name: "አማርኛ",
+"aa": "አፋርኛ",
+"ab": "አብሐዚኛ",
+"af": "አፍሪቃንስኛ",
+"am": "አማርኛ",
+"ar": "ዐርቢኛ",
+"as": "አሳሜዛዊ",
+"ay": "አያማርኛ",
+"az": "አዜርባይጃንኛ",
+"ba": "ባስኪርኛ",
+"be": "ቤላራሻኛ",
+"bg": "ቡልጋሪኛ",
+"bh": "ቢሃሪ",
+"bi": "ቢስላምኛ",
+"bn": "በንጋሊኛ",
+"bo": "ትበትንኛ",
+"br": "ብሬቶንኛ",
+"ca": "ካታላንኛ",
+"co": "ኮርሲካኛ",
+"cs": "ቼክኛ",
+"cy": "ወልሽ",
+"da": "ዴኒሽ",
+"de": "ጀርመን",
+"dz": "ድዞንግኻኛ",
+"el": "ግሪክኛ",
+"en": "እንግሊዝኛ",
+"eo": "ኤስፐራንቶ",
+"es": "ስፓኒሽ",
+"et": "ኤስቶኒአን",
+"eu": "ባስክኛ",
+"fa": "ፐርሲያኛ",
+"fi": "ፊኒሽ",
+"fj": "ፊጂኛ",
+"fo": "ፋሮኛ",
+"fr": "ፈረንሳይኛ",
+"fy": "ፍሪስኛ",
+"ga": "አይሪሽ",
+"gd": "እስኮትስ ጌልክኛ",
+"gl": "ጋለጋኛ",
+"gn": "ጓራኒኛ",
+"gu": "ጉጃርቲኛ",
+"ha": "ሃውሳኛ",
+"he": "ዕብራስጥ",
+"hi": "ሐንድኛ",
+"hr": "ክሮሽያንኛ",
+"hu": "ሀንጋሪኛ",
+"hy": "አርመናዊ",
+"ia": "ኢንቴርሊንጓ",
+"id": "እንዶኒሲኛ",
+"ie": "እንተርሊንግወ",
+"ik": "እኑፒያቅኛ",
+"is": "አይስላንድኛ",
+"it": "ጣሊያንኛ",
+"iu": "እኑክቲቱትኛ",
+"ja": "ጃፓንኛ",
+"jv": "ጃቫንኛ",
+"ka": "ጊዮርጊያን",
+"kk": "ካዛክኛ",
+"kl": "ካላሊሱትኛ",
+"km": "ክመርኛ",
+"kn": "ካናዳኛ",
+"ko": "ኮሪያኛ",
+"ks": "ካሽሚርኛ",
+"ku": "ኩርድሽኛ",
+"ky": "ኪርጊዝኛ",
+"la": "ላቲንኛ",
+"ln": "ሊንጋላኛ",
+"lo": "ላውስኛ",
+"lt": "ሊቱአኒያን",
+"lv": "ላትቪያን",
+"mg": "ማላጋስኛ",
+"mi": "ማዮሪኛ",
+"mk": "ማከዶኒኛ",
+"ml": "ማላያላምኛ",
+"mn": "ሞንጎላዊኛ",
+"mo": "ሞልዳቫዊና",
+"mr": "ማራዚኛ",
+"ms": "ማላይኛ",
+"mt": "ማልቲስኛ",
+"my": "ቡርማኛ",
+"na": "ናኡሩ",
+"ne": "ኔፓሊኛ",
+"nl": "ደች",
+"no": "ኖርዌጂያን",
+"oc": "ኦኪታንኛ",
+"om": "ኦሮምኛ",
+"or": "ኦሪያኛ",
+"pa": "ፓንጃቢኛ",
+"pl": "ፖሊሽ",
+"ps": "ፑሽቶኛ",
+"pt": "ፖርቱጋሊኛ",
+"qu": "ኵቿኛ",
+"rm": "ሮማንስ",
+"rn": "ሩንዲኛ",
+"ro": "ሮማኒያን",
+"ru": "ራሽኛ",
+"rw": "ኪንያርዋንድኛ",
+"sa": "ሳንስክሪትኛ",
+"sd": "ሲንድሂኛ",
+"sg": "ሳንጎኛ",
+"si": "ስንሃልኛ",
+"sk": "ስሎቫክኛ",
+"sl": "ስሎቪኛ",
+"sm": "ሳሞአኛ",
+"sn": "ሾናኛ",
+"so": "ሱማልኛ",
+"sq": "ልቤኒኛ",
+"sr": "ሰርቢኛ",
+"ss": "ስዋቲኛ",
+"st": "ሶዞኛ",
+"su": "ሱዳንኛ",
+"sv": "ስዊድንኛ",
+"sw": "ስዋሂሊኛ",
+"ta": "ታሚልኛ",
+"te": "ተሉጉኛ",
+"tg": "ታጂኪኛ",
+"th": "ታይኛ",
+"ti": "ትግርኛ",
+"tk": "ቱርክመንኛ",
+"tl": "ታጋሎገኛ",
+"tn": "ጽዋናዊኛ",
+"to": "ቶንጋ",
+"tr": "ቱርክኛ",
+"ts": "ጾንጋኛ",
+"tt": "ታታርኛ",
+"tw": "ትዊኛ",
+"ug": "ኡዊግሁርኛ",
+"uk": "ዩክረኒኛ",
+"ur": "ኡርዱኛ",
+"uz": "ኡዝበክኛ",
+"vi": "ቪትናምኛ",
+"vo": "ቮላፑክኛ",
+"wo": "ዎሎፍኛ",
+"xh": "ዞሳኛ",
+"yi": "ይዲሻዊኛ",
+"yo": "ዮሩባዊኛ",
+"za": "ዡዋንግኛ",
+"zh": "ቻይንኛ",
+"zu": "ዙሉኛ",
+},
+{ type: "language", iso: "ar",
+countries: [
+{_reference: "AE"},
+{_reference: "BH"},
+{_reference: "DZ"},
+{_reference: "EG"},
+{_reference: "IQ"},
+{_reference: "JO"},
+{_reference: "KW"},
+{_reference: "LB"},
+{_reference: "LY"},
+{_reference: "MA"},
+{_reference: "OM"},
+{_reference: "QA"},
+{_reference: "SA"},
+{_reference: "SD"},
+{_reference: "SY"},
+{_reference: "TN"},
+{_reference: "YE"},
+],
+name: "العربية",
+"aa": "الأفارية",
+"ab": "الأبخازية",
+"ae": "الأفستية",
+"af": "الأفريقية",
+"ak": "الأكانية",
+"am": "الأمهرية",
+"an": "الأراجونية",
+"ar": "العربية",
+"as": "الأسامية",
+"av": "الأفاريكية",
+"ay": "الأيمارا",
+"az": "الأذرية",
+"ba": "الباشكيرية",
+"be": "البيلوروسية",
+"bg": "البلغارية",
+"bh": "البيهارية",
+"bi": "البيسلامية",
+"bm": "البامبارا",
+"bn": "البنغالية",
+"bo": "التبتية",
+"br": "البريتونية",
+"bs": "البوسنية",
+"ca": "الكاتالوينية",
+"ce": "الشيشانية",
+"ch": "التشامورو",
+"co": "الكورسيكية",
+"cr": "الكرى",
+"cs": "التشيكية",
+"cu": "سلافية كنسية",
+"cv": "التشفاش",
+"cy": "الولزية",
+"da": "الدانماركية",
+"de": "الألمانية",
+"dv": "المالديفية",
+"dz": "الزونخاية",
+"el": "اليونانية",
+"en": "الانجليزية",
+"eo": "اسبرانتو",
+"es": "الأسبانية",
+"et": "الأستونية",
+"eu": "لغة الباسك",
+"fa": "الفارسية",
+"ff": "الفلة",
+"fi": "الفنلندية",
+"fj": "الفيجية",
+"fo": "الفارويز",
+"fr": "الفرنسية",
+"fy": "الفريزيان",
+"ga": "الأيرلندية",
+"gd": "الغيلية الأسكتلندية",
+"gl": "الجاليكية",
+"gn": "الجوارانى",
+"gu": "الغوجاراتية",
+"gv": "المنكية",
+"ha": "الهوسا",
+"he": "العبرية",
+"hi": "الهندية",
+"ho": "الهيرى موتو",
+"hr": "الكرواتية",
+"ht": "الهايتية",
+"hu": "الهنغارية",
+"hy": "الأرمينية",
+"hz": "الهيريرو",
+"ia": "اللّغة الوسيطة",
+"id": "الأندونيسية",
+"ie": "الانترلينج",
+"ig": "الايجبو",
+"ii": "السيتشيون يى",
+"ik": "الاينبياك",
+"io": "الايدو",
+"is": "الأيسلاندية",
+"it": "الايطالية",
+"iu": "الاينكتيتت",
+"ja": "اليابانية",
+"jv": "الجاوية",
+"ka": "الجورجية",
+"kg": "الكونغو",
+"ki": "الكيكيو",
+"kj": "الكيونياما",
+"kk": "الكازاخستانية",
+"kl": "الكالاليست",
+"km": "الخميرية",
+"kn": "الكانادا",
+"ko": "الكورية",
+"kr": "الكانيورى",
+"ks": "الكاشميرية",
+"ku": "الكردية",
+"kv": "الكومى",
+"kw": "الكورنية",
+"ky": "القيرغستانية",
+"la": "اللاتينية",
+"lb": "اللوكسمبرجية",
+"lg": "الجاندا",
+"li": "الليمبرجيشية",
+"ln": "اللينجالا",
+"lo": "اللاوية",
+"lt": "اللتوانية",
+"lu": "اللبا-كاتانجا",
+"lv": "اللاتفية",
+"mg": "المالاجاشية",
+"mh": "المارشالية",
+"mi": "الماورية",
+"mk": "المقدونية",
+"ml": "الماليالام",
+"mn": "المنغولية",
+"mo": "المولدوفية",
+"mr": "الماراثى",
+"ms": "لغة الملايو",
+"mt": "المالطية",
+"my": "البورمية",
+"na": "النورو",
+"nb": "البوكمالية النرويجية",
+"nd": "النديبيل الشمالى",
+"ne": "النيبالية",
+"ng": "الندونجا",
+"nl": "الهولندية",
+"nn": "النينورسك النرويجي",
+"no": "النرويجية",
+"nr": "النديبيل الجنوبى",
+"nv": "النافاجو",
+"ny": "النيانجا، التشيتشوا، التشوا",
+"oc": "الأوكيتان (بعد 1500)، بروفينسية",
+"oj": "الأوجيبوا",
+"om": "الأورومو",
+"or": "الأورييا",
+"os": "الأوسيتيك",
+"pa": "البنجابية",
+"pi": "البالية",
+"pl": "البولندية",
+"ps": "البشتونية",
+"pt": "البرتغالية",
+"qu": "الكويتشوا",
+"rm": "الرهايتو-رومانس",
+"rn": "الرندى",
+"ro": "الرومانية",
+"ru": "الروسية",
+"rw": "الكينيارواندا",
+"sa": "السنسكريتية",
+"sc": "السردينية",
+"sd": "السيندى",
+"se": "السامي الشمالى",
+"sg": "السانجو",
+"si": "السريلانكية",
+"sk": "السلوفاكية",
+"sl": "السلوفانية",
+"sm": "الساموائية",
+"sn": "الشونا",
+"so": "الصومالية",
+"sq": "الألبانية",
+"sr": "الصربية",
+"ss": "السواتى",
+"su": "السودانية",
+"sv": "السويدية",
+"sw": "السواحلية",
+"ta": "التاميلية",
+"te": "التيلجو",
+"tg": "الطاجيكية",
+"th": "التايلاندية",
+"ti": "التيجرينيا",
+"tk": "التركمانية",
+"tl": "التاغالوغية",
+"tn": "التسوانية",
+"to": "تونجا - جزر تونجا",
+"tr": "التركية",
+"ts": "السونجا",
+"tt": "التتارية",
+"tw": "التوى",
+"ty": "التاهيتية",
+"ug": "الأغورية",
+"uk": "الأوكرانية",
+"ur": "الأردية",
+"uz": "الاوزباكية",
+"ve": "الفيندا",
+"vi": "الفيتنامية",
+"wa": "الولونية",
+"wo": "الولوف",
+"yi": "اليديشية",
+"yo": "اليوروبية",
+"za": "الزهيونج",
+"zh": "الصينية",
+},
+{ type: "language", iso: "as",
+countries: [
+{_reference: "IN"},
+],
+name: "অসমীয়া",
+"as": "অসমীয়া",
+},
+{ type: "language", iso: "az",
+countries: [
+{_reference: "AZ"},
+],
+name: "azərbaycanca",
+"az": "azərbaycanca",
+},
+{ type: "language", iso: "be",
+countries: [
+{_reference: "BY"},
+],
+name: "Беларускі",
+"ar": "арабскі",
+"be": "Беларускі",
+"de": "нямецкі",
+"en": "англійскі",
+"es": "іспанскі",
+"fr": "французскі",
+"hi": "хіндзі",
+"it": "італьянскі",
+"ja": "японскі",
+"pt": "партугальскі",
+"ru": "рускі",
+"zh": "кітайскі",
+},
+{ type: "language", iso: "bg",
+countries: [
+{_reference: "BG"},
+],
+name: "Български",
+"ab": "Абхазски",
+"af": "Африканс",
+"am": "Амхарски",
+"ar": "Арабски",
+"av": "Аварски",
+"ay": "Аймара",
+"az": "Азърбайджански",
+"ba": "Башкирски",
+"be": "Беларуски",
+"bg": "Български",
+"bi": "Бислама",
+"bn": "Бенгалски",
+"bo": "Тибетски",
+"br": "Бретонски",
+"bs": "Босненски",
+"ca": "Каталонски",
+"ce": "Чеченски",
+"co": "Корсикански",
+"cs": "Чешки",
+"cu": "Църковно славянски",
+"cy": "Уелски",
+"da": "Датски",
+"de": "Немски",
+"dv": "Дивехи",
+"el": "Гръцки",
+"en": "Английски",
+"eo": "Есперанто",
+"es": "Испански",
+"et": "Естонски",
+"eu": "Баски",
+"fa": "Персийски",
+"fi": "Фински",
+"fr": "Френски",
+"ga": "Ирландски",
+"gd": "Шотландски галски",
+"gu": "Гуджарати",
+"he": "Иврит",
+"hi": "Хинди",
+"hr": "Хърватски",
+"ht": "Хаитянски",
+"hu": "Унгарски",
+"hy": "Арменски",
+"id": "Индонезийски",
+"io": "Идо",
+"is": "Исландски",
+"it": "Италиански",
+"ja": "Японски",
+"jv": "Явански",
+"ka": "Грузински",
+"kg": "Конгоански",
+"ki": "кикуйу",
+"kk": "Казахски",
+"km": "Кхмерски",
+"ko": "Корейски",
+"ks": "Кашмирски",
+"ku": "Кюрдски",
+"ky": "Киргизски",
+"la": "Латински",
+"lb": "Люксембургски",
+"lo": "Лаоски",
+"lt": "Литовски",
+"lv": "Латвийски",
+"mg": "Малгашки",
+"mi": "Маорски",
+"mk": "Македонски",
+"ml": "Малаялам",
+"mn": "Монголски",
+"mo": "Молдовски",
+"ms": "Малайски",
+"mt": "Малтийски",
+"my": "Бирмански",
+"ne": "Непалски",
+"nl": "Холандски",
+"no": "Норвежки",
+"ny": "Чинянджа",
+"os": "Осетски",
+"pa": "Пенджабски",
+"pl": "Полски",
+"ps": "Пущу",
+"pt": "Португалски",
+"qu": "Кечуа",
+"rm": "Реторомански",
+"rn": "Рунди",
+"ro": "Румънски",
+"ru": "Руски",
+"rw": "Киняруанда",
+"sa": "Санкскритски",
+"sc": "Сардински",
+"sg": "Санго",
+"sh": "Сърбохърватски",
+"si": "Синхалски",
+"sk": "Словашки",
+"sl": "Словенски",
+"sm": "Самоански",
+"so": "Сомалийски",
+"sq": "Албански",
+"sr": "Сръбски",
+"ss": "Суази",
+"st": "Сесуто",
+"sv": "Шведски",
+"sw": "Суахили",
+"ta": "Тамилски",
+"te": "Телугу",
+"tg": "Таджикски",
+"th": "Таи",
+"tk": "Туркменски",
+"tr": "Турски",
+"tt": "Татарски",
+"ty": "Таитянски",
+"uk": "Украински",
+"ur": "Урду",
+"uz": "Узбекски",
+"vi": "Виетнамски",
+"zh": "Китайски",
+"zu": "Зулуски",
+},
+{ type: "language", iso: "bn",
+countries: [
+{_reference: "BD"},
+{_reference: "IN"},
+],
+name: "বাংলা",
+"bn": "বাংলা",
+},
+{ type: "language", iso: "bs",
+countries: [
+{_reference: "BA"},
+],
+"de": "njemački",
+"en": "engleski",
+"es": "španjolski",
+"fr": "francuski",
+"it": "talijanski",
+"ja": "japanski",
+"pt": "portugalski",
+"ru": "ruski",
+"zh": "kineski",
+},
+{ type: "language", iso: "ca",
+countries: [
+{_reference: "ES"},
+],
+name: "català",
+"aa": "àfar",
+"ab": "abkhaz",
+"af": "afrikaans",
+"am": "amhàric",
+"ar": "àrab",
+"as": "assamès",
+"ay": "aimara",
+"az": "àzeri",
+"ba": "baixkir",
+"be": "bielorús",
+"bg": "búlgar",
+"bh": "bihari",
+"bi": "bislama",
+"bn": "bengalí",
+"bo": "tibetà",
+"br": "bretó",
+"ca": "català",
+"co": "cors",
+"cs": "txec",
+"cy": "gal·lès",
+"da": "danès",
+"de": "alemany",
+"dz": "bhutanès",
+"el": "grec",
+"en": "anglès",
+"eo": "esperanto",
+"es": "espanyol",
+"et": "estonià",
+"eu": "basc",
+"fa": "persa",
+"fi": "finès",
+"fj": "fijià",
+"fo": "feroès",
+"fr": "francès",
+"fy": "frisó",
+"ga": "irlandès",
+"gd": "escocès",
+"gl": "gallec",
+"gn": "guaraní",
+"gu": "gujarati",
+"ha": "hausa",
+"he": "hebreu",
+"hi": "hindi",
+"hr": "croat",
+"hu": "hongarès",
+"hy": "armeni",
+"ia": "interlingua",
+"id": "indonesi",
+"ie": "interlingue",
+"ik": "inupiak",
+"is": "islandès",
+"it": "italià",
+"iu": "inuktitut",
+"ja": "japonès",
+"jv": "javanès",
+"ka": "georgià",
+"kk": "kazakh",
+"kl": "greenlandès",
+"km": "cambodjà",
+"kn": "kannada",
+"ko": "coreà",
+"ks": "caixmiri",
+"ku": "kurd",
+"ky": "kirguís",
+"la": "llatí",
+"ln": "lingala",
+"lo": "laosià",
+"lt": "lituà",
+"lv": "letó",
+"mg": "malgaix",
+"mi": "maori",
+"mk": "macedoni",
+"ml": "malaialam",
+"mn": "mongol",
+"mo": "moldau",
+"mr": "marathi",
+"ms": "malai",
+"mt": "maltès",
+"my": "birmà",
+"na": "nauruà",
+"ne": "nepalès",
+"nl": "neerlandès",
+"no": "noruec",
+"oc": "occità",
+"om": "oromo (afan)",
+"or": "oriya",
+"pa": "panjabi",
+"pl": "polonès",
+"ps": "paixto",
+"pt": "portuguès",
+"qu": "quètxua",
+"rm": "retoromànic",
+"rn": "kirundi",
+"ro": "romanès",
+"ru": "rus",
+"rw": "kinyarwanda",
+"sa": "sànscrit",
+"sd": "sindhi",
+"sg": "sango",
+"sh": "serbo-croat",
+"si": "sinhalès",
+"sk": "eslovac",
+"sl": "eslovè",
+"sm": "samoà",
+"sn": "shona",
+"so": "somali",
+"sq": "albanès",
+"sr": "serbi",
+"ss": "siswati",
+"st": "sotho",
+"su": "sundanès",
+"sv": "suec",
+"sw": "swahili",
+"ta": "tàmil",
+"te": "telugu",
+"tg": "tadjik",
+"th": "thai",
+"ti": "tigrinya",
+"tk": "turcman",
+"tl": "tagàlog",
+"tn": "tswana",
+"to": "tonga",
+"tr": "turc",
+"ts": "tsonga",
+"tt": "tàtar",
+"tw": "twi",
+"ug": "uigur",
+"uk": "ucraïnès",
+"ur": "urdú",
+"uz": "uzbek",
+"vi": "vietnamita",
+"vo": "volapuk",
+"wo": "wòlof",
+"xh": "xosa",
+"yi": "jiddish",
+"yo": "ioruba",
+"za": "zhuang",
+"zh": "xinés",
+"zu": "zulu",
+},
+{ type: "language", iso: "cs",
+countries: [
+{_reference: "CZ"},
+],
+name: "Čeština",
+"aa": "Afarština",
+"ab": "Abcházština",
+"af": "Afrikánština",
+"am": "Amharština",
+"ar": "Arabština",
+"as": "Assaméština",
+"ay": "Aymárština",
+"az": "Azerbajdžánština",
+"ba": "Baskirština",
+"be": "Běloruština",
+"bg": "Bulharština",
+"bh": "Biharština",
+"bi": "Bislámština",
+"bn": "Bengálština",
+"bo": "Tibetština",
+"br": "Bretaňština",
+"ca": "Katalánština",
+"co": "Korsičtina",
+"cs": "Čeština",
+"cy": "Velština",
+"da": "Dánština",
+"de": "Němčina",
+"dz": "Bhútánština",
+"el": "Řečtina",
+"en": "Angličtina",
+"eo": "Esperanto",
+"es": "Španělština",
+"et": "Estonština",
+"eu": "Baskičtina",
+"fa": "Perština",
+"fi": "Finština",
+"fj": "Fidži",
+"fo": "Faerština",
+"fr": "Francouzština",
+"fy": "Fríština",
+"ga": "Irština",
+"gd": "Skotská galština",
+"gl": "Haličština",
+"gn": "Guaranština",
+"gu": "Gujaratština",
+"gv": "Manština",
+"ha": "Hausa",
+"he": "Hebrejština",
+"hi": "Hindština",
+"hr": "Chorvatština",
+"hu": "Maďarština",
+"hy": "Arménština",
+"ia": "Interlingua",
+"id": "Indonéština",
+"ie": "Interlingue",
+"ik": "Inupiakština",
+"is": "Islandština",
+"it": "Italština",
+"iu": "Inuktitutština",
+"ja": "Japonština",
+"jv": "Javánština",
+"ka": "Gruzínština",
+"kk": "Kazachština",
+"kl": "Grónština",
+"km": "Kambodžština",
+"kn": "Kannadština",
+"ko": "Korejština",
+"ks": "Kašmírština",
+"ku": "Kurdština",
+"ky": "Kirgizština",
+"la": "Latina",
+"ln": "Lingalština",
+"lo": "Laoština",
+"lt": "Litevština",
+"lv": "Lotyština",
+"mg": "Malgaština",
+"mi": "Maorština",
+"mk": "Makedonština",
+"ml": "Malabarština",
+"mn": "Mongolština",
+"mo": "Moldavština",
+"mr": "Marathi",
+"ms": "Malajština",
+"mt": "Maltština",
+"my": "Barmština",
+"na": "Nauru",
+"ne": "Nepálština",
+"no": "Norština",
+"oc": "Occitan",
+"om": "Oromo (Afan)",
+"or": "Oriya",
+"pa": "Paňdžábština",
+"pl": "Polština",
+"ps": "Pashto (Pushto)",
+"pt": "Portugalština",
+"qu": "Kečuánština",
+"rm": "Rétorománština",
+"rn": "Kirundi",
+"ro": "Rumunština",
+"ru": "Ruština",
+"rw": "Kinyarwandština",
+"sa": "Sanskrt",
+"sd": "Sindhi",
+"sg": "Sangho",
+"sh": "Srbochorvatština",
+"si": "Sinhálština",
+"sk": "Slovenština",
+"sl": "Slovinština",
+"sm": "Samoyština",
+"sn": "Shona",
+"so": "Somálština",
+"sq": "Albánština",
+"sr": "Srbština",
+"ss": "Siswatština",
+"st": "Sesotho",
+"su": "Sundanština",
+"sv": "Švédština",
+"sw": "Svahilština",
+"ta": "Tamilština",
+"te": "Telugština",
+"tg": "Tádžičtina",
+"th": "Thajština",
+"ti": "Tigrinijština",
+"tk": "Turkmenština",
+"tl": "Tagalog",
+"tn": "Setswanština",
+"to": "Tonga",
+"tr": "Turečtina",
+"ts": "Tsonga",
+"tt": "Tatarština",
+"tw": "Twi",
+"ug": "Uighurština",
+"uk": "Ukrajinština",
+"ur": "Urdština",
+"uz": "Uzbečtina",
+"vi": "Vietnamština",
+"vo": "Volapuk",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Jidiš",
+"yo": "Yoruba",
+"za": "Zhuang",
+"zh": "Čínština",
+"zu": "Zulu",
+},
+{ type: "language", iso: "cy",
+countries: [
+{_reference: "GB"},
+],
+name: "Cymraeg",
+"ar": "Arabeg",
+"cy": "Cymraeg",
+"de": "Almaeneg",
+"en": "Saesneg",
+"es": "Sbaeneg",
+"fr": "Ffrangeg",
+"hi": "Hindi",
+"it": "Eidaleg",
+"ja": "Siapaneeg",
+"pt": "Portiwgaleg",
+"ru": "Rwsieg",
+"zh": "Tseineeg",
+},
+{ type: "language", iso: "da",
+countries: [
+{_reference: "DK"},
+],
+name: "Dansk",
+"aa": "afar",
+"ab": "abkhasisk",
+"ae": "avestan",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amharisk",
+"an": "aragonesisk",
+"ar": "arabisk",
+"as": "assamesisk",
+"ay": "Aymara",
+"az": "aserbajdsjansk",
+"ba": "bashkir",
+"be": "hviderussisk",
+"bg": "bulgarsk",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengalsk",
+"bo": "Tibetansk",
+"br": "bretonsk",
+"bs": "bosnisk",
+"ca": "katalansk",
+"ce": "tjetjensk",
+"ch": "chamorro",
+"co": "Korsikansk",
+"cr": "Cree",
+"cs": "Tjekkisk",
+"cu": "Kirkeslavisk",
+"cv": "Chuvash",
+"cy": "Walisisk",
+"da": "Dansk",
+"de": "Tysk",
+"dv": "Divehi",
+"dz": "Dzongkha",
+"ee": "Ewe",
+"el": "Græsk",
+"en": "Engelsk",
+"eo": "Esperanto",
+"es": "Spansk",
+"et": "Estisk",
+"eu": "baskisk",
+"fa": "Persisk",
+"ff": "Fulah",
+"fi": "Finsk",
+"fj": "Fijian",
+"fo": "Færøsk",
+"fr": "Fransk",
+"fy": "Frisisk",
+"ga": "Irsk",
+"gd": "Gælisk (skotsk)",
+"gl": "Galicisk",
+"gn": "Guarani",
+"gu": "Gujaratisk",
+"gv": "Manx",
+"ha": "Hausa",
+"he": "Hebraisk",
+"hi": "Hindi",
+"ho": "Hiri Motu",
+"hr": "Kroatisk",
+"ht": "Haitisk",
+"hu": "Ungarsk",
+"hy": "armensk",
+"hz": "Herero",
+"ia": "Interlingua",
+"id": "Indonesisk",
+"ie": "Interlingue",
+"ig": "Igbo",
+"ii": "Sichuan Yi",
+"ik": "Inupiaq",
+"io": "Ido",
+"is": "Islandsk",
+"it": "Italiensk",
+"iu": "Inuktitut",
+"ja": "Japansk",
+"jv": "Javanesisk",
+"ka": "Georgisk",
+"kg": "Kongo",
+"ki": "Kikuyu",
+"kj": "Kuanyama",
+"kk": "Kasakhisk",
+"kl": "Kalaallisut",
+"km": "Khmer",
+"kn": "Kannaresisk",
+"ko": "Koreansk",
+"kr": "Kanuri",
+"ks": "Kashmiri",
+"ku": "Kurdisk",
+"kw": "Cornisk",
+"ky": "Kirgisisk",
+"la": "Latin",
+"lb": "Luxembourgsk",
+"lg": "Ganda",
+"li": "Limburgsk",
+"ln": "Lingala",
+"lo": "Lao",
+"lt": "Litauisk",
+"lu": "Luba-Katanga",
+"lv": "Lettisk",
+"mg": "Malagasy",
+"mh": "Marshallese",
+"mi": "Maori",
+"mk": "Makedonsk",
+"ml": "Malayalam",
+"mn": "Mongolsk",
+"mo": "Moldovisk",
+"mr": "Marathisk",
+"ms": "Malay",
+"mt": "Maltesisk",
+"my": "burmesisk",
+"na": "Nauru",
+"nb": "Norsk Bokmål",
+"nd": "Ndebele, Nord",
+"ne": "Nepalesisk",
+"ng": "Ndonga",
+"nl": "Hollandsk",
+"nn": "Nynorsk",
+"no": "Norsk",
+"nr": "Ndebele, Syd",
+"nv": "Navajo",
+"ny": "Nyanja; Chichewa; Chewa",
+"oc": "Occitansk (efter 1500); Provencalsk",
+"oj": "Ojibwa",
+"om": "Oromo",
+"or": "Oriya",
+"os": "Ossetisk",
+"pa": "Punjabi",
+"pi": "Pali",
+"pl": "Polsk",
+"ps": "Pashto (Pushto)",
+"pt": "Portugisisk",
+"qu": "Quechua",
+"rm": "Rætoromansk",
+"rn": "Rundi",
+"ro": "Rumænsk",
+"ru": "Russisk",
+"rw": "Kinyarwanda",
+"sa": "Sanskrit",
+"sc": "Sardinsk",
+"sd": "Sindhi",
+"se": "Nordsamisk",
+"sg": "Sango",
+"sh": "Serbokroatisk",
+"si": "Singalesisk",
+"sk": "Slovakisk",
+"sl": "Slovensk",
+"sm": "Samoansk",
+"sn": "Shona",
+"so": "Somalisk",
+"sq": "albansk",
+"sr": "Serbisk",
+"ss": "Swati",
+"st": "Sotho, Southern",
+"su": "Sundanesisk",
+"sv": "Svensk",
+"sw": "Swahili",
+"ta": "Tamilsk",
+"te": "Telugu",
+"tg": "Tajik",
+"th": "Thailandsk",
+"ti": "Tigrinya",
+"tk": "Turkmensk",
+"tl": "Tagalog",
+"tn": "Tswana",
+"to": "Tonga (Tongaøerne)",
+"tr": "Tyrkisk",
+"ts": "Tsonga",
+"tt": "Tatarisk",
+"tw": "Twi",
+"ty": "Tahitiansk",
+"ug": "Uigurisk",
+"uk": "Ukrainsk",
+"ur": "Urdu",
+"uz": "Usbekisk",
+"ve": "Venda",
+"vi": "Vietnamesisk",
+"vo": "Volapük",
+"wa": "Vallonsk",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Jiddisch",
+"yo": "Yoruba",
+"za": "Zhuang",
+"zh": "Kinesisk",
+"zu": "Zulu",
+},
+{ type: "language", iso: "de",
+countries: [
+{_reference: "AT"},
+{_reference: "BE"},
+{_reference: "CH"},
+{_reference: "DE"},
+{_reference: "LI"},
+{_reference: "LU"},
+],
+name: "Deutsch",
+"aa": "Afar",
+"ab": "Abchasisch",
+"ae": "Avestisch",
+"af": "Afrikaans",
+"ak": "Akan",
+"am": "Amharisch",
+"an": "Aragonesisch",
+"ar": "Arabisch",
+"as": "Assamesisch",
+"av": "Awarisch",
+"ay": "Aymará-Sprache",
+"az": "Aserbaidschanisch",
+"ba": "Baschkirisch",
+"be": "Weißrussisch",
+"bg": "Bulgarisch",
+"bh": "Biharisch",
+"bi": "Bislama",
+"bm": "Bambara-Sprache",
+"bn": "Bengalisch",
+"bo": "Tibetisch",
+"br": "Bretonisch",
+"bs": "Bosnisch",
+"ca": "Katalanisch",
+"ce": "Tschetschenisch",
+"ch": "Chamorro-Sprache",
+"co": "Korsisch",
+"cr": "Cree",
+"cs": "Tschechisch",
+"cu": "Kirchenslawisch",
+"cv": "Tschuwaschisch",
+"cy": "Kymrisch",
+"da": "Dänisch",
+"de": "Deutsch",
+"dv": "Maledivisch",
+"dz": "Bhutanisch",
+"ee": "Ewe-Sprache",
+"el": "Griechisch",
+"en": "Englisch",
+"eo": "Esperanto",
+"es": "Spanisch",
+"et": "Estnisch",
+"eu": "Baskisch",
+"fa": "Persisch",
+"ff": "Ful",
+"fi": "Finnisch",
+"fj": "Fidschianisch",
+"fo": "Färöisch",
+"fr": "Französisch",
+"fy": "Friesisch",
+"ga": "Irisch",
+"gd": "Schottisch-Gälisch",
+"gl": "Galizisch",
+"gn": "Guarani",
+"gu": "Gujarati",
+"gv": "Manx",
+"ha": "Hausa",
+"he": "Hebräisch",
+"hi": "Hindi",
+"ho": "Hiri-Motu",
+"hr": "Kroatisch",
+"ht": "Kreolisch",
+"hu": "Ungarisch",
+"hy": "Armenisch",
+"hz": "Herero-Sprache",
+"ia": "Interlingua",
+"id": "Indonesisch",
+"ie": "Interlingue",
+"ig": "Igbo-Sprache",
+"ii": "Sichuan Yi",
+"ik": "Inupiak",
+"io": "Ido-Sprache",
+"is": "Isländisch",
+"it": "Italienisch",
+"iu": "Inukitut",
+"ja": "Japanisch",
+"jv": "Javanisch",
+"ka": "Georgisch",
+"kg": "Kongo",
+"ki": "Kikuyu-Sprache",
+"kj": "Kwanyama",
+"kk": "Kasachisch",
+"kl": "Grönländisch",
+"km": "Kambodschanisch",
+"kn": "Kannada",
+"ko": "Koreanisch",
+"kr": "Kanuri-Sprache",
+"ks": "Kaschmirisch",
+"ku": "Kurdisch",
+"kv": "Komi-Sprache",
+"kw": "Kornisch",
+"ky": "Kirgisisch",
+"la": "Latein",
+"lb": "Luxemburgisch",
+"lg": "Ganda-Sprache",
+"li": "Limburgisch",
+"ln": "Lingala",
+"lo": "Laotisch",
+"lt": "Litauisch",
+"lu": "Luba",
+"lv": "Lettisch",
+"mg": "Madagassisch",
+"mh": "Marschallesisch",
+"mi": "Maori",
+"mk": "Mazedonisch",
+"ml": "Malayalam",
+"mn": "Mongolisch",
+"mo": "Moldauisch",
+"mr": "Marathi",
+"ms": "Malaiisch",
+"mt": "Maltesisch",
+"my": "Birmanisch",
+"na": "Nauruisch",
+"nb": "Norwegisch Bokmål",
+"nd": "Ndebele-Sprache (Nord)",
+"ne": "Nepalesisch",
+"ng": "Ndonga",
+"nl": "Niederländisch",
+"nn": "Norwegisch Nynorsk",
+"no": "Norwegisch",
+"nr": "Ndebele-Sprache (Süd)",
+"nv": "Navajo-Sprache",
+"ny": "Chewa-Sprache",
+"oc": "Okzitanisch",
+"oj": "Ojibwa-Sprache",
+"om": "Oromo",
+"or": "Orija",
+"os": "Ossetisch",
+"pa": "Pandschabisch",
+"pi": "Pali",
+"pl": "Polnisch",
+"ps": "Afghanisch (Paschtu)",
+"pt": "Portugiesisch",
+"qu": "Quechua",
+"rm": "Rätoromanisch",
+"rn": "Rundi-Sprache",
+"ro": "Rumänisch",
+"ru": "Russisch",
+"rw": "Ruandisch",
+"sa": "Sanskrit",
+"sc": "Sardisch",
+"sd": "Sindhi",
+"se": "Nord-Samisch",
+"sg": "Sango",
+"sh": "Serbo-Kroatisch",
+"si": "Singhalesisch",
+"sk": "Slowakisch",
+"sl": "Slowenisch",
+"sm": "Samoanisch",
+"sn": "Shona",
+"so": "Somali",
+"sq": "Albanisch",
+"sr": "Serbisch",
+"ss": "Swazi",
+"st": "Süd-Sotho-Sprache",
+"su": "Sudanesisch",
+"sv": "Schwedisch",
+"sw": "Suaheli",
+"ta": "Tamilisch",
+"te": "Telugu",
+"tg": "Tadschikisch",
+"th": "Thai",
+"ti": "Tigrinja",
+"tk": "Turkmenisch",
+"tl": "Tagalog",
+"tn": "Tswana-Sprache",
+"to": "Tongaisch",
+"tr": "Türkisch",
+"ts": "Tsonga",
+"tt": "Tatarisch",
+"tw": "Twi",
+"ty": "Tahitisch",
+"ug": "Uigurisch",
+"uk": "Ukrainisch",
+"ur": "Urdu",
+"uz": "Usbekisch",
+"ve": "Venda-Sprache",
+"vi": "Vietnamesisch",
+"vo": "Volapük",
+"wa": "Wallonisch",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Jiddisch",
+"yo": "Joruba",
+"za": "Zhuang",
+"zh": "Chinesisch",
+"zu": "Zulu",
+},
+{ type: "language", iso: "dv",
+countries: [
+{_reference: "MV"},
+],
+name: "ދިވެހިބަސް",
+},
+{ type: "language", iso: "dz",
+countries: [
+{_reference: "BT"},
+],
+name: "རྫོང་ཁ",
+},
+{ type: "language", iso: "ee",
+countries: [
+{_reference: "GH"},
+{_reference: "TG"},
+],
+},
+{ type: "language", iso: "el",
+countries: [
+{_reference: "CY"},
+{_reference: "GR"},
+],
+name: "Ελληνικά",
+"ar": "Αραβικά",
+"be": "Λευκορωσικά",
+"bg": "Βουλγαρικά",
+"bn": "Μπενγκάλι",
+"bo": "Θιβετιανά",
+"bs": "Βοσνιακά",
+"ca": "Καταλανικά",
+"co": "Κορσικανικά",
+"cs": "Τσεχικά",
+"cy": "Ουαλικά",
+"da": "Δανικά",
+"de": "Γερμανικά",
+"el": "Ελληνικά",
+"en": "Αγγλικά",
+"es": "Ισπανικά",
+"et": "Εσθονικά",
+"eu": "Βασκικά",
+"fa": "Περσικά",
+"fi": "Φινλανδικά",
+"fr": "Γαλλικά",
+"ga": "Ιρλανδικά",
+"gd": "Σκωτικά Κελτικά",
+"he": "Εβραϊκά",
+"hi": "Χίντι",
+"hr": "Κροατικά",
+"hu": "Ουγγρικά",
+"hy": "Αρμενικά",
+"id": "Ινδονησιακά",
+"is": "Ισλανδικά",
+"it": "Ιταλικά",
+"ja": "Ιαπωνικά",
+"ka": "Γεωργιανά",
+"ko": "Κορεατικά",
+"la": "Λατινικά",
+"lt": "Λιθουανικά",
+"lv": "Λετονικά",
+"mk": "Σλαβομακεδονικά",
+"mn": "Μογγολικά",
+"mo": "Μολδαβικά",
+"mt": "Μαλτεζικά",
+"nl": "Ολλανδικά",
+"no": "Νορβηγικά",
+"pl": "Πολωνικά",
+"pt": "Πορτογαλικά",
+"ro": "Ρουμανικά",
+"ru": "Ρωσικά",
+"sh": "Σερβοκροατικά",
+"sk": "Σλοβακικά",
+"sl": "Σλοβενικά",
+"sq": "Αλβανικά",
+"sr": "Σερβικά",
+"sv": "Σουηδικά",
+"th": "Ταϊλανδικά",
+"tr": "Τουρκικά",
+"uk": "Ουκρανικά",
+"vi": "Βιετναμεζικά",
+"yi": "Ιουδαϊκά",
+"zh": "Κινεζικά",
+},
+{ type: "language", iso: "en",
+countries: [
+{_reference: "AS"},
+{_reference: "AU"},
+{_reference: "BE"},
+{_reference: "BW"},
+{_reference: "BZ"},
+{_reference: "CA"},
+{_reference: "GB"},
+{_reference: "GU"},
+{_reference: "HK"},
+{_reference: "IE"},
+{_reference: "IN"},
+{_reference: "JM"},
+{_reference: "MH"},
+{_reference: "MP"},
+{_reference: "MT"},
+{_reference: "NA"},
+{_reference: "NZ"},
+{_reference: "PH"},
+{_reference: "PK"},
+{_reference: "SG"},
+{_reference: "TT"},
+{_reference: "UM"},
+{_reference: "US"},
+{_reference: "VI"},
+{_reference: "ZA"},
+{_reference: "ZW"},
+],
+name: "English",
+"aa": "Afar",
+"ab": "Abkhazian",
+"ae": "Avestan",
+"af": "Afrikaans",
+"ak": "Akan",
+"am": "Amharic",
+"an": "Aragonese",
+"ar": "Arabic",
+"as": "Assamese",
+"av": "Avaric",
+"ay": "Aymara",
+"az": "Azerbaijani",
+"ba": "Bashkir",
+"be": "Belarusian",
+"bg": "Bulgarian",
+"bh": "Bihari",
+"bi": "Bislama",
+"bm": "Bambara",
+"bn": "Bengali",
+"bo": "Tibetan",
+"br": "Breton",
+"bs": "Bosnian",
+"ca": "Catalan",
+"ce": "Chechen",
+"ch": "Chamorro",
+"co": "Corsican",
+"cr": "Cree",
+"cs": "Czech",
+"cu": "Church Slavic",
+"cv": "Chuvash",
+"cy": "Welsh",
+"da": "Danish",
+"de": "German",
+"dv": "Divehi",
+"dz": "Dzongkha",
+"ee": "Ewe",
+"el": "Greek",
+"en": "English",
+"eo": "Esperanto",
+"es": "Spanish",
+"et": "Estonian",
+"eu": "Basque",
+"fa": "Persian",
+"ff": "Fulah",
+"fi": "Finnish",
+"fj": "Fijian",
+"fo": "Faroese",
+"fr": "French",
+"fy": "Western Frisian",
+"ga": "Irish",
+"gd": "Scottish Gaelic",
+"gl": "Galician",
+"gn": "Guarani",
+"gu": "Gujarati",
+"gv": "Manx",
+"ha": "Hausa",
+"he": "Hebrew",
+"hi": "Hindi",
+"ho": "Hiri Motu",
+"hr": "Croatian",
+"ht": "Haitian",
+"hu": "Hungarian",
+"hy": "Armenian",
+"hz": "Herero",
+"ia": "Interlingua",
+"id": "Indonesian",
+"ie": "Interlingue",
+"ig": "Igbo",
+"ii": "Sichuan Yi",
+"ik": "Inupiaq",
+"io": "Ido",
+"is": "Icelandic",
+"it": "Italian",
+"iu": "Inuktitut",
+"ja": "Japanese",
+"jv": "Javanese",
+"ka": "Georgian",
+"kg": "Kongo",
+"ki": "Kikuyu",
+"kj": "Kuanyama",
+"kk": "Kazakh",
+"kl": "Kalaallisut",
+"km": "Khmer",
+"kn": "Kannada",
+"ko": "Korean",
+"kr": "Kanuri",
+"ks": "Kashmiri",
+"ku": "Kurdish",
+"kv": "Komi",
+"kw": "Cornish",
+"ky": "Kirghiz",
+"la": "Latin",
+"lb": "Luxembourgish",
+"lg": "Ganda",
+"li": "Limburgish",
+"ln": "Lingala",
+"lo": "Lao",
+"lt": "Lithuanian",
+"lu": "Luba-Katanga",
+"lv": "Latvian",
+"mg": "Malagasy",
+"mh": "Marshallese",
+"mi": "Maori",
+"mk": "Macedonian",
+"ml": "Malayalam",
+"mn": "Mongolian",
+"mo": "Moldavian",
+"mr": "Marathi",
+"ms": "Malay",
+"mt": "Maltese",
+"my": "Burmese",
+"na": "Nauru",
+"nb": "Norwegian Bokmål",
+"nd": "North Ndebele",
+"ne": "Nepali",
+"ng": "Ndonga",
+"nl": "Dutch",
+"nn": "Norwegian Nynorsk",
+"no": "Norwegian",
+"nr": "South Ndebele",
+"nv": "Navajo",
+"ny": "Nyanja; Chichewa; Chewa",
+"oc": "Occitan (post 1500); Provençal",
+"oj": "Ojibwa",
+"om": "Oromo",
+"or": "Oriya",
+"os": "Ossetic",
+"pa": "Punjabi",
+"pi": "Pali",
+"pl": "Polish",
+"pt": "Portuguese",
+"qu": "Quechua",
+"rm": "Rhaeto-Romance",
+"rn": "Rundi",
+"ro": "Romanian",
+"ru": "Russian",
+"rw": "Kinyarwanda",
+"sa": "Sanskrit",
+"sc": "Sardinian",
+"sd": "Sindhi",
+"se": "Northern Sami",
+"sg": "Sango",
+"sh": "Serbo-Croatian",
+"si": "Sinhalese",
+"sk": "Slovak",
+"sl": "Slovenian",
+"sm": "Samoan",
+"sn": "Shona",
+"so": "Somali",
+"sq": "Albanian",
+"sr": "Serbian",
+"ss": "Swati",
+"st": "Southern Sotho",
+"su": "Sundanese",
+"sv": "Swedish",
+"sw": "Swahili",
+"ta": "Tamil",
+"te": "Telugu",
+"tg": "Tajik",
+"th": "Thai",
+"ti": "Tigrinya",
+"tk": "Turkmen",
+"tl": "Tagalog",
+"tn": "Tswana",
+"to": "Tonga (Tonga Islands)",
+"tr": "Turkish",
+"ts": "Tsonga",
+"tt": "Tatar",
+"tw": "Twi",
+"ty": "Tahitian",
+"ug": "Uighur",
+"uk": "Ukrainian",
+"ur": "Urdu",
+"uz": "Uzbek",
+"ve": "Venda",
+"vi": "Vietnamese",
+"vo": "Volapük",
+"wa": "Walloon",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Yiddish",
+"yo": "Yoruba",
+"za": "Zhuang",
+"zh": "Chinese",
+"zu": "Zulu",
+},
+{ type: "language", iso: "eo",
+countries: [
+],
+name: "esperanto",
+"aa": "afara",
+"ab": "abĥaza",
+"af": "afrikansa",
+"am": "amhara",
+"ar": "araba",
+"as": "asama",
+"ay": "ajmara",
+"az": "azerbajĝana",
+"ba": "baŝkira",
+"be": "belorusa",
+"bg": "bulgara",
+"bh": "bihara",
+"bi": "bislamo",
+"bn": "bengala",
+"bo": "tibeta",
+"br": "bretona",
+"ca": "kataluna",
+"co": "korsika",
+"cs": "ĉeĥa",
+"cy": "kimra",
+"da": "dana",
+"de": "germana",
+"dz": "dzonko",
+"el": "greka",
+"en": "angla",
+"eo": "esperanto",
+"es": "hispana",
+"et": "estona",
+"eu": "eŭska",
+"fa": "persa",
+"fi": "finna",
+"fj": "fiĝia",
+"fo": "feroa",
+"fr": "franca",
+"fy": "frisa",
+"ga": "irlanda",
+"gd": "gaela",
+"gl": "galega",
+"gn": "gvarania",
+"gu": "guĝarata",
+"ha": "haŭsa",
+"he": "hebrea",
+"hi": "hinda",
+"hr": "kroata",
+"hu": "hungara",
+"hy": "armena",
+"ia": "interlingvao",
+"id": "indonezia",
+"ie": "okcidentalo",
+"ik": "eskima",
+"is": "islanda",
+"it": "itala",
+"iu": "inuita",
+"ja": "japana",
+"jv": "java",
+"ka": "kartvela",
+"kk": "kazaĥa",
+"kl": "gronlanda",
+"km": "kmera",
+"kn": "kanara",
+"ko": "korea",
+"ks": "kaŝmira",
+"ku": "kurda",
+"ky": "kirgiza",
+"la": "latino",
+"ln": "lingala",
+"lo": "laŭa",
+"lt": "litova",
+"lv": "latva",
+"mg": "malagasa",
+"mi": "maoria",
+"mk": "makedona",
+"ml": "malajalama",
+"mn": "mongola",
+"mr": "marata",
+"ms": "malaja",
+"mt": "malta",
+"my": "birma",
+"na": "naura",
+"ne": "nepala",
+"nl": "nederlanda",
+"no": "norvega",
+"oc": "okcitana",
+"om": "oroma",
+"or": "orijo",
+"pa": "panĝaba",
+"pl": "pola",
+"ps": "paŝtua",
+"pt": "portugala",
+"qu": "keĉua",
+"rm": "romanĉa",
+"rn": "burunda",
+"ro": "rumana",
+"ru": "rusa",
+"rw": "ruanda",
+"sa": "sanskrito",
+"sd": "sinda",
+"sg": "sangoa",
+"sh": "serbo-Kroata",
+"si": "sinhala",
+"sk": "slovaka",
+"sl": "slovena",
+"sm": "samoa",
+"sn": "ŝona",
+"so": "somala",
+"sq": "albana",
+"sr": "serba",
+"ss": "svazia",
+"st": "sota",
+"su": "sunda",
+"sv": "sveda",
+"sw": "svahila",
+"ta": "tamila",
+"te": "telugua",
+"tg": "taĝika",
+"th": "taja",
+"ti": "tigraja",
+"tk": "turkmena",
+"tl": "filipina",
+"tn": "cvana",
+"to": "tongaa",
+"tr": "turka",
+"ts": "conga",
+"tt": "tatara",
+"tw": "akana",
+"ug": "ujgura",
+"uk": "ukraina",
+"ur": "urduo",
+"uz": "uzbeka",
+"vi": "vjetnama",
+"vo": "volapuko",
+"wo": "volofa",
+"xh": "ksosa",
+"yi": "jida",
+"yo": "joruba",
+"za": "ĝuanga",
+"zh": "ĉina",
+"zu": "zulua",
+},
+{ type: "language", iso: "es",
+countries: [
+{_reference: "AR"},
+{_reference: "BO"},
+{_reference: "CL"},
+{_reference: "CO"},
+{_reference: "CR"},
+{_reference: "DO"},
+{_reference: "EC"},
+{_reference: "ES"},
+{_reference: "GT"},
+{_reference: "HN"},
+{_reference: "MX"},
+{_reference: "NI"},
+{_reference: "PA"},
+{_reference: "PE"},
+{_reference: "PR"},
+{_reference: "PY"},
+{_reference: "SV"},
+{_reference: "US"},
+{_reference: "UY"},
+{_reference: "VE"},
+],
+name: "español",
+"aa": "afar",
+"ab": "abjaso",
+"ae": "avéstico",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amárico",
+"an": "aragonés",
+"ar": "árabe",
+"as": "asamés",
+"av": "avar",
+"ay": "aymara",
+"az": "azerí",
+"ba": "bashkir",
+"be": "bielorruso",
+"bg": "búlgaro",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengalí",
+"bo": "tibetano",
+"br": "bretón",
+"bs": "bosnio",
+"ca": "catalán",
+"ce": "checheno",
+"ch": "chamorro",
+"co": "corso",
+"cr": "cree",
+"cs": "checo",
+"cu": "eslavo eclesiástico",
+"cv": "chuvash",
+"cy": "galés",
+"da": "danés",
+"de": "alemán",
+"dv": "divehi",
+"ee": "ewe",
+"el": "griego",
+"en": "inglés",
+"eo": "esperanto",
+"es": "español",
+"et": "estonio",
+"eu": "vasco",
+"fa": "farsi",
+"ff": "fula",
+"fi": "finés",
+"fo": "feroés",
+"fr": "francés",
+"fy": "frisón",
+"ga": "irlandés",
+"gd": "gaélico escocés",
+"gl": "gallego",
+"gn": "guaraní",
+"gu": "gujarati",
+"gv": "gaélico manés",
+"ha": "hausa",
+"he": "hebreo",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "croata",
+"ht": "haitiano",
+"hu": "húngaro",
+"hy": "armenio",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesio",
+"ie": "interlingue",
+"ig": "igbo",
+"ii": "sichuan yi",
+"ik": "inupiak",
+"io": "ido",
+"is": "islandés",
+"it": "italiano",
+"iu": "inuktitut",
+"ja": "japonés",
+"jv": "javanés",
+"ka": "georgiano",
+"kg": "kongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kazajo",
+"kl": "groenlandés",
+"km": "jemer",
+"kn": "canarés",
+"ko": "coreano",
+"kr": "kanuri",
+"ks": "cachemiro",
+"ku": "kurdo",
+"kv": "komi",
+"kw": "córnico",
+"ky": "kirghiz",
+"la": "latín",
+"lb": "luxemburgués",
+"lg": "ganda",
+"li": "limburgués",
+"ln": "lingala",
+"lo": "laosiano",
+"lt": "lituano",
+"lu": "luba-katanga",
+"lv": "letón",
+"mg": "malgache",
+"mh": "marshalés",
+"mi": "maorí",
+"mk": "macedonio",
+"ml": "malayalam",
+"mn": "mongol",
+"mo": "moldavo",
+"mr": "marathi",
+"ms": "malayo",
+"mt": "maltés",
+"my": "birmano",
+"na": "nauruano",
+"nb": "bokmal noruego",
+"nd": "ndebele septentrional",
+"ne": "nepalí",
+"ng": "ndonga",
+"nn": "nynorsk noruego",
+"no": "noruego",
+"nr": "ndebele meridional",
+"nv": "navajo",
+"ny": "nyanja",
+"oc": "occitano (después del 1500)",
+"oj": "ojibwa",
+"om": "oromo",
+"or": "oriya",
+"os": "osético",
+"pa": "punjabí",
+"pi": "pali",
+"pl": "polaco",
+"ps": "pashto",
+"pt": "portugués",
+"qu": "quechua",
+"rm": "reto-romance",
+"rn": "kiroundi",
+"ro": "rumano",
+"ru": "ruso",
+"rw": "kinyarwanda",
+"sa": "sánscrito",
+"sc": "sardo",
+"sd": "sindhi",
+"se": "sami septentrional",
+"sg": "sango",
+"sh": "serbocroata",
+"sk": "eslovaco",
+"sl": "esloveno",
+"sm": "samoano",
+"sn": "shona",
+"so": "somalí",
+"sq": "albanés",
+"sr": "serbio",
+"ss": "siswati",
+"st": "sesotho",
+"su": "sundanés",
+"sv": "sueco",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tayiko",
+"th": "tailandés",
+"tl": "tagalo",
+"tn": "setchwana",
+"to": "tonga (Islas Tonga)",
+"tr": "turco",
+"ts": "tsonga",
+"tw": "twi",
+"ty": "tahitiano",
+"ug": "uigur",
+"uk": "ucraniano",
+"ur": "urdu",
+"uz": "uzbeko",
+"ve": "venda",
+"vi": "vietnamita",
+"wa": "valón",
+"wo": "uolof",
+"xh": "xhosa",
+"yo": "yoruba",
+"za": "zhuang",
+"zh": "chino",
+"zu": "zulú",
+},
+{ type: "language", iso: "et",
+countries: [
+{_reference: "EE"},
+],
+name: "Eesti",
+"ar": "Araabia",
+"bg": "Bulgaaria",
+"cs": "Tiehhi",
+"da": "Taani",
+"de": "Saksa",
+"el": "Kreeka",
+"en": "Inglise",
+"es": "Hispaania",
+"et": "Eesti",
+"fi": "Soome",
+"fr": "Prantsuse",
+"he": "Heebrea",
+"hr": "Horvaadi",
+"hu": "Ungari",
+"it": "Itaalia",
+"ja": "Jaapani",
+"ko": "Korea",
+"lt": "Leedu",
+"lv": "Läti",
+"nl": "Hollandi",
+"no": "Norra",
+"pl": "Poola",
+"pt": "Portugali",
+"ro": "Rumeenia",
+"ru": "Vene",
+"sk": "Slovaki",
+"sl": "Sloveeni",
+"sv": "Rootsi",
+"tr": "Türgi",
+"zh": "Hiina",
+},
+{ type: "language", iso: "eu",
+countries: [
+{_reference: "ES"},
+],
+name: "euskara",
+"de": "alemanera",
+"en": "ingelera",
+"es": "espainiera",
+"eu": "euskara",
+"fr": "frantsesera",
+"it": "italiera",
+"ja": "japoniera",
+"pt": "portugalera",
+"ru": "errusiera",
+"zh": "txinera",
+},
+{ type: "language", iso: "fa",
+countries: [
+{_reference: "AF"},
+{_reference: "IR"},
+],
+name: "فارسی",
+"az": "ترکی آذربایجانی",
+"bs": "بوسنیایی",
+"cu": "اسلاوی کلیسایی",
+"ii": "یی سیچوان",
+"iu": "اینوکتیتوت",
+"li": "لیمبورگی",
+"lu": "لوبایی‐کاتانگا",
+"ng": "ندونگایی",
+"pi": "پالی",
+"tr": "ترکی استانبولی",
+},
+{ type: "language", iso: "fi",
+countries: [
+{_reference: "FI"},
+],
+name: "suomi",
+"aa": "afar",
+"ab": "abhaasi",
+"ae": "avesta",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amhara",
+"an": "aragonia",
+"ar": "arabia",
+"as": "assami",
+"av": "avaari",
+"ay": "aimara",
+"az": "azeri",
+"ba": "baškiiri",
+"be": "valkovenäjä",
+"bg": "bulgaria",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tiibet",
+"br": "bretoni",
+"bs": "bosnia",
+"ca": "katalaani",
+"ce": "tšetšeeni",
+"ch": "tšamorro",
+"co": "korsika",
+"cr": "cree",
+"cs": "tšekki",
+"cu": "kirkkoslaavi",
+"cv": "tšuvassi",
+"cy": "kymri",
+"da": "tanska",
+"de": "saksa",
+"dv": "divehi",
+"dz": "dzongkha",
+"ee": "ewe",
+"el": "kreikka",
+"en": "englanti",
+"eo": "esperanto",
+"es": "espanja",
+"et": "viro",
+"eu": "baski",
+"ff": "fulani",
+"fi": "suomi",
+"fj": "fidži",
+"fo": "fääri",
+"fr": "ranska",
+"fy": "länsifriisi",
+"ga": "iiri",
+"gd": "gaeli",
+"gl": "galicia",
+"gn": "guarani",
+"gv": "manx",
+"ha": "hausa",
+"he": "heprea",
+"hi": "hindi",
+"ho": "hiri-motu",
+"hr": "kroatia",
+"ht": "haiti",
+"hu": "unkari",
+"hy": "armenia",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesia",
+"ie": "interlingue",
+"ig": "igbo",
+"ii": "sichuanin-yi",
+"ik": "inupiatun",
+"io": "ido",
+"is": "islanti",
+"it": "italia",
+"iu": "inuktitut",
+"ja": "japani",
+"jv": "jaava",
+"ka": "georgia",
+"kg": "kongo",
+"ki": "kikuju",
+"kj": "kuanjama",
+"kk": "kazakki",
+"kl": "kalaallisut; grönlanti",
+"km": "khmer",
+"kn": "kannada",
+"ko": "korea",
+"kr": "kanuri",
+"ks": "kašmiri",
+"ku": "kurdi",
+"kv": "komi",
+"kw": "korni",
+"ky": "kirgiisi",
+"la": "latina",
+"lb": "luxemburg",
+"lg": "ganda",
+"li": "limburg",
+"ln": "lingala",
+"lo": "lao",
+"lt": "liettua",
+"lu": "luba (Katanga)",
+"lv": "latvia",
+"mg": "malagassi",
+"mh": "marshall",
+"mi": "maori",
+"mk": "makedonia",
+"ml": "malajalam",
+"mn": "mongoli",
+"mo": "moldavia",
+"mr": "marathi",
+"ms": "malaiji",
+"mt": "malta",
+"my": "burma",
+"na": "nauru",
+"nb": "norja (bokmål)",
+"nd": "ndebele, pohjois-",
+"ne": "nepali",
+"ng": "ndonga",
+"nl": "hollanti",
+"nn": "norja (nynorsk)",
+"no": "norja",
+"nr": "ndebele, etelä-",
+"nv": "navajo",
+"ny": "njandža",
+"oc": "oksitaani",
+"oj": "odžibwa",
+"om": "oromo",
+"or": "orija",
+"os": "osseetti",
+"pa": "pandžabi",
+"pi": "paali",
+"pl": "puola",
+"ps": "paštu",
+"pt": "portugali",
+"qu": "ketšua",
+"rm": "retoromaani",
+"rn": "rundi",
+"ro": "romania",
+"ru": "venäjä",
+"rw": "ruanda",
+"sa": "sanskrit",
+"sc": "sardi",
+"sd": "sindhi",
+"se": "saame, pohjois-",
+"sg": "sango",
+"si": "sinhali",
+"sk": "slovakki",
+"sl": "sloveeni",
+"sm": "samoa",
+"sn": "šona",
+"so": "somali",
+"sq": "albania",
+"sr": "serbia",
+"ss": "swazi",
+"st": "sotho, etelä-",
+"su": "sunda",
+"sv": "ruotsi",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tadžikki",
+"th": "thai",
+"ti": "tigrinja",
+"tk": "turkmeeni",
+"tl": "tagalog",
+"tn": "tswana",
+"to": "tonga (Tonga)",
+"tr": "turkki",
+"ts": "tsonga",
+"tt": "tataari",
+"tw": "twi",
+"ty": "tahiti",
+"ug": "uiguuri",
+"uk": "ukraina",
+"ur": "urdu",
+"uz": "uzbekki",
+"ve": "venda",
+"vi": "vietnam",
+"vo": "volapük",
+"wa": "valloni",
+"wo": "wolof",
+"xh": "xhosa",
+"yi": "jiddiš",
+"yo": "joruba",
+"za": "zhuang",
+"zh": "kiina",
+"zu": "zulu",
+},
+{ type: "language", iso: "fo",
+countries: [
+{_reference: "FO"},
+],
+name: "føroyskt",
+"fo": "føroyskt",
+},
+{ type: "language", iso: "fr",
+countries: [
+{_reference: "BE"},
+{_reference: "CA"},
+{_reference: "CH"},
+{_reference: "FR"},
+{_reference: "LU"},
+{_reference: "MC"},
+],
+name: "français",
+"aa": "afar",
+"ab": "abkhaze",
+"ae": "avestique",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amharique",
+"an": "aragonais",
+"ar": "arabe",
+"as": "assamais",
+"av": "avar",
+"ay": "aymara",
+"az": "azéri",
+"ba": "bachkir",
+"be": "biélorusse",
+"bg": "bulgare",
+"bh": "bihari",
+"bi": "bichlamar",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tibétain",
+"br": "breton",
+"bs": "bosniaque",
+"ca": "catalan",
+"ce": "tchétchène",
+"ch": "chamorro",
+"co": "corse",
+"cr": "cree",
+"cs": "tchèque",
+"cu": "slavon d’église",
+"cv": "tchouvache",
+"cy": "gallois",
+"da": "danois",
+"de": "allemand",
+"dv": "maldivien",
+"dz": "dzongkha",
+"ee": "éwé",
+"el": "grec",
+"en": "anglais",
+"eo": "espéranto",
+"es": "espagnol",
+"et": "estonien",
+"eu": "basque",
+"fa": "persan",
+"ff": "peul",
+"fi": "finnois",
+"fj": "fidjien",
+"fo": "féroïen",
+"fr": "français",
+"fy": "frison",
+"ga": "irlandais",
+"gd": "gaélique écossais",
+"gl": "galicien",
+"gn": "guarani",
+"gu": "goudjrati",
+"gv": "manx",
+"ha": "haoussa",
+"he": "hébreu",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "croate",
+"ht": "haïtien",
+"hu": "hongrois",
+"hy": "arménien",
+"hz": "héréro",
+"ia": "interlingua",
+"id": "indonésien",
+"ie": "interlingue",
+"ig": "igbo",
+"ii": "yi de Sichuan",
+"ik": "inupiaq",
+"io": "ido",
+"is": "islandais",
+"it": "italien",
+"iu": "inuktitut",
+"ja": "japonais",
+"jv": "javanais",
+"ka": "géorgien",
+"kg": "kongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kazakh",
+"kl": "groenlandais",
+"km": "khmer",
+"kn": "kannada",
+"ko": "coréen",
+"kr": "kanouri",
+"ks": "kashmiri",
+"ku": "kurde",
+"kv": "komi",
+"kw": "cornique",
+"ky": "kirghize",
+"la": "latin",
+"lb": "luxembourgeois",
+"lg": "ganda",
+"li": "limbourgeois",
+"ln": "lingala",
+"lo": "lao",
+"lt": "lituanien",
+"lu": "luba-katanga",
+"lv": "letton",
+"mg": "malgache",
+"mh": "marshall",
+"mi": "maori",
+"mk": "macédonien",
+"ml": "malayalam",
+"mn": "mongol",
+"mo": "moldave",
+"mr": "marathe",
+"ms": "malais",
+"mt": "maltais",
+"my": "birman",
+"na": "nauruan",
+"nb": "bokmål norvégien",
+"nd": "ndébélé du Nord",
+"ne": "népalais",
+"ng": "ndonga",
+"nl": "néerlandais",
+"nn": "nynorsk norvégien",
+"no": "norvégien",
+"nr": "ndébélé du Sud",
+"nv": "navaho",
+"ny": "nyanja",
+"oc": "occitan (après 1500)",
+"oj": "ojibwa",
+"om": "galla",
+"or": "oriya",
+"os": "ossète",
+"pa": "pendjabi",
+"pi": "pali",
+"pl": "polonais",
+"ps": "pachto",
+"pt": "portugais",
+"qu": "quechua",
+"rm": "rhéto-roman",
+"rn": "roundi",
+"ro": "roumain",
+"ru": "russe",
+"rw": "rwanda",
+"sa": "sanskrit",
+"sc": "sarde",
+"sd": "sindhi",
+"se": "sami du Nord",
+"sg": "sango",
+"sh": "serbo-croate",
+"si": "singhalais",
+"sk": "slovaque",
+"sl": "slovène",
+"sm": "samoan",
+"sn": "shona",
+"so": "somali",
+"sq": "albanais",
+"sr": "serbe",
+"ss": "swati",
+"st": "sotho du Sud",
+"su": "soundanais",
+"sv": "suédois",
+"sw": "swahili",
+"ta": "tamoul",
+"te": "télougou",
+"tg": "tadjik",
+"th": "thaï",
+"ti": "tigrigna",
+"tk": "turkmène",
+"tl": "tagalog",
+"tn": "setswana",
+"to": "tongan (Îles Tonga)",
+"tr": "turc",
+"ts": "tsonga",
+"tt": "tatar",
+"tw": "twi",
+"ty": "tahitien",
+"ug": "ouïgour",
+"uk": "ukrainien",
+"ur": "ourdou",
+"uz": "ouzbek",
+"ve": "venda",
+"vi": "vietnamien",
+"vo": "volapük",
+"wa": "wallon",
+"wo": "wolof",
+"xh": "xhosa",
+"yi": "yiddish",
+"yo": "yoruba",
+"za": "zhuang",
+"zh": "chinois",
+"zu": "zoulou",
+},
+{ type: "language", iso: "ga",
+countries: [
+{_reference: "IE"},
+],
+name: "Gaeilge",
+"aa": "Afar",
+"ab": "Abcáisis",
+"ae": "Aivéistis",
+"af": "Afracáinis",
+"ar": "Araibis",
+"as": "Asaimis",
+"az": "Asarbaiseáinis",
+"ba": "Baiscíris",
+"be": "Bealarúisis",
+"bg": "Bulgáiris",
+"bn": "Beangálais",
+"bo": "Tibéadais",
+"br": "Briotáinis",
+"bs": "Boisnis",
+"ca": "Catalóinis",
+"ce": "Sisinis",
+"co": "Corsaicis",
+"cr": "Craíais",
+"cs": "Seicis",
+"cu": "Slavais na hEaglaise",
+"cv": "Suvaisis",
+"cy": "Breatnais",
+"da": "Danmhairgis",
+"de": "Gearmáinis",
+"el": "Gréigis",
+"en": "Béarla",
+"eo": "Esperanto",
+"es": "Spáinnis",
+"et": "Eastóinis",
+"eu": "Bascais",
+"fa": "Peirsis",
+"fi": "Fionnlainnis",
+"fj": "Fidsis",
+"fo": "Faróis",
+"fr": "Fraincis",
+"fy": "Freaslainnais",
+"ga": "Gaeilge",
+"gd": "Gaeilge na hAlban",
+"gu": "Gúisearáitis",
+"gv": "Mannainis",
+"he": "Eabhrais",
+"hi": "Hiondúis",
+"hr": "Cróitis",
+"hu": "Ungáiris",
+"hy": "Airméinis",
+"ia": "Interlingua",
+"id": "Indinéisis",
+"ie": "Interlingue",
+"ik": "Inupiaq",
+"io": "Ido",
+"is": "Íoslainnais",
+"it": "Iodáilis",
+"iu": "Ionúitis",
+"ja": "Seapáinis",
+"jv": "Iávais",
+"ka": "Seoirsis",
+"kk": "Casachais",
+"kn": "Cannadais",
+"ko": "Cóiréis",
+"ks": "Caismíris",
+"kw": "Cornais",
+"ky": "Cirgeasais",
+"la": "Laidin",
+"lb": "Leitseabuirgis",
+"lo": "Laosais",
+"lt": "Liotuáinis",
+"lv": "Laitvis",
+"mg": "Malagásais",
+"mi": "Maorais",
+"mk": "Macadóinis",
+"ml": "Mailéalaimis",
+"mn": "Mongóilis",
+"mo": "Moldáivis",
+"mr": "Maraitis",
+"mt": "Maltais",
+"my": "Burmais",
+"na": "Nárúis",
+"nb": "Ioruais Bokmål",
+"ne": "Neipealais",
+"nl": "Ollainnais",
+"nn": "Ioruais Nynorsk",
+"no": "Ioruais",
+"nv": "Navachóis",
+"oc": "Ocatáinis (tar éis 1500); Provençal",
+"os": "Óiséitis",
+"pa": "Puinseaibis",
+"pl": "Polainnis",
+"ps": "Paisteo",
+"pt": "Portaingéilis",
+"qu": "Ceatsuais",
+"ro": "Romáinis",
+"ru": "Rúisis",
+"sa": "Sanscrait",
+"sc": "Sairdínis",
+"sd": "Sindis",
+"se": "Sáimis Thuaidh",
+"sh": "Seirbea-Chróitis",
+"sk": "Slóvacais",
+"sl": "Slóvéinis",
+"sm": "Samóis",
+"so": "Somálais",
+"sq": "Albáinis",
+"sr": "Seirbis",
+"sv": "Sualainnis",
+"sw": "Svahaílis",
+"ta": "Tamailis",
+"th": "Téalainnis",
+"tl": "Tagálaigis",
+"tr": "Tuircis",
+"tt": "Tatarais",
+"ty": "Taihítis",
+"uk": "Úcráinis",
+"ur": "Urdais",
+"uz": "Úisbéicis",
+"vi": "Vítneamais",
+"wa": "Vallúnais",
+"yi": "Giúdais",
+"zh": "Sínis",
+"zu": "Súlúis",
+},
+{ type: "language", iso: "gl",
+countries: [
+{_reference: "ES"},
+],
+name: "galego",
+"gl": "galego",
+},
+{ type: "language", iso: "gu",
+countries: [
+{_reference: "IN"},
+],
+name: "ગુજરાતી",
+"gu": "ગુજરાતી",
+},
+{ type: "language", iso: "gv",
+countries: [
+{_reference: "GB"},
+],
+name: "Gaelg",
+"gv": "Gaelg",
+},
+{ type: "language", iso: "ha",
+countries: [
+{_reference: "GH"},
+{_reference: "NE"},
+{_reference: "NG"},
+],
+},
+{ type: "language", iso: "he",
+countries: [
+{_reference: "IL"},
+],
+name: "עברית",
+"aa": "אתיופית",
+"ab": "אבחזית",
+"ae": "אבסטן",
+"af": "אפריקנית",
+"ak": "אקאן",
+"am": "אמהרית",
+"ar": "ערבית",
+"as": "אסאמית",
+"az": "אזרית",
+"ba": "בשקירית",
+"be": "בלארוסית",
+"bg": "בולגרית",
+"bn": "בנגלית",
+"bo": "טיבטית",
+"br": "ברטונית",
+"bs": "בוסנית",
+"ca": "קטלונית",
+"ce": "צ'צ'נית",
+"co": "קורסיקאית",
+"cs": "צ׳כית",
+"cy": "וולשית",
+"da": "דנית",
+"de": "גרמנית",
+"dv": "דיבהי",
+"el": "יוונית",
+"en": "אנגלית",
+"eo": "אספרנטו",
+"es": "ספרדית",
+"et": "אסטונית",
+"eu": "בסקית",
+"fa": "פרסית",
+"fi": "פינית",
+"fj": "פיג'ית",
+"fo": "פארואזית",
+"fr": "צרפתית",
+"ga": "אירית",
+"gd": "סקוטית גאלית",
+"gl": "גליציאנית",
+"gu": "גוג'ראטית",
+"ha": "האוסה",
+"he": "עברית",
+"hi": "הינדית",
+"hr": "קרואטית",
+"ht": "האיטית",
+"hu": "הונגרית",
+"hy": "ארמנית",
+"id": "אינדונזית",
+"is": "איסלנדית",
+"it": "איטלקית",
+"ja": "יפנית",
+"ka": "גרוזינית",
+"kk": "קזחית",
+"ko": "קוריאנית",
+"ks": "קשמירית",
+"ku": "כורדית",
+"la": "לטינית",
+"lb": "לוקסמבורגית",
+"lt": "ליטאית",
+"lv": "לטבית",
+"mg": "מלגשית",
+"mi": "מאורית",
+"mk": "מקדונית",
+"mn": "מונגולית",
+"mo": "מולדבית",
+"mr": "מארתית",
+"mt": "מלטזית",
+"my": "בורמזית",
+"nb": "נורבגית שפת הספר (בוקמול)",
+"ne": "נפאלית",
+"nl": "הולנדית",
+"nn": "נורבגית חדשה (נינורשק)",
+"no": "נורווגית",
+"nv": "נבחו",
+"pl": "פולנית",
+"ps": "פאשטו",
+"pt": "פורטוגזית",
+"ro": "רומנית",
+"ru": "רוסית",
+"sa": "סנסקרית",
+"sc": "סרדינית",
+"sd": "סינדהית",
+"sh": "סרבו-קרואטית",
+"sk": "סלובקית",
+"sl": "סלובנית",
+"sm": "סמואית",
+"so": "סומלית",
+"sq": "אלבנית",
+"sr": "סרבית",
+"sv": "שוודית",
+"sw": "סווהילית",
+"ta": "טמילית",
+"th": "תאי",
+"tk": "טורקמנית",
+"tr": "טורקית",
+"uk": "אוקראינית",
+"ur": "אורדו",
+"uz": "אוזבקית",
+"vi": "ויאטנמית",
+"yi": "יידיש",
+"zh": "סינית",
+"zu": "זולו",
+},
+{ type: "language", iso: "hi",
+countries: [
+{_reference: "IN"},
+],
+name: "हिंदी",
+"aa": "अफ़ार",
+"ab": "अब्खाज़ियन्",
+"af": "अफ्रीकी",
+"am": "अम्हारिक्",
+"ar": "अरबी",
+"as": "असामी",
+"ay": "आयमारा",
+"az": "अज़रबैंजानी",
+"ba": "बशख़िर",
+"be": "बैलोरूशियन्",
+"bg": "बल्गेरियन्",
+"bh": "बिहारी",
+"bi": "बिस्लामा",
+"bn": "बँगाली",
+"bo": "तिब्बती",
+"br": "ब्रेटन",
+"ca": "कातालान",
+"co": "कोर्सीकन",
+"cs": "चेक",
+"cy": "वेल्श",
+"da": "डैनीश",
+"de": "ज़र्मन",
+"dz": "भुटानी",
+"el": "ग्रीक",
+"en": "अंग्रेजी",
+"eo": "एस्पेरान्तो",
+"es": "स्पेनिश",
+"et": "ऐस्तोनियन्",
+"eu": "बास्क्",
+"fa": "पर्शियन्",
+"fi": "फिनिश",
+"fj": "फ़ीजी",
+"fo": "फिरोज़ी",
+"fr": "फ्रेंच",
+"fy": "फ्रीज़न्",
+"ga": "आईरिश",
+"gd": "स्काट्स् गायेलिक्",
+"gl": "गैलिशियन्",
+"gn": "गुआरानी",
+"gu": "गुज़राती",
+"ha": "होउसा",
+"he": "हिब्रीऊ",
+"hi": "हिंदी",
+"hr": "क्रोएशन्",
+"hu": "हंगेरी",
+"hy": "अरमेनियन्",
+"ia": "ईन्टरलिंगुआ",
+"id": "इन्डोनेशियन्",
+"ie": "ईन्टरलिंगुइ",
+"ik": "इनुपियाक्",
+"is": "आईस्लैंडिक्",
+"it": "ईटालियन्",
+"iu": "इनूकीटूत्",
+"ja": "जापानी",
+"jv": "जावानीस",
+"ka": "जॉर्जीयन्",
+"kk": "कज़ाख",
+"kl": "ग्रीनलैंडिक",
+"km": "कैम्बोडियन्",
+"kn": "कन्नड़",
+"ko": "कोरीयन्",
+"ks": "काश्मिरी",
+"ku": "कुरदीश",
+"ky": "किरघिज़",
+"la": "लैटीन",
+"ln": "लिंगाला",
+"lo": "लाओथीयन्",
+"lt": "लिथुनियन्",
+"lv": "लाटवियन् (लेट्टीश)",
+"mg": "मालागासी",
+"mi": "मेओरी",
+"mk": "मैसेडोनियन्",
+"ml": "मलयालम",
+"mn": "मोंगोलियन",
+"mo": "मोलडावियन्",
+"mr": "मराठी",
+"ms": "मलय",
+"mt": "मालटिस्",
+"my": "बर्लिस",
+"na": "नायरू",
+"ne": "नेपाली",
+"nl": "डच्",
+"no": "नार्वेजीयन्",
+"oc": "ओसीटान",
+"om": "ओरोमो (अफ़ान)",
+"or": "उड़िया",
+"pa": "पंजाबी",
+"pl": "पॉलिश",
+"ps": "पॉशतो (पुशतो)",
+"pt": "पुर्तुगी",
+"qu": "क्वेशुआ",
+"rm": "रहेय्टो-रोमान्स",
+"rn": "किरून्दी",
+"ro": "रूमानीयन्",
+"ru": "रुसी",
+"rw": "किन्यारवाण्डा",
+"sa": "संस्कृत",
+"sd": "सिन्धी",
+"sg": "साँग्रो",
+"sh": "सेर्बो-क्रोएशन्",
+"si": "शिंघालीस्",
+"sk": "स्लोवाक्",
+"sl": "स्लोवेनियन्",
+"sm": "सामोन",
+"sn": "सोणा",
+"so": "सोमाली",
+"sq": "अल्बेनियन्",
+"sr": "सर्बियन्",
+"ss": "सीस्वाटि",
+"st": "सेसोथो",
+"su": "सुन्दानीस",
+"sv": "स्विडिश",
+"sw": "स्वाहिली",
+"ta": "तमिल",
+"te": "तेलेगु",
+"tg": "ताजिक्",
+"th": "थाई",
+"ti": "तिग्रीन्या",
+"tk": "तुक्रमेन",
+"tl": "तागालोग",
+"tn": "सेत्स्वाना",
+"to": "टोंगा",
+"tr": "तुक्रीश",
+"ts": "सोंगा",
+"tt": "टाटर",
+"tw": "ट्वी",
+"ug": "उईघुर",
+"uk": "यूक्रेनियन्",
+"ur": "ऊर्दु",
+"uz": "उज़बेक्",
+"vi": "वियेतनामी",
+"vo": "वोलापुक",
+"wo": "वोलोफ",
+"xh": "षोसा",
+"yi": "येहुदी",
+"yo": "योरूबा",
+"za": "ज़ुआंग",
+"zh": "चीनी",
+"zu": "ज़ुलू",
+},
+{ type: "language", iso: "hr",
+countries: [
+{_reference: "HR"},
+],
+name: "hrvatski",
+"ar": "arapski",
+"av": "avarski",
+"be": "bjeloruski",
+"bg": "bugarski",
+"cs": "češki",
+"cu": "crkvenoslavenski",
+"cy": "velški",
+"da": "danski",
+"de": "njemački",
+"el": "grčki",
+"en": "engleski",
+"eo": "esperanto",
+"es": "španjolski",
+"et": "estonijski",
+"fa": "perzijski",
+"fi": "finski",
+"fr": "francuski",
+"fy": "frizijski",
+"ga": "irski",
+"he": "hebrejski",
+"hr": "hrvatski",
+"hu": "mađarski",
+"hy": "armenski",
+"is": "islandski",
+"it": "talijanski",
+"ja": "japanski",
+"km": "kmerski",
+"ko": "korejski",
+"la": "latinski",
+"lt": "litvanski",
+"lv": "latvijski",
+"mk": "makedonski",
+"mn": "mongolski",
+"mt": "malteški",
+"ne": "nepalski",
+"nl": "nizozemski",
+"no": "norveški",
+"pl": "poljski",
+"pt": "portugalski",
+"ro": "rumunjski",
+"ru": "ruski",
+"sk": "slovački",
+"sl": "slovenski",
+"sq": "albanski",
+"sr": "srpski",
+"sv": "švedski",
+"tr": "turski",
+"uk": "ukrajinski",
+"vi": "vijetnamski",
+"zh": "kineski",
+},
+{ type: "language", iso: "hu",
+countries: [
+{_reference: "HU"},
+],
+name: "magyar",
+"aa": "afar",
+"ab": "abház",
+"af": "afrikai",
+"am": "amhara",
+"ar": "arab",
+"as": "asszámi",
+"ay": "ajmara",
+"az": "azerbajdzsáni",
+"ba": "baskír",
+"be": "belorusz",
+"bg": "bolgár",
+"bh": "bihari",
+"bi": "bislama",
+"bn": "bengáli",
+"bo": "tibeti",
+"br": "breton",
+"ca": "katalán",
+"co": "korzikai",
+"cs": "cseh",
+"cy": "walesi",
+"da": "dán",
+"de": "német",
+"dz": "butáni",
+"el": "görög",
+"en": "angol",
+"eo": "eszperantó",
+"es": "spanyol",
+"et": "észt",
+"eu": "baszk",
+"fa": "perzsa",
+"fi": "finn",
+"fj": "fidzsi",
+"fo": "feröeri",
+"fr": "francia",
+"fy": "fríz",
+"ga": "ír",
+"gd": "skót (gael)",
+"gl": "galíciai",
+"gn": "guarani",
+"gu": "gudzsaráti",
+"ha": "hausza",
+"he": "héber",
+"hi": "hindi",
+"hr": "horvát",
+"hu": "magyar",
+"hy": "örmény",
+"ia": "interlingua",
+"id": "indonéz",
+"ie": "interlingue",
+"ik": "inupiak",
+"is": "izlandi",
+"it": "olasz",
+"iu": "inuktitut",
+"ja": "japán",
+"jv": "jávai",
+"ka": "grúz",
+"kk": "kazah",
+"kl": "grönlandi",
+"km": "kambodzsai",
+"kn": "kannada",
+"ko": "koreai",
+"ks": "kasmíri",
+"ku": "kurd",
+"ky": "kirgiz",
+"la": "latin",
+"ln": "lingala",
+"lo": "laoszi",
+"lt": "litván",
+"lv": "lett",
+"mg": "madagaszkári",
+"mi": "maori",
+"mk": "macedón",
+"ml": "malajalam",
+"mn": "mongol",
+"mo": "moldvai",
+"mr": "marati",
+"ms": "maláj",
+"mt": "máltai",
+"my": "burmai",
+"na": "naurui",
+"ne": "nepáli",
+"nl": "holland",
+"no": "norvég",
+"oc": "okszitán",
+"om": "oromói",
+"or": "orija",
+"pa": "pandzsábi",
+"pl": "lengyel",
+"ps": "pastu (afgán)",
+"pt": "portugál",
+"qu": "kecsua",
+"rm": "rétoromán",
+"rn": "kirundi",
+"ro": "román",
+"ru": "orosz",
+"rw": "kiruanda",
+"sa": "szanszkrit",
+"sd": "szindi",
+"sg": "sango",
+"sh": "szerb-horvát",
+"si": "szingaléz",
+"sk": "szlovák",
+"sl": "szlovén",
+"sm": "szamoai",
+"sn": "sona",
+"so": "szomáli",
+"sq": "albán",
+"sr": "szerb",
+"ss": "sziszuati",
+"st": "szeszotó",
+"su": "szundanéz",
+"sv": "svéd",
+"sw": "szuahéli",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tadzsik",
+"th": "thai",
+"ti": "tigrinya",
+"tk": "türkmén",
+"tl": "tagalog",
+"tn": "szecsuáni",
+"to": "tonga",
+"tr": "török",
+"ts": "conga",
+"tt": "tatár",
+"tw": "tui",
+"ug": "ujgur",
+"uk": "ukrán",
+"ur": "urdu",
+"uz": "üzbég",
+"vi": "vietnámi",
+"vo": "volapük",
+"wo": "volof",
+"xh": "hosza",
+"yi": "zsidó",
+"yo": "joruba",
+"za": "zsuang",
+"zh": "kínai",
+"zu": "zulu",
+},
+{ type: "language", iso: "hy",
+countries: [
+{_reference: "AM"},
+],
+name: "Հայերէն",
+"hy": "Հայերէն",
+},
+{ type: "language", iso: "ia",
+countries: [
+],
+},
+{ type: "language", iso: "id",
+countries: [
+{_reference: "ID"},
+],
+name: "Bahasa Indonesia",
+"aa": "Afar",
+"ab": "Abkhaz",
+"ae": "Avestan",
+"af": "Afrikaans",
+"ak": "Akan",
+"am": "Amharik",
+"ar": "Arab",
+"as": "Assam",
+"av": "Avarik",
+"ay": "Aymara",
+"az": "Azerbaijan",
+"ba": "Bashkir",
+"be": "Belarusia",
+"bg": "Bulgaria",
+"bh": "Bihari",
+"bi": "Bislama",
+"bm": "Bambara",
+"bn": "Bengal",
+"bo": "Tibet",
+"br": "Breton",
+"bs": "Bosnia",
+"ca": "Catalan",
+"ce": "Chechen",
+"ch": "Chamorro",
+"co": "Korsika",
+"cr": "Cree",
+"cs": "Ceko",
+"cv": "Chuvash",
+"cy": "Welsh",
+"da": "Denmark",
+"de": "Jerman",
+"dv": "Divehi",
+"dz": "Dzongkha",
+"ee": "Ewe",
+"el": "Yunani",
+"en": "Inggris",
+"eo": "Esperanto",
+"es": "Spanyol",
+"et": "Estonian",
+"eu": "Basque",
+"fa": "Persia",
+"ff": "Fulah",
+"fi": "Finlandia",
+"fj": "Fiji",
+"fo": "Faro",
+"fr": "Perancis",
+"fy": "Frisi",
+"ga": "Irlandia",
+"gd": "Gaelik Skotlandia",
+"gl": "Gallegan",
+"gn": "Guarani",
+"gu": "Gujarati",
+"gv": "Manx",
+"ha": "Hausa",
+"he": "Ibrani",
+"hi": "Hindi",
+"ho": "Hiri Motu",
+"hr": "Kroasia",
+"hu": "Hungaria",
+"hy": "Armenia",
+"hz": "Herero",
+"ia": "Interlingua",
+"id": "Bahasa Indonesia",
+"ie": "Interlingue",
+"ig": "Igbo",
+"ii": "Sichuan Yi",
+"ik": "Inupiaq",
+"io": "Ido",
+"is": "Icelandic",
+"it": "Italian",
+"ja": "Japanese",
+"jv": "Jawa",
+"ka": "Georgian",
+"kg": "Kongo",
+"ki": "Kikuyu",
+"kj": "Kuanyama",
+"kk": "Kazakh",
+"kl": "Kalaallisut",
+"km": "Khmer",
+"kn": "Kannada",
+"ko": "Korea",
+"kr": "Kanuri",
+"ks": "Kashmir",
+"ku": "Kurdi",
+"kv": "Komi",
+"kw": "Cornish",
+"ky": "Kirghiz",
+"la": "Latin",
+"lb": "Luxembourg",
+"lg": "Ganda",
+"li": "Limburg",
+"ln": "Lingala",
+"lo": "Lao",
+"lt": "Lithuania",
+"lu": "Luba-Katanga",
+"lv": "Latvian",
+"mg": "Malagasi",
+"mh": "Marshall",
+"mi": "Maori",
+"mk": "Macedonian",
+"ml": "Malayalam",
+"mn": "Mongolian",
+"mo": "Moldavian",
+"mr": "Marathi",
+"ms": "Malay",
+"mt": "Maltese",
+"my": "Burma",
+"na": "Nauru",
+"nb": "Norwegian Bokmål",
+"ne": "Nepal",
+"ng": "Ndonga",
+"nl": "Belanda",
+"nn": "Norwegian Nynorsk",
+"no": "Norwegian",
+"nv": "Navajo",
+"ny": "Nyanja; Chichewa; Chewa",
+"oj": "Ojibwa",
+"om": "Oromo",
+"or": "Oriya",
+"os": "Ossetic",
+"pa": "Punjabi",
+"pi": "Pali",
+"pl": "Polish",
+"ps": "Pashto (Pushto)",
+"pt": "Portugis",
+"qu": "Quechua",
+"rm": "Rhaeto-Romance",
+"rn": "Rundi",
+"ro": "Romanian",
+"ru": "Russian",
+"rw": "Kinyarwanda",
+"sa": "Sanskrit",
+"sc": "Sardinian",
+"sd": "Sindhi",
+"se": "Northern Sami",
+"sg": "Sango",
+"sh": "Serbo-Croatian",
+"si": "Sinhalese",
+"sk": "Slovak",
+"sl": "Slovenian",
+"sm": "Samoan",
+"sn": "Shona",
+"so": "Somali",
+"sq": "Albanian",
+"sr": "Serbian",
+"ss": "Swati",
+"su": "Sundan",
+"sv": "Swedia",
+"sw": "Swahili",
+"ta": "Tamil",
+"te": "Telugu",
+"tg": "Tajik",
+"th": "Thai",
+"ti": "Tigrinya",
+"tk": "Turkmen",
+"tl": "Tagalog",
+"tn": "Tswana",
+"tr": "Turkish",
+"ts": "Tsonga",
+"tt": "Tatar",
+"tw": "Twi",
+"ty": "Tahitian",
+"ug": "Uighur",
+"uk": "Ukrainian",
+"ur": "Urdu",
+"uz": "Uzbek",
+"ve": "Venda",
+"vi": "Vietnamese",
+"vo": "Volapük",
+"wa": "Walloon",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Yiddish",
+"yo": "Yoruba",
+"za": "Zhuang",
+"zh": "Cina",
+"zu": "Zulu",
+},
+{ type: "language", iso: "ig",
+countries: [
+{_reference: "NG"},
+],
+},
+{ type: "language", iso: "is",
+countries: [
+{_reference: "IS"},
+],
+name: "Íslenska",
+"ab": "Abkasíska",
+"ae": "Avestíska",
+"af": "Afríkanska",
+"ak": "Akan",
+"am": "Amharíska",
+"an": "Aragonska",
+"ar": "Arabíska",
+"as": "Assamska",
+"av": "Avaríska",
+"ay": "Aímara",
+"az": "Aserska",
+"ba": "Baskír",
+"be": "Hvítrússneska",
+"bg": "Búlgarska",
+"bh": "Bíharí",
+"bi": "Bíslama",
+"bm": "Bambara",
+"bn": "Bengalska",
+"bo": "Tíbeska",
+"br": "Bretónska",
+"bs": "Bosníska",
+"ca": "Katalónska",
+"ce": "Tsjetsjenska",
+"ch": "Kamorró",
+"co": "Korsíska",
+"cr": "Krí",
+"cs": "Tékkneska",
+"cu": "Kirkjuslavneska",
+"cv": "Sjúvas",
+"cy": "Velska",
+"da": "Danska",
+"de": "Þýska",
+"dv": "Dívehí",
+"dz": "Dsongka",
+"ee": "Eve",
+"el": "Nýgríska (1453-)",
+"en": "Enska",
+"eo": "Esperantó",
+"es": "Spænska",
+"et": "Eistneska",
+"eu": "Baskneska",
+"fa": "Persneska",
+"ff": "Fúla",
+"fi": "Finnska",
+"fj": "Fídjeyska",
+"fo": "Færeyska",
+"fr": "Franska",
+"fy": "Frísneska",
+"ga": "Írska",
+"gd": "Skosk gelíska",
+"gl": "Gallegska",
+"gn": "Gvaraní",
+"gu": "Gújaratí",
+"gv": "Manx",
+"ha": "Hása",
+"he": "Hebreska",
+"hi": "Hindí",
+"ho": "Hírímótú",
+"hr": "Króatíska",
+"ht": "Haítíska",
+"hu": "Ungverska",
+"hy": "Armenska",
+"hz": "Hereró",
+"ia": "Interlingva",
+"id": "Indónesíska",
+"ie": "Interlingve",
+"ig": "Ígbó",
+"ii": "Sísúanjí",
+"ik": "Ínúpíak",
+"io": "Ídó",
+"is": "Íslenska",
+"it": "Ítalska",
+"iu": "Inúktitút",
+"ja": "Japanska",
+"jv": "Javanska",
+"ka": "Georgíska",
+"kg": "Kongó",
+"ki": "Kíkújú",
+"kj": "Kúanjama",
+"kk": "Kasakska",
+"kl": "Grænlenska",
+"km": "Kmer",
+"kn": "Kannada",
+"ko": "Kóreska",
+"kr": "Kanúrí",
+"ks": "Kasmírska",
+"ku": "Kúrdneska",
+"kv": "Komíska",
+"kw": "Korníska",
+"ky": "Kirgiska",
+"la": "Latína",
+"lb": "Lúxemborgíska",
+"lg": "Ganda",
+"li": "Limbúrgíska",
+"ln": "Lingala",
+"lo": "Laó",
+"lt": "Litháíska",
+"lu": "Lúbakatanga",
+"lv": "Lettneska",
+"mg": "Malagasíska",
+"mh": "Marshallska",
+"mi": "Maórí",
+"mk": "Makedónska",
+"ml": "Malajalam",
+"mn": "Mongólska",
+"mo": "Moldóvska",
+"mr": "Maratí",
+"ms": "Malaíska",
+"mt": "Maltneska",
+"my": "Burmneska",
+"na": "Nárúska",
+"nb": "Norskt bókmál",
+"nd": "Norðurndebele",
+"ne": "Nepalska",
+"ng": "Ndonga",
+"nl": "Hollenska",
+"nn": "Nýnorska",
+"no": "Norska",
+"nr": "Suðurndebele",
+"nv": "Navahó",
+"ny": "Njanja; Sísjeva; Sjeva",
+"oc": "Okkitíska (eftir 1500); Próvensalska",
+"oj": "Ojibva",
+"om": "Órómó",
+"or": "Óría",
+"os": "Ossetíska",
+"pa": "Púnjabí",
+"pi": "Palí",
+"pl": "Pólska",
+"ps": "Pastú",
+"pt": "Portúgalska",
+"qu": "Kvesjúa",
+"rm": "Retórómanska",
+"rn": "Rúndí",
+"ro": "Rúmenska",
+"ru": "Rússneska",
+"rw": "Kínjarvanda",
+"sa": "Sanskrít",
+"sc": "Sardínska",
+"sd": "Sindí",
+"se": "Norðursamíska",
+"sg": "Sangó",
+"sh": "Serbókróatíska",
+"si": "Singalesíska",
+"sk": "Slóvakíska",
+"sl": "Slóvenska",
+"sm": "Samóska",
+"sn": "Shona",
+"so": "Sómalska",
+"sq": "Albanska",
+"sr": "Serbneska",
+"ss": "Svatí",
+"st": "Suðursótó",
+"su": "Súndanska",
+"sv": "Sænska",
+"sw": "Svahílí",
+"ta": "Tamílska",
+"te": "Telúgú",
+"tg": "Tadsjikska",
+"th": "Taílenska",
+"ti": "Tígrinja",
+"tk": "Túrkmenska",
+"tl": "Tagalog",
+"tn": "Tsúana",
+"to": "Tongverska (Tongaeyjar)",
+"tr": "Tyrkneska",
+"ts": "Tsonga",
+"tt": "Tatarska",
+"tw": "Tví",
+"ty": "Tahítíska",
+"ug": "Úígúr",
+"uk": "Úkraínska",
+"ur": "Úrdú",
+"uz": "Úsbekska",
+"ve": "Venda",
+"vi": "Víetnamska",
+"vo": "Volapük",
+"wa": "Vallónska",
+"wo": "Volof",
+"xh": "Sósa",
+"yi": "Jiddíska",
+"yo": "Jórúba",
+"za": "Súang",
+"zh": "Kínverska",
+"zu": "Súlú",
+},
+{ type: "language", iso: "it",
+countries: [
+{_reference: "CH"},
+{_reference: "IT"},
+],
+name: "italiano",
+"aa": "afar",
+"ab": "abkhazian",
+"ae": "avestan",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amarico",
+"an": "aragonese",
+"ar": "arabo",
+"as": "assamese",
+"av": "avaro",
+"ay": "aymara",
+"az": "azerbaigiano",
+"ba": "baschiro",
+"be": "bielorusso",
+"bg": "bulgaro",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengalese",
+"bo": "tibetano",
+"br": "bretone",
+"bs": "bosniaco",
+"ca": "catalano",
+"ce": "ceceno",
+"ch": "chamorro",
+"co": "corso",
+"cr": "cree",
+"cs": "ceco",
+"cu": "slavo della Chiesa",
+"cv": "chuvash",
+"cy": "gallese",
+"da": "danese",
+"de": "tedesco",
+"dv": "divehi",
+"dz": "dzongkha",
+"ee": "ewe",
+"el": "greco",
+"en": "inglese",
+"eo": "esperanto",
+"es": "spagnolo",
+"et": "estone",
+"eu": "basco",
+"fa": "persiano",
+"ff": "fulah",
+"fi": "finlandese",
+"fj": "figiano",
+"fo": "faroese",
+"fr": "francese",
+"fy": "frisone",
+"ga": "irlandese",
+"gd": "gaelico scozzese",
+"gl": "galiziano",
+"gn": "guarana",
+"gu": "gujarati",
+"gv": "manx",
+"ha": "haussa",
+"he": "ebraico",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "croato",
+"ht": "haitiano",
+"hu": "ungherese",
+"hy": "armeno",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesiano",
+"ie": "interlingue",
+"ig": "igbo",
+"ii": "sichuan yi",
+"ik": "inupiak",
+"io": "ido",
+"is": "islandese",
+"it": "italiano",
+"iu": "inuktitut",
+"ja": "giapponese",
+"jv": "giavanese",
+"ka": "georgiano",
+"kg": "kongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kazako",
+"kl": "kalaallisut",
+"km": "khmer",
+"kn": "kannada",
+"ko": "coreano",
+"kr": "kanuri",
+"ks": "kashmiri",
+"ku": "curdo",
+"kv": "komi",
+"kw": "cornico",
+"ky": "kirghiso",
+"la": "latino",
+"lb": "lussemburghese",
+"lg": "ganda",
+"li": "limburgese",
+"ln": "lingala",
+"lo": "lao",
+"lt": "lituano",
+"lu": "luba-katanga",
+"lv": "lettone",
+"mg": "malgascio",
+"mh": "marshallese",
+"mi": "maori",
+"mk": "macedone",
+"ml": "malayalam",
+"mn": "mongolo",
+"mo": "moldavo",
+"mr": "marathi",
+"ms": "malese",
+"mt": "maltese",
+"my": "birmano",
+"na": "nauru",
+"nd": "ndebele del nord",
+"ne": "nepalese",
+"ng": "ndonga",
+"nl": "olandese",
+"nn": "norvegese nynorsk",
+"no": "norvegese",
+"nr": "ndebele del sud",
+"nv": "navajo",
+"ny": "nyanja; chichewa; chewa",
+"oc": "occitano (post 1500); provenzale",
+"oj": "ojibwa",
+"om": "oromo",
+"or": "oriya",
+"os": "ossetico",
+"pa": "punjabi",
+"pi": "pali",
+"pl": "polacco",
+"ps": "pashto",
+"pt": "portoghese",
+"qu": "quechua",
+"rm": "lingua rhaeto-romance",
+"rn": "rundi",
+"ro": "rumeno",
+"ru": "russo",
+"rw": "kinyarwanda",
+"sa": "sanscrito",
+"sc": "sardo",
+"sd": "sindhi",
+"se": "sami del nord",
+"sg": "sango",
+"sh": "serbo-croato",
+"si": "singalese",
+"sk": "slovacco",
+"sl": "sloveno",
+"sm": "samoano",
+"sn": "shona",
+"so": "somalo",
+"sq": "albanese",
+"sr": "serbo",
+"ss": "swati",
+"st": "sotho del sud",
+"su": "sundanese",
+"sv": "svedese",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tagicco",
+"th": "thai",
+"ti": "tigrinya",
+"tk": "turcomanno",
+"tl": "tagalog",
+"tn": "tswana",
+"to": "tonga (Isole Tonga)",
+"tr": "turco",
+"ts": "tsonga",
+"tt": "tatarico",
+"tw": "ci",
+"ty": "taitiano",
+"ug": "uigurico",
+"uk": "ucraino",
+"ur": "urdu",
+"uz": "usbeco",
+"ve": "venda",
+"vi": "vietnamita",
+"wa": "vallone",
+"wo": "volof",
+"xh": "xosa",
+"yi": "yiddish",
+"yo": "yoruba",
+"za": "zhuang",
+"zh": "cinese",
+"zu": "zulu",
+},
+{ type: "language", iso: "iu",
+countries: [
+],
+name: "ᐃᓄᒃᑎᑐᑦ ᑎᑎᕋᐅᓯᖅ",
+},
+{ type: "language", iso: "ja",
+countries: [
+{_reference: "JP"},
+],
+name: "日本語",
+"aa": "アファル語",
+"ab": "アブハズ語",
+"ae": "アヴェスタ語",
+"af": "アフリカーンス語",
+"ak": "アカン語",
+"am": "アムハラ語",
+"an": "アラゴン語",
+"ar": "アラビア語",
+"as": "アッサム語",
+"av": "アヴァル語",
+"ay": "アイマラ語",
+"az": "アゼルバイジャン語",
+"ba": "バシキール語",
+"be": "ベラルーシ語",
+"bg": "ブルガリア語",
+"bh": "ビハール語",
+"bi": "ビスラマ語",
+"bm": "バンバラ語",
+"bn": "ベンガル語",
+"bo": "チベット語",
+"br": "ブルトン語",
+"bs": "ボスニア語",
+"ca": "カタロニア語",
+"ce": "チェチェン語",
+"ch": "チャモロ語",
+"co": "コルシカ語",
+"cr": "クリー語",
+"cs": "チェコ語",
+"cu": "教会スラブ語",
+"cv": "チュヴァシュ語",
+"cy": "ウェールズ語",
+"da": "デンマーク語",
+"de": "ドイツ語",
+"dv": "ディベヒ語",
+"dz": "ゾンカ語",
+"ee": "エウェ語",
+"el": "ギリシャ語",
+"en": "英語",
+"eo": "エスペラント語",
+"es": "スペイン語",
+"et": "エストニア語",
+"eu": "バスク語",
+"fa": "ペルシア語",
+"ff": "フラニ語",
+"fi": "フィンランド語",
+"fj": "フィジー語",
+"fo": "フェロー語",
+"fr": "フランス語",
+"fy": "フリジア語",
+"ga": "アイルランド語",
+"gd": "スコットランド・ゲール語",
+"gl": "ガリシア語",
+"gn": "グアラニー語",
+"gu": "グジャラート語",
+"gv": "マン島語",
+"ha": "ハウサ語",
+"he": "ヘブライ語",
+"hi": "ヒンディー語",
+"ho": "ヒリモトゥ語",
+"hr": "クロアチア語",
+"ht": "ハイチ語",
+"hu": "ハンガリー語",
+"hy": "アルメニア語",
+"hz": "ヘレロ語",
+"ia": "インターリングア語",
+"id": "インドネシア語",
+"ie": "インターリング語",
+"ig": "イボ語",
+"ii": "四川イ語",
+"ik": "イヌピアック語",
+"io": "イド語",
+"is": "アイスランド語",
+"it": "イタリア語",
+"iu": "イヌクウティトット語",
+"ja": "日本語",
+"jv": "ジャワ語",
+"ka": "グルジア語",
+"kg": "コンゴ語",
+"ki": "キクユ語",
+"kj": "クアニャマ語",
+"kk": "カザフ語",
+"kl": "グリーンランド語",
+"km": "クメール語",
+"kn": "カンナダ語",
+"ko": "韓国語",
+"kr": "カヌリ語",
+"ks": "カシミール語",
+"ku": "クルド語",
+"kv": "コミ語",
+"kw": "コーンウォール語",
+"ky": "キルギス語",
+"la": "ラテン語",
+"lb": "ルクセンブルク語",
+"lg": "ガンダ語",
+"li": "リンブルフ語",
+"ln": "リンガラ語",
+"lo": "ラオ語",
+"lt": "リトアニア語",
+"lu": "ルバ・カタンガ語",
+"lv": "ラトビア語",
+"mg": "マダガスカル語",
+"mh": "マーシャル語",
+"mi": "マオリ語",
+"mk": "マケドニア語",
+"ml": "マラヤーラム語",
+"mn": "モンゴル語",
+"mo": "モルダビア語",
+"mr": "マラーティー語",
+"ms": "マレー語",
+"mt": "マルタ語",
+"my": "ビルマ語",
+"na": "ナウル語",
+"nb": "ノルウェー語 (ブークモール)",
+"nd": "北ンデベレ語",
+"ne": "ネパール語",
+"ng": "ンドンガ語",
+"nl": "オランダ語",
+"nn": "ノルウェー語 (ニーノシュク)",
+"no": "ノルウェー語",
+"nr": "南ンデベレ語",
+"nv": "ナバホ語",
+"ny": "ニャンジャ語、チチェワ語、チェワ語",
+"oc": "オック語 (1500以降)、プロバンス語",
+"oj": "オブジワ語",
+"om": "オロモ語",
+"or": "オリヤー語",
+"os": "オセト語",
+"pa": "パンジャブ語",
+"pi": "パーリ語",
+"pl": "ポーランド語",
+"ps": "パシュトゥー語",
+"pt": "ポルトガル語",
+"qu": "ケチュア語",
+"rm": "レト=ロマン語",
+"rn": "ルンディ語",
+"ro": "ルーマニア語",
+"ru": "ロシア語",
+"rw": "ルワンダ語",
+"sa": "サンスクリット語",
+"sc": "サルデーニャ語",
+"sd": "シンド語",
+"se": "北サーミ語",
+"sg": "サンゴ語",
+"sh": "セルボ=クロアチア語",
+"si": "シンハラ語",
+"sk": "スロバキア語",
+"sl": "スロベニア語",
+"sm": "サモア語",
+"sn": "ショナ語",
+"so": "ソマリ語",
+"sq": "アルバニア語",
+"sr": "セルビア語",
+"ss": "シスワティ語",
+"st": "南部ソト語",
+"su": "スンダ語",
+"sv": "スウェーデン語",
+"sw": "スワヒリ語",
+"ta": "タミール語",
+"te": "テルグ語",
+"tg": "タジク語",
+"th": "タイ語",
+"ti": "ティグリニア語",
+"tk": "トルクメン語",
+"tl": "タガログ語",
+"tn": "ツワナ語",
+"to": "トンガ語",
+"tr": "トルコ語",
+"ts": "ツォンガ語",
+"tt": "タタール語",
+"tw": "トウィ語",
+"ty": "タヒチ語",
+"ug": "ウイグル語",
+"uk": "ウクライナ語",
+"ur": "ウルドゥー語",
+"uz": "ウズベク語",
+"ve": "ベンダ語",
+"vi": "ベトナム語",
+"vo": "ボラピュク語",
+"wa": "ワロン語",
+"wo": "ウォロフ語",
+"xh": "コサ語",
+"yi": "イディッシュ語",
+"yo": "ヨルバ語",
+"za": "チワン語",
+"zh": "中国語",
+"zu": "ズールー語",
+},
+{ type: "language", iso: "ka",
+countries: [
+{_reference: "GE"},
+],
+name: "ქართული",
+"de": "გერმანული",
+"en": "ინგლისური",
+"es": "ესპანური",
+"fr": "ფრანგული",
+"it": "იტალიური",
+"ja": "იაპონური",
+"ka": "ქართული",
+"pt": "პორტუგალიური",
+"ru": "რუსული",
+"zh": "ჩინური",
+},
+{ type: "language", iso: "kk",
+countries: [
+{_reference: "KZ"},
+],
+name: "Қазақ",
+"kk": "Қазақ",
+},
+{ type: "language", iso: "kl",
+countries: [
+{_reference: "GL"},
+],
+name: "kalaallisut",
+"kl": "kalaallisut",
+},
+{ type: "language", iso: "km",
+countries: [
+{_reference: "KH"},
+],
+name: "ភាសាខ្មែរ",
+"aa": "ភាសាអាហ្វារ",
+"ae": "ភាសាអាវែស្តង់",
+"af": "ភាសាអាហ្វ្រីកាអាន",
+"an": "ភាសាអារ៉ាហ្គោន",
+"ar": "ភាសាអារ៉ាប់",
+"ay": "ភាសាអីម៉ារ៉ា",
+"az": "ភាសាអាហ៊្សែរបែហ្សង់",
+"be": "ភាសាបេឡារុស្ស",
+"bg": "ភាសាប៊ុលហ្ការី",
+"bh": "ភាសាបិហារ",
+"bm": "ភាសាបាម្បារា",
+"bn": "ភាសាបេន្កាលី",
+"bo": "ភាសាទីបេ",
+"ca": "ភាសាកាតាឡាន",
+"cs": "ភាសាឆេក",
+"da": "ភាសាដាណឺម៉ាក",
+"de": "ភាសាអាល្លឺម៉ង់",
+"dz": "ភាសាប៊ូតាន",
+"el": "ភាសាក្រិច",
+"en": "ភាសាអង់គ្លេស",
+"eo": "ភាសាអេស្ពេរ៉ាន្ទោ",
+"es": "ភាសាអេស្ប៉ាញ",
+"et": "ភាសាអេស្តូនី",
+"eu": "ភាសាបាស្កេ",
+"fi": "ភាសាហ្វាំងឡង់",
+"fj": "ហ្វ៉ីហ្ស៉ី",
+"fr": "ភាសាបារាំង",
+"ga": "ភាសាហ្កែលិគ",
+"gd": "ភាសាហ្កែលិគ [gd]",
+"gl": "ភាសាហ្កាលីស៉ី",
+"gn": "ភាសាហ្កួរ៉ានី",
+"gu": "ភាសាហ្កុយ៉ារាទី",
+"he": "ភាសាហេប្រិ",
+"hi": "ភាសាហ៉ិនឌី",
+"hu": "ភាសាហុងគ្រី",
+"hy": "ភាសាអារមេនី",
+"id": "ភាសាឥណ្ឌូនេស៊ី",
+"is": "ភាសាអ៉ីស្លង់",
+"it": "ភាសាអ៊ីតាលី",
+"ja": "ភាសាជប៉ុន",
+"jv": "ភាសាយ៉ាវា",
+"ka": "ភាសាហ្សកហ្ស៉ី",
+"kk": "ភាសាកាហ្សាក់ស្តង់់",
+"km": "ភាសាខ្មែរ",
+"kn": "ភាសាកិណាដា",
+"ko": "ភាសាកូរ៉េ",
+"ku": "ភាសាឃឺដ",
+"ky": "ភាសាគៀរហ្គីស្តង់",
+"la": "ភាសាឡាតំាង",
+"lo": "ភាសាឡាវ",
+"lt": "ភាសាលីទុយអានី",
+"lv": "ភាសាឡាតវីយ៉ា",
+"mg": "ភាសាម៉ាដាហ្កាសការ",
+"mi": "ភាសាម៉ោរី",
+"mk": "ភាសាម៉ាសេដូនី",
+"ml": "ភាសាម៉ាឡាឡាយ៉ាន",
+"mn": "ភាសាម៉ុងហ្គោលី",
+"mo": "ភាសាម៉ុលដាវី",
+"mr": "ភាសាម៉ារាធី",
+"ms": "ភាសាម៉ាលេស៉ី",
+"mt": "ភាសាម៉ាល់តា",
+"ne": "ភាសានេប៉ាល់",
+"nl": "ភាសាហុល្លង់",
+"no": "ភាសាន័រវែស",
+"or": "ភាសាអូរីយ៉ា",
+"pa": "ភាសាពូនយ៉ាប៊ី",
+"pl": "ភាសាប៉ូឡូញ",
+"pt": "ភាសាព័រទុយហ្កាល់",
+"qu": "ភាសាកេទ្ជូអា",
+"rn": "ភាសារូន្ឌី",
+"ro": "ភាសារូម៉ានី",
+"ru": "ភាសាรัរូស្ស៉ី",
+"sa": "ភាសាសំស្ក្រឹត",
+"sd": "ភាសាស៉ីន្ដី",
+"sk": "ភាសាស្លូវ៉ាគី",
+"sl": "ភាសាស្លូវ៉ានី",
+"sm": "ភាសាសាមូអា",
+"so": "ភាសាសូម៉ាលី",
+"sq": "ភាសាអាល់បានី",
+"su": "ភាំសាស៊ូដង់",
+"sv": "ភាសាស៊ុយអែដ",
+"sw": "ភាសាស្វាហ៉ីលី",
+"ta": "ភាសាតាមីល",
+"te": "ភាសាតេលូហ្គូ",
+"tg": "ភាសាតាដហ្ស៉ីគីស្តង់",
+"th": "ភាសាថៃ",
+"tk": "ភាសាទួគមេនីស្តង់",
+"to": "ភាសាតុងហ្គោ",
+"tr": "ភាសាទួរគី",
+"tt": "ភាសាតាតារ",
+"uk": "ភាសាអ៊ុយក្រែន",
+"ur": "ភាសាអ៊ូរ្ឌូ",
+"uz": "ភាសាអ៊ូហ្សបេគីស្តង់",
+"vi": "ភាសាវៀតណាម",
+"xh": "ភាសាឃសា",
+"yi": "ភាសាយីឌីហ្ស",
+"yo": "ភាសាយរូបា",
+"za": "ភាសាចួង",
+"zh": "ភាសាចិន",
+"zu": "ភាសាហ្ស៉ូលូ",
+},
+{ type: "language", iso: "kn",
+countries: [
+{_reference: "IN"},
+],
+name: "ಕನ್ನಡ",
+"kn": "ಕನ್ನಡ",
+},
+{ type: "language", iso: "ko",
+countries: [
+{_reference: "KR"},
+],
+name: "한국어",
+"aa": "아파르어",
+"ab": "압카즈어",
+"af": "남아공 공용어",
+"ak": "아칸어",
+"am": "암하라어",
+"an": "아라곤어",
+"ar": "아랍어",
+"as": "아샘어",
+"av": "아바릭어",
+"ay": "아이마라어",
+"az": "아제르바이잔어",
+"ba": "바슈키르어",
+"be": "벨로루시어",
+"bg": "불가리아어",
+"bh": "비하르어",
+"bi": "비슬라마어",
+"bm": "밤바라어",
+"bn": "벵골어",
+"bo": "티베트어",
+"br": "브르타뉴어",
+"bs": "보스니아어",
+"ca": "카탈로니아어",
+"ch": "차모로어",
+"co": "코르시카어",
+"cr": "크리어",
+"cs": "체코어",
+"cu": "교회슬라브어",
+"cv": "추바시어",
+"cy": "웨일스어",
+"da": "덴마크어",
+"de": "독일어",
+"dv": "디베히어",
+"dz": "부탄어",
+"ee": "에웨어",
+"el": "그리스어",
+"en": "영어",
+"eo": "에스페란토어",
+"es": "스페인어",
+"et": "에스토니아어",
+"eu": "바스크어",
+"fa": "이란어",
+"ff": "풀라어",
+"fi": "핀란드어",
+"fj": "피지어",
+"fo": "페로스어",
+"fr": "프랑스어",
+"fy": "프리지아어",
+"ga": "아일랜드어",
+"gd": "스코갤릭어",
+"gl": "갈리시아어",
+"gn": "구아라니어",
+"gu": "구자라트어",
+"gv": "맹크스어",
+"ha": "하우자어",
+"he": "히브리어",
+"hi": "힌디어",
+"ho": "히리 모투어",
+"hr": "크로아티아어",
+"ht": "아이티어",
+"hu": "헝가리어",
+"hy": "아르메니아어",
+"ia": "인터링거",
+"id": "인도네시아어",
+"ie": "인터링게어",
+"ig": "이그보어",
+"ii": "시츄안 이어",
+"ik": "이누피아크어",
+"io": "이도어",
+"is": "아이슬란드어",
+"it": "이탈리아어",
+"iu": "이눅티투트어",
+"ja": "일본어",
+"jv": "자바어",
+"ka": "그루지야어",
+"kg": "콩고어",
+"ki": "키쿠유어",
+"kj": "쿠안야마어",
+"kk": "카자흐어",
+"kl": "그린랜드어",
+"km": "캄보디아어",
+"kn": "카나다어",
+"ko": "한국어",
+"kr": "칸누리어",
+"ks": "카슈미르어",
+"ku": "크르드어",
+"kv": "코미어",
+"kw": "콘월어",
+"ky": "키르기스어",
+"la": "라틴어",
+"lb": "룩셈부르크어",
+"lg": "간다어",
+"li": "림버거어",
+"ln": "링갈라어",
+"lo": "라오어",
+"lt": "리투아니아어",
+"lu": "루바-카탄가어",
+"lv": "라트비아어",
+"mg": "마다가스카르어",
+"mh": "마셜제도어",
+"mi": "마오리어",
+"mk": "마케도니아어",
+"ml": "말라얄람어",
+"mn": "몽골어",
+"mo": "몰다비아어",
+"mr": "마라티어",
+"ms": "말레이어",
+"mt": "몰타어",
+"my": "버마어",
+"na": "나우루어",
+"nb": "보크말 노르웨이어",
+"nd": "은데벨레어, 북부",
+"ne": "네팔어",
+"ng": "느동가어",
+"nl": "네덜란드어",
+"nn": "뉘노르스크 노르웨이어",
+"no": "노르웨이어",
+"nr": "은데벨레어, 남부",
+"nv": "나바호어",
+"ny": "니안자어; 치츄어; 츄어",
+"oc": "옥시트어",
+"oj": "오지브웨이어",
+"om": "오로모어 (아판)",
+"or": "오리야어",
+"os": "오세트어",
+"pa": "펀잡어",
+"pi": "팔리어",
+"pl": "폴란드어",
+"ps": "파시토어 (푸시토)",
+"pt": "포르투칼어",
+"qu": "케추아어",
+"rm": "레토로만어",
+"rn": "반투어(부룬디)",
+"ro": "루마니아어",
+"ru": "러시아어",
+"rw": "반투어(루완다)",
+"sa": "산스크리트어",
+"sc": "사르디니아어",
+"sd": "신디어",
+"se": "북부 사미어",
+"sg": "산고어",
+"sh": "세르보크로아티아어",
+"si": "스리랑카어",
+"sk": "슬로바키아어",
+"sl": "슬로베니아어",
+"sm": "사모아어",
+"sn": "쇼나어",
+"so": "소말리아어",
+"sq": "알바니아어",
+"sr": "세르비아어",
+"ss": "시스와티어",
+"st": "세소토어",
+"su": "순단어",
+"sv": "스웨덴어",
+"sw": "스와힐리어",
+"ta": "타밀어",
+"te": "텔루구어",
+"tg": "타지키스탄어",
+"th": "태국어",
+"ti": "티그리냐어",
+"tk": "투르크멘어",
+"tl": "타갈로그어",
+"tn": "세츠와나어",
+"to": "통가어",
+"tr": "터키어",
+"ts": "총가어",
+"tt": "타타르어",
+"tw": "트위어",
+"ty": "타히티어",
+"ug": "위구르어",
+"uk": "우크라이나어",
+"ur": "우르두어",
+"uz": "우즈베크어",
+"ve": "벤다어",
+"vi": "베트남어",
+"vo": "볼라퓌크어",
+"wa": "왈론어",
+"wo": "올로프어",
+"xh": "반투어(남아프리카)",
+"yi": "이디시어",
+"yo": "요루바어",
+"za": "주앙어",
+"zh": "중국어",
+"zu": "줄루어",
+},
+{ type: "language", iso: "ku",
+countries: [
+{_reference: "IQ"},
+{_reference: "IR"},
+{_reference: "SY"},
+{_reference: "TR"},
+],
+name: "kurdî",
+},
+{ type: "language", iso: "kw",
+countries: [
+{_reference: "GB"},
+],
+name: "kernewek",
+"kw": "kernewek",
+},
+{ type: "language", iso: "ky",
+countries: [
+{_reference: "KG"},
+],
+name: "Кыргыз",
+"de": "немисче",
+"en": "англисче",
+"es": "испанча",
+"fr": "французча",
+"it": "италиянча",
+"ja": "япончо",
+"pt": "португалча",
+"ru": "орусча",
+"zh": "кытайча",
+},
+{ type: "language", iso: "ln",
+countries: [
+{_reference: "CD"},
+{_reference: "CG"},
+],
+name: "lingála",
+},
+{ type: "language", iso: "lo",
+countries: [
+{_reference: "LA"},
+],
+name: "ລາວ",
+},
+{ type: "language", iso: "lt",
+countries: [
+{_reference: "LT"},
+],
+name: "Lietuvių",
+"ar": "Arabų",
+"bg": "Bulgarų",
+"bn": "Bengalų",
+"cs": "Čekų",
+"da": "Danų",
+"de": "Vokiečių",
+"el": "Graikų",
+"en": "Anglų",
+"es": "Ispanų",
+"et": "Estų",
+"fi": "Suomių",
+"fr": "Prancūzų",
+"he": "Hebrajų",
+"hi": "Hindi",
+"hr": "Kroatų",
+"hu": "Vengrų",
+"it": "Italų",
+"ja": "Japonų",
+"ko": "Korėjiečių",
+"lt": "Lietuvių",
+"lv": "Latvių",
+"nl": "Olandų",
+"no": "Norvegų",
+"pl": "Lenkų",
+"pt": "Portugalų",
+"ro": "Rumunų",
+"ru": "Rusų",
+"sk": "Slovakų",
+"sl": "Slovėnų",
+"sv": "Švedų",
+"th": "Tajų",
+"tr": "Turkų",
+"zh": "Kinų",
+},
+{ type: "language", iso: "lv",
+countries: [
+{_reference: "LV"},
+],
+name: "latviešu",
+"ar": "arābu",
+"bg": "bulgāru",
+"cs": "čehu",
+"da": "dāņu",
+"de": "vācu",
+"el": "grieķu",
+"en": "angļu",
+"es": "spāņu",
+"et": "igauņu",
+"fi": "somu",
+"fr": "franču",
+"he": "ivrits",
+"hr": "horvātu",
+"hu": "ungāru",
+"it": "itāliešu",
+"ja": "japāņu",
+"ko": "korejiešu",
+"lt": "lietuviešu",
+"lv": "latviešu",
+"nl": "holandiešu",
+"no": "norvēģu",
+"pl": "poļu",
+"pt": "portugāļu",
+"ro": "rumāņu",
+"ru": "krievu",
+"sk": "slovāku",
+"sl": "slovēņu",
+"sv": "zviedru",
+"tr": "turku",
+"zh": "ķīniešu",
+},
+{ type: "language", iso: "mk",
+countries: [
+{_reference: "MK"},
+],
+name: "македонски",
+"de": "германски",
+"en": "англиски",
+"es": "шпански",
+"fr": "француски",
+"it": "италијански",
+"ja": "јапонски",
+"mk": "македонски",
+"pt": "португалски",
+"ru": "руски",
+"zh": "кинески",
+},
+{ type: "language", iso: "ml",
+countries: [
+{_reference: "IN"},
+],
+name: "മലയാളം",
+},
+{ type: "language", iso: "mn",
+countries: [
+{_reference: "MN"},
+],
+name: "Монгол хэл",
+"de": "герман",
+"en": "англи",
+"es": "испани",
+"fr": "франц",
+"it": "итали",
+"ja": "япон",
+"pt": "португали",
+"ru": "орос",
+"zh": "хятад",
+},
+{ type: "language", iso: "mr",
+countries: [
+{_reference: "IN"},
+],
+name: "मराठी",
+"aa": "अफार",
+"ab": "अबखेजियन",
+"af": "अफ्रिकान्स",
+"am": "अमहारिक",
+"ar": "अरेबिक",
+"as": "असामी",
+"ay": "ऐमरा",
+"az": "अज़रबाइजानी",
+"ba": "बष्किर",
+"be": "बैलोरुसियन",
+"bg": "बल्गेरियन",
+"bh": "बीहारी",
+"bi": "बिसलमा",
+"bn": "बंगाली",
+"bo": "तिबेटियन",
+"br": "ब्रेटन",
+"ca": "कटलन",
+"co": "कोर्सिकन",
+"cs": "ज़ेक",
+"cy": "वेल्ष",
+"da": "डानिष",
+"de": "जर्मन",
+"dz": "भूटानी",
+"el": "ग्रीक",
+"en": "इंग्रेजी",
+"eo": "इस्परान्टो",
+"es": "स्पानिष",
+"et": "इस्टोनियन्",
+"eu": "बास्क",
+"fa": "पर्षियन्",
+"fi": "फिन्निष",
+"fj": "फिजी",
+"fo": "फेरोस्",
+"fr": "फ्रेन्च",
+"fy": "फ्रिसियन्",
+"ga": "ऐरिष",
+"gd": "स्काटस् गेलिक",
+"gl": "गेलीशियन",
+"gn": "गौरानी",
+"gu": "गुजराती",
+"ha": "हौसा",
+"he": "हेबृ",
+"hi": "हिन्दी",
+"hr": "क्रोयेषियन्",
+"hu": "हंगेरियन्",
+"hy": "आर्मीनियन्",
+"ia": "इन्टरलिंग्वा",
+"id": "इन्डोनेषियन",
+"ie": "इन्टरलिंग",
+"ik": "इनूपियाक",
+"is": "आईसलान्डिक",
+"it": "इटालियन",
+"iu": "इनुकिटुट्",
+"ja": "जापनीस्",
+"jv": "जावनीस्",
+"ka": "जार्जियन्",
+"kk": "कज़क",
+"kl": "ग्रीनलान्डिक",
+"km": "कंबोडियन",
+"kn": "कन्नड",
+"ko": "कोरियन्",
+"ks": "कश्मीरी",
+"ku": "कुर्दिष",
+"ky": "किर्गिज़",
+"la": "लाटिन",
+"ln": "लिंगाला",
+"lo": "लाओतियन्",
+"lt": "लिथुआनियन्",
+"lv": "लाट्वियन् (लेट्टिष)",
+"mg": "मलागसी",
+"mi": "माओरी",
+"mk": "मसीडोनियन्",
+"ml": "मलियालम",
+"mn": "मंगोलियन्",
+"mo": "मोल्डावियन्",
+"mr": "मराठी",
+"ms": "मलय",
+"mt": "मालतीस्",
+"my": "बर्मीस्",
+"na": "नौरो",
+"ne": "नेपाली",
+"nl": "डच",
+"no": "नोर्वेजियन",
+"oc": "ओसिटान्",
+"om": "ओरोमो (अफान)",
+"or": "ओरिया",
+"pa": "पंजाबी",
+"pl": "पोलिष",
+"ps": "पष्टो (पुष्टो)",
+"pt": "पोर्चुगीस्",
+"qu": "क्वेचओ",
+"rm": "रहटो-रोमान्स्",
+"rn": "किरुन्दी",
+"ro": "रोमानियन्",
+"ru": "रष्यन्",
+"rw": "किन्यार्वान्डा",
+"sa": "संस्कृत",
+"sd": "सिंधी",
+"sg": "सांग्रो",
+"sh": "सेर्बो-क्रोयेषियन्",
+"si": "सिन्हलीस्",
+"sk": "स्लोवाक",
+"sl": "स्लोवेनियन्",
+"sm": "समोन",
+"sn": "शोना",
+"so": "सोमाली",
+"sq": "आल्बेनियन्",
+"sr": "सेर्बियन्",
+"ss": "सिस्वती",
+"st": "सेसोथो",
+"su": "सुंदनीस्",
+"sv": "स्वीडिष",
+"sw": "स्वाहिली",
+"ta": "तमिळ",
+"te": "तेलंगू",
+"tg": "तजिक",
+"th": "थाई",
+"ti": "तिग्रिन्या",
+"tk": "तुर्कमेन",
+"tl": "तगालोग",
+"tn": "सेत्स्वाना",
+"to": "तोंगा",
+"tr": "तुर्किष",
+"ts": "त्सोगा",
+"tt": "टटार",
+"tw": "त्वि",
+"ug": "उधूर",
+"uk": "युक्रेनियन्",
+"ur": "उर्दू",
+"uz": "उज़बेक",
+"vi": "वियत्नामीज़",
+"vo": "ओलापुक",
+"wo": "उलोफ",
+"xh": "क्स्होसा",
+"yi": "इद्दिष",
+"yo": "यूरुबा",
+"za": "झ्हुन्ग",
+"zh": "चिनीस्",
+"zu": "जुलू",
+},
+{ type: "language", iso: "ms",
+countries: [
+{_reference: "BN"},
+{_reference: "MY"},
+],
+name: "Bahasa Melayu",
+"ms": "Bahasa Melayu",
+},
+{ type: "language", iso: "mt",
+countries: [
+{_reference: "MT"},
+],
+name: "Malti",
+"aa": "Afar",
+"ab": "Abkażjan",
+"ae": "Avestan",
+"af": "Afrikans",
+"ak": "Akan",
+"am": "Amħariku",
+"an": "Aragonese",
+"ar": "Għarbi",
+"as": "Assamese",
+"av": "Avarik",
+"ay": "Ajmara",
+"az": "Ażerbajġani",
+"ba": "Baxkir",
+"be": "Belarussu",
+"bg": "Bulgaru",
+"bh": "Biħari",
+"bi": "Bislama",
+"bm": "Bambara",
+"bn": "Bengali",
+"bo": "Tibetjan",
+"br": "Brenton",
+"bs": "Bosnijan",
+"ca": "Katalan",
+"ce": "Ċeċen",
+"ch": "Ċamorro",
+"co": "Korsiku",
+"cr": "Krij",
+"cs": "Ċek",
+"cu": "Slaviku tal-Knisja",
+"cv": "Ċuvax",
+"cy": "Welx",
+"da": "Daniż",
+"de": "Ġermaniż",
+"dv": "Diveħi",
+"dz": "Dżongka",
+"ee": "Ewe",
+"el": "Grieg",
+"en": "Ingliż",
+"eo": "Esperanto",
+"es": "Spanjol",
+"et": "Estonjan",
+"eu": "Bask",
+"fa": "Persjan",
+"ff": "Fulaħ",
+"fi": "Finlandiż",
+"fj": "Fiġi",
+"fo": "Fawriż",
+"fr": "Franċiż",
+"fy": "Friżjan",
+"ga": "Irlandiż",
+"gd": "Galliku Skoċċiż",
+"gl": "Gallegjan",
+"gn": "Gwarani",
+"gu": "Guġarati",
+"gv": "Manks",
+"ha": "Ħawsa",
+"he": "Ebrajk",
+"hi": "Ħindi",
+"ho": "Ħiri Motu",
+"hr": "Kroat",
+"ht": "Haitian",
+"hu": "Ungeriż",
+"hy": "Armenjan",
+"hz": "Ħerero",
+"ia": "Interlingua",
+"id": "Indoneżjan",
+"ie": "Interlingue",
+"ig": "Igbo",
+"ii": "Sichuan Yi",
+"ik": "Inupjak",
+"io": "Ido",
+"is": "Iżlandiż",
+"it": "Taljan",
+"iu": "Inukitut",
+"ja": "Ġappuniż",
+"jv": "Ġavaniż",
+"ka": "Ġorġjan",
+"kg": "Kongo",
+"ki": "Kikuju",
+"kj": "Kuanyama",
+"kk": "Każak",
+"kl": "Kalallisut",
+"km": "Kmer",
+"kn": "Kannada",
+"ko": "Korejan",
+"kr": "Kanuri",
+"ks": "Kaxmiri",
+"ku": "Kurdiż",
+"kv": "Komi",
+"kw": "Korniku",
+"ky": "Kirgiż",
+"la": "Latin",
+"lb": "Letżburgiż",
+"lg": "Ganda",
+"li": "Limburgish",
+"ln": "Lingaljan",
+"lo": "Lao",
+"lt": "Litwanjan",
+"lu": "Luba-Katanga",
+"lv": "Latvjan (Lettix)",
+"mg": "Malagażi",
+"mh": "Marxall",
+"mi": "Maori",
+"mk": "Maċedonjan",
+"ml": "Malajalam",
+"mn": "Mongoljan",
+"mo": "Moldavjan",
+"mr": "Marati",
+"ms": "Malajan",
+"mt": "Malti",
+"my": "Burmiż",
+"na": "Nawuru",
+"nb": "Bokmahal Norveġiż",
+"nd": "Ndebele, ta’ Fuq",
+"ne": "Nepaliż",
+"ng": "Ndonga",
+"nl": "Olandiż",
+"nn": "Ninorsk Norveġiż",
+"no": "Norveġiż",
+"nr": "Ndebele, t’Isfel",
+"nv": "Navaħo",
+"ny": "Ċiċewa; Njanġa",
+"oc": "Provenzal (wara 1500)",
+"oj": "Oġibwa",
+"om": "Oromo (Afan)",
+"or": "Orija",
+"os": "Ossettiku",
+"pa": "Punġabi",
+"pi": "Pali",
+"pl": "Pollakk",
+"ps": "Paxtun",
+"pt": "Portugiż",
+"qu": "Keċwa",
+"rm": "Reto-Romanz",
+"rn": "Rundi",
+"ro": "Rumen",
+"ru": "Russu",
+"rw": "Kinjarwanda",
+"sa": "Sanskrit",
+"sc": "Sardinjan",
+"sd": "Sindi",
+"se": "Sami ta’ Fuq",
+"sg": "Sango",
+"sh": "Serbo-Kroat",
+"si": "Sinħaliż",
+"sk": "Slovakk",
+"sl": "Sloven",
+"sm": "Samojan",
+"sn": "Xona",
+"so": "Somali",
+"sq": "Albaniż",
+"sr": "Serb",
+"ss": "Swati",
+"st": "Soto, t’Isfel",
+"su": "Sundaniż",
+"sv": "Svediż",
+"sw": "Swaħili",
+"ta": "Tamil",
+"te": "Telugu",
+"tg": "Taġik",
+"th": "Tajlandiż",
+"ti": "Tigrinja",
+"tk": "Turkmeni",
+"tl": "Tagalog",
+"tn": "Zwana",
+"to": "Tongan (Gżejjer ta’ Tonga)",
+"tr": "Tork",
+"ts": "Tsonga",
+"tt": "Tatar",
+"tw": "Twi",
+"ty": "Taħitjan",
+"ug": "Wigur",
+"uk": "Ukranjan",
+"ur": "Urdu",
+"uz": "Użbek",
+"ve": "Venda",
+"vi": "Vjetnamiż",
+"vo": "Volapuk",
+"wa": "Walloon",
+"wo": "Wolof",
+"xh": "Ħoża",
+"yi": "Jiddix",
+"yo": "Joruba",
+"za": "Żwang",
+"zh": "Ċiniż",
+"zu": "Żulu",
+},
+{ type: "language", iso: "nb",
+countries: [
+{_reference: "NO"},
+],
+name: "bokmål",
+"aa": "afar",
+"ab": "abkhasisk",
+"ae": "avestisk",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amharisk",
+"an": "aragonsk",
+"ar": "arabisk",
+"as": "assamisk",
+"av": "avarisk",
+"ay": "aymara",
+"az": "aserbajdsjansk",
+"ba": "basjkirsk",
+"be": "hviterussisk",
+"bg": "bulgarsk",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tibetansk",
+"br": "bretonsk",
+"bs": "bosnisk",
+"ca": "katalansk",
+"ce": "tsjetsjensk",
+"ch": "chamorro",
+"co": "korsikansk",
+"cr": "cree",
+"cs": "tsjekkisk",
+"cu": "kirkeslavisk",
+"cv": "tsjuvansk",
+"cy": "walisisk",
+"da": "dansk",
+"de": "tysk",
+"dv": "divehi",
+"dz": "dzongkha",
+"ee": "ewe",
+"el": "gresk",
+"en": "engelsk",
+"eo": "esperanto",
+"es": "spansk",
+"et": "estisk",
+"eu": "baskisk",
+"fa": "persisk",
+"ff": "fulani",
+"fi": "finsk",
+"fj": "fijiansk",
+"fo": "færøysk",
+"fr": "fransk",
+"ga": "irsk",
+"gd": "skotsk gælisk",
+"gl": "galicisk",
+"gn": "guarani",
+"gu": "gujarati",
+"gv": "manx",
+"ha": "hausa",
+"he": "hebraisk",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "kroatisk",
+"ht": "haitisk",
+"hu": "ungarsk",
+"hy": "armensk",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesisk",
+"ie": "interlingue",
+"ig": "ibo",
+"ii": "sichuan-yi",
+"ik": "unupiak",
+"io": "ido",
+"is": "islandsk",
+"it": "italiensk",
+"iu": "inuktitut",
+"ja": "japansk",
+"jv": "javanesisk",
+"ka": "georgisk",
+"kg": "kikongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kasakhisk",
+"km": "khmer",
+"kn": "kannada",
+"ko": "koreansk",
+"kr": "kanuri",
+"ks": "kasjmiri",
+"ku": "kurdisk",
+"kv": "komi",
+"kw": "kornisk",
+"ky": "kirgisisk",
+"la": "latin",
+"lb": "luxemburgsk",
+"lg": "ganda",
+"li": "limburgisk",
+"ln": "lingala",
+"lo": "laotisk",
+"lt": "litauisk",
+"lu": "luba-katanga",
+"lv": "latvisk",
+"mg": "madagassisk",
+"mh": "marshallesisk",
+"mi": "maori",
+"mk": "makedonsk",
+"ml": "malayalam",
+"mn": "mongolsk",
+"mo": "moldavisk",
+"mr": "marathi",
+"ms": "malayisk",
+"mt": "maltesisk",
+"my": "burmesisk",
+"na": "nauru",
+"nb": "bokmål",
+"nd": "nord-ndebele",
+"ne": "nepalsk",
+"ng": "ndonga",
+"nl": "nederlandsk",
+"nn": "nynorsk",
+"no": "norsk",
+"nr": "sør-ndebele",
+"nv": "navajo",
+"ny": "nyanja",
+"oc": "oksitansk (etter 1500)",
+"oj": "ojibwa",
+"om": "oromo",
+"or": "oriya",
+"os": "ossetisk",
+"pa": "panjabi",
+"pi": "pali",
+"pl": "polsk",
+"ps": "pashto",
+"pt": "portugisisk",
+"qu": "quechua",
+"rm": "retoromansk",
+"rn": "rundi",
+"ro": "rumensk",
+"ru": "russisk",
+"rw": "kinjarwanda",
+"sa": "sanskrit",
+"sc": "sardinsk",
+"sd": "sindhi",
+"se": "nordsamisk",
+"sg": "sango",
+"sh": "serbokroatisk",
+"si": "singalesisk",
+"sk": "slovakisk",
+"sl": "slovensk",
+"sm": "samoansk",
+"sn": "shona",
+"sq": "albansk",
+"sr": "serbisk",
+"ss": "swati",
+"st": "sør-sotho",
+"su": "sundanesisk",
+"sv": "svensk",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tatsjikisk",
+"th": "thai",
+"ti": "tigrinja",
+"tk": "turkmensk",
+"tl": "tagalog",
+"tn": "tswana",
+"to": "tonga (Tonga-øyene)",
+"tr": "tyrkisk",
+"ts": "tsonga",
+"tt": "tatarisk",
+"tw": "twi",
+"ty": "tahitisk",
+"ug": "uigurisk",
+"uk": "ukrainsk",
+"ur": "urdu",
+"uz": "usbekisk",
+"ve": "venda",
+"vi": "vietnamesisk",
+"vo": "volapyk",
+"wa": "vallonsk",
+"wo": "wolof",
+"xh": "xhosa",
+"yi": "jiddisk",
+"yo": "joruba",
+"za": "zhuang",
+"zh": "kinesisk",
+"zu": "zulu",
+},
+{ type: "language", iso: "ne",
+countries: [
+{_reference: "NP"},
+],
+},
+{ type: "language", iso: "nl",
+countries: [
+{_reference: "BE"},
+{_reference: "NL"},
+],
+name: "Nederlands",
+"aa": "Afar",
+"ab": "Abchazisch",
+"ae": "Avestisch",
+"af": "Afrikaans",
+"ak": "Akan",
+"am": "Amhaars",
+"an": "Aragonees",
+"ar": "Arabisch",
+"as": "Assamees",
+"av": "Avarisch",
+"ay": "Aymara",
+"az": "Azerbeidzjaans",
+"ba": "Basjkiers",
+"be": "Wit-Russisch",
+"bg": "Bulgaars",
+"bh": "Bihari",
+"bi": "Bislama",
+"bm": "Bambara",
+"bn": "Bengalees",
+"bo": "Tibetaans",
+"br": "Bretons",
+"bs": "Bosnisch",
+"ca": "Catalaans",
+"ce": "Chechen",
+"ch": "Chamorro",
+"co": "Corsicaans",
+"cr": "Cree",
+"cs": "Tsjechisch",
+"cu": "Kerkslavisch",
+"cv": "Tsjoevasjisch",
+"cy": "Welsh",
+"da": "Deens",
+"de": "Duits",
+"dv": "Divehi",
+"dz": "Dzongkha",
+"ee": "Ewe",
+"el": "Grieks",
+"en": "Engels",
+"eo": "Esperanto",
+"es": "Spaans",
+"et": "Estlands",
+"eu": "Baskisch",
+"fa": "Perzisch",
+"ff": "Fulah",
+"fi": "Fins",
+"fj": "Fijisch",
+"fo": "Faeröers",
+"fr": "Frans",
+"fy": "Fries",
+"ga": "Iers",
+"gd": "Schots Gaelic",
+"gl": "Galicisch",
+"gn": "Guarani",
+"gu": "Gujarati",
+"gv": "Manx",
+"ha": "Hausa",
+"he": "Hebreeuws",
+"hi": "Hindi",
+"ho": "Hiri Motu",
+"hr": "Kroatisch",
+"ht": "Haïtiaans",
+"hu": "Hongaars",
+"hy": "Armeens",
+"hz": "Herero",
+"ia": "Interlingua",
+"id": "Indonesisch",
+"ie": "Interlingue",
+"ig": "Igbo",
+"ii": "Sichuan Yi",
+"ik": "Inupiaq",
+"io": "Ido",
+"is": "IJslands",
+"it": "Italiaans",
+"iu": "Inuktitut",
+"ja": "Japans",
+"jv": "Javaans",
+"ka": "Georgisch",
+"kg": "Kongo",
+"ki": "Kikuyu",
+"kj": "Kuanyama",
+"kk": "Kazachs",
+"kl": "Kalaallisut",
+"km": "Khmer",
+"kn": "Kannada",
+"ko": "Koreaans",
+"kr": "Kanuri",
+"ks": "Kashmiri",
+"ku": "Koerdisch",
+"kv": "Komi",
+"kw": "Cornish",
+"ky": "Kirgizisch",
+"la": "Latijn",
+"lb": "Luxemburgs",
+"lg": "Ganda",
+"li": "Limburgs",
+"ln": "Lingala",
+"lo": "Lao",
+"lt": "Litouws",
+"lu": "Luba-Katanga",
+"lv": "Letlands",
+"mg": "Malagasisch",
+"mh": "Marshallees",
+"mi": "Maori",
+"mk": "Macedonisch",
+"ml": "Malayalam",
+"mn": "Mongools",
+"mo": "Moldavisch",
+"mr": "Marathi",
+"ms": "Maleis",
+"mt": "Maltees",
+"my": "Birmees",
+"na": "Nauru",
+"nb": "Noors - Bokmål",
+"nd": "Ndebele, noord-",
+"ne": "Nepalees",
+"ng": "Ndonga",
+"nl": "Nederlands",
+"nn": "Noors - Nynorsk",
+"no": "Noors",
+"nr": "Ndebele, zuid-",
+"nv": "Navajo",
+"ny": "Nyanja",
+"oc": "Langue d’Oc (na 1500)",
+"oj": "Ojibwa",
+"om": "Oromo",
+"or": "Oriya",
+"os": "Ossetisch",
+"pa": "Punjabi",
+"pi": "Pali",
+"pl": "Pools",
+"ps": "Pashto",
+"pt": "Portugees",
+"qu": "Quechua",
+"rm": "Retoromaans",
+"rn": "Rundi",
+"ro": "Roemeens",
+"ru": "Russisch",
+"rw": "Kinyarwanda",
+"sa": "Sanskrit",
+"sc": "Sardinisch",
+"sd": "Sindhi",
+"se": "Noord-Samisch",
+"sg": "Sango",
+"sh": "Servokroatisch",
+"si": "Singalees",
+"sk": "Slowaaks",
+"sl": "Sloveens",
+"sm": "Samoaans",
+"sn": "Shona",
+"so": "Somalisch",
+"sq": "Albanees",
+"sr": "Servisch",
+"ss": "Swati",
+"st": "Sotho, zuid",
+"su": "Sundanees",
+"sv": "Zweeds",
+"sw": "Swahili",
+"ta": "Tamil",
+"te": "Teloegoe",
+"tg": "Tadzjik",
+"th": "Thai",
+"ti": "Tigrinya",
+"tk": "Turkmeens",
+"tl": "Tagalog",
+"tn": "Tswana",
+"to": "Tonga (Tonga-eilanden)",
+"tr": "Turks",
+"ts": "Tsonga",
+"tt": "Tataars",
+"tw": "Twi",
+"ty": "Tahitisch",
+"ug": "Uighur",
+"uk": "Oekraïens",
+"ur": "Urdu",
+"uz": "Oezbeeks",
+"ve": "Venda",
+"vi": "Vietnamees",
+"vo": "Volapük",
+"wa": "Wallonisch",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Jiddisch",
+"yo": "Joruba",
+"za": "Zhuang",
+"zh": "Chinees",
+"zu": "Zulu",
+},
+{ type: "language", iso: "nn",
+countries: [
+{_reference: "NO"},
+],
+name: "nynorsk",
+"aa": "afar",
+"ab": "abkhasisk",
+"ae": "avestisk",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amharisk",
+"an": "aragonsk",
+"ar": "arabisk",
+"as": "assamisk",
+"av": "avarisk",
+"ay": "aymara",
+"az": "aserbajdsjansk",
+"ba": "basjkirsk",
+"be": "kviterussisk",
+"bg": "bulgarsk",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tibetansk",
+"br": "bretonsk",
+"bs": "bosnisk",
+"ca": "katalansk",
+"ce": "tsjetsjensk",
+"ch": "chamorro",
+"co": "korsikansk",
+"cr": "cree",
+"cs": "tsjekkisk",
+"cu": "kyrkjeslavisk",
+"cv": "tsjuvansk",
+"cy": "walisisk",
+"da": "dansk",
+"de": "tysk",
+"dv": "divehi",
+"dz": "dzongkha",
+"ee": "ewe",
+"el": "gresk",
+"en": "engelsk",
+"eo": "esperanto",
+"es": "spansk",
+"et": "estisk",
+"eu": "baskisk",
+"fa": "persisk",
+"ff": "fulani",
+"fi": "finsk",
+"fj": "fijiansk",
+"fo": "færøysk",
+"fr": "fransk",
+"fy": "vestfrisisk",
+"ga": "irsk",
+"gd": "skotsk-gælisk",
+"gl": "galicisk",
+"gn": "guarani",
+"gu": "gujarati",
+"gv": "manx",
+"ha": "hausa",
+"he": "hebraisk",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "kroatisk",
+"ht": "haitisk",
+"hu": "ungarsk",
+"hy": "armensk",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesisk",
+"ie": "interlingue",
+"ig": "ibo",
+"ii": "sichuan-yi",
+"ik": "inupiak",
+"io": "ido",
+"is": "islandsk",
+"it": "italiensk",
+"iu": "inuktitut",
+"ja": "japansk",
+"jv": "javanesisk",
+"ka": "georgisk",
+"kg": "kikongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kasakhisk",
+"kl": "kalaallisut; grønlandsk",
+"km": "khmer",
+"kn": "kannada",
+"ko": "koreansk",
+"kr": "kanuri",
+"ks": "kasjmiri",
+"ku": "kurdisk",
+"kv": "komi",
+"kw": "kornisk",
+"ky": "kirgisisk",
+"la": "latin",
+"lb": "luxemburgsk",
+"lg": "ganda",
+"li": "limburgisk",
+"ln": "lingala",
+"lo": "laotisk",
+"lt": "litauisk",
+"lu": "luba-katanga",
+"lv": "latvisk",
+"mg": "madagassisk",
+"mh": "marshallesisk",
+"mi": "maori",
+"mk": "makedonsk",
+"ml": "malayalam",
+"mn": "mongolsk",
+"mo": "moldavisk",
+"mr": "marathi",
+"ms": "malayisk",
+"mt": "maltesisk",
+"my": "burmesisk",
+"na": "nauru",
+"nb": "bokmål",
+"nd": "nord-ndebele",
+"ne": "nepalsk",
+"ng": "ndonga",
+"nl": "nederlandsk",
+"nn": "nynorsk",
+"no": "norsk",
+"nr": "sør-ndebele",
+"nv": "navajo",
+"ny": "nyanja",
+"oc": "oksitansk (etter 1500)",
+"oj": "ojibwa",
+"om": "oromo",
+"or": "oriya",
+"os": "ossetisk",
+"pa": "panjabi",
+"pi": "pali",
+"pl": "polsk",
+"ps": "pashto",
+"pt": "portugisisk",
+"qu": "quechua",
+"rm": "retoromansk",
+"rn": "rundi",
+"ro": "rumensk",
+"ru": "russisk",
+"rw": "kinjarwanda",
+"sa": "sanskrit",
+"sc": "sardinsk",
+"sd": "sindhi",
+"se": "nordsamisk",
+"sg": "sango",
+"si": "singalesisk",
+"sk": "slovakisk",
+"sl": "slovensk",
+"sm": "samoansk",
+"sn": "shona",
+"so": "somali",
+"sq": "albansk",
+"sr": "serbisk",
+"ss": "swati",
+"st": "sørsotho",
+"su": "sundanesisk",
+"sv": "svensk",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugu",
+"tg": "tatsjikisk",
+"th": "thai",
+"ti": "tigrinja",
+"tk": "turkmensk",
+"tl": "tagalog",
+"tn": "tswana",
+"to": "tonga (Tonga-øyane)",
+"tr": "tyrkisk",
+"ts": "tsonga",
+"tt": "tatarisk",
+"tw": "twi",
+"ty": "tahitisk",
+"ug": "uigurisk",
+"uk": "ukrainsk",
+"ur": "urdu",
+"uz": "usbekisk",
+"ve": "venda",
+"vi": "vietnamesisk",
+"vo": "volapyk",
+"wa": "vallonsk",
+"wo": "wolof",
+"xh": "xhosa",
+"yi": "jiddisk",
+"yo": "joruba",
+"za": "zhuang",
+"zh": "kinesisk",
+"zu": "zulu",
+},
+{ type: "language", iso: "nr",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "ny",
+countries: [
+{_reference: "MW"},
+],
+},
+{ type: "language", iso: "om",
+countries: [
+{_reference: "ET"},
+{_reference: "KE"},
+],
+name: "Oromoo",
+"om": "Oromoo",
+},
+{ type: "language", iso: "or",
+countries: [
+{_reference: "IN"},
+],
+name: "ଓଡ଼ିଆ",
+},
+{ type: "language", iso: "pa",
+countries: [
+{_reference: "IN"},
+{_reference: "PK"},
+],
+name: "ਪੰਜਾਬੀ",
+"pa": "ਪੰਜਾਬੀ",
+},
+{ type: "language", iso: "pl",
+countries: [
+{_reference: "PL"},
+],
+name: "polski",
+"ar": "arabski",
+"bg": "bułgarski",
+"bn": "bengalski",
+"ca": "kataloński",
+"cs": "czeski",
+"cy": "walijski",
+"da": "duński",
+"de": "niemiecki",
+"el": "grecki",
+"en": "angielski",
+"es": "hiszpański",
+"et": "estoński",
+"eu": "baskijski",
+"fi": "fiński",
+"fr": "francuski",
+"he": "hebrajski",
+"hi": "hindi",
+"hr": "chorwacki",
+"hu": "węgierski",
+"it": "włoski",
+"ja": "japoński",
+"ko": "koreański",
+"lt": "litewski",
+"lv": "łotewski",
+"mt": "maltański",
+"nl": "niderlandzki",
+"no": "norweski",
+"pl": "polski",
+"pt": "portugalski",
+"ro": "rumuński",
+"ru": "rosyjski",
+"sk": "słowacki",
+"sl": "słoweński",
+"sv": "szwedzki",
+"th": "tajski",
+"tr": "turecki",
+"zh": "chiński",
+},
+{ type: "language", iso: "ps",
+countries: [
+{_reference: "AF"},
+],
+name: "پښتو",
+"ar": "عربي",
+"de": "الماني",
+"el": "یوناني",
+"en": "انګلیسي",
+"et": "حبشي",
+"fa": "فارسي",
+"fi": "فینلنډي",
+"fr": "فرانسوي",
+"he": "عبري",
+"hi": "هندي",
+"hy": "ارمني",
+"it": "ایټالوي",
+"ja": "جاپانی",
+"ku": "کردي",
+"la": "لاتیني",
+"mg": "ملغاسي",
+"mk": "مقدوني",
+"mn": "مغولي",
+"ms": "ملایا",
+"pl": "پولنډي",
+"ps": "پښتو",
+"pt": "پورتګالي",
+"ru": "روسي",
+"sa": "سنسکریټ",
+"sv": "سویډنی",
+"tg": "تاجک",
+"tk": "ترکمني",
+"tt": "تاتار",
+"uz": "ازبکي",
+"zh": "چیني",
+},
+{ type: "language", iso: "pt",
+countries: [
+{_reference: "BR"},
+{_reference: "PT"},
+],
+name: "português",
+"aa": "afar",
+"ab": "abkhazian",
+"ae": "avéstico",
+"af": "africâner",
+"ak": "Akan",
+"am": "amárico",
+"an": "aragonês",
+"ar": "árabe",
+"as": "assamês",
+"av": "avaric",
+"ay": "aimara",
+"az": "azerbaijano",
+"ba": "bashkir",
+"be": "bielo-russo",
+"bg": "búlgaro",
+"bh": "biari",
+"bi": "bislamá",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tibetano",
+"br": "bretão",
+"bs": "bósnio",
+"ca": "catalão",
+"ce": "chechene",
+"ch": "chamorro",
+"co": "córsico",
+"cr": "cree",
+"cs": "tcheco",
+"cu": "eslavo eclesiástico",
+"cv": "chuvash",
+"cy": "galês",
+"da": "dinamarquês",
+"de": "alemão",
+"dv": "divehi",
+"dz": "dzonga",
+"ee": "eve",
+"el": "grego",
+"en": "inglês",
+"eo": "esperanto",
+"es": "espanhol",
+"et": "estoniano",
+"eu": "basco",
+"fa": "persa",
+"ff": "fula",
+"fi": "finlandês",
+"fj": "fijiano",
+"fo": "feroês",
+"fr": "francês",
+"fy": "frisão",
+"ga": "irlandês",
+"gd": "gaélico escocês",
+"gl": "galego",
+"gn": "guarani",
+"gu": "guzerate",
+"gv": "manx",
+"ha": "hauçá",
+"he": "hebraico",
+"hi": "hindi",
+"ho": "hiri motu",
+"hr": "croata",
+"ht": "haitiano",
+"hu": "húngaro",
+"hy": "armênio",
+"hz": "herero",
+"ia": "interlíngua",
+"id": "indonésio",
+"ie": "interlingue",
+"ig": "ibo",
+"ii": "sichuan yi",
+"ik": "Inupiaq",
+"io": "ido",
+"is": "islandês",
+"it": "italiano",
+"iu": "inuktitut",
+"ja": "japonês",
+"ka": "georgiano",
+"kg": "congolês",
+"ki": "quicuio",
+"kj": "Kuanyama",
+"kk": "cazaque",
+"kl": "groenlandês",
+"km": "cmer",
+"kn": "canarês",
+"ko": "coreano",
+"kr": "canúri",
+"ks": "kashmiri",
+"ku": "curdo",
+"kv": "komi",
+"kw": "córnico",
+"ky": "quirguiz",
+"la": "latim",
+"lb": "luxemburguês",
+"lg": "luganda",
+"li": "limburgish",
+"ln": "lingala",
+"lo": "laosiano",
+"lt": "lituano",
+"lu": "luba-catanga",
+"lv": "letão",
+"mg": "malgaxe",
+"mh": "marshallês",
+"mi": "maori",
+"mk": "macedônio",
+"ml": "malaiala",
+"mn": "mongol",
+"mo": "moldávio",
+"mr": "marata",
+"ms": "malaio",
+"mt": "maltês",
+"my": "birmanês",
+"na": "nauruano",
+"nb": "bokmål norueguês",
+"nd": "ndebele, north",
+"ne": "nepali",
+"ng": "dongo",
+"nl": "holandês",
+"nn": "nynorsk norueguês",
+"no": "norueguês",
+"nr": "ndebele, south",
+"nv": "navajo",
+"ny": "nianja; chicheua; cheua",
+"oc": "occitânico (após 1500); provençal",
+"oj": "ojibwa",
+"om": "oromo",
+"or": "oriya",
+"os": "ossetic",
+"pa": "panjabi",
+"pi": "páli",
+"pl": "polonês",
+"ps": "pashto (pushto)",
+"pt": "português",
+"qu": "quíchua",
+"rm": "rhaeto-romance",
+"rn": "rundi",
+"ro": "romeno",
+"ru": "russo",
+"rw": "kinyarwanda",
+"sa": "sânscrito",
+"sc": "sardo",
+"sd": "sindi",
+"se": "northern sami",
+"sg": "sango",
+"sh": "servo-croata",
+"si": "cingalês",
+"sk": "eslovaco",
+"sl": "eslovênio",
+"so": "somali",
+"sq": "albanês",
+"sr": "sérvio",
+"ss": "swati",
+"st": "soto, do sul",
+"su": "sundanês",
+"sv": "sueco",
+"sw": "suaíli",
+"ta": "tâmil",
+"te": "telugu",
+"tg": "tadjique",
+"th": "tailandês",
+"ti": "tigrínia",
+"tk": "turcomano",
+"tn": "tswana",
+"to": "tonga (ilhas tonga)",
+"tr": "turco",
+"ts": "tsonga",
+"tt": "tatar",
+"tw": "twi",
+"ty": "taitiano",
+"ug": "uighur",
+"uk": "ucraniano",
+"ur": "urdu",
+"uz": "usbeque",
+"ve": "venda",
+"vi": "vietnamita",
+"vo": "volapuque",
+"wa": "walloon",
+"wo": "uolofe",
+"xh": "xosa",
+"yi": "iídiche",
+"yo": "ioruba",
+"za": "zhuang",
+"zh": "chinês",
+"zu": "zulu",
+},
+{ type: "language", iso: "ro",
+countries: [
+{_reference: "RO"},
+],
+name: "Română",
+"ar": "Arabă",
+"bg": "Bulgară",
+"cs": "Cehă",
+"da": "Daneză",
+"de": "Germană",
+"el": "Greacă",
+"en": "Engleză",
+"es": "Spaniolă",
+"et": "Estoniană",
+"fi": "Finlandeză",
+"fr": "Franceză",
+"he": "Ebraică",
+"hr": "Croată",
+"hu": "Maghiară",
+"it": "Italiană",
+"ja": "Japoneză",
+"ko": "Coreeană",
+"lt": "Lituaniană",
+"lv": "Letonă",
+"nl": "Olandeză",
+"no": "Norvegiană",
+"pl": "Poloneză",
+"pt": "Portugheză",
+"ro": "Română",
+"ru": "Rusă",
+"sk": "Slovacă",
+"sl": "Slovenă",
+"sv": "Suedeză",
+"tr": "Turcă",
+"zh": "Chineză",
+},
+{ type: "language", iso: "ru",
+countries: [
+{_reference: "RU"},
+{_reference: "UA"},
+],
+name: "русский",
+"aa": "афар",
+"ab": "абхазский",
+"ae": "авестийский",
+"af": "африкаанс",
+"am": "амхарский",
+"an": "арагонский",
+"ar": "арабский",
+"as": "ассамский",
+"av": "аварский",
+"ay": "аймара",
+"az": "азербайджанский",
+"ba": "башкирский",
+"be": "белорусский",
+"bg": "болгарский",
+"bh": "бихари",
+"bi": "бислама",
+"bm": "бамбарийский",
+"bn": "бенгальский",
+"bo": "тибетский",
+"br": "бретонский",
+"bs": "боснийский",
+"ca": "каталанский",
+"ce": "чеченский",
+"ch": "чаморро",
+"co": "корсиканский",
+"cr": "криийский",
+"cs": "чешский",
+"cu": "церковнославянский",
+"cv": "чувашский",
+"cy": "валлийский",
+"da": "датский",
+"de": "немецкий",
+"dz": "дзонг-кэ",
+"ee": "эве",
+"el": "греческий",
+"en": "английский",
+"eo": "эсперанто",
+"es": "испанский",
+"et": "эстонский",
+"eu": "баскский",
+"fa": "персидский",
+"fi": "финский",
+"fj": "фиджи",
+"fo": "фарерский",
+"fr": "французский",
+"fy": "фризский",
+"ga": "ирландский",
+"gd": "гэльский",
+"gl": "галисийский",
+"gn": "гуарани",
+"gu": "гуджарати",
+"gv": "мэнский",
+"ha": "хауса",
+"he": "иврит",
+"hi": "хинди",
+"hr": "хорватский",
+"ht": "гаитянский",
+"hu": "венгерский",
+"hy": "армянский",
+"hz": "гереро",
+"ia": "интерлингва",
+"id": "индонезийский",
+"ie": "интерлингве",
+"ig": "игбо",
+"ik": "инупиак",
+"is": "исландский",
+"it": "итальянский",
+"iu": "инуктитут",
+"ja": "японский",
+"jv": "яванский",
+"ka": "грузинский",
+"kg": "конго",
+"ki": "кикуйю",
+"kj": "кунама",
+"kk": "казахский",
+"kl": "эскимосский (гренландский)",
+"km": "кхмерский",
+"kn": "каннада",
+"ko": "корейский",
+"kr": "канури",
+"ks": "кашмири",
+"ku": "курдский",
+"kv": "коми",
+"kw": "корнийский",
+"ky": "киргизский",
+"la": "латинский",
+"lb": "люксембургский",
+"lg": "ганда",
+"ln": "лингала",
+"lo": "лаосский",
+"lt": "литовский",
+"lu": "луба-катанга",
+"lv": "латышский",
+"mg": "малагасийский",
+"mh": "маршальский",
+"mi": "маори",
+"mk": "македонский",
+"ml": "малаялам",
+"mn": "монгольский",
+"mo": "молдавский",
+"mr": "маратхи",
+"ms": "малайский",
+"mt": "мальтийский",
+"my": "бирманский",
+"na": "науру",
+"nb": "норвежский",
+"nd": "ндебели (северный)",
+"ne": "непальский",
+"nl": "голландский",
+"nn": "новонорвежский",
+"no": "норвежский",
+"nr": "ндебели (южный)",
+"nv": "навахо",
+"ny": "ньянджа",
+"oc": "окситанский",
+"oj": "оджибва",
+"om": "оромо",
+"or": "ория",
+"os": "осетинский",
+"pa": "панджаби (пенджаби)",
+"pi": "пали",
+"pl": "польский",
+"ps": "пашто (пушту)",
+"pt": "португальский",
+"qu": "кечуа",
+"rm": "ретороманский",
+"rn": "рунди",
+"ro": "румынский",
+"ru": "русский",
+"rw": "киньяруанда",
+"sa": "санскрит",
+"sc": "сардинский",
+"sd": "синдхи",
+"se": "саамский (северный)",
+"sg": "санго",
+"sh": "сербскохорватский",
+"si": "сингальский",
+"sk": "словацкий",
+"sl": "словенский",
+"sm": "самоанский",
+"sn": "шона",
+"so": "сомали",
+"sq": "албанский",
+"sr": "сербский",
+"ss": "свази",
+"st": "сото южный",
+"su": "сунданский",
+"sv": "шведский",
+"sw": "суахили",
+"ta": "тамильский",
+"te": "телугу",
+"tg": "таджикский",
+"th": "тайский",
+"ti": "тигринья",
+"tk": "туркменский",
+"tl": "тагалог",
+"tn": "тсвана",
+"to": "тонга",
+"tr": "турецкий",
+"ts": "тсонга",
+"tt": "татарский",
+"tw": "тви",
+"ty": "таитянский",
+"ug": "уйгурский",
+"uk": "украинский",
+"ur": "урду",
+"uz": "узбекский",
+"ve": "венда",
+"vi": "вьетнамский",
+"vo": "волапюк",
+"wo": "волоф",
+"xh": "ксоза",
+"yi": "идиш",
+"yo": "йоруба",
+"za": "чжуань",
+"zh": "китайский",
+"zu": "зулу",
+},
+{ type: "language", iso: "rw",
+countries: [
+{_reference: "RW"},
+],
+},
+{ type: "language", iso: "sa",
+countries: [
+{_reference: "IN"},
+],
+name: "संस्कृत",
+},
+{ type: "language", iso: "se",
+countries: [
+{_reference: "NO"},
+],
+},
+{ type: "language", iso: "sh",
+countries: [
+{_reference: "BA"},
+{_reference: "CS"},
+{_reference: "YU"},
+],
+},
+{ type: "language", iso: "sk",
+countries: [
+{_reference: "SK"},
+],
+name: "slovenský",
+"ar": "arabský",
+"bg": "bulharský",
+"cs": "český",
+"da": "dánsky",
+"de": "nemecký",
+"el": "grécky",
+"en": "anglický",
+"es": "španielsky",
+"et": "estónsky",
+"fi": "fínsky",
+"fr": "francúzsky",
+"he": "hebrejský",
+"hr": "chorvátsky",
+"hu": "maďarský",
+"it": "taliansky",
+"ja": "japonský",
+"ko": "kórejský",
+"lt": "litovský",
+"lv": "lotyšský",
+"nl": "holandský",
+"no": "nórsky",
+"pl": "poľský",
+"pt": "portugalský",
+"ro": "rumunský",
+"ru": "ruský",
+"sk": "slovenský",
+"sl": "slovinský",
+"sv": "švédsky",
+"tr": "turecký",
+"zh": "čínsky",
+},
+{ type: "language", iso: "sl",
+countries: [
+{_reference: "SI"},
+],
+name: "Slovenščina",
+"ar": "Arabščina",
+"bg": "Bolgarščina",
+"cs": "Češčina",
+"da": "Danščina",
+"de": "Nemščina",
+"el": "Grščina",
+"en": "Angleščina",
+"es": "Španščina",
+"et": "Estonščina",
+"fi": "Finščina",
+"fr": "Francoščina",
+"he": "Hebrejščina",
+"hr": "Hrvaščina",
+"hu": "Madžarščina",
+"it": "Italijanščina",
+"ja": "Japonščina",
+"ko": "Korejščina",
+"lt": "Litovščina",
+"lv": "Letonščina",
+"nl": "Nizozemščina",
+"no": "Norveščina",
+"pl": "Poljščina",
+"pt": "Portugalščina",
+"ro": "Romunščina",
+"ru": "Ruščina",
+"sk": "Slovaščina",
+"sl": "Slovenščina",
+"sv": "Švedščina",
+"tr": "Turščina",
+"zh": "Kitajščina",
+},
+{ type: "language", iso: "so",
+countries: [
+{_reference: "DJ"},
+{_reference: "ET"},
+{_reference: "KE"},
+{_reference: "SO"},
+],
+name: "Soomaali",
+"so": "Soomaali",
+},
+{ type: "language", iso: "sq",
+countries: [
+{_reference: "AL"},
+],
+name: "shqipe",
+"ar": "Arabisht",
+"de": "Gjermanisht",
+"en": "Anglisht",
+"es": "Spanjisht",
+"fr": "Frengjisht",
+"hi": "Hindi",
+"it": "Italisht",
+"ja": "Japanisht",
+"pt": "Portugeze",
+"ru": "Rusisht",
+"sq": "shqipe",
+"zh": "Kineze",
+},
+{ type: "language", iso: "sr",
+countries: [
+{_reference: "BA"},
+{_reference: "CS"},
+{_reference: "YU"},
+],
+name: "Српски",
+"af": "Африканерски",
+"ar": "Арапски",
+"be": "Белоруски",
+"bg": "Бугарски",
+"br": "Бретонски",
+"ca": "Каталонски",
+"co": "Корзикански",
+"cs": "Чешки",
+"da": "Дански",
+"de": "Немачки",
+"el": "Грчки",
+"en": "Енглески",
+"eo": "Есперанто",
+"es": "Шпански",
+"et": "Естонски",
+"eu": "Баскијски",
+"fa": "Персијски",
+"fi": "Фински",
+"fr": "Француски",
+"ga": "Ирски",
+"he": "Хебрејски",
+"hi": "Хинди",
+"hr": "Хрватски",
+"hu": "Мађарски",
+"hy": "Арменски",
+"id": "Индонезијски",
+"is": "Исландски",
+"it": "Италијански",
+"ja": "Јапански",
+"ka": "Грузијски",
+"km": "Кмерски",
+"ko": "Корејски",
+"ku": "Курдски",
+"ky": "Киргиски",
+"la": "Латински",
+"lt": "Литвански",
+"lv": "Летонски",
+"mk": "Македонски",
+"mn": "Монголски",
+"mo": "Молдавски",
+"my": "Бурмански",
+"nl": "Холандски",
+"no": "Норвешки",
+"pl": "Пољски",
+"pt": "Португалски",
+"rm": "Рето-Романски",
+"ro": "Румунски",
+"ru": "Руски",
+"sa": "Санскрит",
+"sh": "Српско-Хрватски",
+"sk": "Словачки",
+"sl": "Словеначки",
+"sq": "Албански",
+"sr": "Српски",
+"sv": "Шведски",
+"sw": "Свахили",
+"tr": "Турски",
+"uk": "Украјински",
+"vi": "Вијетнамски",
+"yi": "Јидиш",
+"zh": "Кинески",
+},
+{ type: "language", iso: "ss",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "st",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "sv",
+countries: [
+{_reference: "FI"},
+{_reference: "SE"},
+],
+name: "svenska",
+"aa": "afar",
+"ab": "abchasiska",
+"ae": "avestiska",
+"af": "afrikaans",
+"ak": "akan",
+"am": "amhariska",
+"an": "aragonesiska",
+"ar": "arabiska",
+"as": "assamesiska",
+"av": "avariskt språk",
+"ay": "aymara",
+"az": "azerbajdzjanska",
+"ba": "basjkiriska",
+"be": "vitryska",
+"bg": "bulgariska",
+"bh": "bihari",
+"bi": "bislama",
+"bm": "bambara",
+"bn": "bengali",
+"bo": "tibetanska",
+"br": "bretonska",
+"bs": "bosniska",
+"ca": "katalanska",
+"ce": "tjetjenska",
+"ch": "chamorro",
+"co": "korsikanska",
+"cr": "cree",
+"cs": "tjeckiska",
+"cu": "kyrkslaviska",
+"cv": "tjuvasjiska",
+"cy": "walesiska",
+"da": "danska",
+"de": "tyska",
+"dv": "divehi",
+"dz": "bhutanesiska",
+"ee": "ewe",
+"el": "grekiska",
+"en": "engelska",
+"eo": "esperanto",
+"es": "spanska",
+"et": "estniska",
+"eu": "baskiska",
+"fa": "persiska",
+"ff": "fulani",
+"fi": "finska",
+"fj": "fidjianska",
+"fo": "färöiska",
+"fr": "franska",
+"fy": "västfrisiska",
+"gd": "höglandsskotska",
+"gl": "galiciska",
+"gn": "guaraní",
+"gu": "gujarati",
+"gv": "manx",
+"ha": "haussa",
+"he": "hebreiska",
+"hi": "hindi",
+"ho": "hirimotu",
+"hr": "kroatiska",
+"ht": "haitiska",
+"hu": "ungerska",
+"hy": "armeniska",
+"hz": "herero",
+"ia": "interlingua",
+"id": "indonesiska",
+"ie": "interlingue",
+"ig": "ibo",
+"ii": "szezuan i",
+"ik": "inupiak",
+"io": "ido",
+"is": "isländska",
+"it": "italienska",
+"iu": "inuktitut",
+"ja": "japanska",
+"jv": "javanesiska",
+"ka": "georgiska",
+"kg": "kikongo",
+"ki": "kikuyu",
+"kj": "kuanyama",
+"kk": "kazakstanska",
+"kl": "grönländska",
+"km": "kambodjanska; khmeriska",
+"kn": "kanaresiska; kannada",
+"ko": "koreanska",
+"kr": "kanuri",
+"ks": "kashmiriska",
+"ku": "kurdiska",
+"kv": "kome",
+"kw": "korniska",
+"ky": "kirgisiska",
+"la": "latin",
+"lb": "luxemburgiska",
+"lg": "luganda",
+"li": "limburgiska",
+"ln": "lingala",
+"lo": "laotiska",
+"lt": "litauiska",
+"lu": "luba-katanga",
+"lv": "lettiska",
+"mg": "malagassiska",
+"mh": "marshalliska",
+"mi": "maori",
+"mk": "makedonska",
+"ml": "malayalam",
+"mn": "mongoliska",
+"mo": "moldaviska",
+"mr": "marathi",
+"ms": "malajiska",
+"mt": "maltesiska",
+"my": "burmesiska",
+"na": "nauru",
+"nb": "norska (bokmål)",
+"ne": "nepalesiska",
+"ng": "ndonga",
+"nn": "nynorska",
+"no": "norska",
+"nv": "navaho",
+"ny": "nyanja",
+"oc": "provensalska (efter 1500); occitanska",
+"oj": "odjibwa; chippewa",
+"om": "oromo",
+"or": "oriya",
+"os": "ossetiska",
+"pa": "punjabi",
+"pi": "pali",
+"pl": "polska",
+"ps": "pashto; afghanska",
+"pt": "portugisiska",
+"qu": "quechua",
+"rn": "rundi",
+"ro": "rumänska",
+"ru": "ryska",
+"rw": "rwanda; kinjarwanda",
+"sa": "sanskrit",
+"sc": "sardiska",
+"sd": "sindhi",
+"sg": "sango",
+"si": "singalesiska",
+"sk": "slovakiska",
+"sl": "slovenska",
+"sm": "samoanska",
+"sn": "shona; manshona",
+"so": "somaliska",
+"sq": "albanska",
+"sr": "serbiska",
+"ss": "swati",
+"su": "sundanesiska",
+"sv": "svenska",
+"sw": "swahili",
+"ta": "tamil",
+"te": "telugiska",
+"tg": "tadzjikiska",
+"th": "thailändska",
+"ti": "tigrinja",
+"tk": "turkmeniska",
+"tl": "tagalog",
+"tn": "tswana",
+"to": "tonganska",
+"tr": "turkiska",
+"ts": "tsonga",
+"tt": "tatariska",
+"tw": "twi",
+"ty": "tahitiska",
+"ug": "uiguriska",
+"uk": "ukrainska",
+"ur": "urdu",
+"uz": "uzbekiska",
+"ve": "venda",
+"vi": "vietnamesiska",
+"vo": "volapük",
+"wa": "vallonska",
+"wo": "wolof",
+"xh": "xhosa",
+"yi": "jiddisch",
+"yo": "yoruba",
+"za": "zhuang",
+"zh": "kinesiska",
+"zu": "zulu",
+},
+{ type: "language", iso: "sw",
+countries: [
+{_reference: "KE"},
+{_reference: "TZ"},
+],
+name: "Kiswahili",
+"de": "kijerumani",
+"en": "kiingereza",
+"es": "kihispania",
+"fr": "kifaransa",
+"it": "kiitaliano",
+"ja": "kijapani",
+"pt": "kireno",
+"ru": "kirusi",
+"sw": "Kiswahili",
+"zh": "kichina",
+},
+{ type: "language", iso: "ta",
+countries: [
+{_reference: "IN"},
+],
+name: "தமிழ்",
+"aa": "அபார்",
+"ab": "அப்காஸின்",
+"af": "ஆப்ரிகன்ஸ்",
+"am": "அம்ஹாரிக்",
+"ar": "அரபு",
+"as": "அஸ்ஸாமி",
+"ay": "அயமரா",
+"az": "அசர்பாய்ஜானி",
+"ba": "பாஷ்கிர்0",
+"be": "பைலோருஷ்ன்",
+"bg": "பல்கேரியன்",
+"bh": "பிஹாரி",
+"bi": "பிஸ்லாமா",
+"bn": "வங்காளம்",
+"bo": "திபெத்து",
+"br": "பிரிடன்",
+"ca": "காடலான்",
+"co": "கார்சியன்",
+"cs": "செக்",
+"cy": "வெல்ஷ்",
+"da": "டானிஷ்",
+"de": "ஜெர்மன்",
+"dz": "புடானி",
+"el": "கிரேக்கம்",
+"en": "ஆங்கிலம்",
+"eo": "எஸ்பரேன்டோ",
+"es": "ஸ்பேனிஷ்",
+"et": "எஸ்டோனியன்",
+"eu": "பஸ்க்",
+"fa": "பர்ஸியன்",
+"fi": "பின்னிஷ்",
+"fj": "பிஜி",
+"fo": "பைரோஸி",
+"fr": "பிரெஞ்சு",
+"fy": "பிரிஷியன்",
+"ga": "ஐரிஷ்",
+"gd": "ஸ்காட்ஸ் காலெக்",
+"gl": "கெலிஸியன்",
+"gn": "குரானி",
+"gu": "குஜராத்தி",
+"ha": "ஹொஸா",
+"he": "ஹுப்ரு",
+"hi": "இந்தி",
+"hr": "கரோஷியன்",
+"hu": "ஹங்கேரியன்",
+"hy": "ஆர்மேனியன்",
+"ia": "இன்டர்லிங்குவா [ia]",
+"id": "இந்தோனேஷியன்",
+"ie": "இன்டர்லிங்குவா",
+"ik": "இனுபெக்",
+"is": "ஐஸ்லென்டிக்",
+"it": "இத்தாலியன்",
+"iu": "இனுகிடட்",
+"ja": "ஜப்பானீஸ்",
+"jv": "ஜாவானீஸ்",
+"ka": "கன்னடம்",
+"kk": "கசாக்",
+"kl": "கிரின்லென்டிக்",
+"km": "கம்போடியன்",
+"kn": "கன்னடா",
+"ko": "கொரியன்",
+"ks": "காஷ்மிரி",
+"ku": "குர்திஷ்",
+"ky": "கிர்கிஷ்",
+"la": "லாதின்",
+"ln": "லிங்காலா",
+"lo": "லோத்தியன்",
+"lt": "லுத்தேனியன்",
+"lv": "லேட்வியன் (லேட்டிஷ்)",
+"mg": "மலகெஸி",
+"mi": "மோரி",
+"mk": "மெக்கடோனியன்",
+"ml": "மலையாளம்",
+"mn": "மங்கோலியன்",
+"mo": "மோல்டேவியன்",
+"mr": "மராத்தி",
+"ms": "மலாய்",
+"mt": "மால்டிஸ்",
+"my": "பர்மிஸ்",
+"na": "நாரூ",
+"ne": "நேப்பாலி",
+"nl": "டச்சு",
+"no": "நார்வேகியன்",
+"oc": "ஆகிடியன்",
+"om": "ஒரோம (அபன்)",
+"or": "ஒரியா",
+"pa": "பஞ்சாபி",
+"pl": "போலிஷ்",
+"ps": "பேஷ்டோ (புஷ்டோ)",
+"pt": "போர்த்துகீஸ்",
+"qu": "கியுசா",
+"rm": "ரைட்டோ-ரோமென்ஸ்",
+"rn": "கிருந்தி",
+"ro": "ரோமேனியன்",
+"ru": "ரஷியன்",
+"rw": "கின்யர்வென்டா",
+"sa": "சமஸ்கிருதம்",
+"sd": "சிந்தி",
+"sg": "சென்க்ரோ",
+"sh": "செர்போ-க்ரோஷியன்",
+"si": "சிங்களம்",
+"sk": "ஸ்லோவெக்",
+"sl": "ஸ்லோவினேயின்",
+"sm": "ஸெமோன்",
+"sn": "ஷோனா",
+"so": "சோமாலி",
+"sq": "அல்பெனியன்",
+"sr": "சர்பியன்",
+"ss": "ஷிஸ்வாதி",
+"st": "ஷெஸ்ஸோதோ",
+"su": "சுடானீஸ்",
+"sv": "ஷீவிடிஸ்",
+"sw": "சுவாஹிலி",
+"ta": "தமிழ்",
+"te": "தெலுங்கு",
+"tg": "தாஜிக்",
+"th": "தாய்",
+"ti": "டிக்ரின்யா",
+"tk": "டர்க்மென்",
+"tl": "டாகாலோக்",
+"tn": "ஸெட்ஸ்வானா",
+"to": "டோங்கா",
+"tr": "டர்கிஷ்",
+"ts": "ஸோங்கா",
+"tt": "டாடர்",
+"tw": "த்திவி",
+"ug": "யுகுர்",
+"uk": "உக்ரேனியன்",
+"ur": "உருது",
+"uz": "உஸ்பெக்",
+"vi": "வியட்நாமிஸ்",
+"vo": "ஒலபுக்",
+"wo": "ஒலோப்",
+"xh": "ஹோஷா",
+"yi": "ஈத்திஷ",
+"yo": "யோருப்பா",
+"za": "ஜுவாங்",
+"zh": "சீனம்",
+"zu": "ஜூலூ",
+},
+{ type: "language", iso: "te",
+countries: [
+{_reference: "IN"},
+],
+name: "తెలుగు",
+"ar": "అరబిక్",
+"de": "ఙర్మన్",
+"en": "ఆంగ్లం",
+"es": "స్పానిష్",
+"fr": "ఫ్రెంచ్",
+"hi": "హిందీ",
+"it": "ఇటాలియన్ భాష",
+"ja": "జపాను భాష",
+"pt": "పొర్చుగల్ భాష",
+"ru": "రష్యన్ భాష",
+"te": "తెలుగు",
+"zh": "చైనా భాష",
+},
+{ type: "language", iso: "tg",
+countries: [
+{_reference: "TJ"},
+],
+},
+{ type: "language", iso: "th",
+countries: [
+{_reference: "TH"},
+],
+name: "ไทย",
+"aa": "อาฟา",
+"ab": "แอบกาเซีย",
+"af": "แอฟริกัน",
+"ak": "อาคาน",
+"am": "อัมฮาริค",
+"an": "อาราโกนิส",
+"as": "อัสสัมมิส",
+"av": "อาวาริก",
+"ay": "ไอมารา",
+"az": "อาเซอร์ไบจานี",
+"ba": "บาสช์กีร์",
+"be": "บายโลรัสเซีย",
+"bg": "บัลแกเรีย",
+"bh": "บิฮารี",
+"bi": "บิสลามา",
+"bm": "บามบารา",
+"bo": "ทิเบต",
+"br": "บรีทัน",
+"bs": "บอสเนีย",
+"ca": "แคตาแลน",
+"ce": "เชเชิน",
+"co": "คอร์ซิกา",
+"cr": "ครี",
+"cu": "เชอร์ชสลาวิก",
+"cv": "ชูวาส",
+"cy": "เวลส์",
+"da": "เดนมาร์ก",
+"de": "เยอรมัน",
+"dv": "ดิเวฮิ",
+"dz": "ดซองคา",
+"ee": "อีเว",
+"el": "กรีก",
+"en": "อังกฤษ",
+"eo": "เอสเปอรันโต",
+"es": "สเปน",
+"et": "เอสโตเนีย",
+"eu": "แบสก์",
+"fa": "เปอร์เซีย",
+"ff": "ฟูลาฮ์",
+"fi": "ฟิน",
+"fj": "ฟิจิ",
+"fo": "ฟาโรส",
+"fr": "ฝรั่งเศส",
+"fy": "ฟรีสแลนด์",
+"ga": "ไอริช",
+"gd": "สก็อตส์เกลิค",
+"gl": "กะลีเชีย",
+"gn": "กัวรานี",
+"gu": "กูจาราติ",
+"gv": "มานซ์",
+"ha": "โฮซา",
+"he": "ฮิบรู",
+"hi": "ฮินดี",
+"ho": "ฮิริโมทุ",
+"hr": "โครเอเทีย",
+"ht": "ไฮเทียน",
+"hu": "ฮังการี",
+"hy": "อาร์มีเนีย",
+"hz": "เฮียร์โร",
+"id": "อินโดนีเชีย",
+"ie": "อินเตอร์ลิงค์",
+"ig": "อิกโบ",
+"ii": "สิชวนยิ",
+"ik": "ไอนูเปียก",
+"io": "อิโด",
+"is": "ไอซ์แลนด์ดิค",
+"it": "อิตาลี",
+"iu": "ไอนุกติตัท",
+"ja": "ญี่ปุ่น",
+"jv": "ชวา",
+"ka": "จอร์เจียน",
+"kg": "คองโก",
+"ki": "กิกุยุ",
+"kj": "กวนยามา",
+"kk": "คาซัค",
+"kl": "กรีนแลนด์ดิค",
+"km": "เขมร",
+"kn": "กานาดา",
+"ko": "เกาหลี",
+"kr": "กานุริ",
+"ks": "คัชมีรี",
+"ku": "เคิด",
+"kv": "โกมิ",
+"kw": "คอร์นิส",
+"ky": "เคอร์กิซ",
+"la": "ละติน",
+"lb": "ลักเซมเบิร์ก",
+"lg": "กานดา",
+"li": "ลิมเบิร์ก",
+"ln": "ลิงกาลา",
+"lo": "ลาว",
+"lt": "ลิธัวเนีย",
+"lu": "ลูกา-กาทันกา",
+"lv": "แลตเวีย (เลททิสช์)",
+"mg": "มาลากาซี",
+"mh": "มาร์แชลลิส",
+"mi": "เมารี",
+"mk": "แมซีโดเนีย",
+"ml": "มาลายาลัม",
+"mn": "มองโกล",
+"mo": "โมดาเวีย",
+"mr": "มาราที",
+"ms": "มลายู",
+"mt": "มอลตา",
+"my": "พม่า",
+"na": "นอรู",
+"nb": "นอร์เวย์บอกมอล",
+"nd": "เอ็นเดเบเลเหนือ",
+"ne": "เนปาล",
+"ng": "ดองกา",
+"nl": "ฮอลันดา",
+"nn": "นอร์เวย์ไนนอรส์ก",
+"no": "นอร์เวย์",
+"nv": "นาวาโจ",
+"ny": "เนียนจา; ชิเชวา; เชวา",
+"oc": "ออกซิทัน",
+"oj": "โอจิบวา",
+"om": "โอโรโม (อาฟาน)",
+"or": "โอริยา",
+"os": "ออสเซทิก",
+"pa": "ปัญจาป",
+"pi": "บาลี",
+"pl": "โปแลนด์",
+"ps": "พาสช์โต (พุสช์โต)",
+"pt": "โปรตุเกส",
+"qu": "คิวชัว",
+"rm": "เรโต-โรแมนซ์",
+"rn": "คิรันดี",
+"ro": "โรมัน",
+"ru": "รัสเซีย",
+"rw": "คินยาวันดา",
+"sa": "สันสกฤต",
+"sc": "ซาร์ดิเนียน",
+"sd": "ซินดิ",
+"se": "ซามิเหนือ",
+"sg": "สันโค",
+"sh": "เซอร์โบ-โครเอเทียน",
+"si": "สิงหล",
+"sk": "สโลวัค",
+"sl": "สโลเวเนีย",
+"sm": "ซามัว",
+"sn": "โซนา",
+"so": "โซมาลี",
+"sq": "แอลเบเนีย",
+"sr": "เซอร์เบีย",
+"ss": "ซีสวาติ",
+"st": "เซโสโท",
+"su": "ซันดานีส",
+"sv": "สวีเดน",
+"sw": "ซวาฮิรี",
+"ta": "ทมิฬ",
+"te": "ทิลูกู",
+"tg": "ทาจิค",
+"th": "ไทย",
+"ti": "ทิกรินยา",
+"tk": "เติร์กเมน",
+"tl": "ตากาล็อก",
+"tn": "เซตสวานา",
+"to": "ทองก้า",
+"tr": "ตุรกี",
+"ts": "ซองกา",
+"tt": "ตาด",
+"tw": "ทวี",
+"ty": "ทาฮิเทียน",
+"ug": "อุยกัว",
+"uk": "ยูเครน",
+"ur": "อิรดู",
+"uz": "อุสเบค",
+"ve": "เวนดา",
+"vi": "เวียดนาม",
+"vo": "โวลาพุก",
+"wa": "วอลลูน",
+"wo": "วูลอฟ",
+"xh": "โซสา",
+"yi": "ยีดิช",
+"yo": "โยรูบา",
+"za": "จวง",
+"zh": "จีน",
+"zu": "ซูลู",
+},
+{ type: "language", iso: "ti",
+countries: [
+{_reference: "ER"},
+{_reference: "ET"},
+],
+},
+{ type: "language", iso: "tn",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "tr",
+countries: [
+{_reference: "TR"},
+],
+name: "Türkçe",
+"aa": "Afar",
+"ab": "Abazca",
+"af": "Afrikaan Dili",
+"am": "Amharik",
+"ar": "Arapça",
+"av": "Avar Dili",
+"ay": "Aymara",
+"az": "Azerice",
+"ba": "Başkırt Dili",
+"be": "Beyaz Rusça",
+"bg": "Bulgarca",
+"bh": "Bihari",
+"bi": "Bislama",
+"bn": "Bengal Dili",
+"bo": "Tibetçe",
+"br": "Breton Dili",
+"bs": "Bosna Dili",
+"ca": "Katalan Dili",
+"ce": "Çeçence",
+"co": "Korsika Dili",
+"cs": "Çekçe",
+"cu": "Kilise Slavcası",
+"cv": "Çuvaş",
+"cy": "Gal Dili",
+"da": "Danca",
+"de": "Almanca",
+"dz": "Bhutan Dili",
+"ee": "Ewe",
+"el": "Yunanca",
+"en": "İngilizce",
+"eo": "Esperanto",
+"es": "İspanyolca",
+"et": "Estonya Dili",
+"eu": "Bask Dili",
+"fa": "Farsça",
+"fi": "Fince",
+"fj": "Fiji Dili",
+"fo": "Faroe Dili",
+"fr": "Fransızca",
+"fy": "Frizye Dili",
+"ga": "İrlanda Dili",
+"gd": "İskoç Gal Dili",
+"gl": "Galiçya Dili",
+"gn": "Guarani",
+"gu": "Gujarati",
+"ha": "Hausa",
+"he": "İbranice",
+"hi": "Hint Dili",
+"hr": "Hırvatça",
+"ht": "Haiti Dili",
+"hu": "Macarca",
+"hy": "Ermenice",
+"ia": "Interlingua",
+"id": "Endonezya Dili",
+"ie": "Interlingue",
+"ik": "Inupiak",
+"io": "Ido",
+"is": "İzlandaca",
+"it": "İtalyanca",
+"iu": "Inuktitut",
+"ja": "Japonca",
+"jv": "Java Dili",
+"ka": "Gürcüce",
+"kk": "Kazak Dili",
+"kl": "Grönland Dili",
+"km": "Kamboçya Dili",
+"kn": "Kannada",
+"ko": "Korece",
+"ks": "Keşmirce",
+"ku": "Kürtçe",
+"ky": "Kırgızca",
+"la": "Latince",
+"lb": "Lüksemburg Dili",
+"ln": "Lingala",
+"lo": "Laos Dili",
+"lt": "Litvanya Dili",
+"lv": "Letonya Dili",
+"mg": "Malaga Dili",
+"mh": "Marshall Adaları Dili",
+"mi": "Maori",
+"mk": "Makedonca",
+"ml": "Malayalam",
+"mn": "Moğol Dili",
+"mo": "Moldavya Dili",
+"mr": "Marathi",
+"ms": "Malay",
+"mt": "Malta Dili",
+"my": "Birmanya Dili",
+"na": "Nauru",
+"nb": "Norveç Kitap Dili",
+"nd": "Kuzey Ndebele",
+"ne": "Nepal Dili",
+"nl": "Hollanda Dili",
+"nn": "Norveççe Nynorsk",
+"no": "Norveççe",
+"nr": "Güney Ndebele",
+"oc": "Occitan (1500 sonrası); Provençal",
+"oj": "Ojibwa",
+"om": "Oromo (Afan)",
+"or": "Oriya",
+"os": "Oset",
+"pa": "Pencap Dili",
+"pl": "Polonya Dili",
+"ps": "Peştun Dili",
+"pt": "Portekizce",
+"qu": "Quechua",
+"rm": "Rhaeto-Roman Dili",
+"rn": "Kirundi",
+"ro": "Romence",
+"ru": "Rusça",
+"rw": "Kinyarwanda",
+"sa": "Sanskritçe",
+"sc": "Sardunya Dili",
+"sd": "Sindhi",
+"se": "Kuzey Sami",
+"sg": "Sangho",
+"sh": "Sırp-Hırvat Dili",
+"si": "Sinhal Dili",
+"sk": "Slovakça",
+"sl": "Slovence",
+"sm": "Samoa Dili",
+"sn": "Shona",
+"so": "Somali Dili",
+"sq": "Arnavutça",
+"sr": "Sırpça",
+"ss": "Siswati",
+"st": "Sesotho",
+"su": "Sudan Dili",
+"sv": "İsveççe",
+"sw": "Swahili",
+"ta": "Tamil",
+"te": "Telugu",
+"tg": "Tacik Dili",
+"th": "Tay Dili",
+"ti": "Tigrinya",
+"tk": "Türkmence",
+"tl": "Tagalog",
+"tn": "Setswana",
+"to": "Tonga (Tonga Adaları)",
+"tr": "Türkçe",
+"ts": "Tsonga",
+"tt": "Tatarca",
+"tw": "Twi",
+"ty": "Tahiti Dili",
+"ug": "Uygurca",
+"uk": "Ukraynaca",
+"ur": "Urduca",
+"uz": "Özbekçe",
+"vi": "Vietnam Dili",
+"vo": "Volapuk",
+"wo": "Wolof",
+"xh": "Xhosa",
+"yi": "Yiddiş",
+"yo": "Yoruba",
+"za": "Zhuang",
+"zh": "Çince",
+"zu": "Zulu",
+},
+{ type: "language", iso: "ts",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "tt",
+countries: [
+{_reference: "RU"},
+],
+name: "Татар",
+},
+{ type: "language", iso: "uk",
+countries: [
+{_reference: "UA"},
+],
+name: "Українська",
+"aa": "Афарська",
+"ab": "Абхазька",
+"af": "Африканс",
+"am": "Амхарік",
+"ar": "Арабська",
+"as": "Ассамська",
+"ay": "Аймара",
+"az": "Азербайджанська",
+"ba": "Башкирська",
+"be": "Білоруська",
+"bg": "Болгарська",
+"bh": "Біхарійська",
+"bi": "Бісламійська",
+"bn": "Бенгальська",
+"bo": "Тибетська",
+"br": "Бретонська",
+"ca": "Каталонська",
+"co": "Корсиканська",
+"cs": "Чеська",
+"cy": "Валлійська",
+"da": "Датська",
+"de": "Німецька",
+"dz": "Дзонг-ке",
+"el": "Грецька",
+"en": "Англійська",
+"eo": "Есперанто",
+"es": "Іспанська",
+"et": "Естонська",
+"eu": "Басків",
+"fa": "Перська",
+"fi": "Фінська",
+"fj": "Фіджі",
+"fo": "Фарерська",
+"fr": "Французька",
+"fy": "Фризька",
+"ga": "Ірландська",
+"gd": "Гаельська",
+"gl": "Галісійська",
+"gn": "Гуарані",
+"gu": "Гуяраті",
+"ha": "Хауса",
+"he": "Іврит",
+"hi": "Гінді",
+"hr": "Хорватська",
+"hu": "Угорська",
+"hy": "Вірменська",
+"ia": "Інтерлінгва",
+"id": "Індонезійська",
+"ie": "Інтерлінгве",
+"ik": "Інупіак",
+"is": "Ісландська",
+"it": "Італійська",
+"ja": "Японська",
+"jv": "Яванська",
+"ka": "Грузинська",
+"kk": "Казахська",
+"kl": "Калааллісут",
+"km": "Кхмерська",
+"kn": "Каннада",
+"ko": "Корейська",
+"ks": "Кашмірська",
+"ku": "Курдська",
+"ky": "Киргизька",
+"la": "Латинська",
+"ln": "Лінгала",
+"lo": "Лаоська",
+"lt": "Литовська",
+"lv": "Латвійська",
+"mg": "Малагасійська",
+"mi": "Маорі",
+"mk": "Македонська",
+"ml": "Малайялам",
+"mn": "Монгольська",
+"mo": "Молдавська",
+"mr": "Маратхі",
+"ms": "Малайська",
+"mt": "Мальтійська",
+"my": "Бірманська",
+"na": "Науру",
+"ne": "Непальська",
+"nl": "Голландська",
+"no": "Норвезька",
+"oc": "Окитан",
+"om": "Оромо",
+"or": "Орія",
+"pa": "Панджабі",
+"pl": "Польська",
+"ps": "Пашто",
+"pt": "Португальська",
+"qu": "Кечуа",
+"rm": "Ретророманські діалекти",
+"rn": "Кірундійська",
+"ro": "Румунська",
+"ru": "Російська",
+"rw": "Кінаруанда",
+"sa": "Санскрит",
+"sd": "Сіндтхі",
+"sg": "Сангро",
+"sh": "Сербсько-хорватська",
+"si": "Сингальська",
+"sk": "Словацька",
+"sl": "Словенська",
+"sm": "Самоанська",
+"sn": "Шона",
+"so": "Сомалі",
+"sq": "Албанська",
+"sr": "Сербська",
+"ss": "Сісваті",
+"st": "Сото, південний діалект",
+"su": "Суданська",
+"sv": "Шведська",
+"sw": "Суахілі",
+"ta": "Тамільська",
+"te": "Телугу",
+"tg": "Таджицька",
+"th": "Тайська",
+"ti": "Тигріні",
+"tk": "Туркменська",
+"tl": "Тагальська",
+"tn": "Сетсванська",
+"to": "Тонга (острови Тонга)",
+"tr": "Турецька",
+"ts": "Тсонго",
+"tt": "Татарська",
+"tw": "Тві",
+"ug": "Уйгурська",
+"uk": "Українська",
+"ur": "Урду",
+"uz": "Узбецька",
+"vi": "Вʼєтнамська",
+"vo": "Волапак",
+"wo": "Волоф",
+"xh": "Кхоса",
+"yi": "Ідиш",
+"yo": "Йоруба",
+"za": "Зуанг",
+"zh": "Китайська",
+"zu": "Зулуська",
+},
+{ type: "language", iso: "ur",
+countries: [
+{_reference: "IN"},
+{_reference: "PK"},
+],
+name: "اردو",
+"ur": "اردو",
+},
+{ type: "language", iso: "uz",
+countries: [
+{_reference: "AF"},
+{_reference: "UZ"},
+],
+name: "Ўзбек",
+},
+{ type: "language", iso: "ve",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "vi",
+countries: [
+{_reference: "VN"},
+],
+name: "Tiếng Việt",
+"ar": "Tiếng A-rập",
+"az": "Tiếng Ai-déc-bai-gian",
+"be": "Tiếng Bê-la-rút",
+"bg": "Tiếng Bun-ga-ri",
+"bo": "Tiếng Tây Tạng",
+"ca": "Tiếng Ca-ta-lăng",
+"cs": "Tiếng Séc",
+"da": "Tiếng Đan Mạch",
+"de": "Tiếng Đức",
+"el": "Tiếng Hy Lạp",
+"en": "Tiếng Anh",
+"eo": "Tiếng Quốc Tế Ngữ",
+"es": "Tiếng Tây Ban Nha",
+"et": "Tiếng E-xtô-ni-a",
+"fa": "Tiếng Ba Tư",
+"fi": "Tiếng Phần Lan",
+"fr": "Tiếng Pháp",
+"ga": "Tiếng Ai-len",
+"he": "Tiếng Hê-brơ",
+"hi": "Tiếng Hin-đi",
+"hr": "Tiếng Crô-a-ti-a",
+"hu": "Tiếng Hung-ga-ri",
+"hy": "Tiếng Ác-mê-ni",
+"ia": "Tiếng Khoa Học Quốc Tế",
+"id": "Tiếng In-đô-nê-xia",
+"is": "Tiếng Ai-xơ-len",
+"it": "Tiếng Ý",
+"ja": "Tiếng Nhật",
+"jv": "Tiếng Gia-va",
+"km": "Tiếng Campuchia",
+"kn": "Tiếng Kan-na-đa",
+"ko": "Tiếng Hàn Quốc",
+"la": "Tiếng La-tinh",
+"lo": "Tiếng Lào",
+"lt": "Tiếng Lít-va",
+"lv": "Tiếng Lát-vi-a",
+"mk": "Tiếng Ma-xê-đô-ni-a",
+"mn": "Tiếng Mông Cổ",
+"ms": "Tiếng Ma-lay-xi-a",
+"ne": "Tiếng Nê-pan",
+"nl": "Tiếng Hà Lan",
+"no": "Tiếng Na Uy",
+"pl": "Tiếng Ba Lan",
+"pt": "Tiếng Bồ Đào Nha",
+"ro": "Tiếng Ru-ma-ni",
+"ru": "Tiếng Nga",
+"sa": "Tiếng Phạn",
+"sk": "Tiếng Xlô-vác",
+"sl": "Tiếng Xlô-ven",
+"so": "Tiếng Xô-ma-li",
+"sq": "Tiếng An-ba-ni",
+"sr": "Tiếng Séc-bi",
+"sv": "Tiếng Thụy Điển",
+"th": "Tiếng Thái",
+"tr": "Tiếng Thổ Nhĩ Kỳ",
+"uk": "Tiếng U-crai-na",
+"uz": "Tiếng U-dơ-bếch",
+"vi": "Tiếng Việt",
+"yi": "Tiếng Y-đit",
+"zh": "Tiếng Trung Quốc",
+},
+{ type: "language", iso: "xh",
+countries: [
+{_reference: "ZA"},
+],
+},
+{ type: "language", iso: "yo",
+countries: [
+{_reference: "NG"},
+],
+},
+{ type: "language", iso: "zh",
+countries: [
+{_reference: "CN"},
+{_reference: "HK"},
+{_reference: "MO"},
+{_reference: "SG"},
+{_reference: "TW"},
+],
+name: "中文",
+"aa": "阿法文",
+"ab": "阿布哈西亚文",
+"ae": "阿维斯塔文",
+"af": "南非荷兰文",
+"ak": "阿肯文",
+"am": "阿姆哈拉文",
+"ar": "阿拉伯文",
+"as": "阿萨姆文",
+"av": "阿瓦尔文",
+"ay": "艾马拉文",
+"az": "阿塞拜疆文",
+"ba": "巴什客尔文",
+"be": "白俄罗斯文",
+"bg": "保加利亚文",
+"bh": "比哈尔文",
+"bi": "比斯拉马文",
+"bm": "班巴拉文",
+"bn": "孟加拉文",
+"bo": "西藏文",
+"br": "布里多尼文",
+"bs": "波斯尼亚文",
+"ca": "加泰罗尼亚文",
+"ce": "车臣文",
+"ch": "查莫罗文",
+"co": "科西嘉文",
+"cr": "克里族文",
+"cs": "捷克文",
+"cu": "宗教斯拉夫文",
+"cv": "楚瓦什文",
+"cy": "威尔士文",
+"da": "丹麦文",
+"de": "德文",
+"dv": "迪维希文",
+"dz": "不丹文",
+"ee": "幽文",
+"el": "希腊文",
+"en": "英文",
+"eo": "世界文",
+"es": "西班牙文",
+"et": "爱沙尼亚文",
+"eu": "巴斯克文",
+"fa": "波斯文",
+"ff": "夫拉文",
+"fi": "芬兰文",
+"fj": "斐济文",
+"fo": "法罗文",
+"fr": "法文",
+"fy": "弗里斯兰文",
+"ga": "爱尔兰文",
+"gd": "苏格兰- 盖尔文",
+"gl": "加利西亚文",
+"gn": "瓜拉尼文",
+"gu": "古加拉提文",
+"gv": "马恩岛文",
+"ha": "豪撒文",
+"he": "希伯来文",
+"hi": "印地文",
+"ho": "新里木托文",
+"hr": "克罗地亚文",
+"hu": "匈牙利文",
+"hy": "亚美尼亚文",
+"hz": "赫雷罗文",
+"ia": "拉丁国际文 Interlingua",
+"id": "印度尼西亚文",
+"ie": "拉丁国际文 Interlingue",
+"ig": "伊格博文",
+"ii": "四川话",
+"ik": "依奴皮维克文",
+"io": "爱德莪文(人工语言)",
+"is": "冰岛文",
+"it": "意大利文",
+"iu": "爱斯基摩文",
+"ja": "日文",
+"jv": "爪哇文",
+"ka": "格鲁吉亚文",
+"kg": "刚果文",
+"ki": "吉库尤文",
+"kj": "关琊玛文",
+"kk": "哈萨克文",
+"kl": "格陵兰文",
+"km": "柬埔寨文",
+"kn": "埃纳德文",
+"ko": "韩文",
+"kr": "卡努里文",
+"ks": "克什米尔文",
+"ku": "库尔德文",
+"kv": "科米文",
+"kw": "凯尔特文",
+"ky": "吉尔吉斯文",
+"la": "拉丁文",
+"lb": "卢森堡文",
+"lg": "卢干达文",
+"li": "淋布尔吉文",
+"ln": "林加拉文",
+"lo": "老挝文",
+"lt": "立陶宛文",
+"lu": "鲁巴加丹加文",
+"lv": "拉脫維亞文",
+"mg": "马尔加什文",
+"mh": "马绍尔文",
+"mi": "毛利文",
+"mk": "马其顿文",
+"ml": "马来亚拉姆文",
+"mn": "蒙古文",
+"mo": "摩尔多瓦文",
+"mr": "马拉地文",
+"ms": "马来文",
+"mt": "马耳他文",
+"my": "缅甸文",
+"na": "瑙鲁文",
+"nb": "挪威博克马尔文",
+"nd": "北恩德贝勒文",
+"ne": "尼泊尔文",
+"ng": "恩东加文",
+"nl": "荷兰文",
+"nn": "挪威尼诺斯克文",
+"no": "挪威文",
+"nr": "南部恩德贝勒文",
+"nv": "纳瓦霍文",
+"ny": "尼昂加文;切瓦文;切瓦文",
+"oc": "奥西坦文",
+"oj": "奥季布瓦文",
+"om": "阿曼文",
+"or": "欧里亚文",
+"os": "奥塞提文",
+"pa": "旁遮普文",
+"pi": "帕利文",
+"pl": "波兰文",
+"ps": "普什图文",
+"pt": "葡萄牙文",
+"qu": "盖丘亚文",
+"rm": "里托罗曼斯文",
+"rn": "基隆迪文",
+"ro": "罗马尼亚文",
+"ru": "俄文",
+"rw": "卢旺达文",
+"sa": "梵文",
+"sc": "萨丁文",
+"sd": "信德语",
+"se": "北萨迷文",
+"sg": "桑戈文",
+"sh": "塞波尼斯-克罗地亚文",
+"si": "僧伽罗文",
+"sk": "斯洛伐克文",
+"sl": "斯洛文尼亚文",
+"sm": "萨摩亚文",
+"sn": "塞内加尔文",
+"so": "索马里文",
+"sq": "阿尔巴尼亚文",
+"sr": "塞尔维亚文",
+"ss": "辛辛那提文",
+"st": "塞索托文",
+"su": "巽他语",
+"sv": "瑞典文",
+"sw": "斯瓦希里文",
+"ta": "泰米尔文",
+"te": "泰卢固文",
+"tg": "塔吉克文",
+"th": "泰文",
+"ti": "提格里尼亚文",
+"tk": "土库曼文",
+"tl": "塔加路族文",
+"tn": "突尼斯文",
+"to": "汤加文",
+"tr": "土耳其文",
+"ts": "特松加文",
+"tt": "鞑靼文",
+"tw": "台湾文",
+"ty": "塔西提文",
+"ug": "维吾尔文",
+"uk": "乌克兰文",
+"ur": "乌尔都文",
+"uz": "乌兹别克文",
+"ve": "文达文",
+"vi": "越南文",
+"vo": "沃拉普克文",
+"wa": "華隆文",
+"wo": "沃尔夫文",
+"xh": "科萨语",
+"yi": "依地文",
+"yo": "约鲁巴文",
+"za": "藏文",
+"zh": "中文",
+"zu": "祖鲁文",
+},
+{ type: "language", iso: "zu",
+countries: [
+{_reference: "ZA"},
+],
+},
+]
diff --git a/includes/js/dijit/demos/i18n/languages.sh b/includes/js/dijit/demos/i18n/languages.sh
new file mode 100644
index 0000000..5d353ee
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/languages.sh
@@ -0,0 +1,18 @@
+echo "["
+for lang in $(ls [a-z][a-z].xml |sed s/.xml//)
+do
+ echo '{ type: "language", iso: "'${lang}'",'
+
+ # countries that use this language
+ echo 'countries: ['
+ ls ${lang}_[A-Z][A-Z].xml | sed -e 's/^.*_/{_reference: "/' -e 's/.xml/"},/'
+ echo '],'
+
+ # name of this language (in this language)
+ grep '<language type="'${lang}'"[ >]' ${lang}.xml |head -1 |sed -e 's/.*<language type=".."[^>]*>/name: "/' -e 's/<\/language>/",/'
+
+ # names of other langauges (in this language)
+ grep '<language type="..">' ${lang}.xml |sed -e 's/.*<language type=//' -e 's/<\/language>/",/' -e 's/>/: "/' -e 's/-->//'
+ echo '},'
+done
+echo "]"
diff --git a/includes/js/dijit/demos/i18n/sprite.html b/includes/js/dijit/demos/i18n/sprite.html
new file mode 100644
index 0000000..c34ef3e
--- /dev/null
+++ b/includes/js/dijit/demos/i18n/sprite.html
@@ -0,0 +1,2319 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script>
+ dojo.require("dijit.layout.ContentPane");
+ </script>
+ <style>
+ img { padding: 0; border: 0; margin: 0; }
+ </style>
+ <script>
+
+ function t(node){ return node.innerText || node.textContent; };
+
+ var languages, langCountryMap, continents, countries;
+
+ function generate(){
+ // Generate country items
+ countries = dojo.query("tr", "source").
+ filter(function(row){ return dojo.query("img", row).length; } ).
+ map(function(row){
+ var iso = t(dojo.query("td", row)[3]),
+ a = dojo.query("td:nth-child(1) a:nth-child(2)", row)[0],
+ name = t(a);
+ var country = {
+ type: "country",
+ iso: iso,
+ name: name,
+ href: "http://en.wikipedia.org/wiki" + a.href.replace(/.*\/wiki/, "")
+ };
+ return country;
+ });
+
+ // make sprite
+ var sprite = dojo.byId("sprite");
+ dojo.query("img", "source").forEach(function(img, idx, ary){
+ img = img.cloneNode(true);
+ sprite.appendChild(img);
+ if(idx%20==19){
+ sprite.appendChild(document.createElement("br"));
+ }
+ });
+
+ // generate css rules
+ var css = dojo.byId("css");
+ var val = "";
+ dojo.query("img", "sprite").forEach(function(img, idx, ary){
+ var style=dojo.coords(img);
+ val += [
+ ".country" + countries[idx].iso + "Icon {",
+ " background-position: " + -1*style.l + "px " + -1*style.t + "px;",
+ " width: " + img.width + "px;",
+ " height: " + img.height + "px;",
+ "}"].join("\n") + "\n";
+ });
+ css.value = ".countryIcon {\n\tbackground-image: url('flags.png');\n}\n\n" + val;
+ }
+ </script>
+</head>
+<body>
+<h1>Flag Sprite/CSS Generator</h1>
+<button onclick="generate();">generate</button>
+
+<h1>Sprite</h1>
+<div style="border: 1px solid black; padding: 10px;">
+ <div style="position:relative" id="sprite"></div>
+</div>
+
+<h1>CSS</h1>
+<textarea id="css" cols=100 rows=20>push generate to fill in</textarea>
+
+
+<h1>Country names, flags, and ISO code</h1>
+<p>data taken from <a href="http://en.wikipedia.org/wiki/ISO_3166-1">wikipedia ISO 3166-1 site</a></p>
+<table id="source" style="height: 300px; overflow: auto;">
+<tbody>
+
+<tr>
+<th width="300">Official country names used by the ISO 3166/MA</th>
+<th><a href="/wiki/ISO_3166-1_numeric" title="ISO 3166-1 numeric">Numeric</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-3" title="ISO 3166-1 alpha-3">Alpha-3</a></th>
+<th><a href="/wiki/ISO_3166-1_alpha-2" title="ISO 3166-1 alpha-2">Alpha-2</a></th>
+<th>Local ISO codes</th>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"><img alt="Flag of Afghanistan" longdesc="/wiki/Image:Flag_of_Afghanistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Afghanistan.svg/22px-Flag_of_Afghanistan.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></td>
+<td>004</td>
+
+<td>AFG</td>
+<td id="AF">AF</td>
+<td><a href="/wiki/ISO_3166-2:AF" title="ISO 3166-2:AF">ISO 3166-2:AF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aaland.svg" class="image" title="Flag of Åland"><img alt="Flag of Åland" longdesc="/wiki/Image:Flag_of_Aaland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Flag_of_Aaland.svg/22px-Flag_of_Aaland.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/%C3%85land" title="Åland">Åland Islands</a></td>
+<td>248</td>
+<td>ALA</td>
+<td id="AX">AX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AX&amp;action=edit" class="new" title="ISO 3166-2:AX">ISO 3166-2:AX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"><img alt="Flag of Albania" longdesc="/wiki/Image:Flag_of_Albania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/22px-Flag_of_Albania.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></td>
+<td>008</td>
+<td>ALB</td>
+<td id="AL">AL</td>
+<td><a href="/wiki/ISO_3166-2:AL" title="ISO 3166-2:AL">ISO 3166-2:AL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"><img alt="Flag of Algeria" longdesc="/wiki/Image:Flag_of_Algeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/22px-Flag_of_Algeria.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></td>
+<td>012</td>
+
+<td>DZA</td>
+<td id="DZ">DZ</td>
+<td><a href="/wiki/ISO_3166-2:DZ" title="ISO 3166-2:DZ">ISO 3166-2:DZ</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"><img alt="Flag of American Samoa" longdesc="/wiki/Image:Flag_of_American_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/22px-Flag_of_American_Samoa.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></td>
+<td>016</td>
+<td>ASM</td>
+<td id="AS">AS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AS&amp;action=edit" class="new" title="ISO 3166-2:AS">ISO 3166-2:AS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"><img alt="Flag of Andorra" longdesc="/wiki/Image:Flag_of_Andorra.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Andorra.svg/22px-Flag_of_Andorra.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></td>
+<td>020</td>
+<td>AND</td>
+<td id="AD">AD</td>
+<td><a href="/wiki/ISO_3166-2:AD" title="ISO 3166-2:AD">ISO 3166-2:AD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"><img alt="Flag of Angola" longdesc="/wiki/Image:Flag_of_Angola.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Flag_of_Angola.svg/22px-Flag_of_Angola.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></td>
+<td>024</td>
+
+<td>AGO</td>
+<td id="AO">AO</td>
+<td><a href="/wiki/ISO_3166-2:AO" title="ISO 3166-2:AO">ISO 3166-2:AO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"><img alt="Flag of Anguilla" longdesc="/wiki/Image:Flag_of_Anguilla.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Anguilla.svg/22px-Flag_of_Anguilla.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></td>
+<td>660</td>
+<td>AIA</td>
+<td id="AI">AI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AI&amp;action=edit" class="new" title="ISO 3166-2:AI">ISO 3166-2:AI</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antarctica.svg" class="image" title="Flag of Antarctica"><img alt="Flag of Antarctica" longdesc="/wiki/Image:Flag_of_Antarctica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Antarctica.svg/22px-Flag_of_Antarctica.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Antarctica" title="Antarctica">Antarctica</a></td>
+<td>010</td>
+<td>ATA</td>
+<td id="AQ">AQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AQ&amp;action=edit" class="new" title="ISO 3166-2:AQ">ISO 3166-2:AQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"><img alt="Flag of Antigua and Barbuda" longdesc="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Antigua_and_Barbuda.svg/22px-Flag_of_Antigua_and_Barbuda.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></td>
+<td>028</td>
+
+<td>ATG</td>
+<td id="AG">AG</td>
+<td><a href="/wiki/ISO_3166-2:AG" title="ISO 3166-2:AG">ISO 3166-2:AG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"><img alt="Flag of Argentina" longdesc="/wiki/Image:Flag_of_Argentina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Flag_of_Argentina.svg/22px-Flag_of_Argentina.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></td>
+<td>032</td>
+<td>ARG</td>
+<td id="AR">AR</td>
+<td><a href="/wiki/ISO_3166-2:AR" title="ISO 3166-2:AR">ISO 3166-2:AR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"><img alt="Flag of Armenia" longdesc="/wiki/Image:Flag_of_Armenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Armenia.svg/22px-Flag_of_Armenia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></td>
+<td>051</td>
+<td>ARM</td>
+<td id="AM">AM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AM&amp;action=edit" class="new" title="ISO 3166-2:AM">ISO 3166-2:AM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"><img alt="Flag of Aruba" longdesc="/wiki/Image:Flag_of_Aruba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Aruba.svg/22px-Flag_of_Aruba.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></td>
+<td>533</td>
+
+<td>ABW</td>
+<td id="AW">AW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AW&amp;action=edit" class="new" title="ISO 3166-2:AW">ISO 3166-2:AW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"><img alt="Flag of Australia" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></td>
+<td>036</td>
+<td>AUS</td>
+<td id="AU">AU</td>
+<td><a href="/wiki/ISO_3166-2:AU" title="ISO 3166-2:AU">ISO 3166-2:AU</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"><img alt="Flag of Austria" longdesc="/wiki/Image:Flag_of_Austria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_Austria.svg/22px-Flag_of_Austria.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></td>
+<td>040</td>
+<td>AUT</td>
+<td id="AT">AT</td>
+<td><a href="/wiki/ISO_3166-2:AT" title="ISO 3166-2:AT">ISO 3166-2:AT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"><img alt="Flag of Azerbaijan" longdesc="/wiki/Image:Flag_of_Azerbaijan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Azerbaijan.svg/22px-Flag_of_Azerbaijan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></td>
+<td>031</td>
+
+<td>AZE</td>
+<td id="AZ">AZ</td>
+<td><a href="/wiki/ISO_3166-2:AZ" title="ISO 3166-2:AZ">ISO 3166-2:AZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"><img alt="Flag of the Bahamas" longdesc="/wiki/Image:Flag_of_the_Bahamas.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_the_Bahamas.svg/22px-Flag_of_the_Bahamas.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></td>
+<td>044</td>
+<td>BHS</td>
+
+<td id="BS">BS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BS&amp;action=edit" class="new" title="ISO 3166-2:BS">ISO 3166-2:BS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"><img alt="Flag of Bahrain" longdesc="/wiki/Image:Flag_of_Bahrain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Bahrain.svg/22px-Flag_of_Bahrain.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></td>
+<td>048</td>
+<td>BHR</td>
+<td id="BH">BH</td>
+<td><a href="/wiki/ISO_3166-2:BH" title="ISO 3166-2:BH">ISO 3166-2:BH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"><img alt="Flag of Bangladesh" longdesc="/wiki/Image:Flag_of_Bangladesh.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bangladesh.svg/22px-Flag_of_Bangladesh.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></td>
+<td>050</td>
+<td>BGD</td>
+<td id="BD">BD</td>
+<td><a href="/wiki/ISO_3166-2:BD" title="ISO 3166-2:BD">ISO 3166-2:BD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"><img alt="Flag of Barbados" longdesc="/wiki/Image:Flag_of_Barbados.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Barbados.svg/22px-Flag_of_Barbados.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></td>
+<td>052</td>
+
+<td>BRB</td>
+<td id="BB">BB</td>
+<td><a href="/wiki/ISO_3166-2:BB" title="ISO 3166-2:BB">ISO 3166-2:BB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"><img alt="Flag of Belarus" longdesc="/wiki/Image:Flag_of_Belarus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Belarus.svg/22px-Flag_of_Belarus.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></td>
+<td>112</td>
+<td>BLR</td>
+<td id="BY">BY</td>
+<td><a href="/wiki/ISO_3166-2:BY" title="ISO 3166-2:BY">ISO 3166-2:BY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"><img alt="Flag of Belgium" longdesc="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Belgium_%28civil%29.svg/22px-Flag_of_Belgium_%28civil%29.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></td>
+<td>056</td>
+<td>BEL</td>
+<td id="BE">BE</td>
+<td><a href="/wiki/ISO_3166-2:BE" title="ISO 3166-2:BE">ISO 3166-2:BE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"><img alt="Flag of Belize" longdesc="/wiki/Image:Flag_of_Belize.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Belize.svg/22px-Flag_of_Belize.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></td>
+<td>084</td>
+
+<td>BLZ</td>
+<td id="BZ">BZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BZ&amp;action=edit" class="new" title="ISO 3166-2:BZ">ISO 3166-2:BZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"><img alt="Flag of Benin" longdesc="/wiki/Image:Flag_of_Benin.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Benin.svg/22px-Flag_of_Benin.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></td>
+<td>204</td>
+<td>BEN</td>
+<td id="BJ">BJ</td>
+<td><a href="/wiki/ISO_3166-2:BJ" title="ISO 3166-2:BJ">ISO 3166-2:BJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"><img alt="Flag of Bermuda" longdesc="/wiki/Image:Flag_of_Bermuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bermuda.svg/22px-Flag_of_Bermuda.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></td>
+<td>060</td>
+<td>BMU</td>
+<td id="BM">BM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BM&amp;action=edit" class="new" title="ISO 3166-2:BM">ISO 3166-2:BM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"><img alt="Flag of Bhutan" longdesc="/wiki/Image:Flag_of_Bhutan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Flag_of_Bhutan.svg/22px-Flag_of_Bhutan.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></td>
+<td>064</td>
+
+<td>BTN</td>
+<td id="BT">BT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BT&amp;action=edit" class="new" title="ISO 3166-2:BT">ISO 3166-2:BT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"><img alt="Flag of Bolivia" longdesc="/wiki/Image:Flag_of_Bolivia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Bolivia.svg/22px-Flag_of_Bolivia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></td>
+<td>068</td>
+<td>BOL</td>
+<td id="BO">BO</td>
+<td><a href="/wiki/ISO_3166-2:BO" title="ISO 3166-2:BO">ISO 3166-2:BO</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"><img alt="Flag of Bosnia and Herzegovina" longdesc="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bosnia_and_Herzegovina.svg/22px-Flag_of_Bosnia_and_Herzegovina.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></td>
+<td>070</td>
+<td>BIH</td>
+<td id="BA">BA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BA&amp;action=edit" class="new" title="ISO 3166-2:BA">ISO 3166-2:BA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"><img alt="Flag of Botswana" longdesc="/wiki/Image:Flag_of_Botswana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Botswana.svg/22px-Flag_of_Botswana.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></td>
+<td>072</td>
+
+<td>BWA</td>
+<td id="BW">BW</td>
+<td><a href="/wiki/ISO_3166-2:BW" title="ISO 3166-2:BW">ISO 3166-2:BW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"><img alt="Flag of Bouvet Island" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></td>
+<td>074</td>
+<td>BVT</td>
+<td id="BV">BV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BV&amp;action=edit" class="new" title="ISO 3166-2:BV">ISO 3166-2:BV</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"><img alt="Flag of Brazil" longdesc="/wiki/Image:Flag_of_Brazil.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/22px-Flag_of_Brazil.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></td>
+<td>076</td>
+<td>BRA</td>
+<td id="BR">BR</td>
+<td><a href="/wiki/ISO_3166-2:BR" title="ISO 3166-2:BR">ISO 3166-2:BR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"><img alt="Flag of British Indian Ocean Territory" longdesc="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg/22px-Flag_of_the_British_Indian_Ocean_Territory.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></td>
+<td>086</td>
+
+<td>IOT</td>
+<td id="IO">IO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IO&amp;action=edit" class="new" title="ISO 3166-2:IO">ISO 3166-2:IO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"><img alt="Flag of Brunei" longdesc="/wiki/Image:Flag_of_Brunei.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Brunei.svg/22px-Flag_of_Brunei.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei Darussalam</a></td>
+<td>096</td>
+<td>BRN</td>
+<td id="BN">BN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BN&amp;action=edit" class="new" title="ISO 3166-2:BN">ISO 3166-2:BN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"><img alt="Flag of Bulgaria" longdesc="/wiki/Image:Flag_of_Bulgaria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Bulgaria.svg/22px-Flag_of_Bulgaria.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></td>
+<td>100</td>
+<td>BGR</td>
+<td id="BG">BG</td>
+<td><a href="/wiki/ISO_3166-2:BG" title="ISO 3166-2:BG">ISO 3166-2:BG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"><img alt="Flag of Burkina Faso" longdesc="/wiki/Image:Flag_of_Burkina_Faso.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Burkina_Faso.svg/22px-Flag_of_Burkina_Faso.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></td>
+<td>854</td>
+
+<td>BFA</td>
+<td id="BF">BF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:BF&amp;action=edit" class="new" title="ISO 3166-2:BF">ISO 3166-2:BF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"><img alt="Flag of Burundi" longdesc="/wiki/Image:Flag_of_Burundi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Flag_of_Burundi.svg/22px-Flag_of_Burundi.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></td>
+<td>108</td>
+<td>BDI</td>
+<td id="BI">BI</td>
+<td><a href="/wiki/ISO_3166-2:BI" title="ISO 3166-2:BI">ISO 3166-2:BI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"><img alt="Flag of Cambodia" longdesc="/wiki/Image:Flag_of_Cambodia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Cambodia.svg/22px-Flag_of_Cambodia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></td>
+<td>116</td>
+<td>KHM</td>
+<td id="KH">KH</td>
+<td><a href="/wiki/ISO_3166-2:KH" title="ISO 3166-2:KH">ISO 3166-2:KH</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"><img alt="Flag of Cameroon" longdesc="/wiki/Image:Flag_of_Cameroon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Cameroon.svg/22px-Flag_of_Cameroon.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></td>
+<td>120</td>
+<td>CMR</td>
+<td id="CM">CM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CM&amp;action=edit" class="new" title="ISO 3166-2:CM">ISO 3166-2:CM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"><img alt="Flag of Canada" longdesc="/wiki/Image:Flag_of_Canada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Canada.svg/22px-Flag_of_Canada.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></td>
+<td>124</td>
+<td>CAN</td>
+
+<td id="CA">CA</td>
+<td><a href="/wiki/ISO_3166-2:CA" title="ISO 3166-2:CA">ISO 3166-2:CA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"><img alt="Flag of Cape Verde" longdesc="/wiki/Image:Flag_of_Cape_Verde.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Cape_Verde.svg/22px-Flag_of_Cape_Verde.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></td>
+<td>132</td>
+<td>CPV</td>
+<td id="CV">CV</td>
+<td><a href="/wiki/ISO_3166-2:CV" title="ISO 3166-2:CV">ISO 3166-2:CV</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"><img alt="Flag of Cayman Islands" longdesc="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_the_Cayman_Islands.svg/22px-Flag_of_the_Cayman_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></td>
+<td>136</td>
+<td>CYM</td>
+<td id="KY">KY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KY&amp;action=edit" class="new" title="ISO 3166-2:KY">ISO 3166-2:KY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"><img alt="Flag of the Central African Republic" longdesc="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Central_African_Republic.svg/22px-Flag_of_the_Central_African_Republic.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></td>
+<td>140</td>
+
+<td>CAF</td>
+<td id="CF">CF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CF&amp;action=edit" class="new" title="ISO 3166-2:CF">ISO 3166-2:CF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"><img alt="Flag of Chad" longdesc="/wiki/Image:Flag_of_Chad.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Chad.svg/22px-Flag_of_Chad.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></td>
+<td>148</td>
+<td>TCD</td>
+<td id="TD">TD</td>
+<td><a href="/wiki/ISO_3166-2:TD" title="ISO 3166-2:TD">ISO 3166-2:TD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"><img alt="Flag of Chile" longdesc="/wiki/Image:Flag_of_Chile.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Flag_of_Chile.svg/22px-Flag_of_Chile.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></td>
+<td>152</td>
+<td>CHL</td>
+<td id="CL">CL</td>
+<td><a href="/wiki/ISO_3166-2:CL" title="ISO 3166-2:CL">ISO 3166-2:CL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"><img alt="Flag of the People's Republic of China" longdesc="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_People%27s_Republic_of_China.svg/22px-Flag_of_the_People%27s_Republic_of_China.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China</a></td>
+<td>156</td>
+
+<td>CHN</td>
+<td id="CN">CN</td>
+<td><a href="/wiki/ISO_3166-2:CN" title="ISO 3166-2:CN">ISO 3166-2:CN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"><img alt="Flag of Christmas Island" longdesc="/wiki/Image:Flag_of_Christmas_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Flag_of_Christmas_Island.svg/22px-Flag_of_Christmas_Island.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></td>
+<td>162</td>
+<td>CXR</td>
+<td id="CX">CX</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CX&amp;action=edit" class="new" title="ISO 3166-2:CX">ISO 3166-2:CX</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"><img alt="Flag of the Cocos (Keeling) Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></td>
+<td>166</td>
+<td>CCK</td>
+<td id="CC">CC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CC&amp;action=edit" class="new" title="ISO 3166-2:CC">ISO 3166-2:CC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"><img alt="Flag of Colombia" longdesc="/wiki/Image:Flag_of_Colombia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Colombia.svg/22px-Flag_of_Colombia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></td>
+<td>170</td>
+
+<td>COL</td>
+<td id="CO">CO</td>
+<td><a href="/wiki/ISO_3166-2:CO" title="ISO 3166-2:CO">ISO 3166-2:CO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"><img alt="Flag of the Comoros" longdesc="/wiki/Image:Flag_of_the_Comoros.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Comoros.svg/22px-Flag_of_the_Comoros.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></td>
+<td>174</td>
+<td>COM</td>
+<td id="KM">KM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KM&amp;action=edit" class="new" title="ISO 3166-2:KM">ISO 3166-2:KM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"><img alt="Flag of the Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Republic_of_the_Congo.svg/22px-Flag_of_the_Republic_of_the_Congo.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo</a></td>
+<td>178</td>
+<td>COG</td>
+<td id="CG">CG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CG&amp;action=edit" class="new" title="ISO 3166-2:CG">ISO 3166-2:CG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"><img alt="Flag of the Democratic Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg/22px-Flag_of_the_Democratic_Republic_of_the_Congo.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of the</a></td>
+<td>180</td>
+
+<td>COD</td>
+<td id="CD">CD</td>
+<td><a href="/wiki/ISO_3166-2:CD" title="ISO 3166-2:CD">ISO 3166-2:CD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"><img alt="Flag of the Cook Islands" longdesc="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/22px-Flag_of_the_Cook_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></td>
+<td>184</td>
+<td>COK</td>
+<td id="CK">CK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CK&amp;action=edit" class="new" title="ISO 3166-2:CK">ISO 3166-2:CK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"><img alt="Flag of Costa Rica" longdesc="/wiki/Image:Flag_of_Costa_Rica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Flag_of_Costa_Rica.svg/22px-Flag_of_Costa_Rica.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></td>
+<td>188</td>
+<td>CRI</td>
+<td id="CR">CR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:CR&amp;action=edit" class="new" title="ISO 3166-2:CR">ISO 3166-2:CR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"><img alt="Flag of Côte d'Ivoire" longdesc="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_Cote_d%27Ivoire.svg/22px-Flag_of_Cote_d%27Ivoire.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></td>
+<td>384</td>
+
+<td>CIV</td>
+<td id="CI">CI</td>
+<td><a href="/wiki/ISO_3166-2:CI" title="ISO 3166-2:CI">ISO 3166-2:CI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"><img alt="Flag of Croatia" longdesc="/wiki/Image:Flag_of_Croatia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Croatia.svg/22px-Flag_of_Croatia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></td>
+<td>191</td>
+<td>HRV</td>
+<td id="HR">HR</td>
+<td><a href="/wiki/ISO_3166-2:HR" title="ISO 3166-2:HR">ISO 3166-2:HR</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"><img alt="Flag of Cuba" longdesc="/wiki/Image:Flag_of_Cuba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Flag_of_Cuba.svg/22px-Flag_of_Cuba.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></td>
+<td>192</td>
+<td>CUB</td>
+<td id="CU">CU</td>
+<td><a href="/wiki/ISO_3166-2:CU" title="ISO 3166-2:CU">ISO 3166-2:CU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"><img alt="Flag of Cyprus" longdesc="/wiki/Image:Flag_of_Cyprus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Cyprus.svg/22px-Flag_of_Cyprus.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></td>
+<td>196</td>
+
+<td>CYP</td>
+<td id="CY">CY</td>
+<td><a href="/wiki/ISO_3166-2:CY" title="ISO 3166-2:CY">ISO 3166-2:CY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"><img alt="Flag of the Czech Republic" longdesc="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/22px-Flag_of_the_Czech_Republic.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></td>
+<td>203</td>
+<td>CZE</td>
+<td id="CZ">CZ</td>
+<td><a href="/wiki/ISO_3166-2:CZ" title="ISO 3166-2:CZ">ISO 3166-2:CZ</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"><img alt="Flag of Denmark" longdesc="/wiki/Image:Flag_of_Denmark.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Denmark.svg/22px-Flag_of_Denmark.svg.png" height="17" width="22"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></td>
+<td>208</td>
+<td>DNK</td>
+<td id="DK">DK</td>
+<td><a href="/wiki/ISO_3166-2:DK" title="ISO 3166-2:DK">ISO 3166-2:DK</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"><img alt="Flag of Djibouti" longdesc="/wiki/Image:Flag_of_Djibouti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_Djibouti.svg/22px-Flag_of_Djibouti.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></td>
+<td>262</td>
+<td>DJI</td>
+<td id="DJ">DJ</td>
+<td><a href="/wiki/ISO_3166-2:DJ" title="ISO 3166-2:DJ">ISO 3166-2:DJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"><img alt="Flag of Dominica" longdesc="/wiki/Image:Flag_of_Dominica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_Dominica.svg/22px-Flag_of_Dominica.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></td>
+<td>212</td>
+<td>DMA</td>
+
+<td id="DM">DM</td>
+<td><a href="/wiki/ISO_3166-2:DM" title="ISO 3166-2:DM">ISO 3166-2:DM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"><img alt="Flag of the Dominican Republic" longdesc="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_the_Dominican_Republic.svg/22px-Flag_of_the_Dominican_Republic.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></td>
+<td>214</td>
+<td>DOM</td>
+<td id="DO">DO</td>
+<td><a href="/wiki/ISO_3166-2:DO" title="ISO 3166-2:DO">ISO 3166-2:DO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"><img alt="Flag of Ecuador" longdesc="/wiki/Image:Flag_of_Ecuador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Ecuador.svg/22px-Flag_of_Ecuador.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></td>
+<td>218</td>
+<td>ECU</td>
+<td id="EC">EC</td>
+<td><a href="/wiki/ISO_3166-2:EC" title="ISO 3166-2:EC">ISO 3166-2:EC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"><img alt="Flag of Egypt" longdesc="/wiki/Image:Flag_of_Egypt.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Egypt.svg/22px-Flag_of_Egypt.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></td>
+
+<td>818</td>
+<td>EGY</td>
+<td id="EG">EG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EG&amp;action=edit" class="new" title="ISO 3166-2:EG">ISO 3166-2:EG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"><img alt="Flag of El Salvador" longdesc="/wiki/Image:Flag_of_El_Salvador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_El_Salvador.svg/22px-Flag_of_El_Salvador.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></td>
+<td>222</td>
+<td>SLV</td>
+<td id="SV">SV</td>
+
+<td><a href="/wiki/ISO_3166-2:SV" title="ISO 3166-2:SV">ISO 3166-2:SV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"><img alt="Flag of Equatorial Guinea" longdesc="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Equatorial_Guinea.svg/22px-Flag_of_Equatorial_Guinea.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></td>
+<td>226</td>
+<td>GNQ</td>
+<td id="GQ">GQ</td>
+<td><a href="/wiki/ISO_3166-2:GQ" title="ISO 3166-2:GQ">ISO 3166-2:GQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"><img alt="Flag of Eritrea" longdesc="/wiki/Image:Flag_of_Eritrea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_Eritrea.svg/22px-Flag_of_Eritrea.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></td>
+
+<td>232</td>
+<td>ERI</td>
+<td id="ER">ER</td>
+<td><a href="/wiki/ISO_3166-2:ER" title="ISO 3166-2:ER">ISO 3166-2:ER</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"><img alt="Flag of Estonia" longdesc="/wiki/Image:Flag_of_Estonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Estonia.svg/22px-Flag_of_Estonia.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></td>
+<td>233</td>
+<td>EST</td>
+<td id="EE">EE</td>
+
+<td><a href="/wiki/ISO_3166-2:EE" title="ISO 3166-2:EE">ISO 3166-2:EE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"><img alt="Flag of Ethiopia" longdesc="/wiki/Image:Flag_of_Ethiopia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/22px-Flag_of_Ethiopia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></td>
+<td>231</td>
+<td>ETH</td>
+<td id="ET">ET</td>
+<td><a href="/wiki/ISO_3166-2:ET" title="ISO 3166-2:ET">ISO 3166-2:ET</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"><img alt="Flag of the Falkland Islands" longdesc="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_the_Falkland_Islands.svg/22px-Flag_of_the_Falkland_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands (Malvinas)</a></td>
+<td>238</td>
+<td>FLK</td>
+<td id="FK">FK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FK&amp;action=edit" class="new" title="ISO 3166-2:FK">ISO 3166-2:FK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"><img alt="Flag of the Faroe Islands" longdesc="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Faroe_Islands.svg/22px-Flag_of_the_Faroe_Islands.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></td>
+<td>234</td>
+
+<td>FRO</td>
+<td id="FO">FO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FO&amp;action=edit" class="new" title="ISO 3166-2:FO">ISO 3166-2:FO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"><img alt="Flag of Fiji" longdesc="/wiki/Image:Flag_of_Fiji.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Fiji.svg/22px-Flag_of_Fiji.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></td>
+<td>242</td>
+<td>FJI</td>
+<td id="FJ">FJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FJ&amp;action=edit" class="new" title="ISO 3166-2:FJ">ISO 3166-2:FJ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"><img alt="Flag of Finland" longdesc="/wiki/Image:Flag_of_Finland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Finland.svg/22px-Flag_of_Finland.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></td>
+<td>246</td>
+<td>FIN</td>
+<td id="FI">FI</td>
+<td><a href="/wiki/ISO_3166-2:FI" title="ISO 3166-2:FI">ISO 3166-2:FI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/France" title="France">France</a></td>
+<td>250</td>
+
+<td>FRA</td>
+<td id="FR">FR</td>
+<td><a href="/wiki/ISO_3166-2:FR" title="ISO 3166-2:FR">ISO 3166-2:FR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"><img alt="Flag of French Guiana" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></td>
+<td>254</td>
+<td>GUF</td>
+<td id="GF">GF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GF&amp;action=edit" class="new" title="ISO 3166-2:GF">ISO 3166-2:GF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"><img alt="Flag of French Polynesia" longdesc="/wiki/Image:Flag_of_French_Polynesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_French_Polynesia.svg/22px-Flag_of_French_Polynesia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></td>
+<td>258</td>
+<td>PYF</td>
+<td id="PF">PF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PF&amp;action=edit" class="new" title="ISO 3166-2:PF">ISO 3166-2:PF</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"><img alt="Flag of the French Southern and Antarctic Lands" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></td>
+<td>260</td>
+
+<td>ATF</td>
+<td id="TF">TF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TF&amp;action=edit" class="new" title="ISO 3166-2:TF">ISO 3166-2:TF</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"><img alt="Flag of Gabon" longdesc="/wiki/Image:Flag_of_Gabon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Gabon.svg/22px-Flag_of_Gabon.svg.png" height="17" width="22"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></td>
+<td>266</td>
+<td>GAB</td>
+
+<td id="GA">GA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GA&amp;action=edit" class="new" title="ISO 3166-2:GA">ISO 3166-2:GA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"><img alt="Flag of The Gambia" longdesc="/wiki/Image:Flag_of_The_Gambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_The_Gambia.svg/22px-Flag_of_The_Gambia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></td>
+<td>270</td>
+<td>GMB</td>
+<td id="GM">GM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GM&amp;action=edit" class="new" title="ISO 3166-2:GM">ISO 3166-2:GM</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"><img alt="Flag of Georgia (country)" longdesc="/wiki/Image:Flag_of_Georgia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Georgia.svg/22px-Flag_of_Georgia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></td>
+<td>268</td>
+<td>GEO</td>
+<td id="GE">GE</td>
+<td><a href="/wiki/ISO_3166-2:GE" title="ISO 3166-2:GE">ISO 3166-2:GE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"><img alt="Flag of Germany" longdesc="/wiki/Image:Flag_of_Germany.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/22px-Flag_of_Germany.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></td>
+<td>276</td>
+
+<td>DEU</td>
+<td id="DE">DE</td>
+<td><a href="/wiki/ISO_3166-2:DE" title="ISO 3166-2:DE">ISO 3166-2:DE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"><img alt="Flag of Ghana" longdesc="/wiki/Image:Flag_of_Ghana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Ghana.svg/22px-Flag_of_Ghana.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></td>
+<td>288</td>
+<td>GHA</td>
+<td id="GH">GH</td>
+<td><a href="/wiki/ISO_3166-2:GH" title="ISO 3166-2:GH">ISO 3166-2:GH</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"><img alt="Flag of Gibraltar" longdesc="/wiki/Image:Flag_of_Gibraltar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Gibraltar.svg/22px-Flag_of_Gibraltar.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></td>
+<td>292</td>
+<td>GIB</td>
+<td id="GI">GI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GI&amp;action=edit" class="new" title="ISO 3166-2:GI">ISO 3166-2:GI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"><img alt="Flag of Greece" longdesc="/wiki/Image:Flag_of_Greece.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Greece.svg/22px-Flag_of_Greece.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></td>
+<td>300</td>
+
+<td>GRC</td>
+<td id="GR">GR</td>
+<td><a href="/wiki/ISO_3166-2:GR" title="ISO 3166-2:GR">ISO 3166-2:GR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"><img alt="Flag of Greenland" longdesc="/wiki/Image:Flag_of_Greenland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Greenland.svg/22px-Flag_of_Greenland.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></td>
+<td>304</td>
+<td>GRL</td>
+<td id="GL">GL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GL&amp;action=edit" class="new" title="ISO 3166-2:GL">ISO 3166-2:GL</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"><img alt="Flag of Grenada" longdesc="/wiki/Image:Flag_of_Grenada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Grenada.svg/22px-Flag_of_Grenada.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></td>
+<td>308</td>
+<td>GRD</td>
+<td id="GD">GD</td>
+<td><a href="/wiki/ISO_3166-2:GD" title="ISO 3166-2:GD">ISO 3166-2:GD</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"><img alt="Flag of Guadeloupe" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a><span class="reference plainlinksneverexpand" id="ref_COM"><sup><a href="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM" class="external autonumber" title="http://en.wikipedia.org/wiki/ISO_3166-1#endnote_COM" rel="nofollow">[2]</a></sup></span></td>
+
+<td>312</td>
+<td>GLP</td>
+<td id="GP">GP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GP&amp;action=edit" class="new" title="ISO 3166-2:GP">ISO 3166-2:GP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"><img alt="Flag of Guam" longdesc="/wiki/Image:Flag_of_Guam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Flag_of_Guam.svg/22px-Flag_of_Guam.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></td>
+<td>316</td>
+<td>GUM</td>
+<td id="GU">GU</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:GU&amp;action=edit" class="new" title="ISO 3166-2:GU">ISO 3166-2:GU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"><img alt="Flag of Guatemala" longdesc="/wiki/Image:Flag_of_Guatemala.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Flag_of_Guatemala.svg/22px-Flag_of_Guatemala.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></td>
+<td>320</td>
+<td>GTM</td>
+<td id="GT">GT</td>
+<td><a href="/wiki/ISO_3166-2:GT" title="ISO 3166-2:GT">ISO 3166-2:GT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"><img alt="Flag of Guernsey" longdesc="/wiki/Image:Flag_of_Guernsey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Guernsey.svg/22px-Flag_of_Guernsey.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></td>
+
+<td>831</td>
+<td>GGY</td>
+<td id="GG">GG</td>
+<td><a href="/wiki/ISO_3166-2:GG" title="ISO 3166-2:GG">ISO 3166-2:GG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"><img alt="Flag of Guinea" longdesc="/wiki/Image:Flag_of_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Guinea.svg/22px-Flag_of_Guinea.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></td>
+<td>324</td>
+<td>GIN</td>
+<td id="GN">GN</td>
+
+<td><a href="/wiki/ISO_3166-2:GN" title="ISO 3166-2:GN">ISO 3166-2:GN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"><img alt="Flag of Guinea-Bissau" longdesc="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Guinea-Bissau.svg/22px-Flag_of_Guinea-Bissau.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></td>
+<td>624</td>
+<td>GNB</td>
+<td id="GW">GW</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GW&amp;action=edit" class="new" title="ISO 3166-2:GW">ISO 3166-2:GW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"><img alt="Flag of Guyana" longdesc="/wiki/Image:Flag_of_Guyana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_Guyana.svg/22px-Flag_of_Guyana.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></td>
+
+<td>328</td>
+<td>GUY</td>
+<td id="GY">GY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GY&amp;action=edit" class="new" title="ISO 3166-2:GY">ISO 3166-2:GY</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"><img alt="Flag of Haiti" longdesc="/wiki/Image:Flag_of_Haiti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Haiti.svg/22px-Flag_of_Haiti.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></td>
+<td>332</td>
+
+<td>HTI</td>
+<td id="HT">HT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HT&amp;action=edit" class="new" title="ISO 3166-2:HT">ISO 3166-2:HT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"><img alt="Flag of Heard Island and McDonald Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/22px-Flag_of_Australia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></td>
+<td>334</td>
+<td>HMD</td>
+<td id="HM">HM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:HM&amp;action=edit" class="new" title="ISO 3166-2:HM">ISO 3166-2:HM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"><img alt="Flag of the Vatican City" longdesc="/wiki/Image:Flag_of_the_Vatican_City.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_the_Vatican_City.svg/20px-Flag_of_the_Vatican_City.svg.png" height="20" width="20"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Holy See (Vatican City State)</a></td>
+<td>336</td>
+<td>VAT</td>
+<td id="VA">VA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VA&amp;action=edit" class="new" title="ISO 3166-2:VA">ISO 3166-2:VA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"><img alt="Flag of Honduras" longdesc="/wiki/Image:Flag_of_Honduras.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Flag_of_Honduras.svg/22px-Flag_of_Honduras.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></td>
+<td>340</td>
+
+<td>HND</td>
+<td id="HN">HN</td>
+<td><a href="/wiki/ISO_3166-2:HN" title="ISO 3166-2:HN">ISO 3166-2:HN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"><img alt="Flag of Hong Kong" longdesc="/wiki/Image:Flag_of_Hong_Kong.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Hong_Kong.svg/22px-Flag_of_Hong_Kong.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></td>
+<td>344</td>
+<td>HKG</td>
+<td id="HK">HK</td>
+<td><a href="/wiki/ISO_3166-2:HK" title="ISO 3166-2:HK">ISO 3166-2:HK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"><img alt="Flag of Hungary" longdesc="/wiki/Image:Flag_of_Hungary.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Hungary.svg/22px-Flag_of_Hungary.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></td>
+<td>348</td>
+<td>HUN</td>
+<td id="HU">HU</td>
+<td><a href="/wiki/ISO_3166-2:HU" title="ISO 3166-2:HU">ISO 3166-2:HU</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"><img alt="Flag of Iceland" longdesc="/wiki/Image:Flag_of_Iceland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Iceland.svg/22px-Flag_of_Iceland.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></td>
+<td>352</td>
+<td>ISL</td>
+<td id="IS">IS</td>
+<td><a href="/wiki/ISO_3166-2:IS" title="ISO 3166-2:IS">ISO 3166-2:IS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"><img alt="Flag of India" longdesc="/wiki/Image:Flag_of_India.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_India.svg/22px-Flag_of_India.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/India" title="India">India</a></td>
+<td>356</td>
+<td>IND</td>
+
+<td id="IN">IN</td>
+<td><a href="/wiki/ISO_3166-2:IN" title="ISO 3166-2:IN">ISO 3166-2:IN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"><img alt="Flag of Indonesia" longdesc="/wiki/Image:Flag_of_Indonesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Indonesia.svg/22px-Flag_of_Indonesia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></td>
+<td>360</td>
+<td>IDN</td>
+<td id="ID">ID</td>
+<td><a href="/wiki/ISO_3166-2:ID" title="ISO 3166-2:ID">ISO 3166-2:ID</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"><img alt="Flag of Iran" longdesc="/wiki/Image:Flag_of_Iran.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Flag_of_Iran.svg/22px-Flag_of_Iran.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran, Islamic Republic of</a></td>
+<td>364</td>
+<td>IRN</td>
+<td id="IR">IR</td>
+<td><a href="/wiki/ISO_3166-2:IR" title="ISO 3166-2:IR">ISO 3166-2:IR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"><img alt="Flag of Iraq" longdesc="/wiki/Image:Flag_of_Iraq.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Iraq.svg/22px-Flag_of_Iraq.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></td>
+<td>368</td>
+
+<td>IRQ</td>
+<td id="IQ">IQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:IQ&amp;action=edit" class="new" title="ISO 3166-2:IQ">ISO 3166-2:IQ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"><img alt="Flag of Ireland" longdesc="/wiki/Image:Flag_of_Ireland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/22px-Flag_of_Ireland.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></td>
+<td>372</td>
+<td>IRL</td>
+<td id="IE">IE</td>
+<td><a href="/wiki/ISO_3166-2:IE" title="ISO 3166-2:IE">ISO 3166-2:IE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"><img alt="Flag of the Isle of Man" longdesc="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_the_Isle_of_Man.svg/22px-Flag_of_the_Isle_of_Man.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></td>
+<td>833</td>
+<td>IMN</td>
+<td id="IM">IM</td>
+<td><a href="/wiki/ISO_3166-2:IM" title="ISO 3166-2:IM">ISO 3166-2:IM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"><img alt="Flag of Israel" longdesc="/wiki/Image:Flag_of_Israel.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Israel.svg/22px-Flag_of_Israel.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></td>
+<td>376</td>
+
+<td>ISR</td>
+<td id="IL">IL</td>
+<td><a href="/wiki/ISO_3166-2:IL" title="ISO 3166-2:IL">ISO 3166-2:IL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"><img alt="Flag of Italy" longdesc="/wiki/Image:Flag_of_Italy.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/22px-Flag_of_Italy.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></td>
+<td>380</td>
+<td>ITA</td>
+<td id="IT">IT</td>
+<td><a href="/wiki/ISO_3166-2:IT" title="ISO 3166-2:IT">ISO 3166-2:IT</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"><img alt="Flag of Jamaica" longdesc="/wiki/Image:Flag_of_Jamaica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Jamaica.svg/22px-Flag_of_Jamaica.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></td>
+<td>388</td>
+<td>JAM</td>
+<td id="JM">JM</td>
+<td><a href="/wiki/ISO_3166-2:JM" title="ISO 3166-2:JM">ISO 3166-2:JM</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"><img alt="Flag of Japan" longdesc="/wiki/Image:Flag_of_Japan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Flag_of_Japan.svg/22px-Flag_of_Japan.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></td>
+<td>392</td>
+<td>JPN</td>
+<td id="JP">JP</td>
+<td><a href="/wiki/ISO_3166-2:JP" title="ISO 3166-2:JP">ISO 3166-2:JP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"><img alt="Flag of Jersey" longdesc="/wiki/Image:Flag_of_Jersey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_Jersey.svg/22px-Flag_of_Jersey.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></td>
+<td>832</td>
+<td>JEY</td>
+
+<td id="JE">JE</td>
+<td><a href="/wiki/ISO_3166-2:JE" title="ISO 3166-2:JE">ISO 3166-2:JE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"><img alt="Flag of Jordan" longdesc="/wiki/Image:Flag_of_Jordan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Jordan.svg/22px-Flag_of_Jordan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></td>
+<td>400</td>
+<td>JOR</td>
+<td id="JO">JO</td>
+<td><a href="/w/index.php?title=ISO_3166-2:JO&amp;action=edit" class="new" title="ISO 3166-2:JO">ISO 3166-2:JO</a></td>
+</tr>
+
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"><img alt="Flag of Kazakhstan" longdesc="/wiki/Image:Flag_of_Kazakhstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kazakhstan.svg/22px-Flag_of_Kazakhstan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></td>
+<td>398</td>
+<td>KAZ</td>
+<td id="KZ">KZ</td>
+<td><a href="/wiki/ISO_3166-2:KZ" title="ISO 3166-2:KZ">ISO 3166-2:KZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"><img alt="Flag of Kenya" longdesc="/wiki/Image:Flag_of_Kenya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Kenya.svg/22px-Flag_of_Kenya.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></td>
+
+<td>404</td>
+<td>KEN</td>
+<td id="KE">KE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:KE&amp;action=edit" class="new" title="ISO 3166-2:KE">ISO 3166-2:KE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"><img alt="Flag of Kiribati" longdesc="/wiki/Image:Flag_of_Kiribati.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kiribati.svg/22px-Flag_of_Kiribati.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></td>
+<td>296</td>
+<td>KIR</td>
+<td id="KI">KI</td>
+
+<td><a href="/wiki/ISO_3166-2:KI" title="ISO 3166-2:KI">ISO 3166-2:KI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"><img alt="Flag of North Korea" longdesc="/wiki/Image:Flag_of_North_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Flag_of_North_Korea.svg/22px-Flag_of_North_Korea.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></td>
+<td>408</td>
+<td>PRK</td>
+<td id="KP">KP</td>
+<td><a href="/wiki/ISO_3166-2:KP" title="ISO 3166-2:KP">ISO 3166-2:KP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"><img alt="Flag of South Korea" longdesc="/wiki/Image:Flag_of_South_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_South_Korea.svg/22px-Flag_of_South_Korea.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></td>
+
+<td>410</td>
+<td>KOR</td>
+<td id="KR">KR</td>
+<td><a href="/wiki/ISO_3166-2:KR" title="ISO 3166-2:KR">ISO 3166-2:KR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"><img alt="Flag of Kuwait" longdesc="/wiki/Image:Flag_of_Kuwait.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Kuwait.svg/22px-Flag_of_Kuwait.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></td>
+<td>414</td>
+<td>KWT</td>
+<td id="KW">KW</td>
+
+<td><a href="/wiki/ISO_3166-2:KW" title="ISO 3166-2:KW">ISO 3166-2:KW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"><img alt="Flag of Kyrgyzstan" longdesc="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Kyrgyzstan.svg/22px-Flag_of_Kyrgyzstan.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></td>
+<td>417</td>
+<td>KGZ</td>
+<td id="KG">KG</td>
+<td><a href="/wiki/ISO_3166-2:KG" title="ISO 3166-2:KG">ISO 3166-2:KG</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"><img alt="Flag of Laos" longdesc="/wiki/Image:Flag_of_Laos.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Laos.svg/22px-Flag_of_Laos.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Lao People's Democratic Republic</a></td>
+<td>418</td>
+<td>LAO</td>
+<td id="LA">LA</td>
+<td><a href="/wiki/ISO_3166-2:LA" title="ISO 3166-2:LA">ISO 3166-2:LA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"><img alt="Flag of Latvia" longdesc="/wiki/Image:Flag_of_Latvia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Latvia.svg/22px-Flag_of_Latvia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></td>
+<td>428</td>
+
+<td>LVA</td>
+<td id="LV">LV</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LV&amp;action=edit" class="new" title="ISO 3166-2:LV">ISO 3166-2:LV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"><img alt="Flag of Lebanon" longdesc="/wiki/Image:Flag_of_Lebanon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Lebanon.svg/22px-Flag_of_Lebanon.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></td>
+<td>422</td>
+<td>LBN</td>
+<td id="LB">LB</td>
+<td><a href="/wiki/ISO_3166-2:LB" title="ISO 3166-2:LB">ISO 3166-2:LB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"><img alt="Flag of Lesotho" longdesc="/wiki/Image:Flag_of_Lesotho.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Flag_of_Lesotho.svg/22px-Flag_of_Lesotho.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></td>
+<td>426</td>
+<td>LSO</td>
+<td id="LS">LS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LS&amp;action=edit" class="new" title="ISO 3166-2:LS">ISO 3166-2:LS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"><img alt="Flag of Liberia" longdesc="/wiki/Image:Flag_of_Liberia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Liberia.svg/22px-Flag_of_Liberia.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></td>
+<td>430</td>
+
+<td>LBR</td>
+<td id="LR">LR</td>
+<td><a href="/wiki/ISO_3166-2:LR" title="ISO 3166-2:LR">ISO 3166-2:LR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"><img alt="Flag of Libya" longdesc="/wiki/Image:Flag_of_Libya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Libya.svg/22px-Flag_of_Libya.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libyan Arab Jamahiriya</a></td>
+<td>434</td>
+<td>LBY</td>
+<td id="LY">LY</td>
+<td><a href="/wiki/ISO_3166-2:LY" title="ISO 3166-2:LY">ISO 3166-2:LY</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"><img alt="Flag of Liechtenstein" longdesc="/wiki/Image:Flag_of_Liechtenstein.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Flag_of_Liechtenstein.svg/22px-Flag_of_Liechtenstein.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></td>
+<td>438</td>
+<td>LIE</td>
+<td id="LI">LI</td>
+<td><a href="/wiki/ISO_3166-2:LI" title="ISO 3166-2:LI">ISO 3166-2:LI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"><img alt="Flag of Lithuania" longdesc="/wiki/Image:Flag_of_Lithuania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Lithuania.svg/22px-Flag_of_Lithuania.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></td>
+<td>440</td>
+
+<td>LTU</td>
+<td id="LT">LT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LT&amp;action=edit" class="new" title="ISO 3166-2:LT">ISO 3166-2:LT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"><img alt="Flag of Luxembourg" longdesc="/wiki/Image:Flag_of_Luxembourg.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_Luxembourg.svg/22px-Flag_of_Luxembourg.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></td>
+<td>442</td>
+<td>LUX</td>
+<td id="LU">LU</td>
+<td><a href="/wiki/ISO_3166-2:LU" title="ISO 3166-2:LU">ISO 3166-2:LU</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"><img alt="Flag of Macau" longdesc="/wiki/Image:Flag_of_Macau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Flag_of_Macau.svg/22px-Flag_of_Macau.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macao</a></td>
+<td>446</td>
+<td>MAC</td>
+<td id="MO">MO</td>
+<td><a href="/wiki/ISO_3166-2:MO" title="ISO 3166-2:MO">ISO 3166-2:MO</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"><img alt="Flag of the Republic of Macedonia" longdesc="/wiki/Image:Flag_of_Macedonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_Macedonia.svg/22px-Flag_of_Macedonia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia, the former Yugoslav Republic of</a></td>
+<td>807</td>
+<td>MKD</td>
+<td id="MK">MK</td>
+<td><a href="/wiki/ISO_3166-2:MK" title="ISO 3166-2:MK">ISO 3166-2:MK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"><img alt="Flag of Madagascar" longdesc="/wiki/Image:Flag_of_Madagascar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Madagascar.svg/22px-Flag_of_Madagascar.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></td>
+<td>450</td>
+<td>MDG</td>
+
+<td id="MG">MG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MG&amp;action=edit" class="new" title="ISO 3166-2:MG">ISO 3166-2:MG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"><img alt="Flag of Malawi" longdesc="/wiki/Image:Flag_of_Malawi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Malawi.svg/22px-Flag_of_Malawi.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></td>
+<td>454</td>
+<td>MWI</td>
+<td id="MW">MW</td>
+<td><a href="/wiki/ISO_3166-2:MW" title="ISO 3166-2:MW">ISO 3166-2:MW</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"><img alt="Flag of Malaysia" longdesc="/wiki/Image:Flag_of_Malaysia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_Malaysia.svg/22px-Flag_of_Malaysia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></td>
+<td>458</td>
+<td>MYS</td>
+<td id="MY">MY</td>
+<td><a href="/wiki/ISO_3166-2:MY" title="ISO 3166-2:MY">ISO 3166-2:MY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"><img alt="Flag of the Maldives" longdesc="/wiki/Image:Flag_of_Maldives.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Maldives.svg/22px-Flag_of_Maldives.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></td>
+<td>462</td>
+
+<td>MDV</td>
+<td id="MV">MV</td>
+<td><a href="/wiki/ISO_3166-2:MV" title="ISO 3166-2:MV">ISO 3166-2:MV</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"><img alt="Flag of Mali" longdesc="/wiki/Image:Flag_of_Mali.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Mali.svg/22px-Flag_of_Mali.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></td>
+<td>466</td>
+<td>MLI</td>
+<td id="ML">ML</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ML&amp;action=edit" class="new" title="ISO 3166-2:ML">ISO 3166-2:ML</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"><img alt="Flag of Malta" longdesc="/wiki/Image:Flag_of_Malta.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Malta.svg/22px-Flag_of_Malta.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></td>
+<td>470</td>
+<td>MLT</td>
+<td id="MT">MT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MT&amp;action=edit" class="new" title="ISO 3166-2:MT">ISO 3166-2:MT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"><img alt="Flag of the Marshall Islands" longdesc="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Flag_of_the_Marshall_Islands.svg/22px-Flag_of_the_Marshall_Islands.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></td>
+<td>584</td>
+
+<td>MHL</td>
+<td id="MH">MH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MH&amp;action=edit" class="new" title="ISO 3166-2:MH">ISO 3166-2:MH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"><img alt="Flag of Martinique" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></td>
+<td>474</td>
+<td>MTQ</td>
+<td id="MQ">MQ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MQ&amp;action=edit" class="new" title="ISO 3166-2:MQ">ISO 3166-2:MQ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"><img alt="Flag of Mauritania" longdesc="/wiki/Image:Flag_of_Mauritania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Mauritania.svg/22px-Flag_of_Mauritania.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></td>
+<td>478</td>
+<td>MRT</td>
+<td id="MR">MR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MR&amp;action=edit" class="new" title="ISO 3166-2:MR">ISO 3166-2:MR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"><img alt="Flag of Mauritius" longdesc="/wiki/Image:Flag_of_Mauritius.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Mauritius.svg/22px-Flag_of_Mauritius.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></td>
+<td>480</td>
+
+<td>MUS</td>
+<td id="MU">MU</td>
+<td><a href="/wiki/ISO_3166-2:MU" title="ISO 3166-2:MU">ISO 3166-2:MU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"><img alt="Flag of Mayotte" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></td>
+<td>175</td>
+<td>MYT</td>
+<td id="YT">YT</td>
+<td><a href="/w/index.php?title=ISO_3166-2:YT&amp;action=edit" class="new" title="ISO 3166-2:YT">ISO 3166-2:YT</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"><img alt="Flag of Mexico" longdesc="/wiki/Image:Flag_of_Mexico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Flag_of_Mexico.svg/22px-Flag_of_Mexico.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></td>
+<td>484</td>
+<td>MEX</td>
+<td id="MX">MX</td>
+<td><a href="/wiki/ISO_3166-2:MX" title="ISO 3166-2:MX">ISO 3166-2:MX</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"><img alt="Flag of the Federated States of Micronesia" longdesc="/wiki/Image:Flag_of_Micronesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Micronesia.svg/22px-Flag_of_Micronesia.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia, Federated States of</a></td>
+<td>583</td>
+
+<td>FSM</td>
+<td id="FM">FM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:FM&amp;action=edit" class="new" title="ISO 3166-2:FM">ISO 3166-2:FM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"><img alt="Flag of Moldova" longdesc="/wiki/Image:Flag_of_Moldova.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Moldova.svg/22px-Flag_of_Moldova.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova, Republic of</a></td>
+<td>498</td>
+<td>MDA</td>
+<td id="MD">MD</td>
+<td><a href="/wiki/ISO_3166-2:MD" title="ISO 3166-2:MD">ISO 3166-2:MD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"><img alt="Flag of Monaco" longdesc="/wiki/Image:Flag_of_Monaco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Monaco.svg/22px-Flag_of_Monaco.svg.png" height="18" width="22"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></td>
+<td>492</td>
+<td>MCO</td>
+<td id="MC">MC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MC&amp;action=edit" class="new" title="ISO 3166-2:MC">ISO 3166-2:MC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"><img alt="Flag of Mongolia" longdesc="/wiki/Image:Flag_of_Mongolia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Mongolia.svg/22px-Flag_of_Mongolia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></td>
+<td>496</td>
+
+<td>MNG</td>
+<td id="MN">MN</td>
+<td><a href="/wiki/ISO_3166-2:MN" title="ISO 3166-2:MN">ISO 3166-2:MN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"><img alt="Flag of Montenegro" longdesc="/wiki/Image:Flag_of_Montenegro.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Montenegro.svg/22px-Flag_of_Montenegro.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></td>
+<td>499</td>
+<td>MNE</td>
+<td id="ME">ME</td>
+<td><a href="/wiki/ISO_3166-2:ME" title="ISO 3166-2:ME">ISO 3166-2:ME</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"><img alt="Flag of Montserrat" longdesc="/wiki/Image:Flag_of_Montserrat.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Montserrat.svg/22px-Flag_of_Montserrat.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></td>
+<td>500</td>
+<td>MSR</td>
+<td id="MS">MS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MS&amp;action=edit" class="new" title="ISO 3166-2:MS">ISO 3166-2:MS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"><img alt="Flag of Morocco" longdesc="/wiki/Image:Flag_of_Morocco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Morocco.svg/22px-Flag_of_Morocco.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></td>
+<td>504</td>
+
+<td>MAR</td>
+<td id="MA">MA</td>
+<td><a href="/wiki/ISO_3166-2:MA" title="ISO 3166-2:MA">ISO 3166-2:MA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"><img alt="Flag of Mozambique" longdesc="/wiki/Image:Flag_of_Mozambique.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Mozambique.svg/22px-Flag_of_Mozambique.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></td>
+<td>508</td>
+<td>MOZ</td>
+<td id="MZ">MZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MZ&amp;action=edit" class="new" title="ISO 3166-2:MZ">ISO 3166-2:MZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"><img alt="Flag of Myanmar" longdesc="/wiki/Image:Flag_of_Myanmar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Myanmar.svg/22px-Flag_of_Myanmar.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></td>
+<td>104</td>
+<td>MMR</td>
+<td id="MM">MM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MM&amp;action=edit" class="new" title="ISO 3166-2:MM">ISO 3166-2:MM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"><img alt="Flag of Namibia" longdesc="/wiki/Image:Flag_of_Namibia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Namibia.svg/22px-Flag_of_Namibia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></td>
+<td>516</td>
+<td>NAM</td>
+<td id="NA">NA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NA&amp;action=edit" class="new" title="ISO 3166-2:NA">ISO 3166-2:NA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"><img alt="Flag of Nauru" longdesc="/wiki/Image:Flag_of_Nauru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_of_Nauru.svg/22px-Flag_of_Nauru.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></td>
+<td>520</td>
+<td>NRU</td>
+
+<td id="NR">NR</td>
+<td><a href="/wiki/ISO_3166-2:NR" title="ISO 3166-2:NR">ISO 3166-2:NR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"><img alt="Flag of Nepal" longdesc="/wiki/Image:Flag_of_Nepal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Nepal.svg/16px-Flag_of_Nepal.svg.png" height="20" width="16"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></td>
+<td>524</td>
+<td>NPL</td>
+<td id="NP">NP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NP&amp;action=edit" class="new" title="ISO 3166-2:NP">ISO 3166-2:NP</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"><img alt="Flag of the Netherlands" longdesc="/wiki/Image:Flag_of_the_Netherlands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/22px-Flag_of_the_Netherlands.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td>
+<td>528</td>
+<td>NLD</td>
+<td id="NL">NL</td>
+<td><a href="/wiki/ISO_3166-2:NL" title="ISO 3166-2:NL">ISO 3166-2:NL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"><img alt="Flag of the Netherlands Antilles" longdesc="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Flag_of_the_Netherlands_Antilles.svg/22px-Flag_of_the_Netherlands_Antilles.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></td>
+<td>530</td>
+
+<td>ANT</td>
+<td id="AN">AN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:AN&amp;action=edit" class="new" title="ISO 3166-2:AN">ISO 3166-2:AN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"><img alt="Flag of New Caledonia" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></td>
+<td>540</td>
+<td>NCL</td>
+<td id="NC">NC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NC&amp;action=edit" class="new" title="ISO 3166-2:NC">ISO 3166-2:NC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"><img alt="Flag of New Zealand" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/22px-Flag_of_New_Zealand.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></td>
+<td>554</td>
+<td>NZL</td>
+<td id="NZ">NZ</td>
+<td><a href="/wiki/ISO_3166-2:NZ" title="ISO 3166-2:NZ">ISO 3166-2:NZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"><img alt="Flag of Nicaragua" longdesc="/wiki/Image:Flag_of_Nicaragua.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Nicaragua.svg/22px-Flag_of_Nicaragua.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></td>
+<td>558</td>
+
+<td>NIC</td>
+<td id="NI">NI</td>
+<td><a href="/wiki/ISO_3166-2:NI" title="ISO 3166-2:NI">ISO 3166-2:NI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"><img alt="Flag of Niger" longdesc="/wiki/Image:Flag_of_Niger.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_Niger.svg/22px-Flag_of_Niger.svg.png" height="19" width="22"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></td>
+<td>562</td>
+<td>NER</td>
+<td id="NE">NE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NE&amp;action=edit" class="new" title="ISO 3166-2:NE">ISO 3166-2:NE</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"><img alt="Flag of Nigeria" longdesc="/wiki/Image:Flag_of_Nigeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Nigeria.svg/22px-Flag_of_Nigeria.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></td>
+<td>566</td>
+<td>NGA</td>
+<td id="NG">NG</td>
+<td><a href="/wiki/ISO_3166-2:NG" title="ISO 3166-2:NG">ISO 3166-2:NG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"><img alt="Flag of Niue" longdesc="/wiki/Image:Flag_of_Niue.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/22px-Flag_of_Niue.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></td>
+<td>570</td>
+
+<td>NIU</td>
+<td id="NU">NU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NU&amp;action=edit" class="new" title="ISO 3166-2:NU">ISO 3166-2:NU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"><img alt="Flag of Norfolk Island" longdesc="/wiki/Image:Flag_of_Norfolk_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Norfolk_Island.svg/22px-Flag_of_Norfolk_Island.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></td>
+<td>574</td>
+<td>NFK</td>
+<td id="NF">NF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:NF&amp;action=edit" class="new" title="ISO 3166-2:NF">ISO 3166-2:NF</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"><img alt="Flag of the Northern Mariana Islands" longdesc="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_the_Northern_Mariana_Islands.svg/22px-Flag_of_the_Northern_Mariana_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></td>
+<td>580</td>
+<td>MNP</td>
+<td id="MP">MP</td>
+<td><a href="/w/index.php?title=ISO_3166-2:MP&amp;action=edit" class="new" title="ISO 3166-2:MP">ISO 3166-2:MP</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"><img alt="Flag of Norway" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></td>
+<td>578</td>
+
+<td>NOR</td>
+<td id="NO">NO</td>
+<td><a href="/wiki/ISO_3166-2:NO" title="ISO 3166-2:NO">ISO 3166-2:NO</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"><img alt="Flag of Oman" longdesc="/wiki/Image:Flag_of_Oman.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Oman.svg/22px-Flag_of_Oman.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></td>
+<td>512</td>
+<td>OMN</td>
+
+<td id="OM">OM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:OM&amp;action=edit" class="new" title="ISO 3166-2:OM">ISO 3166-2:OM</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"><img alt="Flag of Pakistan" longdesc="/wiki/Image:Flag_of_Pakistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Pakistan.svg/22px-Flag_of_Pakistan.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></td>
+<td>586</td>
+<td>PAK</td>
+<td id="PK">PK</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PK&amp;action=edit" class="new" title="ISO 3166-2:PK">ISO 3166-2:PK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"><img alt="Flag of Palau" longdesc="/wiki/Image:Flag_of_Palau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Palau.svg/22px-Flag_of_Palau.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></td>
+<td>585</td>
+<td>PLW</td>
+<td id="PW">PW</td>
+<td><a href="/wiki/ISO_3166-2:PW" title="ISO 3166-2:PW">ISO 3166-2:PW</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"><img alt="Palestinian flag" longdesc="/wiki/Image:Flag_of_Palestine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/22px-Flag_of_Palestine.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian Territory, Occupied</a></td>
+
+<td>275</td>
+<td>PSE</td>
+<td id="PS">PS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PS&amp;action=edit" class="new" title="ISO 3166-2:PS">ISO 3166-2:PS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"><img alt="Flag of Panama" longdesc="/wiki/Image:Flag_of_Panama.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Flag_of_Panama.svg/22px-Flag_of_Panama.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></td>
+<td>591</td>
+<td>PAN</td>
+<td id="PA">PA</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:PA&amp;action=edit" class="new" title="ISO 3166-2:PA">ISO 3166-2:PA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"><img alt="Flag of Papua New Guinea" longdesc="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Flag_of_Papua_New_Guinea.svg/22px-Flag_of_Papua_New_Guinea.svg.png" height="17" width="22"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></td>
+<td>598</td>
+<td>PNG</td>
+<td id="PG">PG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PG&amp;action=edit" class="new" title="ISO 3166-2:PG">ISO 3166-2:PG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"><img alt="Flag of Paraguay" longdesc="/wiki/Image:Flag_of_Paraguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Paraguay.svg/22px-Flag_of_Paraguay.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></td>
+
+<td>600</td>
+<td>PRY</td>
+<td id="PY">PY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PY&amp;action=edit" class="new" title="ISO 3166-2:PY">ISO 3166-2:PY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"><img alt="Flag of Peru" longdesc="/wiki/Image:Flag_of_Peru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Peru.svg/22px-Flag_of_Peru.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></td>
+<td>604</td>
+<td>PER</td>
+<td id="PE">PE</td>
+
+<td><a href="/wiki/ISO_3166-2:PE" title="ISO 3166-2:PE">ISO 3166-2:PE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"><img alt="Flag of the Philippines" longdesc="/wiki/Image:Flag_of_the_Philippines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_the_Philippines.svg/22px-Flag_of_the_Philippines.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></td>
+<td>608</td>
+<td>PHL</td>
+<td id="PH">PH</td>
+<td><a href="/wiki/ISO_3166-2:PH" title="ISO 3166-2:PH">ISO 3166-2:PH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"><img alt="Flag of the Pitcairn Islands" longdesc="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Flag_of_the_Pitcairn_Islands.svg/22px-Flag_of_the_Pitcairn_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn</a></td>
+
+<td>612</td>
+<td>PCN</td>
+<td id="PN">PN</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PN&amp;action=edit" class="new" title="ISO 3166-2:PN">ISO 3166-2:PN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"><img alt="Flag of Poland" longdesc="/wiki/Image:Flag_of_Poland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_Poland.svg/22px-Flag_of_Poland.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></td>
+<td>616</td>
+<td>POL</td>
+<td id="PL">PL</td>
+
+<td><a href="/wiki/ISO_3166-2:PL" title="ISO 3166-2:PL">ISO 3166-2:PL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"><img alt="Flag of Portugal" longdesc="/wiki/Image:Flag_of_Portugal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Portugal.svg/22px-Flag_of_Portugal.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></td>
+<td>620</td>
+<td>PRT</td>
+<td id="PT">PT</td>
+<td><a href="/wiki/ISO_3166-2:PT" title="ISO 3166-2:PT">ISO 3166-2:PT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"><img alt="Flag of Puerto Rico" longdesc="/wiki/Image:Flag_of_Puerto_Rico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Puerto_Rico.svg/22px-Flag_of_Puerto_Rico.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></td>
+
+<td>630</td>
+<td>PRI</td>
+<td id="PR">PR</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PR&amp;action=edit" class="new" title="ISO 3166-2:PR">ISO 3166-2:PR</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"><img alt="Flag of Qatar" longdesc="/wiki/Image:Flag_of_Qatar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Flag_of_Qatar.svg/22px-Flag_of_Qatar.svg.png" height="9" width="22"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></td>
+<td>634</td>
+
+<td>QAT</td>
+<td id="QA">QA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:QA&amp;action=edit" class="new" title="ISO 3166-2:QA">ISO 3166-2:QA</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"><img alt="Flag of Réunion" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></td>
+<td>638</td>
+<td>REU</td>
+
+<td id="RE">RE</td>
+<td><a href="/w/index.php?title=ISO_3166-2:RE&amp;action=edit" class="new" title="ISO 3166-2:RE">ISO 3166-2:RE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"><img alt="Flag of Romania" longdesc="/wiki/Image:Flag_of_Romania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Romania.svg/22px-Flag_of_Romania.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></td>
+<td>642</td>
+<td>ROU</td>
+<td id="RO">RO</td>
+<td><a href="/wiki/ISO_3166-2:RO" title="ISO 3166-2:RO">ISO 3166-2:RO</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"><img alt="Flag of Russia" longdesc="/wiki/Image:Flag_of_Russia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Russia.svg/22px-Flag_of_Russia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russian Federation</a></td>
+<td>643</td>
+<td>RUS</td>
+<td id="RU">RU</td>
+<td><a href="/wiki/ISO_3166-2:RU" title="ISO 3166-2:RU">ISO 3166-2:RU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"><img alt="Flag of Rwanda" longdesc="/wiki/Image:Flag_of_Rwanda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Rwanda.svg/22px-Flag_of_Rwanda.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></td>
+<td>646</td>
+
+<td>RWA</td>
+<td id="RW">RW</td>
+<td><a href="/wiki/ISO_3166-2:RW" title="ISO 3166-2:RW">ISO 3166-2:RW</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"><img alt="Flag of Saint Helena" longdesc="/wiki/Image:Flag_of_Saint_Helena.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Saint_Helena.svg/22px-Flag_of_Saint_Helena.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></td>
+<td>654</td>
+<td>SHN</td>
+
+<td id="SH">SH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SH&amp;action=edit" class="new" title="ISO 3166-2:SH">ISO 3166-2:SH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"><img alt="Flag of Saint Kitts and Nevis" longdesc="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Saint_Kitts_and_Nevis.svg/22px-Flag_of_Saint_Kitts_and_Nevis.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></td>
+<td>659</td>
+<td>KNA</td>
+<td id="KN">KN</td>
+<td><a href="/wiki/ISO_3166-2:KN" title="ISO 3166-2:KN">ISO 3166-2:KN</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"><img alt="Flag of Saint Lucia" longdesc="/wiki/Image:Flag_of_Saint_Lucia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Saint_Lucia.svg/22px-Flag_of_Saint_Lucia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></td>
+<td>662</td>
+<td>LCA</td>
+<td id="LC">LC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LC&amp;action=edit" class="new" title="ISO 3166-2:LC">ISO 3166-2:LC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"><img alt="Flag of Saint Pierre and Miquelon" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></td>
+<td>666</td>
+
+<td>SPM</td>
+<td id="PM">PM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:PM&amp;action=edit" class="new" title="ISO 3166-2:PM">ISO 3166-2:PM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"><img alt="Flag of Saint Vincent and the Grenadines" longdesc="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg/22px-Flag_of_Saint_Vincent_and_the_Grenadines.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></td>
+<td>670</td>
+<td>VCT</td>
+<td id="VC">VC</td>
+<td><a href="/wiki/ISO_3166-2:VC" title="ISO 3166-2:VC">ISO 3166-2:VC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"><img alt="Flag of Samoa" longdesc="/wiki/Image:Flag_of_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Samoa.svg/22px-Flag_of_Samoa.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></td>
+<td>882</td>
+<td>WSM</td>
+<td id="WS">WS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WS&amp;action=edit" class="new" title="ISO 3166-2:WS">ISO 3166-2:WS</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"><img alt="Flag of San Marino" longdesc="/wiki/Image:Flag_of_San_Marino.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_San_Marino.svg/22px-Flag_of_San_Marino.svg.png" height="17" width="22"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></td>
+<td>674</td>
+
+<td>SMR</td>
+<td id="SM">SM</td>
+<td><a href="/wiki/ISO_3166-2:SM" title="ISO 3166-2:SM">ISO 3166-2:SM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"><img alt="Flag of São Tomé and Príncipe" longdesc="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Sao_Tome_and_Principe.svg/22px-Flag_of_Sao_Tome_and_Principe.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></td>
+<td>678</td>
+<td>STP</td>
+<td id="ST">ST</td>
+<td><a href="/wiki/ISO_3166-2:ST" title="ISO 3166-2:ST">ISO 3166-2:ST</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"><img alt="Flag of Saudi Arabia" longdesc="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Flag_of_Saudi_Arabia.svg/22px-Flag_of_Saudi_Arabia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></td>
+<td>682</td>
+<td>SAU</td>
+<td id="SA">SA</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SA&amp;action=edit" class="new" title="ISO 3166-2:SA">ISO 3166-2:SA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"><img alt="Flag of Senegal" longdesc="/wiki/Image:Flag_of_Senegal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/22px-Flag_of_Senegal.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></td>
+<td>686</td>
+
+<td>SEN</td>
+<td id="SN">SN</td>
+<td><a href="/wiki/ISO_3166-2:SN" title="ISO 3166-2:SN">ISO 3166-2:SN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"><img alt="Flag of Serbia" longdesc="/wiki/Image:Flag_of_Serbia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Flag_of_Serbia.svg/22px-Flag_of_Serbia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></td>
+<td>688</td>
+<td>SRB</td>
+<td id="RS">RS</td>
+<td><a href="/wiki/ISO_3166-2:RS" title="ISO 3166-2:RS">ISO 3166-2:RS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"><img alt="Flag of the Seychelles" longdesc="/wiki/Image:Flag_of_the_Seychelles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Seychelles.svg/22px-Flag_of_the_Seychelles.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></td>
+<td>690</td>
+<td>SYC</td>
+<td id="SC">SC</td>
+<td><a href="/wiki/ISO_3166-2:SC" title="ISO 3166-2:SC">ISO 3166-2:SC</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"><img alt="Flag of Sierra Leone" longdesc="/wiki/Image:Flag_of_Sierra_Leone.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Sierra_Leone.svg/22px-Flag_of_Sierra_Leone.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></td>
+<td>694</td>
+
+<td>SLE</td>
+<td id="SL">SL</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SL&amp;action=edit" class="new" title="ISO 3166-2:SL">ISO 3166-2:SL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"><img alt="Flag of Singapore" longdesc="/wiki/Image:Flag_of_Singapore.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Singapore.svg/22px-Flag_of_Singapore.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></td>
+<td>702</td>
+<td>SGP</td>
+<td id="SG">SG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SG&amp;action=edit" class="new" title="ISO 3166-2:SG">ISO 3166-2:SG</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"><img alt="Flag of Slovakia" longdesc="/wiki/Image:Flag_of_Slovakia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Slovakia.svg/22px-Flag_of_Slovakia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></td>
+<td>703</td>
+<td>SVK</td>
+<td id="SK">SK</td>
+<td><a href="/wiki/ISO_3166-2:SK" title="ISO 3166-2:SK">ISO 3166-2:SK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"><img alt="Flag of Slovenia" longdesc="/wiki/Image:Flag_of_Slovenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Slovenia.svg/22px-Flag_of_Slovenia.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></td>
+<td>705</td>
+
+<td>SVN</td>
+<td id="SI">SI</td>
+<td><a href="/wiki/ISO_3166-2:SI" title="ISO 3166-2:SI">ISO 3166-2:SI</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"><img alt="Flag of the Solomon Islands" longdesc="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Solomon_Islands.svg/22px-Flag_of_the_Solomon_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></td>
+<td>090</td>
+<td>SLB</td>
+<td id="SB">SB</td>
+<td><a href="/wiki/ISO_3166-2:SB" title="ISO 3166-2:SB">ISO 3166-2:SB</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"><img alt="Flag of Somalia" longdesc="/wiki/Image:Flag_of_Somalia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Somalia.svg/22px-Flag_of_Somalia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></td>
+<td>706</td>
+<td>SOM</td>
+<td id="SO">SO</td>
+<td><a href="/wiki/ISO_3166-2:SO" title="ISO 3166-2:SO">ISO 3166-2:SO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"><img alt="Flag of South Africa" longdesc="/wiki/Image:Flag_of_South_Africa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Flag_of_South_Africa.svg/22px-Flag_of_South_Africa.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></td>
+<td>710</td>
+
+<td>ZAF</td>
+<td id="ZA">ZA</td>
+<td><a href="/wiki/ISO_3166-2:ZA" title="ISO 3166-2:ZA">ISO 3166-2:ZA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"><img alt="Flag of South Georgia and the South Sandwich Islands" longdesc="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg/22px-Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></td>
+<td>239</td>
+<td>SGS</td>
+<td id="GS">GS</td>
+<td><a href="/w/index.php?title=ISO_3166-2:GS&amp;action=edit" class="new" title="ISO 3166-2:GS">ISO 3166-2:GS</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"><img alt="Flag of Spain" longdesc="/wiki/Image:Flag_of_Spain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Spain.svg/22px-Flag_of_Spain.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></td>
+<td>724</td>
+<td>ESP</td>
+<td id="ES">ES</td>
+<td><a href="/wiki/ISO_3166-2:ES" title="ISO 3166-2:ES">ISO 3166-2:ES</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"><img alt="Flag of Sri Lanka" longdesc="/wiki/Image:Flag_of_Sri_Lanka.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Sri_Lanka.svg/22px-Flag_of_Sri_Lanka.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></td>
+<td>144</td>
+
+<td>LKA</td>
+<td id="LK">LK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:LK&amp;action=edit" class="new" title="ISO 3166-2:LK">ISO 3166-2:LK</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"><img alt="Flag of Sudan" longdesc="/wiki/Image:Flag_of_Sudan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Sudan.svg/22px-Flag_of_Sudan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></td>
+<td>736</td>
+<td>SDN</td>
+<td id="SD">SD</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SD&amp;action=edit" class="new" title="ISO 3166-2:SD">ISO 3166-2:SD</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"><img alt="Flag of Suriname" longdesc="/wiki/Image:Flag_of_Suriname.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_Suriname.svg/22px-Flag_of_Suriname.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></td>
+<td>740</td>
+<td>SUR</td>
+<td id="SR">SR</td>
+<td><a href="/wiki/ISO_3166-2:SR" title="ISO 3166-2:SR">ISO 3166-2:SR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Svalbard and Jan Mayen"><img alt="Flag of Svalbard and Jan Mayen" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/22px-Flag_of_Norway.svg.png" height="16" width="22"></a>&nbsp;<a href="/wiki/Svalbard_and_Jan_Mayen" title="Svalbard and Jan Mayen">Svalbard and Jan Mayen</a></td>
+<td>744</td>
+
+<td>SJM</td>
+<td id="SJ">SJ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SJ&amp;action=edit" class="new" title="ISO 3166-2:SJ">ISO 3166-2:SJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"><img alt="Flag of Swaziland" longdesc="/wiki/Image:Flag_of_Swaziland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Flag_of_Swaziland.svg/22px-Flag_of_Swaziland.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></td>
+<td>748</td>
+<td>SWZ</td>
+<td id="SZ">SZ</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SZ&amp;action=edit" class="new" title="ISO 3166-2:SZ">ISO 3166-2:SZ</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"><img alt="Flag of Sweden" longdesc="/wiki/Image:Flag_of_Sweden.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Sweden.svg/22px-Flag_of_Sweden.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></td>
+<td>752</td>
+<td>SWE</td>
+<td id="SE">SE</td>
+<td><a href="/wiki/ISO_3166-2:SE" title="ISO 3166-2:SE">ISO 3166-2:SE</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"><img alt="Flag of Switzerland" longdesc="/wiki/Image:Flag_of_Switzerland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Switzerland.svg/20px-Flag_of_Switzerland.svg.png" height="20" width="20"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></td>
+<td>756</td>
+
+<td>CHE</td>
+<td id="CH">CH</td>
+<td><a href="/wiki/ISO_3166-2:CH" title="ISO 3166-2:CH">ISO 3166-2:CH</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"><img alt="Flag of Syria" longdesc="/wiki/Image:Flag_of_Syria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Flag_of_Syria.svg/22px-Flag_of_Syria.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syrian Arab Republic</a></td>
+<td>760</td>
+<td>SYR</td>
+<td id="SY">SY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:SY&amp;action=edit" class="new" title="ISO 3166-2:SY">ISO 3166-2:SY</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"><img alt="Flag of the Republic of China" longdesc="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_the_Republic_of_China.svg/22px-Flag_of_the_Republic_of_China.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">Taiwan, Province of China</a></td>
+<td>158</td>
+<td>TWN</td>
+<td id="TW">TW</td>
+<td><a href="/wiki/ISO_3166-2:TW" title="ISO 3166-2:TW">ISO 3166-2:TW</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"><img alt="Flag of Tajikistan" longdesc="/wiki/Image:Flag_of_Tajikistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Tajikistan.svg/22px-Flag_of_Tajikistan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></td>
+<td>762</td>
+<td>TJK</td>
+<td id="TJ">TJ</td>
+<td><a href="/wiki/ISO_3166-2:TJ" title="ISO 3166-2:TJ">ISO 3166-2:TJ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"><img alt="Flag of Tanzania" longdesc="/wiki/Image:Flag_of_Tanzania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tanzania.svg/22px-Flag_of_Tanzania.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania, United Republic of</a></td>
+<td>834</td>
+<td>TZA</td>
+
+<td id="TZ">TZ</td>
+<td><a href="/wiki/ISO_3166-2:TZ" title="ISO 3166-2:TZ">ISO 3166-2:TZ</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"><img alt="Flag of Thailand" longdesc="/wiki/Image:Flag_of_Thailand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Thailand.svg/22px-Flag_of_Thailand.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></td>
+<td>764</td>
+<td>THA</td>
+<td id="TH">TH</td>
+<td><a href="/wiki/ISO_3166-2:TH" title="ISO 3166-2:TH">ISO 3166-2:TH</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"><img alt="Flag of East Timor" longdesc="/wiki/Image:Flag_of_East_Timor.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_East_Timor.svg/22px-Flag_of_East_Timor.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></td>
+<td>626</td>
+<td>TLS</td>
+<td id="TL">TL</td>
+<td><a href="/wiki/ISO_3166-2:TL" title="ISO 3166-2:TL">ISO 3166-2:TL</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"><img alt="Flag of Togo" longdesc="/wiki/Image:Flag_of_Togo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Togo.svg/22px-Flag_of_Togo.svg.png" height="14" width="22"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></td>
+<td>768</td>
+
+<td>TGO</td>
+<td id="TG">TG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TG&amp;action=edit" class="new" title="ISO 3166-2:TG">ISO 3166-2:TG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"><img alt="Flag of Tokelau" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/22px-Flag_of_New_Zealand.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></td>
+<td>772</td>
+<td>TKL</td>
+<td id="TK">TK</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TK&amp;action=edit" class="new" title="ISO 3166-2:TK">ISO 3166-2:TK</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"><img alt="Flag of Tonga" longdesc="/wiki/Image:Flag_of_Tonga.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Tonga.svg/22px-Flag_of_Tonga.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></td>
+<td>776</td>
+<td>TON</td>
+<td id="TO">TO</td>
+<td><a href="/wiki/ISO_3166-2:TO" title="ISO 3166-2:TO">ISO 3166-2:TO</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"><img alt="Flag of Trinidad and Tobago" longdesc="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Trinidad_and_Tobago.svg/22px-Flag_of_Trinidad_and_Tobago.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></td>
+<td>780</td>
+
+<td>TTO</td>
+<td id="TT">TT</td>
+<td><a href="/wiki/ISO_3166-2:TT" title="ISO 3166-2:TT">ISO 3166-2:TT</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"><img alt="Flag of Tunisia" longdesc="/wiki/Image:Flag_of_Tunisia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Tunisia.svg/22px-Flag_of_Tunisia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></td>
+<td>788</td>
+<td>TUN</td>
+<td id="TN">TN</td>
+<td><a href="/wiki/ISO_3166-2:TN" title="ISO 3166-2:TN">ISO 3166-2:TN</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"><img alt="Flag of Turkey" longdesc="/wiki/Image:Flag_of_Turkey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Turkey.svg/22px-Flag_of_Turkey.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></td>
+<td>792</td>
+<td>TUR</td>
+<td id="TR">TR</td>
+<td><a href="/wiki/ISO_3166-2:TR" title="ISO 3166-2:TR">ISO 3166-2:TR</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"><img alt="Flag of Turkmenistan" longdesc="/wiki/Image:Flag_of_Turkmenistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Turkmenistan.svg/22px-Flag_of_Turkmenistan.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></td>
+<td>795</td>
+
+<td>TKM</td>
+<td id="TM">TM</td>
+<td><a href="/wiki/ISO_3166-2:TM" title="ISO 3166-2:TM">ISO 3166-2:TM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"><img alt="Flag of the Turks and Caicos Islands" longdesc="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_the_Turks_and_Caicos_Islands.svg/22px-Flag_of_the_Turks_and_Caicos_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></td>
+<td>796</td>
+<td>TCA</td>
+<td id="TC">TC</td>
+<td><a href="/w/index.php?title=ISO_3166-2:TC&amp;action=edit" class="new" title="ISO 3166-2:TC">ISO 3166-2:TC</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"><img alt="Flag of Tuvalu" longdesc="/wiki/Image:Flag_of_Tuvalu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tuvalu.svg/22px-Flag_of_Tuvalu.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></td>
+<td>798</td>
+<td>TUV</td>
+<td id="TV">TV</td>
+<td><a href="/wiki/ISO_3166-2:TV" title="ISO 3166-2:TV">ISO 3166-2:TV</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"><img alt="Flag of Uganda" longdesc="/wiki/Image:Flag_of_Uganda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Uganda.svg/22px-Flag_of_Uganda.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></td>
+<td>800</td>
+<td>UGA</td>
+<td id="UG">UG</td>
+<td><a href="/wiki/ISO_3166-2:UG" title="ISO 3166-2:UG">ISO 3166-2:UG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"><img alt="Flag of Ukraine" longdesc="/wiki/Image:Flag_of_Ukraine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Ukraine.svg/22px-Flag_of_Ukraine.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></td>
+<td>804</td>
+<td>UKR</td>
+
+<td id="UA">UA</td>
+<td><a href="/wiki/ISO_3166-2:UA" title="ISO 3166-2:UA">ISO 3166-2:UA</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"><img alt="Flag of the United Arab Emirates" longdesc="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_United_Arab_Emirates.svg/22px-Flag_of_the_United_Arab_Emirates.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></td>
+<td>784</td>
+<td>ARE</td>
+<td id="AE">AE</td>
+<td><a href="/wiki/ISO_3166-2:AE" title="ISO 3166-2:AE">ISO 3166-2:AE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"><img alt="Flag of the United Kingdom" longdesc="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/22px-Flag_of_the_United_Kingdom.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></td>
+<td>826</td>
+<td>GBR</td>
+<td id="GB">GB</td>
+<td><a href="/wiki/ISO_3166-2:GB" title="ISO 3166-2:GB">ISO 3166-2:GB</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/22px-Flag_of_the_United_States.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></td>
+<td>840</td>
+
+<td>USA</td>
+<td id="US">US</td>
+<td><a href="/wiki/ISO_3166-2:US" title="ISO 3166-2:US">ISO 3166-2:US</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of United States Minor Outlying Islands"><img alt="Flag of United States Minor Outlying Islands" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/22px-Flag_of_the_United_States.svg.png" height="12" width="22"></a>&nbsp;<a href="/wiki/United_States_Minor_Outlying_Islands" title="United States Minor Outlying Islands">United States Minor Outlying Islands</a></td>
+<td>581</td>
+<td>UMI</td>
+<td id="UM">UM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UM&amp;action=edit" class="new" title="ISO 3166-2:UM">ISO 3166-2:UM</a></td>
+
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"><img alt="Flag of Uruguay" longdesc="/wiki/Image:Flag_of_Uruguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Uruguay.svg/22px-Flag_of_Uruguay.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></td>
+<td>858</td>
+<td>URY</td>
+<td id="UY">UY</td>
+<td><a href="/w/index.php?title=ISO_3166-2:UY&amp;action=edit" class="new" title="ISO 3166-2:UY">ISO 3166-2:UY</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"><img alt="Flag of Uzbekistan" longdesc="/wiki/Image:Flag_of_Uzbekistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Uzbekistan.svg/22px-Flag_of_Uzbekistan.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></td>
+<td>860</td>
+
+<td>UZB</td>
+<td id="UZ">UZ</td>
+<td><a href="/wiki/ISO_3166-2:UZ" title="ISO 3166-2:UZ">ISO 3166-2:UZ</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"><img alt="Flag of Vanuatu" longdesc="/wiki/Image:Flag_of_Vanuatu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Vanuatu.svg/22px-Flag_of_Vanuatu.svg.png" height="13" width="22"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></td>
+<td>548</td>
+<td>VUT</td>
+
+<td id="VU">VU</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VU&amp;action=edit" class="new" title="ISO 3166-2:VU">ISO 3166-2:VU</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"><img alt="Flag of Venezuela" longdesc="/wiki/Image:Flag_of_Venezuela.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Venezuela.svg/22px-Flag_of_Venezuela.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></td>
+<td>862</td>
+<td>VEN</td>
+<td id="VE">VE</td>
+<td><a href="/wiki/ISO_3166-2:VE" title="ISO 3166-2:VE">ISO 3166-2:VE</a></td>
+</tr>
+
+<tr>
+<td><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"><img alt="Flag of Vietnam" longdesc="/wiki/Image:Flag_of_Vietnam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Vietnam.svg/22px-Flag_of_Vietnam.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Viet Nam</a></td>
+<td>704</td>
+<td>VNM</td>
+<td id="VN">VN</td>
+<td><a href="/wiki/ISO_3166-2:VN" title="ISO 3166-2:VN">ISO 3166-2:VN</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"><img alt="Flag of the British Virgin Islands" longdesc="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_the_British_Virgin_Islands.svg/22px-Flag_of_the_British_Virgin_Islands.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">Virgin Islands, British</a></td>
+<td>092</td>
+
+<td>VGB</td>
+<td id="VG">VG</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VG&amp;action=edit" class="new" title="ISO 3166-2:VG">ISO 3166-2:VG</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"><img alt="Flag of the United States Virgin Islands" longdesc="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_the_United_States_Virgin_Islands.svg/22px-Flag_of_the_United_States_Virgin_Islands.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">Virgin Islands, U.S.</a></td>
+<td>850</td>
+<td>VIR</td>
+<td id="VI">VI</td>
+<td><a href="/w/index.php?title=ISO_3166-2:VI&amp;action=edit" class="new" title="ISO 3166-2:VI">ISO 3166-2:VI</a></td>
+
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"><img alt="Flag of Wallis and Futuna" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/22px-Flag_of_France.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></td>
+<td>876</td>
+<td>WLF</td>
+<td id="WF">WF</td>
+<td><a href="/w/index.php?title=ISO_3166-2:WF&amp;action=edit" class="new" title="ISO 3166-2:WF">ISO 3166-2:WF</a></td>
+</tr>
+<tr>
+
+<td><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"><img alt="Flag of Western Sahara" longdesc="/wiki/Image:Flag_of_Western_Sahara.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Flag_of_Western_Sahara.svg/22px-Flag_of_Western_Sahara.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></td>
+<td>732</td>
+<td>ESH</td>
+<td id="EH">EH</td>
+<td><a href="/w/index.php?title=ISO_3166-2:EH&amp;action=edit" class="new" title="ISO 3166-2:EH">ISO 3166-2:EH</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"><img alt="Flag of Yemen" longdesc="/wiki/Image:Flag_of_Yemen.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Yemen.svg/22px-Flag_of_Yemen.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></td>
+
+<td>887</td>
+<td>YEM</td>
+<td id="YE">YE</td>
+<td><a href="/wiki/ISO_3166-2:YE" title="ISO 3166-2:YE">ISO 3166-2:YE</a></td>
+</tr>
+<tr bgcolor="lightgray">
+<td colspan="5"></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"><img alt="Flag of Zambia" longdesc="/wiki/Image:Flag_of_Zambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Zambia.svg/22px-Flag_of_Zambia.svg.png" height="15" width="22"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></td>
+<td>894</td>
+
+<td>ZMB</td>
+<td id="ZM">ZM</td>
+<td><a href="/w/index.php?title=ISO_3166-2:ZM&amp;action=edit" class="new" title="ISO 3166-2:ZM">ISO 3166-2:ZM</a></td>
+</tr>
+<tr>
+<td><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"><img alt="Flag of Zimbabwe" longdesc="/wiki/Image:Flag_of_Zimbabwe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Flag_of_Zimbabwe.svg/22px-Flag_of_Zimbabwe.svg.png" height="11" width="22"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></td>
+<td>716</td>
+<td>ZWE</td>
+<td id="ZW">ZW</td>
+
+<td><a href="/w/index.php?title=ISO_3166-2:ZW&amp;action=edit" class="new" title="ISO 3166-2:ZW">ISO 3166-2:ZW</a></td>
+</tr>
+
+</tbody>
+</table>
+
+<h1>Country Continent Mapping</h1>
+<p>abstracted from <a href="http://en.wikipedia.org/wiki/List_of_countries_by_continent">wikipedia continent country page</a></p>
+<table id="continents">
+<!-- Africa -->
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Algeria.svg" class="image" title="Flag of Algeria"><img alt="Flag of Algeria" longdesc="/wiki/Image:Flag_of_Algeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/50px-Flag_of_Algeria.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Algeria" title="Algeria">Algeria</a></b> – <a href="/wiki/Algiers" title="Algiers">Algiers</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Angola.svg" class="image" title="Flag of Angola"><img alt="Flag of Angola" longdesc="/wiki/Image:Flag_of_Angola.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Flag_of_Angola.svg/50px-Flag_of_Angola.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Angola" title="Angola">Angola</a></b> – <a href="/wiki/Luanda" title="Luanda">Luanda</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Benin.svg" class="image" title="Flag of Benin"><img alt="Flag of Benin" longdesc="/wiki/Image:Flag_of_Benin.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Benin.svg/50px-Flag_of_Benin.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Benin" title="Benin">Benin</a></b> – <a href="/wiki/Porto-Novo" title="Porto-Novo">Porto-Novo</a> (seat of government at <a href="/wiki/Cotonou" title="Cotonou">Cotonou</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Botswana.svg" class="image" title="Flag of Botswana"><img alt="Flag of Botswana" longdesc="/wiki/Image:Flag_of_Botswana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Botswana.svg/50px-Flag_of_Botswana.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Botswana" title="Botswana">Botswana</a></b> – <a href="/wiki/Gaborone" title="Gaborone">Gaborone</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burkina_Faso.svg" class="image" title="Flag of Burkina Faso"><img alt="Flag of Burkina Faso" longdesc="/wiki/Image:Flag_of_Burkina_Faso.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Burkina_Faso.svg/50px-Flag_of_Burkina_Faso.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Burkina_Faso" title="Burkina Faso">Burkina Faso</a></b> – <a href="/wiki/Ouagadougou" title="Ouagadougou">Ouagadougou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Burundi.svg" class="image" title="Flag of Burundi"><img alt="Flag of Burundi" longdesc="/wiki/Image:Flag_of_Burundi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Flag_of_Burundi.svg/50px-Flag_of_Burundi.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Burundi" title="Burundi">Burundi</a></b> – <a href="/wiki/Bujumbura" title="Bujumbura">Bujumbura</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cameroon.svg" class="image" title="Flag of Cameroon"><img alt="Flag of Cameroon" longdesc="/wiki/Image:Flag_of_Cameroon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Cameroon.svg/50px-Flag_of_Cameroon.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Cameroon" title="Cameroon">Cameroon</a></b> – <a href="/wiki/Yaound%C3%A9" title="Yaoundé">Yaoundé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cape_Verde.svg" class="image" title="Flag of Cape Verde"><img alt="Flag of Cape Verde" longdesc="/wiki/Image:Flag_of_Cape_Verde.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Cape_Verde.svg/50px-Flag_of_Cape_Verde.svg.png" height="29" width="50"></a>&nbsp;<a href="/wiki/Cape_Verde" title="Cape Verde">Cape Verde</a></b> – <a href="/wiki/Praia" title="Praia">Praia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="image" title="Flag of the Central African Republic"><img alt="Flag of the Central African Republic" longdesc="/wiki/Image:Flag_of_the_Central_African_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Central_African_Republic.svg/50px-Flag_of_the_Central_African_Republic.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Central_African_Republic" title="Central African Republic">Central African Republic</a></b> – <a href="/wiki/Bangui" title="Bangui">Bangui</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Chad.svg" class="image" title="Flag of Chad"><img alt="Flag of Chad" longdesc="/wiki/Image:Flag_of_Chad.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Chad.svg/50px-Flag_of_Chad.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Chad" title="Chad">Chad</a></b> – <a href="/wiki/N%27Djamena" title="N'Djamena">N'Djamena</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Comoros.svg" class="image" title="Flag of the Comoros"><img alt="Flag of the Comoros" longdesc="/wiki/Image:Flag_of_the_Comoros.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Comoros.svg/50px-Flag_of_the_Comoros.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Comoros" title="Comoros">Comoros</a></b> – <a href="/wiki/Moroni%2C_Comoros" title="Moroni, Comoros">Moroni</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="image" title="Flag of the Democratic Republic of the Congo"><img alt="Flag of the Democratic Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Democratic_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg/50px-Flag_of_the_Democratic_Republic_of_the_Congo.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Democratic_Republic_of_the_Congo" title="Democratic Republic of the Congo">Congo, Democratic Republic of</a></b> (also known as <b>Congo-Kinshasa</b>, formerly known as <b>Zaire</b>) – <a href="/wiki/Kinshasa" title="Kinshasa">Kinshasa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="image" title="Flag of the Republic of the Congo"><img alt="Flag of the Republic of the Congo" longdesc="/wiki/Image:Flag_of_the_Republic_of_the_Congo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Republic_of_the_Congo.svg/50px-Flag_of_the_Republic_of_the_Congo.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Republic_of_the_Congo" title="Republic of the Congo">Congo, Republic of</a></b> (also known as <b>Congo-Brazzaville</b>) – <a href="/wiki/Brazzaville" title="Brazzaville">Brazzaville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="image" title="Flag of Côte d'Ivoire"><img alt="Flag of Côte d'Ivoire" longdesc="/wiki/Image:Flag_of_Cote_d%27Ivoire.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_Cote_d%27Ivoire.svg/50px-Flag_of_Cote_d%27Ivoire.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/C%C3%B4te_d%27Ivoire" title="Côte d'Ivoire">Côte d'Ivoire</a></b> (commonly known as <b>Ivory Coast</b>) – <a href="/wiki/Yamoussoukro" title="Yamoussoukro">Yamoussoukro</a> (seat of government at <a href="/wiki/Abidjan" title="Abidjan">Abidjan</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Djibouti.svg" class="image" title="Flag of Djibouti"><img alt="Flag of Djibouti" longdesc="/wiki/Image:Flag_of_Djibouti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_Djibouti.svg/50px-Flag_of_Djibouti.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Djibouti" title="Djibouti">Djibouti</a></b> – <a href="/wiki/Djibouti%2C_Djibouti" title="Djibouti, Djibouti">Djibouti</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Egypt.svg" class="image" title="Flag of Egypt"><img alt="Flag of Egypt" longdesc="/wiki/Image:Flag_of_Egypt.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Egypt.svg/50px-Flag_of_Egypt.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Egypt" title="Egypt">Egypt</a></b> – <a href="/wiki/Cairo" title="Cairo">Cairo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="image" title="Flag of Equatorial Guinea"><img alt="Flag of Equatorial Guinea" longdesc="/wiki/Image:Flag_of_Equatorial_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Equatorial_Guinea.svg/50px-Flag_of_Equatorial_Guinea.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Equatorial_Guinea" title="Equatorial Guinea">Equatorial Guinea</a></b> – <a href="/wiki/Malabo" title="Malabo">Malabo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Eritrea.svg" class="image" title="Flag of Eritrea"><img alt="Flag of Eritrea" longdesc="/wiki/Image:Flag_of_Eritrea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_Eritrea.svg/50px-Flag_of_Eritrea.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Eritrea" title="Eritrea">Eritrea</a></b> – <a href="/wiki/Asmara" title="Asmara">Asmara</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ethiopia.svg" class="image" title="Flag of Ethiopia"><img alt="Flag of Ethiopia" longdesc="/wiki/Image:Flag_of_Ethiopia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/50px-Flag_of_Ethiopia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Ethiopia" title="Ethiopia">Ethiopia</a></b> – <a href="/wiki/Addis_Ababa" title="Addis Ababa">Addis Ababa</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Gabon.svg" class="image" title="Flag of Gabon"><img alt="Flag of Gabon" longdesc="/wiki/Image:Flag_of_Gabon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Gabon.svg/50px-Flag_of_Gabon.svg.png" height="38" width="50"></a>&nbsp;<a href="/wiki/Gabon" title="Gabon">Gabon</a></b> – <a href="/wiki/Libreville" title="Libreville">Libreville</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_The_Gambia.svg" class="image" title="Flag of The Gambia"><img alt="Flag of The Gambia" longdesc="/wiki/Image:Flag_of_The_Gambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_The_Gambia.svg/50px-Flag_of_The_Gambia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/The_Gambia" title="The Gambia">Gambia</a></b> – <a href="/wiki/Banjul" title="Banjul">Banjul</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Ghana.svg" class="image" title="Flag of Ghana"><img alt="Flag of Ghana" longdesc="/wiki/Image:Flag_of_Ghana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Ghana.svg/50px-Flag_of_Ghana.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Ghana" title="Ghana">Ghana</a></b> – <a href="/wiki/Accra" title="Accra">Accra</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea.svg" class="image" title="Flag of Guinea"><img alt="Flag of Guinea" longdesc="/wiki/Image:Flag_of_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Guinea.svg/50px-Flag_of_Guinea.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Guinea" title="Guinea">Guinea</a></b> – <a href="/wiki/Conakry" title="Conakry">Conakry</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="image" title="Flag of Guinea-Bissau"><img alt="Flag of Guinea-Bissau" longdesc="/wiki/Image:Flag_of_Guinea-Bissau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Guinea-Bissau.svg/50px-Flag_of_Guinea-Bissau.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Guinea-Bissau" title="Guinea-Bissau">Guinea-Bissau</a></b> – <a href="/wiki/Bissau" title="Bissau">Bissau</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Kenya.svg" class="image" title="Flag of Kenya"><img alt="Flag of Kenya" longdesc="/wiki/Image:Flag_of_Kenya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Kenya.svg/50px-Flag_of_Kenya.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Kenya" title="Kenya">Kenya</a></b> – <a href="/wiki/Nairobi" title="Nairobi">Nairobi</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Lesotho.svg" class="image" title="Flag of Lesotho"><img alt="Flag of Lesotho" longdesc="/wiki/Image:Flag_of_Lesotho.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Flag_of_Lesotho.svg/50px-Flag_of_Lesotho.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Lesotho" title="Lesotho">Lesotho</a></b> – <a href="/wiki/Maseru" title="Maseru">Maseru</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Liberia.svg" class="image" title="Flag of Liberia"><img alt="Flag of Liberia" longdesc="/wiki/Image:Flag_of_Liberia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Liberia.svg/50px-Flag_of_Liberia.svg.png" height="26" width="50"></a>&nbsp;<a href="/wiki/Liberia" title="Liberia">Liberia</a></b> – <a href="/wiki/Monrovia" title="Monrovia">Monrovia</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Libya.svg" class="image" title="Flag of Libya"><img alt="Flag of Libya" longdesc="/wiki/Image:Flag_of_Libya.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Libya.svg/50px-Flag_of_Libya.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Libya" title="Libya">Libya</a></b> – <a href="/wiki/Tripoli" title="Tripoli">Tripoli</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Madagascar.svg" class="image" title="Flag of Madagascar"><img alt="Flag of Madagascar" longdesc="/wiki/Image:Flag_of_Madagascar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Madagascar.svg/50px-Flag_of_Madagascar.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Madagascar" title="Madagascar">Madagascar</a></b> – <a href="/wiki/Antananarivo" title="Antananarivo">Antananarivo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Malawi.svg" class="image" title="Flag of Malawi"><img alt="Flag of Malawi" longdesc="/wiki/Image:Flag_of_Malawi.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Malawi.svg/50px-Flag_of_Malawi.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Malawi" title="Malawi">Malawi</a></b> – <a href="/wiki/Lilongwe" title="Lilongwe">Lilongwe</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mali.svg" class="image" title="Flag of Mali"><img alt="Flag of Mali" longdesc="/wiki/Image:Flag_of_Mali.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Mali.svg/50px-Flag_of_Mali.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Mali" title="Mali">Mali</a></b> – <a href="/wiki/Bamako" title="Bamako">Bamako</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritania.svg" class="image" title="Flag of Mauritania"><img alt="Flag of Mauritania" longdesc="/wiki/Image:Flag_of_Mauritania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Mauritania.svg/50px-Flag_of_Mauritania.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Mauritania" title="Mauritania">Mauritania</a></b> – <a href="/wiki/Nouakchott" title="Nouakchott">Nouakchott</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mauritius.svg" class="image" title="Flag of Mauritius"><img alt="Flag of Mauritius" longdesc="/wiki/Image:Flag_of_Mauritius.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Mauritius.svg/50px-Flag_of_Mauritius.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Mauritius" title="Mauritius">Mauritius</a></b> – <a href="/wiki/Port_Louis" title="Port Louis">Port Louis</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Mayotte"><img alt="Flag of Mayotte" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Mayotte" title="Mayotte">Mayotte</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mamoudzou" title="Mamoudzou">Mamoudzou</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Morocco.svg" class="image" title="Flag of Morocco"><img alt="Flag of Morocco" longdesc="/wiki/Image:Flag_of_Morocco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Morocco.svg/50px-Flag_of_Morocco.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Morocco" title="Morocco">Morocco</a></b> – <a href="/wiki/Rabat" title="Rabat">Rabat</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Mozambique.svg" class="image" title="Flag of Mozambique"><img alt="Flag of Mozambique" longdesc="/wiki/Image:Flag_of_Mozambique.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Mozambique.svg/50px-Flag_of_Mozambique.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Mozambique" title="Mozambique">Mozambique</a></b> – <a href="/wiki/Maputo" title="Maputo">Maputo</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Namibia.svg" class="image" title="Flag of Namibia"><img alt="Flag of Namibia" longdesc="/wiki/Image:Flag_of_Namibia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Namibia.svg/50px-Flag_of_Namibia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Namibia" title="Namibia">Namibia</a></b> – <a href="/wiki/Windhoek" title="Windhoek">Windhoek</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Niger.svg" class="image" title="Flag of Niger"><img alt="Flag of Niger" longdesc="/wiki/Image:Flag_of_Niger.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_Niger.svg/50px-Flag_of_Niger.svg.png" height="43" width="50"></a>&nbsp;<a href="/wiki/Niger" title="Niger">Niger</a></b> – <a href="/wiki/Niamey" title="Niamey">Niamey</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Nigeria.svg" class="image" title="Flag of Nigeria"><img alt="Flag of Nigeria" longdesc="/wiki/Image:Flag_of_Nigeria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Nigeria.svg/50px-Flag_of_Nigeria.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Nigeria" title="Nigeria">Nigeria</a></b> – <a href="/wiki/Abuja" title="Abuja">Abuja</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Réunion"><img alt="Flag of Réunion" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/R%C3%A9union" title="Réunion">Réunion</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Saint-Denis%2C_R%C3%A9union" title="Saint-Denis, Réunion">Saint-Denis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Rwanda.svg" class="image" title="Flag of Rwanda"><img alt="Flag of Rwanda" longdesc="/wiki/Image:Flag_of_Rwanda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Rwanda.svg/50px-Flag_of_Rwanda.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Rwanda" title="Rwanda">Rwanda</a></b> – <a href="/wiki/Kigali" title="Kigali">Kigali</a></td></tr>
+<tr><td>Africa</td><td><i><a href="/wiki/Image:Flag_of_Saint_Helena.svg" class="image" title="Flag of Saint Helena"><img alt="Flag of Saint Helena" longdesc="/wiki/Image:Flag_of_Saint_Helena.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Saint_Helena.svg/50px-Flag_of_Saint_Helena.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Saint_Helena" title="Saint Helena">Saint Helena</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Jamestown%2C_Saint_Helena" title="Jamestown, Saint Helena">Jamestown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="image" title="Flag of São Tomé and Príncipe"><img alt="Flag of São Tomé and Príncipe" longdesc="/wiki/Image:Flag_of_Sao_Tome_and_Principe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Sao_Tome_and_Principe.svg/50px-Flag_of_Sao_Tome_and_Principe.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/S%C3%A3o_Tom%C3%A9_and_Pr%C3%ADncipe" title="São Tomé and Príncipe">Sao Tome and Principe</a></b> – <a href="/wiki/S%C3%A3o_Tom%C3%A9" title="São Tomé">São Tomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Senegal.svg" class="image" title="Flag of Senegal"><img alt="Flag of Senegal" longdesc="/wiki/Image:Flag_of_Senegal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/50px-Flag_of_Senegal.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Senegal" title="Senegal">Senegal</a></b> – <a href="/wiki/Dakar" title="Dakar">Dakar</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_the_Seychelles.svg" class="image" title="Flag of the Seychelles"><img alt="Flag of the Seychelles" longdesc="/wiki/Image:Flag_of_the_Seychelles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Seychelles.svg/50px-Flag_of_the_Seychelles.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Seychelles" title="Seychelles">Seychelles</a></b> – <a href="/wiki/Victoria%2C_Seychelles" title="Victoria, Seychelles">Victoria</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sierra_Leone.svg" class="image" title="Flag of Sierra Leone"><img alt="Flag of Sierra Leone" longdesc="/wiki/Image:Flag_of_Sierra_Leone.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Sierra_Leone.svg/50px-Flag_of_Sierra_Leone.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Sierra_Leone" title="Sierra Leone">Sierra Leone</a></b> – <a href="/wiki/Freetown" title="Freetown">Freetown</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Somalia.svg" class="image" title="Flag of Somalia"><img alt="Flag of Somalia" longdesc="/wiki/Image:Flag_of_Somalia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Somalia.svg/50px-Flag_of_Somalia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Somalia" title="Somalia">Somalia</a></b> – <a href="/wiki/Mogadishu" title="Mogadishu">Mogadishu</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_South_Africa.svg" class="image" title="Flag of South Africa"><img alt="Flag of South Africa" longdesc="/wiki/Image:Flag_of_South_Africa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Flag_of_South_Africa.svg/50px-Flag_of_South_Africa.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/South_Africa" title="South Africa">South Africa</a></b> – <a href="/wiki/Pretoria" title="Pretoria">Pretoria</a> (administrative), <a href="/wiki/Cape_Town" title="Cape Town">Cape Town</a> (legislative), <a href="/wiki/Bloemfontein" title="Bloemfontein">Bloemfontein</a> (judicial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Sudan.svg" class="image" title="Flag of Sudan"><img alt="Flag of Sudan" longdesc="/wiki/Image:Flag_of_Sudan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Sudan.svg/50px-Flag_of_Sudan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Sudan" title="Sudan">Sudan</a></b> – <a href="/wiki/Khartoum" title="Khartoum">Khartoum</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Swaziland.svg" class="image" title="Flag of Swaziland"><img alt="Flag of Swaziland" longdesc="/wiki/Image:Flag_of_Swaziland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Flag_of_Swaziland.svg/50px-Flag_of_Swaziland.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Swaziland" title="Swaziland">Swaziland</a></b> – <a href="/wiki/Mbabane" title="Mbabane">Mbabane</a> (administrative), <a href="/wiki/Lobamba" title="Lobamba">Lobamba</a> (royal and legislative)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tanzania.svg" class="image" title="Flag of Tanzania"><img alt="Flag of Tanzania" longdesc="/wiki/Image:Flag_of_Tanzania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tanzania.svg/50px-Flag_of_Tanzania.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Tanzania" title="Tanzania">Tanzania</a></b> – <a href="/wiki/Dodoma" title="Dodoma">Dodoma</a> (seat of government at <a href="/wiki/Dar_es_Salaam" title="Dar es Salaam">Dar es Salaam</a>)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Togo.svg" class="image" title="Flag of Togo"><img alt="Flag of Togo" longdesc="/wiki/Image:Flag_of_Togo.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Togo.svg/50px-Flag_of_Togo.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Togo" title="Togo">Togo</a></b> – <a href="/wiki/Lom%C3%A9" title="Lomé">Lomé</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Tunisia.svg" class="image" title="Flag of Tunisia"><img alt="Flag of Tunisia" longdesc="/wiki/Image:Flag_of_Tunisia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Tunisia.svg/50px-Flag_of_Tunisia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Tunisia" title="Tunisia">Tunisia</a></b> – <a href="/wiki/Tunis" title="Tunis">Tunis</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Uganda.svg" class="image" title="Flag of Uganda"><img alt="Flag of Uganda" longdesc="/wiki/Image:Flag_of_Uganda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Uganda.svg/50px-Flag_of_Uganda.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Uganda" title="Uganda">Uganda</a></b> – <a href="/wiki/Kampala" title="Kampala">Kampala</a></td></tr>
+<tr><td>Africa</td><td><i><b><a href="/wiki/Image:Flag_of_Western_Sahara.svg" class="image" title="Flag of Western Sahara"><img alt="Flag of Western Sahara" longdesc="/wiki/Image:Flag_of_Western_Sahara.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Flag_of_Western_Sahara.svg/50px-Flag_of_Western_Sahara.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Western_Sahara" title="Western Sahara">Western Sahara</a></b></i> – <a href="/wiki/El_Aai%C3%BAn" title="El Aaiún">El Aaiún</a> (unofficial)</td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zambia.svg" class="image" title="Flag of Zambia"><img alt="Flag of Zambia" longdesc="/wiki/Image:Flag_of_Zambia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Zambia.svg/50px-Flag_of_Zambia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Zambia" title="Zambia">Zambia</a></b> – <a href="/wiki/Lusaka" title="Lusaka">Lusaka</a></td></tr>
+<tr><td>Africa</td><td><b><a href="/wiki/Image:Flag_of_Zimbabwe.svg" class="image" title="Flag of Zimbabwe"><img alt="Flag of Zimbabwe" longdesc="/wiki/Image:Flag_of_Zimbabwe.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Flag_of_Zimbabwe.svg/50px-Flag_of_Zimbabwe.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Zimbabwe" title="Zimbabwe">Zimbabwe</a></b> – <a href="/wiki/Harare" title="Harare">Harare</a></td></tr>
+
+<!-- Eurasia: Asia -->
+
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Afghanistan.svg" class="image" title="Flag of Afghanistan"><img alt="Flag of Afghanistan" longdesc="/wiki/Image:Flag_of_Afghanistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Afghanistan.svg/50px-Flag_of_Afghanistan.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Afghanistan" title="Afghanistan">Afghanistan</a></b> – <a href="/wiki/Kabul" title="Kabul">Kabul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Armenia.svg" class="image" title="Flag of Armenia"><img alt="Flag of Armenia" longdesc="/wiki/Image:Flag_of_Armenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Armenia.svg/50px-Flag_of_Armenia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Armenia" title="Armenia">Armenia</a></b><sup id="_ref-europe_0" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Yerevan" title="Yerevan">Yerevan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Azerbaijan.svg" class="image" title="Flag of Azerbaijan"><img alt="Flag of Azerbaijan" longdesc="/wiki/Image:Flag_of_Azerbaijan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Azerbaijan.svg/50px-Flag_of_Azerbaijan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Azerbaijan" title="Azerbaijan">Azerbaijan</a></b><sup id="_ref-europe_1" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Baku" title="Baku">Baku</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bahrain.svg" class="image" title="Flag of Bahrain"><img alt="Flag of Bahrain" longdesc="/wiki/Image:Flag_of_Bahrain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Bahrain.svg/50px-Flag_of_Bahrain.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Bahrain" title="Bahrain">Bahrain</a></b> – <a href="/wiki/Manama" title="Manama">Manama</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bangladesh.svg" class="image" title="Flag of Bangladesh"><img alt="Flag of Bangladesh" longdesc="/wiki/Image:Flag_of_Bangladesh.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bangladesh.svg/50px-Flag_of_Bangladesh.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Bangladesh" title="Bangladesh">Bangladesh</a></b> – <a href="/wiki/Dhaka" title="Dhaka">Dhaka</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Bhutan.svg" class="image" title="Flag of Bhutan"><img alt="Flag of Bhutan" longdesc="/wiki/Image:Flag_of_Bhutan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Flag_of_Bhutan.svg/50px-Flag_of_Bhutan.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Bhutan" title="Bhutan">Bhutan</a></b> – <a href="/wiki/Thimphu" title="Thimphu">Thimphu</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="image" title="Flag of British Indian Ocean Territory"><img alt="Flag of British Indian Ocean Territory" longdesc="/wiki/Image:Flag_of_the_British_Indian_Ocean_Territory.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_British_Indian_Ocean_Territory.svg/50px-Flag_of_the_British_Indian_Ocean_Territory.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/British_Indian_Ocean_Territory" title="British Indian Ocean Territory">British Indian Ocean Territory</a></i><sup id="_ref-1" class="reference"><a href="#_note-1" title="">[3]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Brunei.svg" class="image" title="Flag of Brunei"><img alt="Flag of Brunei" longdesc="/wiki/Image:Flag_of_Brunei.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Brunei.svg/50px-Flag_of_Brunei.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Brunei" title="Brunei">Brunei</a></b> – <a href="/wiki/Bandar_Seri_Begawan" title="Bandar Seri Begawan">Bandar Seri Begawan</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cambodia.svg" class="image" title="Flag of Cambodia"><img alt="Flag of Cambodia" longdesc="/wiki/Image:Flag_of_Cambodia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Cambodia.svg/50px-Flag_of_Cambodia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Cambodia" title="Cambodia">Cambodia</a></b> – <a href="/wiki/Phnom_Penh" title="Phnom Penh">Phnom Penh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="image" title="Flag of the People's Republic of China"><img alt="Flag of the People's Republic of China" longdesc="/wiki/Image:Flag_of_the_People%27s_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_People%27s_Republic_of_China.svg/50px-Flag_of_the_People%27s_Republic_of_China.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/People%27s_Republic_of_China" title="People's Republic of China">China, People's Republic of</a></b> – <a href="/wiki/Beijing" title="Beijing">Beijing</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="image" title="Flag of the Republic of China"><img alt="Flag of the Republic of China" longdesc="/wiki/Image:Flag_of_the_Republic_of_China.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_the_Republic_of_China.svg/50px-Flag_of_the_Republic_of_China.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Republic_of_China" title="Republic of China">China, Republic of</a></b> (commonly known as <b>Taiwan</b>) – <a href="/wiki/Taipei" title="Taipei">Taipei</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Christmas_Island.svg" class="image" title="Flag of Christmas Island"><img alt="Flag of Christmas Island" longdesc="/wiki/Image:Flag_of_Christmas_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Flag_of_Christmas_Island.svg/50px-Flag_of_Christmas_Island.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Christmas_Island" title="Christmas Island">Christmas Island</a></i><sup id="_ref-australia_0" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of the Cocos (Keeling) Islands"><img alt="Flag of the Cocos (Keeling) Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Cocos_%28Keeling%29_Islands" title="Cocos (Keeling) Islands">Cocos (Keeling) Islands</a></i><sup id="_ref-australia_1" class="reference"><a href="#_note-australia" title="">[4]</a></sup> (overseas territory of Australia)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Cyprus.svg" class="image" title="Flag of Cyprus"><img alt="Flag of Cyprus" longdesc="/wiki/Image:Flag_of_Cyprus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Cyprus.svg/50px-Flag_of_Cyprus.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Cyprus" title="Cyprus">Cyprus</a></b><sup id="_ref-europe_2" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Nicosia" title="Nicosia">Nicosia</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Georgia.svg" class="image" title="Flag of Georgia (country)"><img alt="Flag of Georgia (country)" longdesc="/wiki/Image:Flag_of_Georgia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Georgia.svg/50px-Flag_of_Georgia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Georgia_%28country%29" title="Georgia (country)">Georgia</a></b><sup id="_ref-europe_3" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Tbilisi" title="Tbilisi">Tbilisi</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Hong_Kong.svg" class="image" title="Flag of Hong Kong"><img alt="Flag of Hong Kong" longdesc="/wiki/Image:Flag_of_Hong_Kong.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Hong_Kong.svg/50px-Flag_of_Hong_Kong.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Hong_Kong" title="Hong Kong">Hong Kong</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_India.svg" class="image" title="Flag of India"><img alt="Flag of India" longdesc="/wiki/Image:Flag_of_India.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_India.svg/50px-Flag_of_India.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/India" title="India">India</a></b> – <a href="/wiki/New_Delhi" title="New Delhi">New Delhi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Indonesia.svg" class="image" title="Flag of Indonesia"><img alt="Flag of Indonesia" longdesc="/wiki/Image:Flag_of_Indonesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Indonesia.svg/50px-Flag_of_Indonesia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Indonesia" title="Indonesia">Indonesia</a></b> – <a href="/wiki/Jakarta" title="Jakarta">Jakarta</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iran.svg" class="image" title="Flag of Iran"><img alt="Flag of Iran" longdesc="/wiki/Image:Flag_of_Iran.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Flag_of_Iran.svg/50px-Flag_of_Iran.svg.png" height="29" width="50"></a>&nbsp;<a href="/wiki/Iran" title="Iran">Iran</a></b> – <a href="/wiki/Tehran" title="Tehran">Tehran</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Iraq.svg" class="image" title="Flag of Iraq"><img alt="Flag of Iraq" longdesc="/wiki/Image:Flag_of_Iraq.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Iraq.svg/50px-Flag_of_Iraq.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Iraq" title="Iraq">Iraq</a></b> – <a href="/wiki/Baghdad" title="Baghdad">Baghdad</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Israel.svg" class="image" title="Flag of Israel"><img alt="Flag of Israel" longdesc="/wiki/Image:Flag_of_Israel.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Israel.svg/50px-Flag_of_Israel.svg.png" height="36" width="50"></a>&nbsp;<a href="/wiki/Israel" title="Israel">Israel</a></b> – <a href="/wiki/Jerusalem" title="Jerusalem">Jerusalem</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Japan.svg" class="image" title="Flag of Japan"><img alt="Flag of Japan" longdesc="/wiki/Image:Flag_of_Japan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Flag_of_Japan.svg/50px-Flag_of_Japan.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Japan" title="Japan">Japan</a></b> – <a href="/wiki/Tokyo" title="Tokyo">Tokyo</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Jordan.svg" class="image" title="Flag of Jordan"><img alt="Flag of Jordan" longdesc="/wiki/Image:Flag_of_Jordan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Jordan.svg/50px-Flag_of_Jordan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Jordan" title="Jordan">Jordan</a></b> – <a href="/wiki/Amman" title="Amman">Amman</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kazakhstan.svg" class="image" title="Flag of Kazakhstan"><img alt="Flag of Kazakhstan" longdesc="/wiki/Image:Flag_of_Kazakhstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kazakhstan.svg/50px-Flag_of_Kazakhstan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Kazakhstan" title="Kazakhstan">Kazakhstan</a></b> – <a href="/wiki/Astana" title="Astana">Astana</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_North_Korea.svg" class="image" title="Flag of North Korea"><img alt="Flag of North Korea" longdesc="/wiki/Image:Flag_of_North_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Flag_of_North_Korea.svg/50px-Flag_of_North_Korea.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/North_Korea" title="North Korea">Korea, Democratic People's Republic of</a></b> (commonly known as <b>North Korea</b>) – <a href="/wiki/Pyongyang" title="Pyongyang">Pyongyang</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_South_Korea.svg" class="image" title="Flag of South Korea"><img alt="Flag of South Korea" longdesc="/wiki/Image:Flag_of_South_Korea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_South_Korea.svg/50px-Flag_of_South_Korea.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/South_Korea" title="South Korea">Korea, Republic of</a></b> (commonly known as <b>South Korea</b>) – <a href="/wiki/Seoul" title="Seoul">Seoul</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kuwait.svg" class="image" title="Flag of Kuwait"><img alt="Flag of Kuwait" longdesc="/wiki/Image:Flag_of_Kuwait.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Kuwait.svg/50px-Flag_of_Kuwait.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Kuwait" title="Kuwait">Kuwait</a></b> – <a href="/wiki/Kuwait_City" title="Kuwait City">Kuwait City</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="image" title="Flag of Kyrgyzstan"><img alt="Flag of Kyrgyzstan" longdesc="/wiki/Image:Flag_of_Kyrgyzstan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Kyrgyzstan.svg/50px-Flag_of_Kyrgyzstan.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Kyrgyzstan" title="Kyrgyzstan">Kyrgyzstan</a></b> – <a href="/wiki/Bishkek" title="Bishkek">Bishkek</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Laos.svg" class="image" title="Flag of Laos"><img alt="Flag of Laos" longdesc="/wiki/Image:Flag_of_Laos.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Laos.svg/50px-Flag_of_Laos.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Laos" title="Laos">Laos</a></b> – <a href="/wiki/Vientiane" title="Vientiane">Vientiane</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Lebanon.svg" class="image" title="Flag of Lebanon"><img alt="Flag of Lebanon" longdesc="/wiki/Image:Flag_of_Lebanon.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Lebanon.svg/50px-Flag_of_Lebanon.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Lebanon" title="Lebanon">Lebanon</a></b> – <a href="/wiki/Beirut" title="Beirut">Beirut</a></td></tr>
+<tr><td>Asia</td><td><i><a href="/wiki/Image:Flag_of_Macau.svg" class="image" title="Flag of Macau"><img alt="Flag of Macau" longdesc="/wiki/Image:Flag_of_Macau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Flag_of_Macau.svg/50px-Flag_of_Macau.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Macau" title="Macau">Macau</a></i> (<a href="/wiki/Special_administrative_region_%28People%27s_Republic_of_China%29" title="Special administrative region (People's Republic of China)">special administrative region of the People's Republic of China</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Malaysia.svg" class="image" title="Flag of Malaysia"><img alt="Flag of Malaysia" longdesc="/wiki/Image:Flag_of_Malaysia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_Malaysia.svg/50px-Flag_of_Malaysia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Malaysia" title="Malaysia">Malaysia</a></b> – <a href="/wiki/Kuala_Lumpur" title="Kuala Lumpur">Kuala Lumpur</a> (seat of government at <a href="/wiki/Putrajaya" title="Putrajaya">Putrajaya</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Maldives.svg" class="image" title="Flag of the Maldives"><img alt="Flag of the Maldives" longdesc="/wiki/Image:Flag_of_Maldives.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Maldives.svg/50px-Flag_of_Maldives.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Maldives" title="Maldives">Maldives</a></b> – <a href="/wiki/Mal%C3%A9" title="Malé">Malé</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Mongolia.svg" class="image" title="Flag of Mongolia"><img alt="Flag of Mongolia" longdesc="/wiki/Image:Flag_of_Mongolia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Mongolia.svg/50px-Flag_of_Mongolia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Mongolia" title="Mongolia">Mongolia</a></b> – <a href="/wiki/Ulaanbaatar" title="Ulaanbaatar">Ulaanbaatar</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Myanmar.svg" class="image" title="Flag of Myanmar"><img alt="Flag of Myanmar" longdesc="/wiki/Image:Flag_of_Myanmar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Myanmar.svg/50px-Flag_of_Myanmar.svg.png" height="28" width="50"></a>&nbsp;<a href="/wiki/Myanmar" title="Myanmar">Myanmar</a></b> (formerly known as <b>Burma</b>) – <a href="/wiki/Naypyidaw" title="Naypyidaw">Naypyidaw</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Nepal.svg" class="image" title="Flag of Nepal"><img alt="Flag of Nepal" longdesc="/wiki/Image:Flag_of_Nepal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Nepal.svg/50px-Flag_of_Nepal.svg.png" height="61" width="50"></a>&nbsp;<a href="/wiki/Nepal" title="Nepal">Nepal</a></b> – <a href="/wiki/Kathmandu" title="Kathmandu">Kathmandu</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Oman.svg" class="image" title="Flag of Oman"><img alt="Flag of Oman" longdesc="/wiki/Image:Flag_of_Oman.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Oman.svg/50px-Flag_of_Oman.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Oman" title="Oman">Oman</a></b> – <a href="/wiki/Muscat%2C_Oman" title="Muscat, Oman">Muscat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Pakistan.svg" class="image" title="Flag of Pakistan"><img alt="Flag of Pakistan" longdesc="/wiki/Image:Flag_of_Pakistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Pakistan.svg/50px-Flag_of_Pakistan.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Pakistan" title="Pakistan">Pakistan</a></b> – <a href="/wiki/Islamabad" title="Islamabad">Islamabad</a></td></tr>
+<tr><td>Asia</td><td><i><b><a href="/wiki/Image:Flag_of_Palestine.svg" class="image" title="Palestinian flag"><img alt="Palestinian flag" longdesc="/wiki/Image:Flag_of_Palestine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/50px-Flag_of_Palestine.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Palestinian_territories" title="Palestinian territories">Palestinian territories</a></b></i> (collectively the territories of the <a href="/wiki/West_Bank" title="West Bank">West Bank</a> and the <a href="/wiki/Gaza_Strip" title="Gaza Strip">Gaza Strip</a>)</td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_Philippines.svg" class="image" title="Flag of the Philippines"><img alt="Flag of the Philippines" longdesc="/wiki/Image:Flag_of_the_Philippines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_the_Philippines.svg/50px-Flag_of_the_Philippines.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Philippines" title="Philippines">Philippines</a></b> – <a href="/wiki/Manila" title="Manila">Manila</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Qatar.svg" class="image" title="Flag of Qatar"><img alt="Flag of Qatar" longdesc="/wiki/Image:Flag_of_Qatar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Flag_of_Qatar.svg/50px-Flag_of_Qatar.svg.png" height="20" width="50"></a>&nbsp;<a href="/wiki/Qatar" title="Qatar">Qatar</a></b> – <a href="/wiki/Doha" title="Doha">Doha</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="image" title="Flag of Saudi Arabia"><img alt="Flag of Saudi Arabia" longdesc="/wiki/Image:Flag_of_Saudi_Arabia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Flag_of_Saudi_Arabia.svg/50px-Flag_of_Saudi_Arabia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saudi_Arabia" title="Saudi Arabia">Saudi Arabia</a></b> – <a href="/wiki/Riyadh" title="Riyadh">Riyadh</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Singapore.svg" class="image" title="Flag of Singapore"><img alt="Flag of Singapore" longdesc="/wiki/Image:Flag_of_Singapore.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Singapore.svg/50px-Flag_of_Singapore.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Singapore" title="Singapore">Singapore</a></b> – Singapore<sup id="_ref-city-state_0" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Sri_Lanka.svg" class="image" title="Flag of Sri Lanka"><img alt="Flag of Sri Lanka" longdesc="/wiki/Image:Flag_of_Sri_Lanka.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Sri_Lanka.svg/50px-Flag_of_Sri_Lanka.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Sri_Lanka" title="Sri Lanka">Sri Lanka</a></b> – <a href="/wiki/Sri_Jayawardenepura" title="Sri Jayawardenepura">Sri Jayawardenepura</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Syria.svg" class="image" title="Flag of Syria"><img alt="Flag of Syria" longdesc="/wiki/Image:Flag_of_Syria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Flag_of_Syria.svg/50px-Flag_of_Syria.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Syria" title="Syria">Syria</a></b> – <a href="/wiki/Damascus" title="Damascus">Damascus</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Tajikistan.svg" class="image" title="Flag of Tajikistan"><img alt="Flag of Tajikistan" longdesc="/wiki/Image:Flag_of_Tajikistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Tajikistan.svg/50px-Flag_of_Tajikistan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Tajikistan" title="Tajikistan">Tajikistan</a></b> – <a href="/wiki/Dushanbe" title="Dushanbe">Dushanbe</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Thailand.svg" class="image" title="Flag of Thailand"><img alt="Flag of Thailand" longdesc="/wiki/Image:Flag_of_Thailand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Thailand.svg/50px-Flag_of_Thailand.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Thailand" title="Thailand">Thailand</a></b> – <a href="/wiki/Bangkok" title="Bangkok">Bangkok</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_East_Timor.svg" class="image" title="Flag of East Timor"><img alt="Flag of East Timor" longdesc="/wiki/Image:Flag_of_East_Timor.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_East_Timor.svg/50px-Flag_of_East_Timor.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/East_Timor" title="East Timor">Timor-Leste</a></b> (commonly known as <b>East Timor</b>) – <a href="/wiki/Dili" title="Dili">Dili</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkey.svg" class="image" title="Flag of Turkey"><img alt="Flag of Turkey" longdesc="/wiki/Image:Flag_of_Turkey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Turkey.svg/50px-Flag_of_Turkey.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Turkey" title="Turkey">Turkey</a></b><sup id="_ref-europe_4" class="reference"><a href="#_note-europe" title="">[2]</a></sup> – <a href="/wiki/Ankara" title="Ankara">Ankara</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Turkmenistan.svg" class="image" title="Flag of Turkmenistan"><img alt="Flag of Turkmenistan" longdesc="/wiki/Image:Flag_of_Turkmenistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Turkmenistan.svg/50px-Flag_of_Turkmenistan.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Turkmenistan" title="Turkmenistan">Turkmenistan</a></b> – <a href="/wiki/Ashgabat" title="Ashgabat">Ashgabat</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="image" title="Flag of the United Arab Emirates"><img alt="Flag of the United Arab Emirates" longdesc="/wiki/Image:Flag_of_the_United_Arab_Emirates.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_United_Arab_Emirates.svg/50px-Flag_of_the_United_Arab_Emirates.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/United_Arab_Emirates" title="United Arab Emirates">United Arab Emirates</a></b> – <a href="/wiki/Abu_Dhabi" title="Abu Dhabi">Abu Dhabi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Uzbekistan.svg" class="image" title="Flag of Uzbekistan"><img alt="Flag of Uzbekistan" longdesc="/wiki/Image:Flag_of_Uzbekistan.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Uzbekistan.svg/50px-Flag_of_Uzbekistan.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Uzbekistan" title="Uzbekistan">Uzbekistan</a></b> – <a href="/wiki/Tashkent" title="Tashkent">Tashkent</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Vietnam.svg" class="image" title="Flag of Vietnam"><img alt="Flag of Vietnam" longdesc="/wiki/Image:Flag_of_Vietnam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Vietnam.svg/50px-Flag_of_Vietnam.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Vietnam" title="Vietnam">Vietnam</a></b> – <a href="/wiki/Hanoi" title="Hanoi">Hanoi</a></td></tr>
+<tr><td>Asia</td><td><b><a href="/wiki/Image:Flag_of_Yemen.svg" class="image" title="Flag of Yemen"><img alt="Flag of Yemen" longdesc="/wiki/Image:Flag_of_Yemen.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Yemen.svg/50px-Flag_of_Yemen.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Yemen" title="Yemen">Yemen</a></b> – <a href="/wiki/Sana%27a" title="Sana'a">Sana'a</a></td></tr>
+
+<!-- Eurasia: Europe -->
+
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Albania.svg" class="image" title="Flag of Albania"><img alt="Flag of Albania" longdesc="/wiki/Image:Flag_of_Albania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/50px-Flag_of_Albania.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Albania" title="Albania">Albania</a></b> – <a href="/wiki/Tirana" title="Tirana">Tirana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Andorra.svg" class="image" title="Flag of Andorra"><img alt="Flag of Andorra" longdesc="/wiki/Image:Flag_of_Andorra.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Andorra.svg/50px-Flag_of_Andorra.svg.png" height="35" width="50"></a>&nbsp;<a href="/wiki/Andorra" title="Andorra">Andorra</a></b> – <a href="/wiki/Andorra_la_Vella" title="Andorra la Vella">Andorra la Vella</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Austria.svg" class="image" title="Flag of Austria"><img alt="Flag of Austria" longdesc="/wiki/Image:Flag_of_Austria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_Austria.svg/50px-Flag_of_Austria.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Austria" title="Austria">Austria</a></b> – <a href="/wiki/Vienna" title="Vienna">Vienna</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belarus.svg" class="image" title="Flag of Belarus"><img alt="Flag of Belarus" longdesc="/wiki/Image:Flag_of_Belarus.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Belarus.svg/50px-Flag_of_Belarus.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Belarus" title="Belarus">Belarus</a></b> – <a href="/wiki/Minsk" title="Minsk">Minsk</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="image" title="Flag of Belgium"><img alt="Flag of Belgium" longdesc="/wiki/Image:Flag_of_Belgium_%28civil%29.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Belgium_%28civil%29.svg/50px-Flag_of_Belgium_%28civil%29.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Belgium" title="Belgium">Belgium</a></b> – <a href="/wiki/Brussels" title="Brussels">Brussels</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="image" title="Flag of Bosnia and Herzegovina"><img alt="Flag of Bosnia and Herzegovina" longdesc="/wiki/Image:Flag_of_Bosnia_and_Herzegovina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bosnia_and_Herzegovina.svg/50px-Flag_of_Bosnia_and_Herzegovina.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Bosnia_and_Herzegovina" title="Bosnia and Herzegovina">Bosnia and Herzegovina</a></b> – <a href="/wiki/Sarajevo" title="Sarajevo">Sarajevo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Bulgaria.svg" class="image" title="Flag of Bulgaria"><img alt="Flag of Bulgaria" longdesc="/wiki/Image:Flag_of_Bulgaria.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Bulgaria.svg/50px-Flag_of_Bulgaria.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Bulgaria" title="Bulgaria">Bulgaria</a></b> – <a href="/wiki/Sofia" title="Sofia">Sofia</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Croatia.svg" class="image" title="Flag of Croatia"><img alt="Flag of Croatia" longdesc="/wiki/Image:Flag_of_Croatia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Croatia.svg/50px-Flag_of_Croatia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Croatia" title="Croatia">Croatia</a></b> – <a href="/wiki/Zagreb" title="Zagreb">Zagreb</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="image" title="Flag of the Czech Republic"><img alt="Flag of the Czech Republic" longdesc="/wiki/Image:Flag_of_the_Czech_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/50px-Flag_of_the_Czech_Republic.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Czech_Republic" title="Czech Republic">Czech Republic</a></b> – <a href="/wiki/Prague" title="Prague">Prague</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Denmark.svg" class="image" title="Flag of Denmark"><img alt="Flag of Denmark" longdesc="/wiki/Image:Flag_of_Denmark.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Denmark.svg/50px-Flag_of_Denmark.svg.png" height="38" width="50"></a>&nbsp;<a href="/wiki/Denmark" title="Denmark">Denmark</a></b> – <a href="/wiki/Copenhagen" title="Copenhagen">Copenhagen</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Estonia.svg" class="image" title="Flag of Estonia"><img alt="Flag of Estonia" longdesc="/wiki/Image:Flag_of_Estonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Estonia.svg/50px-Flag_of_Estonia.svg.png" height="32" width="50"></a>&nbsp;<a href="/wiki/Estonia" title="Estonia">Estonia</a></b> – <a href="/wiki/Tallinn" title="Tallinn">Tallinn</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="image" title="Flag of the Faroe Islands"><img alt="Flag of the Faroe Islands" longdesc="/wiki/Image:Flag_of_the_Faroe_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Faroe_Islands.svg/50px-Flag_of_the_Faroe_Islands.svg.png" height="36" width="50"></a>&nbsp;<a href="/wiki/Faroe_Islands" title="Faroe Islands">Faroe Islands</a></i> (overseas territory of Denmark) – <a href="/wiki/T%C3%B3rshavn" title="Tórshavn">Tórshavn</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Finland.svg" class="image" title="Flag of Finland"><img alt="Flag of Finland" longdesc="/wiki/Image:Flag_of_Finland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Finland.svg/50px-Flag_of_Finland.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Finland" title="Finland">Finland</a></b> – <a href="/wiki/Helsinki" title="Helsinki">Helsinki</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/France" title="France">France</a></b> – <a href="/wiki/Paris" title="Paris">Paris</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Germany.svg" class="image" title="Flag of Germany"><img alt="Flag of Germany" longdesc="/wiki/Image:Flag_of_Germany.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/50px-Flag_of_Germany.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Germany" title="Germany">Germany</a></b> – <a href="/wiki/Berlin" title="Berlin">Berlin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Gibraltar.svg" class="image" title="Flag of Gibraltar"><img alt="Flag of Gibraltar" longdesc="/wiki/Image:Flag_of_Gibraltar.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Gibraltar.svg/50px-Flag_of_Gibraltar.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Gibraltar" title="Gibraltar">Gibraltar</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – Gibraltar<sup id="_ref-city-state_1" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Greece.svg" class="image" title="Flag of Greece"><img alt="Flag of Greece" longdesc="/wiki/Image:Flag_of_Greece.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Greece.svg/50px-Flag_of_Greece.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Greece" title="Greece">Greece</a></b> – <a href="/wiki/Athens" title="Athens">Athens</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Guernsey.svg" class="image" title="Flag of Guernsey"><img alt="Flag of Guernsey" longdesc="/wiki/Image:Flag_of_Guernsey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Guernsey.svg/50px-Flag_of_Guernsey.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Guernsey" title="Guernsey">Guernsey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Peter_Port" title="Saint Peter Port">Saint Peter Port</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Hungary.svg" class="image" title="Flag of Hungary"><img alt="Flag of Hungary" longdesc="/wiki/Image:Flag_of_Hungary.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Hungary.svg/50px-Flag_of_Hungary.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Hungary" title="Hungary">Hungary</a></b> – <a href="/wiki/Budapest" title="Budapest">Budapest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Iceland.svg" class="image" title="Flag of Iceland"><img alt="Flag of Iceland" longdesc="/wiki/Image:Flag_of_Iceland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Iceland.svg/50px-Flag_of_Iceland.svg.png" height="36" width="50"></a>&nbsp;<a href="/wiki/Iceland" title="Iceland">Iceland</a></b> – <a href="/wiki/Reykjav%C3%ADk" title="Reykjavík">Reykjavík</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ireland.svg" class="image" title="Flag of Ireland"><img alt="Flag of Ireland" longdesc="/wiki/Image:Flag_of_Ireland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/50px-Flag_of_Ireland.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Republic_of_Ireland" title="Republic of Ireland">Ireland</a></b> – <a href="/wiki/Dublin" title="Dublin">Dublin</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="image" title="Flag of the Isle of Man"><img alt="Flag of the Isle of Man" longdesc="/wiki/Image:Flag_of_the_Isle_of_Man.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_the_Isle_of_Man.svg/50px-Flag_of_the_Isle_of_Man.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Isle_of_Man" title="Isle of Man">Isle of Man</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Douglas%2C_Isle_of_Man" title="Douglas, Isle of Man">Douglas</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Italy.svg" class="image" title="Flag of Italy"><img alt="Flag of Italy" longdesc="/wiki/Image:Flag_of_Italy.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/50px-Flag_of_Italy.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Italy" title="Italy">Italy</a></b> – <a href="/wiki/Rome" title="Rome">Rome</a></td></tr>
+<tr><td>Europe</td><td><i><a href="/wiki/Image:Flag_of_Jersey.svg" class="image" title="Flag of Jersey"><img alt="Flag of Jersey" longdesc="/wiki/Image:Flag_of_Jersey.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_Jersey.svg/50px-Flag_of_Jersey.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Jersey" title="Jersey">Jersey</a></i> (<a href="/wiki/Crown_dependency" title="Crown dependency">British crown dependency</a>) – <a href="/wiki/Saint_Helier" title="Saint Helier">Saint Helier</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Latvia.svg" class="image" title="Flag of Latvia"><img alt="Flag of Latvia" longdesc="/wiki/Image:Flag_of_Latvia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Latvia.svg/50px-Flag_of_Latvia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Latvia" title="Latvia">Latvia</a></b> – <a href="/wiki/Riga" title="Riga">Riga</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Liechtenstein.svg" class="image" title="Flag of Liechtenstein"><img alt="Flag of Liechtenstein" longdesc="/wiki/Image:Flag_of_Liechtenstein.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Flag_of_Liechtenstein.svg/50px-Flag_of_Liechtenstein.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Liechtenstein" title="Liechtenstein">Liechtenstein</a></b> – <a href="/wiki/Vaduz" title="Vaduz">Vaduz</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Lithuania.svg" class="image" title="Flag of Lithuania"><img alt="Flag of Lithuania" longdesc="/wiki/Image:Flag_of_Lithuania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Lithuania.svg/50px-Flag_of_Lithuania.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Lithuania" title="Lithuania">Lithuania</a></b> – <a href="/wiki/Vilnius" title="Vilnius">Vilnius</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Luxembourg.svg" class="image" title="Flag of Luxembourg"><img alt="Flag of Luxembourg" longdesc="/wiki/Image:Flag_of_Luxembourg.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_Luxembourg.svg/50px-Flag_of_Luxembourg.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Luxembourg" title="Luxembourg">Luxembourg</a></b> – <a href="/wiki/Luxembourg%2C_Luxembourg" title="Luxembourg, Luxembourg">Luxembourg</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Macedonia.svg" class="image" title="Flag of the Republic of Macedonia"><img alt="Flag of the Republic of Macedonia" longdesc="/wiki/Image:Flag_of_Macedonia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_Macedonia.svg/50px-Flag_of_Macedonia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Republic_of_Macedonia" title="Republic of Macedonia">Macedonia</a></b> – <a href="/wiki/Skopje" title="Skopje">Skopje</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Malta.svg" class="image" title="Flag of Malta"><img alt="Flag of Malta" longdesc="/wiki/Image:Flag_of_Malta.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Malta.svg/50px-Flag_of_Malta.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Malta" title="Malta">Malta</a></b> – <a href="/wiki/Valletta" title="Valletta">Valletta</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Moldova.svg" class="image" title="Flag of Moldova"><img alt="Flag of Moldova" longdesc="/wiki/Image:Flag_of_Moldova.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Moldova.svg/50px-Flag_of_Moldova.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Moldova" title="Moldova">Moldova</a></b> – <a href="/wiki/Chi%C5%9Fin%C4%83u" title="Chişinău">Chişinău</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Monaco.svg" class="image" title="Flag of Monaco"><img alt="Flag of Monaco" longdesc="/wiki/Image:Flag_of_Monaco.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Monaco.svg/50px-Flag_of_Monaco.svg.png" height="40" width="50"></a>&nbsp;<a href="/wiki/Monaco" title="Monaco">Monaco</a></b> – Monaco<sup id="_ref-city-state_2" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Montenegro.svg" class="image" title="Flag of Montenegro"><img alt="Flag of Montenegro" longdesc="/wiki/Image:Flag_of_Montenegro.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Montenegro.svg/50px-Flag_of_Montenegro.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Montenegro" title="Montenegro">Montenegro</a></b> – <a href="/wiki/Podgorica" title="Podgorica">Podgorica</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Netherlands.svg" class="image" title="Flag of the Netherlands"><img alt="Flag of the Netherlands" longdesc="/wiki/Image:Flag_of_the_Netherlands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/50px-Flag_of_the_Netherlands.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></b> – <a href="/wiki/Amsterdam" title="Amsterdam">Amsterdam</a> (seat of government at <a href="/wiki/The_Hague" title="The Hague">The Hague</a>)</td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Norway"><img alt="Flag of Norway" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/50px-Flag_of_Norway.svg.png" height="36" width="50"></a>&nbsp;<a href="/wiki/Norway" title="Norway">Norway</a></b> – <a href="/wiki/Oslo" title="Oslo">Oslo</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Poland.svg" class="image" title="Flag of Poland"><img alt="Flag of Poland" longdesc="/wiki/Image:Flag_of_Poland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_Poland.svg/50px-Flag_of_Poland.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Poland" title="Poland">Poland</a></b> – <a href="/wiki/Warsaw" title="Warsaw">Warsaw</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Portugal.svg" class="image" title="Flag of Portugal"><img alt="Flag of Portugal" longdesc="/wiki/Image:Flag_of_Portugal.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Portugal.svg/50px-Flag_of_Portugal.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Portugal" title="Portugal">Portugal</a></b> – <a href="/wiki/Lisbon" title="Lisbon">Lisbon</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Romania.svg" class="image" title="Flag of Romania"><img alt="Flag of Romania" longdesc="/wiki/Image:Flag_of_Romania.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Romania.svg/50px-Flag_of_Romania.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Romania" title="Romania">Romania</a></b> – <a href="/wiki/Bucharest" title="Bucharest">Bucharest</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Russia.svg" class="image" title="Flag of Russia"><img alt="Flag of Russia" longdesc="/wiki/Image:Flag_of_Russia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Russia.svg/50px-Flag_of_Russia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Russia" title="Russia">Russia</a></b><sup id="_ref-2" class="reference"><a href="#_note-2" title="">[6]</a></sup> – <a href="/wiki/Moscow" title="Moscow">Moscow</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_San_Marino.svg" class="image" title="Flag of San Marino"><img alt="Flag of San Marino" longdesc="/wiki/Image:Flag_of_San_Marino.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_San_Marino.svg/50px-Flag_of_San_Marino.svg.png" height="38" width="50"></a>&nbsp;<a href="/wiki/San_Marino" title="San Marino">San Marino</a></b> – <a href="/wiki/San_Marino%2C_San_Marino" title="San Marino, San Marino">San Marino</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Serbia.svg" class="image" title="Flag of Serbia"><img alt="Flag of Serbia" longdesc="/wiki/Image:Flag_of_Serbia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Flag_of_Serbia.svg/50px-Flag_of_Serbia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Serbia" title="Serbia">Serbia</a></b> – <a href="/wiki/Belgrade" title="Belgrade">Belgrade</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovakia.svg" class="image" title="Flag of Slovakia"><img alt="Flag of Slovakia" longdesc="/wiki/Image:Flag_of_Slovakia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Slovakia.svg/50px-Flag_of_Slovakia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Slovakia" title="Slovakia">Slovakia</a></b> – <a href="/wiki/Bratislava" title="Bratislava">Bratislava</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Slovenia.svg" class="image" title="Flag of Slovenia"><img alt="Flag of Slovenia" longdesc="/wiki/Image:Flag_of_Slovenia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Slovenia.svg/50px-Flag_of_Slovenia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Slovenia" title="Slovenia">Slovenia</a></b> – <a href="/wiki/Ljubljana" title="Ljubljana">Ljubljana</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Spain.svg" class="image" title="Flag of Spain"><img alt="Flag of Spain" longdesc="/wiki/Image:Flag_of_Spain.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Spain.svg/50px-Flag_of_Spain.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Spain" title="Spain">Spain</a></b> – <a href="/wiki/Madrid" title="Madrid">Madrid</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Sweden.svg" class="image" title="Flag of Sweden"><img alt="Flag of Sweden" longdesc="/wiki/Image:Flag_of_Sweden.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Sweden.svg/50px-Flag_of_Sweden.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Sweden" title="Sweden">Sweden</a></b> – <a href="/wiki/Stockholm" title="Stockholm">Stockholm</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Switzerland.svg" class="image" title="Flag of Switzerland"><img alt="Flag of Switzerland" longdesc="/wiki/Image:Flag_of_Switzerland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Switzerland.svg/50px-Flag_of_Switzerland.svg.png" height="50" width="50"></a>&nbsp;<a href="/wiki/Switzerland" title="Switzerland">Switzerland</a></b> – <a href="/wiki/Berne" title="Berne">Berne</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_Ukraine.svg" class="image" title="Flag of Ukraine"><img alt="Flag of Ukraine" longdesc="/wiki/Image:Flag_of_Ukraine.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Ukraine.svg/50px-Flag_of_Ukraine.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Ukraine" title="Ukraine">Ukraine</a></b> – <a href="/wiki/Kiev" title="Kiev">Kiev</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="image" title="Flag of the United Kingdom"><img alt="Flag of the United Kingdom" longdesc="/wiki/Image:Flag_of_the_United_Kingdom.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_United_Kingdom.svg/50px-Flag_of_the_United_Kingdom.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/United_Kingdom" title="United Kingdom">United Kingdom</a></b> – <a href="/wiki/London" title="London">London</a></td></tr>
+<tr><td>Europe</td><td><b><a href="/wiki/Image:Flag_of_the_Vatican_City.svg" class="image" title="Flag of the Vatican City"><img alt="Flag of the Vatican City" longdesc="/wiki/Image:Flag_of_the_Vatican_City.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_the_Vatican_City.svg/50px-Flag_of_the_Vatican_City.svg.png" height="50" width="50"></a>&nbsp;<a href="/wiki/Vatican_City" title="Vatican City">Vatican City</a></b> – Vatican City<sup id="_ref-city-state_3" class="reference"><a href="#_note-city-state" title="">[5]</a></sup></td></tr>
+
+<!-- Americas: North_America -->
+
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Anguilla.svg" class="image" title="Flag of Anguilla"><img alt="Flag of Anguilla" longdesc="/wiki/Image:Flag_of_Anguilla.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Anguilla.svg/50px-Flag_of_Anguilla.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Anguilla" title="Anguilla">Anguilla</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/The_Valley%2C_Anguilla" title="The Valley, Anguilla">The Valley</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="image" title="Flag of Antigua and Barbuda"><img alt="Flag of Antigua and Barbuda" longdesc="/wiki/Image:Flag_of_Antigua_and_Barbuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Antigua_and_Barbuda.svg/50px-Flag_of_Antigua_and_Barbuda.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Antigua_and_Barbuda" title="Antigua and Barbuda">Antigua and Barbuda</a></b> – <a href="/wiki/Saint_John%27s%2C_Antigua_and_Barbuda" title="Saint John's, Antigua and Barbuda">Saint John's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Aruba.svg" class="image" title="Flag of Aruba"><img alt="Flag of Aruba" longdesc="/wiki/Image:Flag_of_Aruba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Aruba.svg/50px-Flag_of_Aruba.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Aruba" title="Aruba">Aruba</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Oranjestad%2C_Aruba" title="Oranjestad, Aruba">Oranjestad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Bahamas.svg" class="image" title="Flag of the Bahamas"><img alt="Flag of the Bahamas" longdesc="/wiki/Image:Flag_of_the_Bahamas.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_the_Bahamas.svg/50px-Flag_of_the_Bahamas.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/The_Bahamas" title="The Bahamas">Bahamas</a></b> – <a href="/wiki/Nassau%2C_Bahamas" title="Nassau, Bahamas">Nassau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Barbados.svg" class="image" title="Flag of Barbados"><img alt="Flag of Barbados" longdesc="/wiki/Image:Flag_of_Barbados.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Barbados.svg/50px-Flag_of_Barbados.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Barbados" title="Barbados">Barbados</a></b> – <a href="/wiki/Bridgetown" title="Bridgetown">Bridgetown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Belize.svg" class="image" title="Flag of Belize"><img alt="Flag of Belize" longdesc="/wiki/Image:Flag_of_Belize.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Belize.svg/50px-Flag_of_Belize.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Belize" title="Belize">Belize</a></b> – <a href="/wiki/Belmopan" title="Belmopan">Belmopan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Bermuda.svg" class="image" title="Flag of Bermuda"><img alt="Flag of Bermuda" longdesc="/wiki/Image:Flag_of_Bermuda.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Bermuda.svg/50px-Flag_of_Bermuda.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Bermuda" title="Bermuda">Bermuda</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Hamilton%2C_Bermuda" title="Hamilton, Bermuda">Hamilton</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="image" title="Flag of the British Virgin Islands"><img alt="Flag of the British Virgin Islands" longdesc="/wiki/Image:Flag_of_the_British_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_the_British_Virgin_Islands.svg/50px-Flag_of_the_British_Virgin_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/British_Virgin_Islands" title="British Virgin Islands">British Virgin Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Road_Town" title="Road Town">Road Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Canada.svg" class="image" title="Flag of Canada"><img alt="Flag of Canada" longdesc="/wiki/Image:Flag_of_Canada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Canada.svg/50px-Flag_of_Canada.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Canada" title="Canada">Canada</a></b> – <a href="/wiki/Ottawa" title="Ottawa">Ottawa</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="image" title="Flag of Cayman Islands"><img alt="Flag of Cayman Islands" longdesc="/wiki/Image:Flag_of_the_Cayman_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_the_Cayman_Islands.svg/50px-Flag_of_the_Cayman_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Cayman_Islands" title="Cayman Islands">Cayman Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/George_Town%2C_Cayman_Islands" title="George Town, Cayman Islands">George Town</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of France"><img alt="Flag of France" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a> <a href="/wiki/Clipperton_Island" title="Clipperton Island">Clipperton Island</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Costa_Rica.svg" class="image" title="Flag of Costa Rica"><img alt="Flag of Costa Rica" longdesc="/wiki/Image:Flag_of_Costa_Rica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Flag_of_Costa_Rica.svg/50px-Flag_of_Costa_Rica.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Costa_Rica" title="Costa Rica">Costa Rica</a></b> – <a href="/wiki/San_Jos%C3%A9%2C_Costa_Rica" title="San José, Costa Rica">San José</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Cuba.svg" class="image" title="Flag of Cuba"><img alt="Flag of Cuba" longdesc="/wiki/Image:Flag_of_Cuba.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Flag_of_Cuba.svg/50px-Flag_of_Cuba.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Cuba" title="Cuba">Cuba</a></b> – <a href="/wiki/Havana" title="Havana">Havana</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Dominica.svg" class="image" title="Flag of Dominica"><img alt="Flag of Dominica" longdesc="/wiki/Image:Flag_of_Dominica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_Dominica.svg/50px-Flag_of_Dominica.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Dominica" title="Dominica">Dominica</a></b> – <a href="/wiki/Roseau" title="Roseau">Roseau</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="image" title="Flag of the Dominican Republic"><img alt="Flag of the Dominican Republic" longdesc="/wiki/Image:Flag_of_the_Dominican_Republic.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_the_Dominican_Republic.svg/50px-Flag_of_the_Dominican_Republic.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Dominican_Republic" title="Dominican Republic">Dominican Republic</a></b> – <a href="/wiki/Santo_Domingo" title="Santo Domingo">Santo Domingo</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_El_Salvador.svg" class="image" title="Flag of El Salvador"><img alt="Flag of El Salvador" longdesc="/wiki/Image:Flag_of_El_Salvador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_El_Salvador.svg/50px-Flag_of_El_Salvador.svg.png" height="28" width="50"></a>&nbsp;<a href="/wiki/El_Salvador" title="El Salvador">El Salvador</a></b> – <a href="/wiki/San_Salvador" title="San Salvador">San Salvador</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Greenland.svg" class="image" title="Flag of Greenland"><img alt="Flag of Greenland" longdesc="/wiki/Image:Flag_of_Greenland.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Greenland.svg/50px-Flag_of_Greenland.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Greenland" title="Greenland">Greenland</a></i> (overseas territory of Denmark) – <a href="/wiki/Nuuk" title="Nuuk">Nuuk</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Grenada.svg" class="image" title="Flag of Grenada"><img alt="Flag of Grenada" longdesc="/wiki/Image:Flag_of_Grenada.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Grenada.svg/50px-Flag_of_Grenada.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Grenada" title="Grenada">Grenada</a></b> – <a href="/wiki/Saint_George%27s%2C_Grenada" title="Saint George's, Grenada">Saint George's</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Guadeloupe"><img alt="Flag of Guadeloupe" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Guadeloupe" title="Guadeloupe">Guadeloupe</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Basse-Terre" title="Basse-Terre">Basse-Terre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Guatemala.svg" class="image" title="Flag of Guatemala"><img alt="Flag of Guatemala" longdesc="/wiki/Image:Flag_of_Guatemala.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Flag_of_Guatemala.svg/50px-Flag_of_Guatemala.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Guatemala" title="Guatemala">Guatemala</a></b> – <a href="/wiki/Guatemala_City" title="Guatemala City">Guatemala City</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Haiti.svg" class="image" title="Flag of Haiti"><img alt="Flag of Haiti" longdesc="/wiki/Image:Flag_of_Haiti.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Haiti.svg/50px-Flag_of_Haiti.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Haiti" title="Haiti">Haiti</a></b> – <a href="/wiki/Port-au-Prince" title="Port-au-Prince">Port-au-Prince</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Honduras.svg" class="image" title="Flag of Honduras"><img alt="Flag of Honduras" longdesc="/wiki/Image:Flag_of_Honduras.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Flag_of_Honduras.svg/50px-Flag_of_Honduras.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Honduras" title="Honduras">Honduras</a></b> – <a href="/wiki/Tegucigalpa" title="Tegucigalpa">Tegucigalpa</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Jamaica.svg" class="image" title="Flag of Jamaica"><img alt="Flag of Jamaica" longdesc="/wiki/Image:Flag_of_Jamaica.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Jamaica.svg/50px-Flag_of_Jamaica.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Jamaica" title="Jamaica">Jamaica</a></b> – <a href="/wiki/Kingston%2C_Jamaica" title="Kingston, Jamaica">Kingston</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Martinique"><img alt="Flag of Martinique" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Martinique" title="Martinique">Martinique</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Fort-de-France" title="Fort-de-France">Fort-de-France</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Mexico.svg" class="image" title="Flag of Mexico"><img alt="Flag of Mexico" longdesc="/wiki/Image:Flag_of_Mexico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Flag_of_Mexico.svg/50px-Flag_of_Mexico.svg.png" height="29" width="50"></a>&nbsp;<a href="/wiki/Mexico" title="Mexico">Mexico</a></b> – <a href="/wiki/Mexico_City" title="Mexico City">Mexico City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Montserrat.svg" class="image" title="Flag of Montserrat"><img alt="Flag of Montserrat" longdesc="/wiki/Image:Flag_of_Montserrat.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Montserrat.svg/50px-Flag_of_Montserrat.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Montserrat" title="Montserrat">Montserrat</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Plymouth%2C_Montserrat" title="Plymouth, Montserrat">Plymouth</a> (seat of government at <a href="/wiki/Brades" title="Brades">Brades</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of Navassa Island"><img alt="Flag of Navassa Island" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a>&nbsp;<a href="/wiki/Navassa_Island" title="Navassa Island">Navassa Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="image" title="Flag of the Netherlands Antilles"><img alt="Flag of the Netherlands Antilles" longdesc="/wiki/Image:Flag_of_the_Netherlands_Antilles.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Flag_of_the_Netherlands_Antilles.svg/50px-Flag_of_the_Netherlands_Antilles.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Netherlands_Antilles" title="Netherlands Antilles">Netherlands Antilles</a></i> (overseas country in the <a href="/wiki/Kingdom_of_the_Netherlands" title="Kingdom of the Netherlands">Kingdom of the Netherlands</a>) – <a href="/wiki/Willemstad%2C_Netherlands_Antilles" title="Willemstad, Netherlands Antilles">Willemstad</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Nicaragua.svg" class="image" title="Flag of Nicaragua"><img alt="Flag of Nicaragua" longdesc="/wiki/Image:Flag_of_Nicaragua.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Nicaragua.svg/50px-Flag_of_Nicaragua.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Nicaragua" title="Nicaragua">Nicaragua</a></b> – <a href="/wiki/Managua" title="Managua">Managua</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Panama.svg" class="image" title="Flag of Panama"><img alt="Flag of Panama" longdesc="/wiki/Image:Flag_of_Panama.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Flag_of_Panama.svg/50px-Flag_of_Panama.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Panama" title="Panama">Panama</a></b> – <a href="/wiki/Panama_City" title="Panama City">Panama City</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_Puerto_Rico.svg" class="image" title="Flag of Puerto Rico"><img alt="Flag of Puerto Rico" longdesc="/wiki/Image:Flag_of_Puerto_Rico.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Puerto_Rico.svg/50px-Flag_of_Puerto_Rico.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Puerto_Rico" title="Puerto Rico">Puerto Rico</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/San_Juan%2C_Puerto_Rico" title="San Juan, Puerto Rico">San Juan</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Barthelemy"><img alt="Flag of Saint Barthelemy" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Barthelemy" title="Saint Barthelemy">Saint Barthelemy</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Gustavia%2C_Saint_Barthelemy" title="Gustavia, Saint Barthelemy">Gustavia</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="image" title="Flag of Saint Kitts and Nevis"><img alt="Flag of Saint Kitts and Nevis" longdesc="/wiki/Image:Flag_of_Saint_Kitts_and_Nevis.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Saint_Kitts_and_Nevis.svg/50px-Flag_of_Saint_Kitts_and_Nevis.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Kitts_and_Nevis" title="Saint Kitts and Nevis">Saint Kitts and Nevis</a></b> – <a href="/wiki/Basseterre" title="Basseterre">Basseterre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Lucia.svg" class="image" title="Flag of Saint Lucia"><img alt="Flag of Saint Lucia" longdesc="/wiki/Image:Flag_of_Saint_Lucia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Saint_Lucia.svg/50px-Flag_of_Saint_Lucia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Saint_Lucia" title="Saint Lucia">Saint Lucia</a></b> – <a href="/wiki/Castries" title="Castries">Castries</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Martin (France)"><img alt="Flag of Saint Martin (France)" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Martin_%28France%29" title="Saint Martin (France)">Saint Martin</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Marigot%2C_Saint_Martin" title="Marigot, Saint Martin">Marigot</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Saint Pierre and Miquelon"><img alt="Flag of Saint Pierre and Miquelon" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Pierre_and_Miquelon" title="Saint Pierre and Miquelon">Saint Pierre and Miquelon</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Saint-Pierre%2C_Saint_Pierre_and_Miquelon" title="Saint-Pierre, Saint Pierre and Miquelon">Saint-Pierre</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="image" title="Flag of Saint Vincent and the Grenadines"><img alt="Flag of Saint Vincent and the Grenadines" longdesc="/wiki/Image:Flag_of_Saint_Vincent_and_the_Grenadines.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg/50px-Flag_of_Saint_Vincent_and_the_Grenadines.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Saint_Vincent_and_the_Grenadines" title="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</a></b> – <a href="/wiki/Kingstown" title="Kingstown">Kingstown</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="image" title="Flag of Trinidad and Tobago"><img alt="Flag of Trinidad and Tobago" longdesc="/wiki/Image:Flag_of_Trinidad_and_Tobago.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Trinidad_and_Tobago.svg/50px-Flag_of_Trinidad_and_Tobago.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Trinidad_and_Tobago" title="Trinidad and Tobago">Trinidad and Tobago</a></b> – <a href="/wiki/Port_of_Spain" title="Port of Spain">Port of Spain</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="image" title="Flag of the Turks and Caicos Islands"><img alt="Flag of the Turks and Caicos Islands" longdesc="/wiki/Image:Flag_of_the_Turks_and_Caicos_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_the_Turks_and_Caicos_Islands.svg/50px-Flag_of_the_Turks_and_Caicos_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Turks_and_Caicos_Islands" title="Turks and Caicos Islands">Turks and Caicos Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Cockburn_Town" title="Cockburn Town">Cockburn Town</a></td></tr>
+<tr><td>North America</td><td><b><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a>&nbsp;<a href="/wiki/United_States" title="United States">United States</a></b> – <a href="/wiki/Washington%2C_D.C." title="Washington, D.C.">Washington, D.C.</a></td></tr>
+<tr><td>North America</td><td><i><a href="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="image" title="Flag of the United States Virgin Islands"><img alt="Flag of the United States Virgin Islands" longdesc="/wiki/Image:Flag_of_the_United_States_Virgin_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_the_United_States_Virgin_Islands.svg/50px-Flag_of_the_United_States_Virgin_Islands.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/United_States_Virgin_Islands" title="United States Virgin Islands">United States Virgin Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Charlotte_Amalie%2C_United_States_Virgin_Islands" title="Charlotte Amalie, United States Virgin Islands">Charlotte Amalie</a></td></tr>
+
+<!-- Americas: South America -->
+
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Argentina.svg" class="image" title="Flag of Argentina"><img alt="Flag of Argentina" longdesc="/wiki/Image:Flag_of_Argentina.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Flag_of_Argentina.svg/50px-Flag_of_Argentina.svg.png" height="32" width="50"></a>&nbsp;<a href="/wiki/Argentina" title="Argentina">Argentina</a></b> – <a href="/wiki/Buenos_Aires" title="Buenos Aires">Buenos Aires</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Bolivia.svg" class="image" title="Flag of Bolivia"><img alt="Flag of Bolivia" longdesc="/wiki/Image:Flag_of_Bolivia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Bolivia.svg/50px-Flag_of_Bolivia.svg.png" height="34" width="50"></a>&nbsp;<a href="/wiki/Bolivia" title="Bolivia">Bolivia</a></b> – <a href="/wiki/Sucre" title="Sucre">Sucre</a> (seat of government at <a href="/wiki/La_Paz" title="La Paz">La Paz</a>)</td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Brazil.svg" class="image" title="Flag of Brazil"><img alt="Flag of Brazil" longdesc="/wiki/Image:Flag_of_Brazil.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/50px-Flag_of_Brazil.svg.png" height="35" width="50"></a>&nbsp;<a href="/wiki/Brazil" title="Brazil">Brazil</a></b> – <a href="/wiki/Bras%C3%ADlia" title="Brasília">Brasília</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Chile.svg" class="image" title="Flag of Chile"><img alt="Flag of Chile" longdesc="/wiki/Image:Flag_of_Chile.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Flag_of_Chile.svg/50px-Flag_of_Chile.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Chile" title="Chile">Chile</a></b> – <a href="/wiki/Santiago%2C_Chile" title="Santiago, Chile">Santiago</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Colombia.svg" class="image" title="Flag of Colombia"><img alt="Flag of Colombia" longdesc="/wiki/Image:Flag_of_Colombia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Colombia.svg/50px-Flag_of_Colombia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Colombia" title="Colombia">Colombia</a></b> – <a href="/wiki/Bogot%C3%A1" title="Bogotá">Bogotá</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Ecuador.svg" class="image" title="Flag of Ecuador"><img alt="Flag of Ecuador" longdesc="/wiki/Image:Flag_of_Ecuador.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Ecuador.svg/50px-Flag_of_Ecuador.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Ecuador" title="Ecuador">Ecuador</a></b> – <a href="/wiki/Quito" title="Quito">Quito</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="image" title="Flag of the Falkland Islands"><img alt="Flag of the Falkland Islands" longdesc="/wiki/Image:Flag_of_the_Falkland_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_the_Falkland_Islands.svg/50px-Flag_of_the_Falkland_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Falkland_Islands" title="Falkland Islands">Falkland Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Stanley%2C_Falkland_Islands" title="Stanley, Falkland Islands">Stanley</a></td></tr>
+<tr><td>South America</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of French Guiana"><img alt="Flag of French Guiana" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/French_Guiana" title="French Guiana">French Guiana</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas department of France</a>) – <a href="/wiki/Cayenne" title="Cayenne">Cayenne</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Guyana.svg" class="image" title="Flag of Guyana"><img alt="Flag of Guyana" longdesc="/wiki/Image:Flag_of_Guyana.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_Guyana.svg/50px-Flag_of_Guyana.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Guyana" title="Guyana">Guyana</a></b> – <a href="/wiki/Georgetown%2C_Guyana" title="Georgetown, Guyana">Georgetown</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Paraguay.svg" class="image" title="Flag of Paraguay"><img alt="Flag of Paraguay" longdesc="/wiki/Image:Flag_of_Paraguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Paraguay.svg/50px-Flag_of_Paraguay.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Paraguay" title="Paraguay">Paraguay</a></b> – <a href="/wiki/Asunci%C3%B3n" title="Asunción">Asunción</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Peru.svg" class="image" title="Flag of Peru"><img alt="Flag of Peru" longdesc="/wiki/Image:Flag_of_Peru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Flag_of_Peru.svg/50px-Flag_of_Peru.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Peru" title="Peru">Peru</a></b> – <a href="/wiki/Lima" title="Lima">Lima</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Suriname.svg" class="image" title="Flag of Suriname"><img alt="Flag of Suriname" longdesc="/wiki/Image:Flag_of_Suriname.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_Suriname.svg/50px-Flag_of_Suriname.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Suriname" title="Suriname">Suriname</a></b> – <a href="/wiki/Paramaribo" title="Paramaribo">Paramaribo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Uruguay.svg" class="image" title="Flag of Uruguay"><img alt="Flag of Uruguay" longdesc="/wiki/Image:Flag_of_Uruguay.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Uruguay.svg/50px-Flag_of_Uruguay.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Uruguay" title="Uruguay">Uruguay</a></b> – <a href="/wiki/Montevideo" title="Montevideo">Montevideo</a></td></tr>
+<tr><td>South America</td><td><b><a href="/wiki/Image:Flag_of_Venezuela.svg" class="image" title="Flag of Venezuela"><img alt="Flag of Venezuela" longdesc="/wiki/Image:Flag_of_Venezuela.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Venezuela.svg/50px-Flag_of_Venezuela.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Venezuela" title="Venezuela">Venezuela</a></b> – <a href="/wiki/Caracas" title="Caracas">Caracas</a></td></tr>
+
+<!-- Americas: Oceania -->
+
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_American_Samoa.svg" class="image" title="Flag of American Samoa"><img alt="Flag of American Samoa" longdesc="/wiki/Image:Flag_of_American_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_American_Samoa.svg/50px-Flag_of_American_Samoa.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/American_Samoa" title="American Samoa">American Samoa</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Pago_Pago" title="Pago Pago">Pago Pago</a> (seat of government at <a href="/wiki/Fagatogo" title="Fagatogo">Fagatogo</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Australia"><img alt="Flag of Australia" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Australia" title="Australia">Australia</a></b> – <a href="/wiki/Canberra" title="Canberra">Canberra</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Baker_Island" title="Baker Island">Baker Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="image" title="Flag of the Cook Islands"><img alt="Flag of the Cook Islands" longdesc="/wiki/Image:Flag_of_the_Cook_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/50px-Flag_of_the_Cook_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Cook_Islands" title="Cook Islands">Cook Islands</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Avarua" title="Avarua">Avarua</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Fiji.svg" class="image" title="Flag of Fiji"><img alt="Flag of Fiji" longdesc="/wiki/Image:Flag_of_Fiji.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Fiji.svg/50px-Flag_of_Fiji.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Fiji" title="Fiji">Fiji</a></b> – <a href="/wiki/Suva" title="Suva">Suva</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_French_Polynesia.svg" class="image" title="Flag of French Polynesia"><img alt="Flag of French Polynesia" longdesc="/wiki/Image:Flag_of_French_Polynesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_French_Polynesia.svg/50px-Flag_of_French_Polynesia.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/French_Polynesia" title="French Polynesia">French Polynesia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Papeete" title="Papeete">Papeete</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Guam.svg" class="image" title="Flag of Guam"><img alt="Flag of Guam" longdesc="/wiki/Image:Flag_of_Guam.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Flag_of_Guam.svg/50px-Flag_of_Guam.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Guam" title="Guam">Guam</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Hag%C3%A5t%C3%B1a" title="Hagåtña">Hagåtña</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Howland_Island" title="Howland Island">Howland Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Jarvis_Island" title="Jarvis Island">Jarvis Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Johnston_Atoll" title="Johnston Atoll">Johnston Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Kingman_Reef" title="Kingman Reef">Kingman Reef</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Kiribati.svg" class="image" title="Flag of Kiribati"><img alt="Flag of Kiribati" longdesc="/wiki/Image:Flag_of_Kiribati.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kiribati.svg/50px-Flag_of_Kiribati.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Kiribati" title="Kiribati">Kiribati</a></b> – <a href="/wiki/South_Tarawa" title="South Tarawa">South Tarawa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="image" title="Flag of the Marshall Islands"><img alt="Flag of the Marshall Islands" longdesc="/wiki/Image:Flag_of_the_Marshall_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Flag_of_the_Marshall_Islands.svg/50px-Flag_of_the_Marshall_Islands.svg.png" height="26" width="50"></a>&nbsp;<a href="/wiki/Marshall_Islands" title="Marshall Islands">Marshall Islands</a></b> – <a href="/wiki/Majuro" title="Majuro">Majuro</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Micronesia.svg" class="image" title="Flag of the Federated States of Micronesia"><img alt="Flag of the Federated States of Micronesia" longdesc="/wiki/Image:Flag_of_Micronesia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Micronesia.svg/50px-Flag_of_Micronesia.svg.png" height="26" width="50"></a>&nbsp;<a href="/wiki/Federated_States_of_Micronesia" title="Federated States of Micronesia">Micronesia</a></b> – <a href="/wiki/Palikir" title="Palikir">Palikir</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Midway_Atoll" title="Midway Atoll">Midway Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Nauru.svg" class="image" title="Flag of Nauru"><img alt="Flag of Nauru" longdesc="/wiki/Image:Flag_of_Nauru.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_of_Nauru.svg/50px-Flag_of_Nauru.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Nauru" title="Nauru">Nauru</a></b> – no official capital (seat of government at <a href="/wiki/Yaren" title="Yaren">Yaren</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of New Caledonia"><img alt="Flag of New Caledonia" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/New_Caledonia" title="New Caledonia">New Caledonia</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Noum%C3%A9a" title="Nouméa">Nouméa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of New Zealand"><img alt="Flag of New Zealand" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/50px-Flag_of_New_Zealand.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/New_Zealand" title="New Zealand">New Zealand</a></b> – <a href="/wiki/Wellington" title="Wellington">Wellington</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Niue.svg" class="image" title="Flag of Niue"><img alt="Flag of Niue" longdesc="/wiki/Image:Flag_of_Niue.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/50px-Flag_of_Niue.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Niue" title="Niue">Niue</a></i> (<a href="/wiki/Associated_state" title="Associated state">territory in free association</a> with New Zealand) – <a href="/wiki/Alofi" title="Alofi">Alofi</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_Norfolk_Island.svg" class="image" title="Flag of Norfolk Island"><img alt="Flag of Norfolk Island" longdesc="/wiki/Image:Flag_of_Norfolk_Island.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Norfolk_Island.svg/50px-Flag_of_Norfolk_Island.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Norfolk_Island" title="Norfolk Island">Norfolk Island</a></i> (overseas territory of Australia) – <a href="/wiki/Kingston%2C_Norfolk_Island" title="Kingston, Norfolk Island">Kingston</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="image" title="Flag of the Northern Mariana Islands"><img alt="Flag of the Northern Mariana Islands" longdesc="/wiki/Image:Flag_of_the_Northern_Mariana_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_the_Northern_Mariana_Islands.svg/50px-Flag_of_the_Northern_Mariana_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Northern_Mariana_Islands" title="Northern Mariana Islands">Northern Mariana Islands</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>) – <a href="/wiki/Saipan" title="Saipan">Saipan</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Palau.svg" class="image" title="Flag of Palau"><img alt="Flag of Palau" longdesc="/wiki/Image:Flag_of_Palau.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Palau.svg/50px-Flag_of_Palau.svg.png" height="31" width="50"></a>&nbsp;<a href="/wiki/Palau" title="Palau">Palau</a></b> – <a href="/wiki/Melekeok" title="Melekeok">Melekeok</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Palmyra_Atoll" title="Palmyra Atoll">Palmyra Atoll</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="image" title="Flag of Papua New Guinea"><img alt="Flag of Papua New Guinea" longdesc="/wiki/Image:Flag_of_Papua_New_Guinea.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Flag_of_Papua_New_Guinea.svg/50px-Flag_of_Papua_New_Guinea.svg.png" height="38" width="50"></a>&nbsp;<a href="/wiki/Papua_New_Guinea" title="Papua New Guinea">Papua New Guinea</a></b> – <a href="/wiki/Port_Moresby" title="Port Moresby">Port Moresby</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="image" title="Flag of the Pitcairn Islands"><img alt="Flag of the Pitcairn Islands" longdesc="/wiki/Image:Flag_of_the_Pitcairn_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Flag_of_the_Pitcairn_Islands.svg/50px-Flag_of_the_Pitcairn_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Pitcairn_Islands" title="Pitcairn Islands">Pitcairn Islands</a></i> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>) – <a href="/wiki/Adamstown%2C_Pitcairn_Island" title="Adamstown, Pitcairn Island">Adamstown</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Samoa.svg" class="image" title="Flag of Samoa"><img alt="Flag of Samoa" longdesc="/wiki/Image:Flag_of_Samoa.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Samoa.svg/50px-Flag_of_Samoa.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Samoa" title="Samoa">Samoa</a></b> – <a href="/wiki/Apia" title="Apia">Apia</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="image" title="Flag of the Solomon Islands"><img alt="Flag of the Solomon Islands" longdesc="/wiki/Image:Flag_of_the_Solomon_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Solomon_Islands.svg/50px-Flag_of_the_Solomon_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Solomon_Islands" title="Solomon Islands">Solomon Islands</a></b> – <a href="/wiki/Honiara" title="Honiara">Honiara</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_New_Zealand.svg" class="image" title="Flag of Tokelau"><img alt="Flag of Tokelau" longdesc="/wiki/Image:Flag_of_New_Zealand.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/50px-Flag_of_New_Zealand.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Tokelau" title="Tokelau">Tokelau</a></i> (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)</td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tonga.svg" class="image" title="Flag of Tonga"><img alt="Flag of Tonga" longdesc="/wiki/Image:Flag_of_Tonga.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Tonga.svg/50px-Flag_of_Tonga.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Tonga" title="Tonga">Tonga</a></b> – <a href="/wiki/Nuku%27alofa" title="Nuku'alofa">Nuku'alofa</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Tuvalu.svg" class="image" title="Flag of Tuvalu"><img alt="Flag of Tuvalu" longdesc="/wiki/Image:Flag_of_Tuvalu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tuvalu.svg/50px-Flag_of_Tuvalu.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Tuvalu" title="Tuvalu">Tuvalu</a></b> – <a href="/wiki/Funafuti" title="Funafuti">Funafuti</a></td></tr>
+<tr><td>Oceania</td><td><b><a href="/wiki/Image:Flag_of_Vanuatu.svg" class="image" title="Flag of Vanuatu"><img alt="Flag of Vanuatu" longdesc="/wiki/Image:Flag_of_Vanuatu.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Vanuatu.svg/50px-Flag_of_Vanuatu.svg.png" height="30" width="50"></a>&nbsp;<a href="/wiki/Vanuatu" title="Vanuatu">Vanuatu</a></b> – <a href="/wiki/Port_Vila" title="Port Vila">Port Vila</a></td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_the_United_States.svg" class="image" title="Flag of the United States"><img alt="Flag of the United States" longdesc="/wiki/Image:Flag_of_the_United_States.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/50px-Flag_of_the_United_States.svg.png" height="26" width="50"></a> <a href="/wiki/Wake_Island" title="Wake Island">Wake Island</a></i> (<a href="/wiki/Insular_area" title="Insular area">overseas territory of the United States</a>)</td></tr>
+<tr><td>Oceania</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of Wallis and Futuna"><img alt="Flag of Wallis and Futuna" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/Wallis_and_Futuna" title="Wallis and Futuna">Wallis and Futuna</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>) – <a href="/wiki/Mata-Utu" title="Mata-Utu">Mata-Utu</a></td></tr>
+
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Norway.svg" class="image" title="Flag of Bouvet Island"><img alt="Flag of Bouvet Island" longdesc="/wiki/Image:Flag_of_Norway.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/50px-Flag_of_Norway.svg.png" height="36" width="50"></a>&nbsp;<a href="/wiki/Bouvet_Island" title="Bouvet Island">Bouvet Island</a></i> (overseas territory of Norway)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_France.svg" class="image" title="Flag of the French Southern and Antarctic Lands"><img alt="Flag of the French Southern and Antarctic Lands" longdesc="/wiki/Image:Flag_of_France.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/50px-Flag_of_France.svg.png" height="33" width="50"></a>&nbsp;<a href="/wiki/French_Southern_and_Antarctic_Lands" title="French Southern and Antarctic Lands">French Southern Territories</a></i> (<a href="/wiki/French_overseas_territory" title="French overseas territory">overseas territory of France</a>)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_Australia.svg" class="image" title="Flag of Heard Island and McDonald Islands"><img alt="Flag of Heard Island and McDonald Islands" longdesc="/wiki/Image:Flag_of_Australia.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Australia.svg/50px-Flag_of_Australia.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/Heard_Island_and_McDonald_Islands" title="Heard Island and McDonald Islands">Heard Island and McDonald Islands</a></i> (overseas territory of Australia)</td></tr>
+<tr><td>Antarctica</td><td><i><a href="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="image" title="Flag of South Georgia and the South Sandwich Islands"><img alt="Flag of South Georgia and the South Sandwich Islands" longdesc="/wiki/Image:Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg" class="thumbborder" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg/50px-Flag_of_South_Georgia_and_the_South_Sandwich_Islands.svg.png" height="25" width="50"></a>&nbsp;<a href="/wiki/South_Georgia_and_the_South_Sandwich_Islands" title="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</a></i><sup id="_ref-3" class="reference"><a href="#_note-3" title="">[7]</a></sup> (<a href="/wiki/British_overseas_territory" title="British overseas territory">overseas territory of the United Kingdom</a>)</td></tr>
+</table>
+
+</body>
+</html>
diff --git a/includes/js/dijit/demos/mail.html b/includes/js/dijit/demos/mail.html
new file mode 100644
index 0000000..0eae49f
--- /dev/null
+++ b/includes/js/dijit/demos/mail.html
@@ -0,0 +1,426 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Demo Mail Application</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/soria/soria.css";
+ @import "mail/mail.css";
+ </style>
+ <style type="text/css">
+ #inbox .dijitSplitterH { height: 5px }
+ #inbox .dijitSplitterV { width: 5px }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: false, parseOnLoad: true, defaultTestTheme: 'soria'"></script>
+ <script type="text/javascript" src="../tests/_testCommon.js"></script>
+ <!--
+ <script type="text/javascript" src="../dijit.js"></script>
+ <script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+ -->
+ <script type="text/javascript">
+ // Use profile builds, if available. Since we use pretty much all of the widgets, just use dijit-all.
+ // A custom profile would provide some additional savings.
+ dojo.require("dijit.dijit");
+ dojo.require("dijit.dijit-all");
+
+ dojo.require("dojo.parser");
+ dojo.require("dojo.data.ItemFileWriteStore");
+
+ dojo.require("dijit.dijit");
+ dojo.require("dijit.Declaration");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.Toolbar");
+ dojo.require("dijit._Calendar");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Editor");
+ dojo.require("dijit._editor.plugins.LinkDialog");
+ dojo.require("dijit.ProgressBar");
+
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.Textarea");
+
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.ContentPane");
+
+ dojo.addOnLoad(function(){
+ dijit.setWaiRole(dojo.body(), "application");
+ });
+
+ var paneId=1;
+
+ // for "new message" tab closing
+ function testClose(pane,tab){
+ return confirm("Are you sure you want to leave your changes?");
+ }
+
+ // fake mail download code:
+ var numMails;
+ var updateFetchStatus = function(x){
+ if (x == 0) {
+ dijit.byId('fakeFetch').update({ indeterminate: false });
+ return;
+ }
+ dijit.byId('fakeFetch').update({ progress: x });
+ if (x == numMails){
+ dojo.fadeOut({ node: 'fetchMail', duration:800,
+ // set progress back to indeterminate. we're cheating, because this
+ // doesn't actually have any data to "progress"
+ onEnd: function(){
+ dijit.byId('fakeFetch').update({ indeterminate: true });
+ dojo.byId('fetchMail').style.visibility='hidden'; // remove progress bar from tab order
+ }
+ }).play();
+ }
+ }
+ var fakeReport = function(percent){
+ // FIXME: can't set a label on an indeterminate progress bar
+ // like if(this.indeterminate) { return " connecting."; }
+ return dojo.string.substitute("Fetching: ${0} of ${1} messages.", [percent*this.maximum, this.maximum]);
+ }
+ var fakeDownload = function(){
+ dojo.byId('fetchMail').style.visibility='visible';
+ numMails = Math.floor(Math.random()*10)+1;
+ dijit.byId('fakeFetch').update({ maximum: numMails, progress:0 });
+ dojo.fadeIn({ node: 'fetchMail', duration:300 }).play();
+ for (var i=0; i<=numMails; i++){
+ setTimeout(function(){updateFetchStatus(i);},((i+1)*(Math.floor(Math.random()*100)+400)));
+ }
+ }
+ // fake sending dialog progress bar
+ var stopSendBar = function(){
+ dijit.byId('fakeSend').update({indeterminate: false});
+ dijit.byId('sendDialog').hide();
+ tabs.selectedChildWidget.onClose = function(){return true;}; // don't want confirm message
+ tabs.closeChild(tabs.selectedChildWidget);
+ }
+
+ var showSendBar = function(){
+ dijit.byId('fakeSend').update({ indeterminate: true });
+ dijit.byId('sendDialog').show();
+ setTimeout(function(){stopSendBar();}, 3000);
+ }
+
+ </script>
+</head>
+<body class="soria">
+ <div dojoType="dojo.data.ItemFileWriteStore" jsId="mailStore"
+ url="mail/mail.json"></div>
+
+ <!-- Inline declaration of a table widget (thanks Alex!) -->
+
+ <table dojoType="dijit.Declaration"
+ widgetClass="demo.Table" class="demoTable"
+ defaults="{ store: null, query: { query: { type: 'message' } }, columns: [ { name: 'From', attribute: 'sender' }, { name: 'Subject', attribute: 'label' }, { name: 'Sent on', attribute: 'sent',
+ format: function(v){ return dojo.date.locale.format(dojo.date.stamp.fromISOString(v), {selector: 'date'}); }
+ } ] }">
+ <thead dojoAttachPoint="head">
+ <tr dojoAttachPoint="headRow"></tr>
+ </thead>
+ <tbody dojoAttachPoint="body">
+ <tr dojoAttachPoint="row"></tr>
+ </tbody>
+
+ <script type="dojo/method">
+ dojo.forEach(this.columns, function(item, idx){
+ var icn = item.className||"";
+ // add a header for each column
+ var tth = document.createElement("th");
+ tth.innerHTML = "<span class='arrowNode'></span> "+ item.name;
+ tth.className = icn;
+ dojo.connect(tth, "onclick", dojo.hitch(this, "onSort", idx));
+ this.headRow.appendChild(tth);
+
+ // and fill in the column cell in the template row
+ this.row.appendChild(document.createElement("td"));
+ this.row.lastChild.className = icn;
+ }, this);
+ this.runQuery();
+ </script>
+ <script type="dojo/method" event="onSort" args="index">
+ var ca = this.columns[index].attribute;
+ var qs = this.query.sort;
+ // clobber an existing sort arrow
+ dojo.query("> th", this.headRow).removeClass("arrowUp").removeClass("arrowDown");
+ if(qs && qs[0].attribute == ca){
+ qs[0].descending = !qs[0].descending;
+ }else{
+ this.query.sort = [{
+ attribute: ca,
+ descending: false
+ }];
+ }
+ var th = dojo.query("> th", this.headRow)[index];
+ dojo.addClass(th, (this.query.sort[0].descending ? "arrowUp" : "arrowDown"));
+ this.runQuery();
+ </script>
+ <script type="dojo/method" event="runQuery">
+ this.query.onBegin = dojo.hitch(this, function(){ dojo.query("tr", this.body).orphan(); });
+ this.query.onItem = dojo.hitch(this, "onItem");
+ this.query.onComplete = dojo.hitch(this, function(){
+ dojo.query("tr:nth-child(odd)", this.body).addClass("oddRow");
+ dojo.query("tr:nth-child(even)", this.body).removeClass("oddRow");
+ });
+ this.store.fetch(this.query);
+ </script>
+ <script type="dojo/method" event="onItem" args="item">
+ var tr = this.row.cloneNode(true);
+ dojo.query("td", tr).forEach(function(n, i, a){
+ var tc = this.columns[i];
+ var tv = this.store.getValue(item, tc.attribute)||"";
+ if(tc.format){ tv = tc.format(tv, item, this.store); }
+ n.innerHTML = tv;
+ }, this);
+ this.body.appendChild(tr);
+ dojo.connect(tr, "onclick", this, function(){ this.onClick(item); });
+ </script>
+ </table>
+
+ <!-- Inline declaration for programmatically created "New Message" tabs -->
+ <div dojoType="dijit.Declaration"
+ widgetClass="mail.NewMessage">
+ <div dojoType="dijit.layout.BorderContainer" dojoAttachPoint="container" title="Composing..." closeable="true">
+ <div dojoType="dijit.layout.ContentPane" region="top" style="height:60px; overflow: visible; z-index: 10; color:#666;">
+ <table width="100%">
+ <tr style="padding-top:5px;">
+ <td style="padding-left:20px; padding-right: 8px; text-align:right;"><label for="${id}_to">To:</label></td>
+ <td width=100%>
+ <select dojoType="dijit.form.ComboBox" id="${id}_to" hasDownArrow="false">
+ <option></option>
+ <option>adam@yahoo.com</option>
+ <option>barry@yahoo.com</option>
+ <option>bob@yahoo.com</option>
+ <option>cal@yahoo.com</option>
+ <option>chris@yahoo.com</option>
+ <option>courtney@yahoo.com</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td style="padding-left: 20px; padding-right:8px; text-align:right;"><label for="${id}_subject">Subject:</label></td>
+ <td width=100%>
+ <select dojoType="dijit.form.ComboBox" id="${id}_subject" hasDownArrow="false">
+ <option></option>
+ <option>progress meeting</option>
+ <option>reports</option>
+ <option>lunch</option>
+ <option>vacation</option>
+ <option>status meeting</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <hr noshade size="1">
+ </div>
+
+ <!-- new message part -->
+ <!-- FIXME: editor as direct widget here doesn't init -->
+ <div dojoType="dijit.layout.ContentPane" region="center" href="mail/newMail.html"></div>
+
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="height:32px" align="center">
+ <button dojoType="dijit.form.Button" iconClass="mailIconOk"
+ >Send
+ <script type="dojo/method" event="onClick">
+ var toField = dojo.byId("${id}_to");
+ if (toField.value == ""){
+ alert("Please enter a recipient address");
+ }else{
+ showSendBar();
+ }
+ </script>
+ </button>
+ <button dojoType="dijit.form.Button" iconClass="mailIconCancel"
+ >Cancel
+ <script type="dojo/method" event="onClick">
+ tabs.closeChild(tabs.selectedChildWidget);
+ </script>
+ </button>
+ </div>
+ </div>
+ </div>
+
+
+ <div dojoType="dijit.layout.BorderContainer" id="main">
+
+ <!-- toolbar with new mail button, etc. -->
+ <div dojoType="dijit.Toolbar" region="top" style="height:25px;">
+ <div id="getMail" dojoType="dijit.form.ComboButton"
+ iconClass="mailIconGetMail" optionsTitle="Mail Source Options">
+ <script type="dojo/method" event="onClick">
+ fakeDownload();
+ </script>
+ <span>Get Mail</span>
+ <ul dojoType="dijit.Menu">
+ <li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">Yahoo</li>
+ <li dojoType="dijit.MenuItem" iconClass="mailIconGetMail">GMail</li>
+ </ul>
+ </div>
+ <span dojoType="dijit.Tooltip" connectId="getMail">Click to download new mail.</span>
+
+ <button
+ id="newMsg" dojoType="dijit.form.Button"
+ iconClass="mailIconNewMessage">
+ New Message
+ <script type="dojo/method" event="onClick">
+ /* make a new tab for composing the message */
+ var newTab = new mail.NewMessage({id: "new"+paneId }).container;
+ dojo.mixin(newTab,
+ {
+ title: "New Message #" + paneId++,
+ closable: true,
+ onClose: testClose
+ }
+ );
+ tabs.addChild(newTab);
+ tabs.selectChild(newTab);
+ </script>
+ </button>
+ <span dojoType="dijit.Tooltip" connectId="newMsg">Click to compose new message.</span>
+
+ <button id="options" dojoType="dijit.form.Button" iconClass="mailIconOptions">
+ &nbsp;Options
+ <script type="dojo/method" event="onClick">
+ dijit.byId('optionsDialog').show();
+ </script>
+ </button>
+ <div dojoType="dijit.Tooltip" connectId="options">Set various options</div>
+ </div>
+
+ <div dojoType="dijit.layout.TabContainer" id="tabs" jsId="tabs" region="center">
+ <!-- main section with tree, table, and preview -->
+ <div dojoType="dijit.layout.BorderContainer" id="inbox" title="Inbox" design="sidebar">
+ <div dojoType="dijit.layout.AccordionContainer" region="leading" minSize="20" style="width:20%;" splitter="true">
+ <div dojoType="dijit.layout.AccordionPane" title="Folders">
+ <div dojoType="dijit.Tree" id="mytree" store="mailStore"
+ childrenAttr="folders" query="{type:'folder'}" label="Folders">
+ <script type="dojo/method" event="onClick" args="item">
+ if(!item){
+ return; // top level node in tree doesn't correspond to any item
+ }
+ /* filter the message list to messages in this folder */
+ table.query.query = {
+ type: "message",
+ folder: mailStore.getValue(item, "id")
+ };
+ table.runQuery();
+ </script>
+ <script type="dojo/method" event="getIconClass" args="item">
+ return (item && mailStore.getValue(item, "icon")) || "mailIconFolderDocuments";
+ </script>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="Address Book">
+ <span dojoType="demo.Table" store="mailStore"
+ query="{ query: { type: 'address' }, columns: [ {name: 'User name', attribute: 'label'} ], sort: [ { attribute: 'label' } ] }"
+ id="addresses" style="width: 100%">
+ <script type="dojo/method" event="preamble">
+ this.query = { type: "address" };
+ this.columns = [
+ {
+ name: "Name",
+ attribute: "label"
+ }
+ ];
+ </script>
+ <script type="dojo/method" event="onClick" args="item">
+ table.query.query.sender = mailStore.getValue(item, "sender");
+ delete table.query.query.folder;
+ table.runQuery();
+ </script>
+ </span>
+ </div>
+ </div> <!-- end of Accordion -->
+
+ <!-- list of messages pane -->
+ <div id="listPane" dojoType="dijit.layout.ContentPane" region="top" minSize="20" style="height:134px;" splitter="true">
+ <span dojoType="demo.Table" store="mailStore"
+ query="{ query: { type: 'message' }, sort: [ { attribute: 'label' } ] }"
+ id="foo" jsId="table" style="width: 100%">
+ <script type="dojo/method" event="onClick" args="item">
+ var sender = this.store.getValue(item, "sender");
+ var subject = this.store.getValue(item, "label");
+ var sent = dojo.date.locale.format(
+ dojo.date.stamp.fromISOString(this.store.getValue(item, "sent")),
+ {formatLength: "long", selector: "date"});
+ var text = this.store.getValue(item, "text");
+ var messageInner = "<span class='messageHeader'>From: " + sender + "<br>" +
+ "Subject: "+ subject + "<br>" +
+ "Date: " + sent + "<br><br></span>" +
+ text;
+ dijit.byId("message").setContent(messageInner);
+ </script>
+ </span>
+ </div> <!-- end of listPane -->
+
+ <!-- message preview pane -->
+ <div id="message" dojoType="dijit.layout.ContentPane" region="center" minSize="20">
+ <p>
+ This is a simple application mockup showing some of the dojo widgets:
+ </p>
+ <ul>
+ <li>layout widgets: BorderContainer, AccordionContainer</li>
+ <li>TooltipDialog, Tooltip</li>
+ <li>Tree</li>
+ <li>form widgets: Button, DropDownButton, ComboButton, FilteringSelect, ComboBox</li>
+ <li>Editor</li>
+ </ul>
+ <p>
+ The message list above originally contains all the messages, but you can filter it
+ by clicking on items in the left Accordion.
+ Then click on the messages in the above list to display them.
+ There's no server running, so the app is just a facade and it doesn't really do anything.
+ <!-- TODO: delete button (we can delete since we are using ItemFileWriteStore -->
+ </p>
+ <p>
+ <span style="font-family: 'Comic Sans MS',Textile,cursive; color: blue; font-style: italic;">-- Bill</span>
+ </p>
+ </div> <!-- end of "message" -->
+
+ </div> <!-- end of inbox -->
+ </div> <!-- end of TabContainer -->
+
+ <div dojoType="dijit.layout.ContentPane" region="bottom" id="footer" align="left">
+ <span style="float:right;">DojoMail v1.0 (demo only)</span>
+ <div id="fetchMail" style="opacity:0;visibility:hidden">
+ <div annotate="true" id="fakeFetch" dojoType="dijit.ProgressBar" style="height:15px; width:275px;" indeterminate="true" report="fakeReport"></div>
+ </div>
+ </div>
+ </div> <!-- end of main -->
+
+ <div dojoType="dijit.Dialog" id="optionsDialog" title="Options:">
+ <table>
+ <tr><td style="text-align:right;"><label for="option1">Transport type:</label></td><td>
+ <select id="option1" dojoType="dijit.form.FilteringSelect">
+ <option value="pop3">POP3</option>
+ <option value="imap">IMAP</option>
+ </select></td></tr>
+ <tr><td style="text-align:right;"><label for="option2">Server:</label></td><td><input id="option2" dojoType="dijit.form.TextBox" type="text">
+ </td></tr>
+
+ <tr><td style="text-align:right;"><input type="checkbox" id="fooCB" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB">Leave messages on Server</label></td></tr>
+ <tr><td style="text-align:right;"><input type="checkbox" id="fooCB2" dojoType="dijit.form.CheckBox"></td><td><label for="fooCB2">Remember Password</label></td></tr>
+
+ <tr><td colspan="2" style="text-align:center;">
+ <button dojoType="dijit.form.Button" type="submit" iconClass="mailIconOk">OK</button>
+ <button dojoType="dijit.form.Button" type="submit" iconClass="mailIconCancel">Abort</button>
+ </td></tr>
+ </table>
+ </div>
+ <div dojoType="dijit.Dialog" id="sendDialog" title="Sending Mail">
+ <div id="sendMailBar" style="text-align:center">
+ <div id="fakeSend" dojoType="dijit.ProgressBar" style="height:15px; width:175px;" indeterminate="true" ></div>
+ </div>
+ <div>
+</body>
+</html>
diff --git a/includes/js/dijit/demos/mail/icons.gif b/includes/js/dijit/demos/mail/icons.gif
new file mode 100644
index 0000000..d0b1760
--- /dev/null
+++ b/includes/js/dijit/demos/mail/icons.gif
Binary files differ
diff --git a/includes/js/dijit/demos/mail/icons.png b/includes/js/dijit/demos/mail/icons.png
new file mode 100644
index 0000000..f333fbe
--- /dev/null
+++ b/includes/js/dijit/demos/mail/icons.png
Binary files differ
diff --git a/includes/js/dijit/demos/mail/mail.css b/includes/js/dijit/demos/mail/mail.css
new file mode 100644
index 0000000..13474c4
--- /dev/null
+++ b/includes/js/dijit/demos/mail/mail.css
@@ -0,0 +1,133 @@
+html, body, #main{
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+ font: 10pt Arial,Myriad,Tahoma,Verdana,sans-serif;
+}
+#banner, #footer {
+background-color: #ededff;
+color: #333;
+padding:3px;
+}
+#banner { text-align:right; }
+#listPane tr:hover, #listPane td:hover, .dijitTreeContent:hover {
+ background-color: #ededed;
+ color: #333;
+ cursor: pointer;
+}
+#listPane tr, #listPane td { cursor: pointer; }
+table.demoTable {
+ border-collapse: collapse;
+}
+th {
+ background-color: #4f8ce5;
+ color: #666;
+ font-weight:: bold !important;
+ margin:0;
+ padding:3px;
+ background-image:url('../../themes/soria/images/titleBar.png');
+ background-position:0px -1px;
+}
+.dijitRtl caption,
+.dijitRtl th {
+ text-align:right;
+}
+th .arrowNode {
+ position:relative;
+ float:left;
+ top:4px;
+ left:4px;
+ width:16px;
+ height:16px;
+}
+.dijitRtl th .arrowNode{
+ float:right;
+}
+th.arrowUp .arrowNode {
+ margin-right: 5px;
+ margin-top: -4px;
+ margin-bottom: 5px;
+ width: 15px;
+ height:15px;
+ background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -45px top no-repeat;
+}
+th.arrowDown .arrowNode {
+ margin-right: 5px;
+ margin-top: -4px;
+ margin-bottom: 5px;
+ width: 15px;
+ height:15px;
+ background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -15px top no-repeat;
+}
+.demoTable td { padding:3px; }
+.demoTable {
+ border-spacing:0;
+ padding:0; margin:0;
+ width:98%;
+
+}
+.oddRow {
+ background-color: #f2f5f9;
+}
+#message {
+ padding: 8px;
+}
+.subject {
+ background: gray;
+ width: 100%;
+ padding-top: 5px;
+ padding-bottom: 10px;
+}
+.message {
+ border: black 2px;
+}
+.messageHeader {
+ font:12pt Arial,sans-serif;
+ font-weight:bold;
+ color:#333;
+}
+body .dojoSplitPane {
+ background: #ededff;
+ overflow: auto;
+}
+.mailIconCancel,
+.mailIconOptions,
+.mailIconFolderDocuments,
+.mailIconFolderInbox,
+.mailIconFolderSent,
+.mailIconGetMail,
+.mailIconNewMessage,
+.mailIconMailbox,
+.mailIconOk,
+.mailIconTrashcanFull {
+ background-image: url('icons.png');
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ text-align: center;
+ padding-right:4px;
+}
+.dj_ie6 .mailIconCancel,
+.dj_ie6 .mailIconOptions,
+.dj_ie6 .mailIconFolderDocuments,
+.dj_ie6 .mailIconFolderInbox,
+.dj_ie6 .mailIconFolderSent,
+.dj_ie6 .mailIconGetMail,
+.dj_ie6 .mailIconNewMessage,
+.dj_ie6 .mailIconMailbox,
+.dj_ie6 .mailIconOk,
+.dj_ie6 .mailIconTrashcanFull {
+ background-image: url('icons.gif');
+}
+.mailIconCancel { background-position: 0px; }
+.mailIconOptions { background-position: -22px; }
+.mailIconFolderDocuments { background-position: -44px; }
+.mailIconFolderInbox { background-position: -66px; }
+.mailIconFolderSent { background-position: -88px; }
+.mailIconGetMail { background-position: -110px; }
+.mailIconNewMessage { background-position: -132px; }
+.mailIconMailbox { background-position: -154px; }
+.mailIconOk { background-position: -176px; }
+.mailIconTrashcanFull { background-position: -198px; }
diff --git a/includes/js/dijit/demos/mail/mail.css.commented.css b/includes/js/dijit/demos/mail/mail.css.commented.css
new file mode 100644
index 0000000..02e2635
--- /dev/null
+++ b/includes/js/dijit/demos/mail/mail.css.commented.css
@@ -0,0 +1,157 @@
+html, body, #main{
+ width: 100%; /* make the body expand to fill the visible window */
+ height: 100%;
+ overflow: hidden; /* erase window level scrollbars */
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+ font: 10pt Arial,Myriad,Tahoma,Verdana,sans-serif;
+}
+
+#banner, #footer {
+background-color: #ededff;
+color: #333;
+padding:3px;
+}
+#banner { text-align:right; }
+
+/* list of messages
+TODO: If i add the rules below as a plain tr/td it seems to mess up accordion, tree, etc. ???
+*/
+#listPane tr:hover, #listPane td:hover, .dijitTreeContent:hover {
+ background-color: #ededed;
+ color: #333;
+ cursor: pointer;
+}
+#listPane tr, #listPane td { cursor: pointer; }
+
+table.demoTable {
+ border-collapse: collapse;
+}
+
+th {
+ background-color: #4f8ce5;
+ color: #666;
+ font-weight:: bold !important;
+ margin:0;
+ padding:3px;
+ background-image:url('../../themes/soria/images/titleBar.png');
+ background-position:0px -1px;
+}
+
+.dijitRtl caption,
+.dijitRtl th {
+ text-align:right;
+}
+
+th .arrowNode {
+ position:relative;
+ float:left;
+ top:4px;
+ left:4px;
+ width:16px;
+ height:16px;
+}
+
+.dijitRtl th .arrowNode{
+ float:right;
+}
+
+th.arrowUp .arrowNode {
+ margin-right: 5px;
+ margin-top: -4px;
+ margin-bottom: 5px;
+ width: 15px;
+ height:15px;
+ background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -45px top no-repeat;
+}
+
+th.arrowDown .arrowNode {
+ margin-right: 5px;
+ margin-top: -4px;
+ margin-bottom: 5px;
+ width: 15px;
+ height:15px;
+ background:transparent url("../../themes/soria/images/spriteRoundedIconsSmall.png") -15px top no-repeat;
+}
+
+.demoTable td { padding:3px; }
+.demoTable {
+ border-spacing:0;
+ padding:0; margin:0;
+ width:98%;
+
+}
+.oddRow {
+ background-color: #f2f5f9;
+}
+
+#message {
+ padding: 8px;
+}
+
+/* Stuff for new messages */
+
+.subject {
+ background: gray;
+ width: 100%;
+ padding-top: 5px;
+ padding-bottom: 10px;
+}
+
+.message {
+ border: black 2px;
+}
+.messageHeader {
+ font:12pt Arial,sans-serif;
+ font-weight:bold;
+ color:#333;
+}
+body .dojoSplitPane {
+ background: #ededff;
+ overflow: auto;
+}
+
+/* Icons */
+
+.mailIconCancel,
+.mailIconOptions,
+.mailIconFolderDocuments,
+.mailIconFolderInbox,
+.mailIconFolderSent,
+.mailIconGetMail,
+.mailIconNewMessage,
+.mailIconMailbox,
+.mailIconOk,
+.mailIconTrashcanFull {
+ background-image: url('icons.png'); /* mail icons sprite image */
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ text-align: center;
+ padding-right:4px;
+}
+
+.dj_ie6 .mailIconCancel,
+.dj_ie6 .mailIconOptions,
+.dj_ie6 .mailIconFolderDocuments,
+.dj_ie6 .mailIconFolderInbox,
+.dj_ie6 .mailIconFolderSent,
+.dj_ie6 .mailIconGetMail,
+.dj_ie6 .mailIconNewMessage,
+.dj_ie6 .mailIconMailbox,
+.dj_ie6 .mailIconOk,
+.dj_ie6 .mailIconTrashcanFull {
+ background-image: url('icons.gif');
+}
+
+
+.mailIconCancel { background-position: 0px; }
+.mailIconOptions { background-position: -22px; }
+.mailIconFolderDocuments { background-position: -44px; }
+.mailIconFolderInbox { background-position: -66px; }
+.mailIconFolderSent { background-position: -88px; }
+.mailIconGetMail { background-position: -110px; }
+.mailIconNewMessage { background-position: -132px; }
+.mailIconMailbox { background-position: -154px; }
+.mailIconOk { background-position: -176px; }
+.mailIconTrashcanFull { background-position: -198px; }
diff --git a/includes/js/dijit/demos/mail/mail.json b/includes/js/dijit/demos/mail/mail.json
new file mode 100644
index 0000000..67f1a04
--- /dev/null
+++ b/includes/js/dijit/demos/mail/mail.json
@@ -0,0 +1,75 @@
+{
+ identifier: 'id',
+ label: 'label',
+ items: [
+
+ // Hierarchy of folders
+ { type: 'folder', id: 'inbox', label:'Inbox', icon:'mailIconFolderInbox' },
+ { type: 'folder', id: 'deleted', label:'Trash', icon:'mailIconTrashcanFull' },
+ { type: 'folder', id: 'save', label:'Save', folders:[
+ { id: 'work', label:'stuff for work'},
+ { id: 'fun', label:'stuff for fun'}
+ ]},
+
+ // Address book (list of people that have sent me messages)
+ { type: 'address', id: 'adam', label: "Adam Arlen" },
+ { type: 'address', id: 'bob', label: "Bob Baxter" },
+ { type: 'address', id: 'carrie', label: "Carrie Crow" },
+
+ // Flat list of messages (each message lists it's folder)
+
+ { type: 'message', id: 'node1.1', folder: 'inbox', label: "today's meeting", sender: "Adam Arlen", sent: "2005-12-19",
+ text: "Today's meeting is cancelled.<br>Let's do it tomorrow instead.<br><br>Adam" },
+ { type: 'message', id: 'node1.2', folder: 'inbox', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18",
+ text:
+ "<p>Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+ },
+ { type: 'message', id: 'node1.3', folder: 'inbox', label: "Hey, look!", sender: "Carrey Crown", sent: "2005-12-17", text:
+ "This is our new simple mail app. What do you think? <br><br>You can navigate around this demo with arrows and tabs ... <br><br>Regards,<br>Carrey"
+ },
+ { type: 'message', id: 'node1.4', folder: 'inbox', label: "paint", sender: "David Davis", sent: "2005-12-16", text:
+ "<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+ },
+ { type: 'message', id: 'node2.1', folder: 'deleted', label: "today's meeting", sender: "Madam Marlen", sent: "2005-12-19",
+ text: "Today's meeting is cancelled.<br>Let's do it tomorrow instead.<br><br>Madam" },
+ { type: 'message', id: 'node2.2', folder: 'deleted', label: "congratulations", sender: "Rob Raxter", sent: "2005-12-18", text: " Good job on that project! " },
+ { type: 'message', id: 'node2.3', folder: 'deleted', label: "schedule", sender: "Carrie Crow", sent: "2005-12-17", text: " Are we still on schedule?<br>The deadline is next Friday. " },
+ { type: 'message', id: 'node2.4', folder: 'deleted', label: "paint", sender: "Daniel Dooey", sent: "2005-12-16", text:
+ "<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+ },
+ { type: 'message', id: 'node3.1', folder: 'work', label: "today's meeting", sender: "Bob Baxter", sent: "2005-12-19",
+ text: "Today's meeting is cancelled.<br>Unnecessary.<br><br>Bob" },
+ { type: 'message', id: 'node3.2', folder: 'work', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18", text: " Are we still on schedule?<br>The deadline is next Friday. " },
+ { type: 'message', id: 'node3.3', folder: 'work', label: "lunch", sender: "Bob Baxter", sent: "2005-12-17", text:
+ "Where do you want to go for lunch?<br><br><ul><li>Fresh Choice<li>Starbucks<li>Dominos</ul><br><br>Let me know..."
+ },
+ { type: 'message', id: 'node3.4', folder: 'work', label: "paint", sender: "Bob Baxter", sent: "2005-12-16", text:
+ "<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+ },
+ { type: 'message', id: 'node4.1', folder: 'fun', label: "today's meeting", sender: "Jack Jackson", sent: "2005-12-19",
+ text: "Today's meeting is cancelled.<br>Let's do it friday instead.<br><br>Joe" },
+ { type: 'message', id: 'node4.2', folder: 'fun', label: "remaining work", sender: "Jack Jackson", sent: "2005-12-18",
+ text:
+ "<p>Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+ },
+ { type: 'message', id: 'node4.3', folder: 'fun', label: "lunch", sender: "Jack Jackson", sent: "2005-12-17", text:
+ "Where do you want to go for lunch?<br><br><ul><li>Indian<li>Mexican<li>Chinese<li>Japanese<li>Pizza</ul><br><br>Let me know..."
+ },
+ { type: 'message', id: 'node4.4', folder: 'fun', label: "paint", sender: "Jack Jackson", sent: "2005-12-16", text:
+ "<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+ },
+
+ { type: 'message', id: 'node5.1', folder: 'deleted', label: "today's meeting", sender: "Jill Jones", sent: "2005-12-19",
+ text: "Today's meeting is cancelled.<br>Let's do it thursday instead.<br><br>Jill" },
+ { type: 'message', id: 'node5.2', folder: 'deleted', label: "remaining work", sender: "Jill Jones", sent: "2005-12-18",
+ text:
+ "<p>Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet: <div dojoType='dijit._Calendar'></div></p>"
+ },
+ { type: 'message', id: 'node5.3', folder: 'deleted', label: "lunch", sender: "Jill Jones", sent: "2005-12-17", text:
+ "Where do you want to go for lunch?<br><br><ul><li>McDonalds<li>Burger King<li>KFC</ul><br><br>Let me know..."
+ },
+ { type: 'message', id: 'node5.4', folder: 'deleted', label: "paint", sender: "Jill Jones", sent: "2005-12-16", text:
+ "<p>what color is good for the new office?</p><div dojoType='dijit.ColorPalette'></div><p>Let me know soon</p>"
+ }
+ ]
+}
diff --git a/includes/js/dijit/demos/mail/newMail.html b/includes/js/dijit/demos/mail/newMail.html
new file mode 100644
index 0000000..f269ad3
--- /dev/null
+++ b/includes/js/dijit/demos/mail/newMail.html
@@ -0,0 +1,8 @@
+<textarea dojoType="dijit.Editor" style="overflow:auto"
+ extraPlugins="[{name:'dijit._editor.plugins.LinkDialog'}]"
+
+>
+<i> This is just a sample message. There is email-address auto-complete in the to: field.
+<br><br> give it a whirl.
+</i>
+</textarea>
diff --git a/includes/js/dijit/demos/nihao.html b/includes/js/dijit/demos/nihao.html
new file mode 100644
index 0000000..113a750
--- /dev/null
+++ b/includes/js/dijit/demos/nihao.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Dojo Globalization Hello World</title>
+
+ <script language="JavaScript" type="text/javascript">
+ // set the global locale for Dojo from the request parameter
+ var result = location.href.match(/[\?\&]locale=([^\&]+)/);
+ djConfig = {locale: result && result[1] || "en-us"}; // default locale is en-us
+ </script>
+
+ <script type="text/javascript" isDebug="true" src="../../dojo/dojo.js"></script>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ @import "../themes/tundra/tundra_rtl.css";
+
+ body {padding:1em}
+ </style>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.number");
+ dojo.require("dojo.string");
+ dojo.require("dojo.parser");
+ dojo.require("dijit.form.DateTextBox");
+
+ // load the resource bundle for HelloWorld
+ dojo.requireLocalization("dijit.demos.nihao", "helloworld");
+
+ var resourceBundle;
+
+ dojo.addOnLoad(function(){
+ // create the DateTextBox from the HTML segment with the dojoType set
+ dojo.parser.parse();
+
+ // make current locale selected
+ dojo.byId('langList').value = dojo.locale;
+
+ // get the resource bundle object of the current global locale
+ resourceBundle = dojo.i18n.getLocalization("dijit.demos.nihao", "helloworld");
+
+ // do formatting and update the resource strings
+ dojo.byId('locale').innerHTML = resourceBundle.localeSelect;
+ dojo.byId('content').innerHTML = dojo.string.substitute(
+ resourceBundle.contentStr,
+ [dojo.date.locale.format(new Date(), {selector:'date', formatLength:'long'})]);
+ dojo.byId('date').innerHTML = resourceBundle.dateSelect;
+
+ dateChanged();
+ });
+
+ function localeChanged(){
+ open("nihao.html?locale=" + dojo.byId("langList").value, "_self");
+ }
+
+ function dateChanged(){
+ if(resourceBundle){
+ var stamp = dijit.byId("dateBox").getValue();
+ if(stamp){
+ dojo.byId('secondsToGo').innerHTML = dojo.string.substitute(
+ resourceBundle.dateStr,
+ [dojo.number.format((stamp - new Date()) / 1000)]);
+ }
+ }
+ }
+ </script>
+ </head>
+
+ <body class="tundra">
+ <h1>Dojo Globalization Hello World</h1>
+ <p>
+ <span id="locale"></span>
+ <select id="langList" onchange="localeChanged();" >
+ <option value="en-us">en-US</option>
+ <option value="fr-fr">fr-FR</option>
+ <option value="zh-cn">zh-CN</option>
+ </select>
+ </p>
+ <hr>
+ <p id="content"></p>
+ <p>
+ <span id="date"></span>
+ <input id="dateBox" type="text" dojoType="dijit.form.DateTextBox" constraints="{formatLength:'long'}" onchange="dateChanged();">
+ </p>
+ <p id="secondsToGo"></p>
+ </body>
+</html> \ No newline at end of file
diff --git a/includes/js/dijit/demos/nihao/nls/en/helloworld.js b/includes/js/dijit/demos/nihao/nls/en/helloworld.js
new file mode 100644
index 0000000..9c726e3
--- /dev/null
+++ b/includes/js/dijit/demos/nihao/nls/en/helloworld.js
@@ -0,0 +1 @@
+({"localeSelect":"Locale:","contentStr":"Hello Dojo Globalization! Today is ${0}.","dateSelect":"Select a date:","dateStr":"${0} seconds to go from now."}) \ No newline at end of file
diff --git a/includes/js/dijit/demos/nihao/nls/fr/helloworld.js b/includes/js/dijit/demos/nihao/nls/fr/helloworld.js
new file mode 100644
index 0000000..aaa5560
--- /dev/null
+++ b/includes/js/dijit/demos/nihao/nls/fr/helloworld.js
@@ -0,0 +1 @@
+({"localeSelect":"Lieu :","contentStr":"Bonjour globalisation de Dojo! Aujourd'hui est ${0}.","dateSelect":"Choisir une date :","dateStr":"${0} secondes à aller dès maintenant."}) \ No newline at end of file
diff --git a/includes/js/dijit/demos/nihao/nls/helloworld.js b/includes/js/dijit/demos/nihao/nls/helloworld.js
new file mode 100644
index 0000000..9c726e3
--- /dev/null
+++ b/includes/js/dijit/demos/nihao/nls/helloworld.js
@@ -0,0 +1 @@
+({"localeSelect":"Locale:","contentStr":"Hello Dojo Globalization! Today is ${0}.","dateSelect":"Select a date:","dateStr":"${0} seconds to go from now."}) \ No newline at end of file
diff --git a/includes/js/dijit/demos/nihao/nls/zh/helloworld.js b/includes/js/dijit/demos/nihao/nls/zh/helloworld.js
new file mode 100644
index 0000000..881d0d3
--- /dev/null
+++ b/includes/js/dijit/demos/nihao/nls/zh/helloworld.js
@@ -0,0 +1 @@
+({"localeSelect":"区域:","contentStr":"你好Dojo全球化! 今天是${0}。","dateSelect":"选择一个日期:","dateStr":"距离现在还有${0}秒。"}) \ No newline at end of file
diff --git a/includes/js/dijit/dijit-all.js b/includes/js/dijit/dijit-all.js
new file mode 100644
index 0000000..c75497c
--- /dev/null
+++ b/includes/js/dijit/dijit-all.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2004-2008, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+ This is a compiled version of Dojo, built for deployment and not for
+ development. To get an editable version, please visit:
+
+ http://dojotoolkit.org
+
+ for documentation and information on getting the source.
+*/
+
+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(_6,_7){var m=_6.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1];if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){var a=dojo.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,_7);}return dojo.colorFromArray(c,_7);}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,_7);}}return null;};var _14=function(c,low,_17){c=Number(c);return isNaN(c)?_17:c<low?low:c>_17?_17:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_14(t.r,0,255));t.g=Math.round(_14(t.g,0,255));t.b=Math.round(_14(t.b,0,255));t.a=_14(t.a,0,1);return this;};})();dojo.colors.makeGrey=function(g,a){return dojo.colorFromArray([g,g,g,a]);};dojo.Color.named=dojo.mixin({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]},dojo.Color.named);}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.i18n.getLocalization=function(_1b,_1c,_1d){_1d=dojo.i18n.normalizeLocale(_1d);var _1e=_1d.split("-");var _1f=[_1b,"nls",_1c].join(".");var _20=dojo._loadedModules[_1f];if(_20){var _21;for(var i=_1e.length;i>0;i--){var loc=_1e.slice(0,i).join("_");if(_20[loc]){_21=_20[loc];break;}}if(!_21){_21=_20.ROOT;}if(_21){var _24=function(){};_24.prototype=_21;return new _24();}}throw new Error("Bundle not found: "+_1c+" in "+_1b+" , locale="+_1d);};dojo.i18n.normalizeLocale=function(_25){var _26=_25?_25.toLowerCase():dojo.locale;if(_26=="root"){_26="ROOT";}return _26;};dojo.i18n._requireLocalization=function(_27,_28,_29,_2a){var _2b=dojo.i18n.normalizeLocale(_29);var _2c=[_27,"nls",_28].join(".");var _2d="";if(_2a){var _2e=_2a.split(",");for(var i=0;i<_2e.length;i++){if(_2b.indexOf(_2e[i])==0){if(_2e[i].length>_2d.length){_2d=_2e[i];}}}if(!_2d){_2d="ROOT";}}var _30=_2a?_2d:_2b;var _31=dojo._loadedModules[_2c];var _32=null;if(_31){if(dojo.config.localizationComplete&&_31._built){return;}var _33=_30.replace(/-/g,"_");var _34=_2c+"."+_33;_32=dojo._loadedModules[_34];}if(!_32){_31=dojo["provide"](_2c);var _35=dojo._getModuleSymbols(_27);var _36=_35.concat("nls").join("/");var _37;dojo.i18n._searchLocalePath(_30,_2a,function(loc){var _39=loc.replace(/-/g,"_");var _3a=_2c+"."+_39;var _3b=false;if(!dojo._loadedModules[_3a]){dojo["provide"](_3a);var _3c=[_36];if(loc!="ROOT"){_3c.push(loc);}_3c.push(_28);var _3d=_3c.join("/")+".js";_3b=dojo._loadPath(_3d,null,function(_3e){var _3f=function(){};_3f.prototype=_37;_31[_39]=new _3f();for(var j in _3e){_31[_39][j]=_3e[j];}});}else{_3b=true;}if(_3b&&_31[_39]){_37=_31[_39];}else{_31[_39]=_37;}if(_2a){return true;}});}if(_2a&&_2b!=_2d){_31[_2b.replace(/-/g,"_")]=_31[_2d.replace(/-/g,"_")];}};(function(){var _41=dojo.config.extraLocale;if(_41){if(!_41 instanceof Array){_41=[_41];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_45,_46){req(m,b,_45,_46);if(_45){return;}for(var i=0;i<_41.length;i++){req(m,b,_41[i],_46);}};}})();dojo.i18n._searchLocalePath=function(_48,_49,_4a){_48=dojo.i18n.normalizeLocale(_48);var _4b=_48.split("-");var _4c=[];for(var i=_4b.length;i>0;i--){_4c.push(_4b.slice(0,i).join("-"));}_4c.push(false);if(_49){_4c.reverse();}for(var j=_4c.length-1;j>=0;j--){var loc=_4c[j]||"ROOT";var _50=_4a(loc);if(_50){break;}}};dojo.i18n._preloadLocalizations=function(_51,_52){function preload(_53){_53=dojo.i18n.normalizeLocale(_53);dojo.i18n._searchLocalePath(_53,true,function(loc){for(var i=0;i<_52.length;i++){if(_52[i]==loc){dojo["require"](_51+"_"+loc);return true;}}return false;});};preload();var _56=dojo.config.extraLocale||[];for(var i=0;i<_56.length;i++){preload(_56[i]);}};}if(!dojo._hasResource["dijit.ColorPalette"]){dojo._hasResource["dijit.ColorPalette"]=true;dojo.provide("dijit.ColorPalette");dojo.declare("dijit.ColorPalette",[dijit._Widget,dijit._Templated],{defaultTimeout:500,timeoutChangeRate:0.9,palette:"7x10",value:null,_currentFocus:0,_xDim:null,_yDim:null,_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","templates/colors7x10.png"),"3x4":dojo.moduleUrl("dijit","templates/colors3x4.png")},_paletteCoords:{"leftOffset":3,"topOffset":3,"cWidth":20,"cHeight":20},templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",_paletteDims:{"7x10":{"width":"206px","height":"145px"},"3x4":{"width":"86px","height":"64px"}},tabIndex:"0",postCreate:function(){dojo.mixin(this.divNode.style,this._paletteDims[this.palette]);this.imageNode.setAttribute("src",this._imagePaths[this.palette]);var _58=this._palettes[this.palette];this.domNode.style.position="relative";this._cellNodes=[];this.colorNames=dojo.i18n.getLocalization("dojo","colors",this.lang);var url=dojo.moduleUrl("dojo","resources/blank.gif"),_5a=new dojo.Color(),_5b=this._paletteCoords;for(var row=0;row<_58.length;row++){for(var col=0;col<_58[row].length;col++){var _5e=dojo.doc.createElement("img");_5e.src=url;dojo.addClass(_5e,"dijitPaletteImg");var _5f=_58[row][col],_60=_5a.setColor(dojo.Color.named[_5f]);_5e.alt=this.colorNames[_5f];_5e.color=_60.toHex();var _61=_5e.style;_61.color=_61.backgroundColor=_5e.color;var _62=dojo.doc.createElement("span");_62.appendChild(_5e);dojo.forEach(["Dijitclick","MouseEnter","Focus","Blur"],function(_63){this.connect(_62,"on"+_63.toLowerCase(),"_onCell"+_63);},this);this.divNode.appendChild(_62);var _64=_62.style;_64.top=_5b.topOffset+(row*_5b.cHeight)+"px";_64.left=_5b.leftOffset+(col*_5b.cWidth)+"px";dojo.attr(_62,"tabindex","-1");_62.title=this.colorNames[_5f];dojo.addClass(_62,"dijitPaletteCell");dijit.setWaiRole(_62,"gridcell");_62.index=this._cellNodes.length;this._cellNodes.push(_62);}}this._xDim=_58[0].length;this._yDim=_58.length;this.connect(this.divNode,"onfocus","_onDivNodeFocus");var _65={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};for(var key in _65){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{keyCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _67=_65[key];return function(_68){this._navigateByKey(_67,_68);};}(),this.timeoutChangeRate,this.defaultTimeout));}},focus:function(){this._focusFirst();},onChange:function(_69){},_focusFirst:function(){this._currentFocus=0;var _6a=this._cellNodes[this._currentFocus];window.setTimeout(function(){dijit.focus(_6a);},0);},_onDivNodeFocus:function(evt){if(evt.target===this.divNode){this._focusFirst();}},_onFocus:function(){dojo.attr(this.divNode,"tabindex","-1");},_onBlur:function(){this._removeCellHighlight(this._currentFocus);dojo.attr(this.divNode,"tabindex",this.tabIndex);},_onCellDijitclick:function(evt){var _6d=evt.currentTarget;if(this._currentFocus!=_6d.index){this._currentFocus=_6d.index;window.setTimeout(function(){dijit.focus(_6d);},0);}this._selectColor(_6d);dojo.stopEvent(evt);},_onCellMouseEnter:function(evt){var _6f=evt.currentTarget;window.setTimeout(function(){dijit.focus(_6f);},0);},_onCellFocus:function(evt){this._removeCellHighlight(this._currentFocus);this._currentFocus=evt.currentTarget.index;dojo.addClass(evt.currentTarget,"dijitPaletteCellHighlight");},_onCellBlur:function(evt){this._removeCellHighlight(this._currentFocus);},_removeCellHighlight:function(_72){dojo.removeClass(this._cellNodes[_72],"dijitPaletteCellHighlight");},_selectColor:function(_73){var img=_73.getElementsByTagName("img")[0];this.onChange(this.value=img.color);},_navigateByKey:function(_75,_76){if(_76==-1){return;}var _77=this._currentFocus+_75;if(_77<this._cellNodes.length&&_77>-1){var _78=this._cellNodes[_77];_78.focus();}}});}if(!dojo._hasResource["dijit.Declaration"]){dojo._hasResource["dijit.Declaration"]=true;dojo.provide("dijit.Declaration");dojo.declare("dijit.Declaration",dijit._Widget,{_noScript:true,widgetClass:"",replaceVars:true,defaults:null,mixins:[],buildRendering:function(){var src=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);var _7a=dojo.query("> script[type='dojo/method'][event='preamble']",src).orphan();var _7b=dojo.query("> script[type^='dojo/']",src).orphan();var _7c=src.nodeName;var _7d=this.defaults||{};this.mixins=this.mixins.length?dojo.map(this.mixins,function(_7e){return dojo.getObject(_7e);}):[dijit._Widget,dijit._Templated];if(_7a.length){_7d.preamble=dojo.parser._functionFromScript(_7a[0]);}var _7f=dojo.map(_7b,function(s){var evt=s.getAttribute("event")||"postscript";return {event:evt,func:dojo.parser._functionFromScript(s)};});this.mixins.push(function(){dojo.forEach(_7f,function(s){dojo.connect(this,s.event,this,s.func);},this);});_7d.widgetsInTemplate=true;_7d._skipNodeCache=true;_7d.templateString="<"+_7c+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent")||"")+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_7c+">";dojo.query("[dojoType]",src).forEach(function(_83){_83.removeAttribute("dojoType");});dojo.declare(this.widgetClass,this.mixins,_7d);}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");dojo.dnd._copyKey=navigator.appVersion.indexOf("Macintosh")<0?"ctrlKey":"metaKey";dojo.dnd.getCopyKeyState=function(e){return e[dojo.dnd._copyKey];};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._abs(n,true);b.l+=t.x+n.scrollLeft;b.t+=t.y+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-b.l,ry=e.pageY-b.t,dx=0,dy=0;if(rx>0&&rx<b.w){if(rx<w){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(rx>b.w-w){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}}if(ry>0&&ry<b.h){if(ry<h){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(ry>b.h-h){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}}var _9b=n.scrollLeft,_9c=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_9b!=n.scrollLeft||_9c!=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(_9d,e,_9f){this.node=dojo.byId(_9d);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=this.host=_9f,d=_9d.ownerDocument,_a2=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,"onselectstart",dojo,"stopEvent"),_a2];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});},onMouseUp:function(e){if(this.mouseButton==e.button){this.destroy();}},onFirstMove:function(){var s=this.node.style,l,t;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left));t=Math.round(parseFloat(s.top));break;default:s.position="absolute";var m=dojo.marginBox(this.node);l=m.l;t=m.t;break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;this.host.onFirstMove(this);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=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(_ab,_ac){this.node=dojo.byId(_ab);if(!_ac){_ac={};}this.handle=_ac.handle?dojo.byId(_ac.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_ac.delay>0?_ac.delay:0;this.skip=_ac.skip;this.mover=_ac.mover?_ac.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(_ad,_ae){return new dojo.dnd.Moveable(_ae,_ad);},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"));this.events.push(dojo.connect(this.handle,"onmouseup",this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{new this.mover(this.node,e,this);}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);new this.mover(this.node,e,this);}dojo.stopEvent(e);},onMouseUp:function(e){dojo.disconnect(this.events.pop());dojo.disconnect(this.events.pop());},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onMoveStart:function(_b3){dojo.publish("/dnd/move/start",[_b3]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_b4){dojo.publish("/dnd/move/stop",[_b4]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_b5){},onMove:function(_b6,_b7){this.onMoving(_b6,_b7);var s=_b6.node.style;s.left=_b7.l+"px";s.top=_b7.t+"px";this.onMoved(_b6,_b7);},onMoving:function(_b9,_ba){},onMoved:function(_bb,_bc){}});}if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){dojo._hasResource["dojo.dnd.TimedMoveable"]=true;dojo.provide("dojo.dnd.TimedMoveable");(function(){var _bd=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(_be,_bf){if(!_bf){_bf={};}if(_bf.timeout&&typeof _bf.timeout=="number"&&_bf.timeout>=0){this.timeout=_bf.timeout;}},markupFactory:function(_c0,_c1){return new dojo.dnd.TimedMoveable(_c1,_c0);},onMoveStop:function(_c2){if(_c2._timer){clearTimeout(_c2._timer);_bd.call(this,_c2,_c2._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_c3,_c4){_c3._leftTop=_c4;if(!_c3._timer){var _t=this;_c3._timer=setTimeout(function(){_c3._timer=null;_bd.call(_t,_c3,_c3._leftTop);},this.timeout);}}});})();}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");dojo.provide("dojo.fx.Toggler");(function(){var _c6={_fire:function(evt,_c8){if(this[evt]){this[evt].apply(this,_c8||[]);}return this;}};var _c9=function(_ca){this._index=-1;this._animations=_ca||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;dojo.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};dojo.extend(_c9,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){dojo.disconnect(this._onAnimateCtx);dojo.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=dojo.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=dojo.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_cc,_cd){if(!this._current){this._current=this._animations[this._index=0];}if(!_cd&&this._current.status()=="playing"){return this;}var _ce=dojo.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_cf=dojo.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_d1=dojo.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);dojo.disconnect(_ce);dojo.disconnect(_cf);dojo.disconnect(_d1);});if(this._onAnimateCtx){dojo.disconnect(this._onAnimateCtx);}this._onAnimateCtx=dojo.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){dojo.disconnect(this._onEndCtx);}this._onEndCtx=dojo.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=dojo.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);dojo.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_d5,_d6){this.pause();var _d7=this.duration*_d5;this._current=null;dojo.some(this._animations,function(a){if(a.duration<=_d7){this._current=a;return true;}_d7-=a.duration;return false;});if(this._current){this._current.gotoPercent(_d7/_current.duration,_d6);}return this;},stop:function(_d9){if(this._current){if(_d9){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=dojo.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);dojo.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){dojo.disconnect(this._onAnimateCtx);}if(this._onEndCtx){dojo.disconnect(this._onEndCtx);}}});dojo.extend(_c9,_c6);dojo.fx.chain=function(_dc){return new _c9(_dc);};var _dd=function(_de){this._animations=_de||[];this._connects=[];this._finished=0;this.duration=0;dojo.forEach(_de,function(a){var _e0=a.duration;if(a.delay){_e0+=a.delay;}if(this.duration<_e0){this.duration=_e0;}this._connects.push(dojo.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new dojo._Animation({curve:[0,1],duration:this.duration});dojo.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop"],function(evt){this._connects.push(dojo.connect(this._pseudoAnimation,evt,dojo.hitch(this,"_fire",evt)));},this);};dojo.extend(_dd,{_doAction:function(_e2,_e3){dojo.forEach(this._animations,function(a){a[_e2].apply(a,_e3);});return this;},_onEnd:function(){if(++this._finished==this._animations.length){this._fire("onEnd");}},_call:function(_e5,_e6){var t=this._pseudoAnimation;t[_e5].apply(t,_e6);},play:function(_e8,_e9){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(_ea,_eb){var ms=this.duration*_ea;dojo.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_eb);});this._call("gotoProcent",arguments);return this;},stop:function(_ee){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){dojo.forEach(this._connects,dojo.disconnect);}});dojo.extend(_dd,_c6);dojo.fx.combine=function(_ef){return new _dd(_ef);};})();dojo.declare("dojo.fx.Toggler",null,{constructor:function(_f0){var _t=this;dojo.mixin(_t,_f0);_t.node=_f0.node;_t._showArgs=dojo.mixin({},_f0);_t._showArgs.node=_t.node;_t._showArgs.duration=_t.showDuration;_t.showAnim=_t.showFunc(_t._showArgs);_t._hideArgs=dojo.mixin({},_f0);_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));},node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,show:function(_f2){return this.showAnim.play(_f2||0);},hide:function(_f3){return this.hideAnim.play(_f3||0);}});dojo.fx.wipeIn=function(_f4){_f4.node=dojo.byId(_f4.node);var _f5=_f4.node,s=_f5.style;var _f7=dojo.animateProperty(dojo.mixin({properties:{height:{start:function(){s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _f8=dojo.style(_f5,"height");return Math.max(_f8,1);}},end:function(){return _f5.scrollHeight;}}}},_f4));dojo.connect(_f7,"onEnd",function(){s.height="auto";});return _f7;};dojo.fx.wipeOut=function(_f9){var _fa=_f9.node=dojo.byId(_f9.node);var s=_fa.style;var _fc=dojo.animateProperty(dojo.mixin({properties:{height:{end:1}}},_f9));dojo.connect(_fc,"beforeBegin",function(){s.overflow="hidden";s.display="";});dojo.connect(_fc,"onEnd",function(){s.height="auto";s.display="none";});return _fc;};dojo.fx.slideTo=function(_fd){var _fe=(_fd.node=dojo.byId(_fd.node));var top=null;var left=null;var init=(function(n){return function(){var cs=dojo.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=dojo.coords(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(_fe);init();var anim=dojo.animateProperty(dojo.mixin({properties:{top:{end:_fd.top||0},left:{end:_fd.left||0}}},_fd));dojo.connect(anim,"beforeBegin",anim,init);return anim;};}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,"class":"dijitContentPane",doLayout:"auto",postCreate:function(){this.domNode.title="";if(!this.containerNode){this.containerNode=this.domNode;}if(this.preload){this._loadCheck();}var _107=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_107);this.errorMessage=dojo.string.substitute(this.errorMessage,_107);var _108=dijit.getWaiRole(this.domNode);if(!_108){dijit.setWaiRole(this.domNode,"group");}dojo.addClass(this.domNode,this["class"]);},startup:function(){if(this._started){return;}if(this.doLayout!="false"&&this.doLayout!==false){this._checkIfSingleChild();if(this._singleChild){this._singleChild.startup();}}this._loadCheck();this.inherited(arguments);},_checkIfSingleChild:function(){var _109=dojo.query(">",this.containerNode||this.domNode),_10a=_109.filter("[widgetId]");if(_109.length==1&&_10a.length==1){this.isContainer=true;this._singleChild=dijit.byNode(_10a[0]);}else{delete this.isContainer;delete this._singleChild;}},refresh:function(){return this._prepareLoad(true);},setHref:function(href){this.href=href;return this._prepareLoad();},setContent:function(data){if(!this._isDownloaded){this.href="";this._onUnloadHandler();}this._setContent(data||"");this._isDownloaded=false;if(this.parseOnLoad){this._createSubWidgets();}if(this.doLayout!="false"&&this.doLayout!==false){this._checkIfSingleChild();if(this._singleChild&&this._singleChild.resize){this._singleChild.startup();this._singleChild.resize(this._contentBox||dojo.contentBox(this.containerNode||this.domNode));}}this._onLoadHandler();},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;},destroy:function(){if(this._beingDestroyed){return;}this._onUnloadHandler();this._beingDestroyed=true;this.inherited("destroy",arguments);},resize:function(size){dojo.marginBox(this.domNode,size);var node=this.containerNode||this.domNode,mb=dojo.mixin(dojo.marginBox(node),size||{});this._contentBox=dijit.layout.marginBox2contentBox(node,mb);if(this._singleChild&&this._singleChild.resize){this._singleChild.resize(this._contentBox);}},_prepareLoad:function(_110){this.cancel();this.isLoaded=false;this._loadCheck(_110);},_isShown:function(){if("open" in this){return this.open;}else{var node=this.domNode;return (node.style.display!="none")&&(node.style.visibility!="hidden");}},_loadCheck:function(_112){var _113=this._isShown();if(this.href&&(_112||(this.preload&&!this._xhrDfd)||(this.refreshOnShow&&_113&&!this._xhrDfd)||(!this.isLoaded&&_113&&!this._xhrDfd))){this._downloadExternalContent();}},_downloadExternalContent:function(){this._onUnloadHandler();this._setContent(this.onDownloadStart.call(this));var self=this;var _115={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_115,this.ioArgs);}var hand=this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_115);hand.addCallback(function(html){try{self.onDownloadEnd.call(self);self._isDownloaded=true;self.setContent.call(self,html);}catch(err){self._onError.call(self,"Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.cancelled){self._onError.call(self,"Download",err);}delete self._xhrDfd;return err;});},_onLoadHandler:function(){this.isLoaded=true;try{this.onLoad.call(this);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code");}},_onUnloadHandler:function(){this.isLoaded=false;this.cancel();try{this.onUnload.call(this);}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code");}},_setContent:function(cont){this.destroyDescendants();try{var node=this.containerNode||this.domNode;while(node.firstChild){dojo._destroyElement(node.firstChild);}if(typeof cont=="string"){if(this.extractContent){match=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(match){cont=match[1];}}node.innerHTML=cont;}else{if(cont.nodeType){node.appendChild(cont);}else{dojo.forEach(cont,function(n){node.appendChild(n.cloneNode(true));});}}}catch(e){var _11c=this.onContentError(e);try{node.innerHTML=_11c;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}}},_onError:function(type,err,_11f){var _120=this["on"+type+"Error"].call(this,err);if(_11f){console.error(_11f,err);}else{if(_120){this._setContent.call(this,_120);}}},_createSubWidgets:function(){var _121=this.containerNode||this.domNode;try{dojo.parser.parse(_121,true);}catch(e){this._onError("Content",e,"Couldn't create widgets in "+this.id+(this.href?" from "+this.href:""));}},onLoad:function(e){},onUnload:function(e){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_124){},onDownloadError:function(_125){return this.errorMessage;},onDownloadEnd:function(){}});}if(!dojo._hasResource["dijit.form.Form"]){dojo._hasResource["dijit.form.Form"]=true;dojo.provide("dijit.form.Form");dojo.declare("dijit.form._FormMixin",null,{reset:function(){dojo.forEach(this.getDescendants(),function(_126){if(_126.reset){_126.reset();}});},validate:function(){var _127=false;return dojo.every(dojo.map(this.getDescendants(),function(_128){_128._hasBeenBlurred=true;var _129=!_128.validate||_128.validate();if(!_129&&!_127){dijit.scrollIntoView(_128.containerNode||_128.domNode);_128.focus();_127=true;}return _129;}),"return item;");},setValues:function(obj){var map={};dojo.forEach(this.getDescendants(),function(_12c){if(!_12c.name){return;}var _12d=map[_12c.name]||(map[_12c.name]=[]);_12d.push(_12c);});for(var name in map){var _12f=map[name],_130=dojo.getObject(name,false,obj);if(!dojo.isArray(_130)){_130=[_130];}if(typeof _12f[0].checked=="boolean"){dojo.forEach(_12f,function(w,i){w.setValue(dojo.indexOf(_130,w.value)!=-1);});}else{if(_12f[0]._multiValue){_12f[0].setValue(_130);}else{dojo.forEach(_12f,function(w,i){w.setValue(_130[i]);});}}}},getValues:function(){var obj={};dojo.forEach(this.getDescendants(),function(_136){var name=_136.name;if(!name){return;}var _138=(_136.getValue&&!_136._getValueDeprecated)?_136.getValue():_136.value;if(typeof _136.checked=="boolean"){if(/Radio/.test(_136.declaredClass)){if(_138!==false){dojo.setObject(name,_138,obj);}}else{var ary=dojo.getObject(name,false,obj);if(!ary){ary=[];dojo.setObject(name,ary,obj);}if(_138!==false){ary.push(_138);}}}else{dojo.setObject(name,_138,obj);}});return obj;},isValid:function(){return dojo.every(this.getDescendants(),function(_13a){return !_13a.isValid||_13a.isValid();});}});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' name='${name}'></form>",attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{action:"",method:"",encType:"","accept-charset":"",accept:"",target:""}),execute:function(_13b){},onExecute:function(){},setAttribute:function(attr,_13d){this.inherited(arguments);switch(attr){case "encType":if(dojo.isIE){this.domNode.encoding=_13d;}}},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.setAttribute("encType",item.value);}}this.inherited(arguments);},onReset:function(e){return true;},_onReset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e.currentTarget,target:e.target};if(!(this.onReset(faux)===false)&&faux.returnValue){this.reset();}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.Dialog"]){dojo._hasResource["dijit.Dialog"]=true;dojo.provide("dijit.Dialog");dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",attributeMap:{},postCreate:function(){dojo.body().appendChild(this.domNode);this.bgIframe=new dijit.BackgroundIframe(this.domNode);},layout:function(){var _145=dijit.getViewport();var is=this.node.style,os=this.domNode.style;os.top=_145.t+"px";os.left=_145.l+"px";is.width=_145.w+"px";is.height=_145.h+"px";var _148=dijit.getViewport();if(_145.w!=_148.w){is.width=_148.w+"px";}if(_145.h!=_148.h){is.height=_148.h+"px";}},show:function(){this.domNode.style.display="block";this.layout();if(this.bgIframe.iframe){this.bgIframe.iframe.style.display="block";}this._resizeHandler=this.connect(window,"onresize","layout");},hide:function(){this.domNode.style.display="none";if(this.bgIframe.iframe){this.bgIframe.iframe.style.display="none";}this.disconnect(this._resizeHandler);},uninitialize:function(){if(this.bgIframe){this.bgIframe.destroy();}}});dojo.declare("dijit._DialogMixin",null,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_149){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.getValues());},_getFocusItems:function(_14a){var _14b=dijit.getFirstInTabbingOrder(_14a);this._firstFocusItem=_14b?_14b:_14a;_14b=dijit.getLastInTabbingOrder(_14a);this._lastFocusItem=_14b?_14b:this._firstFocusItem;if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.attr(this._firstFocusItem,"type").toLowerCase()=="file"){dojo.attr(_14a,"tabindex","0");this._firstFocusItem=_14a;}}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{templateString:null,templateString:"<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\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",open:false,duration:400,refocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{title:"titleBar"}),postCreate:function(){dojo.body().appendChild(this.domNode);this.inherited(arguments);var _14c=dojo.i18n.getLocalization("dijit","common");if(this.closeButtonNode){this.closeButtonNode.setAttribute("title",_14c.buttonCancel);}if(this.closeText){this.closeText.setAttribute("title",_14c.buttonCancel);}var s=this.domNode.style;s.visibility="hidden";s.position="absolute";s.display="";s.top="-9999px";this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();this.inherited(arguments);},_setup:function(){if(this.titleBar){this._moveable=new dojo.dnd.TimedMoveable(this.domNode,{handle:this.titleBar,timeout:0});}this._underlay=new dijit.DialogUnderlay({id:this.id+"_underlay","class":dojo.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")});var node=this.domNode;this._fadeIn=dojo.fx.combine([dojo.fadeIn({node:node,duration:this.duration}),dojo.fadeIn({node:this._underlay.domNode,duration:this.duration,onBegin:dojo.hitch(this._underlay,"show")})]);this._fadeOut=dojo.fx.combine([dojo.fadeOut({node:node,duration:this.duration,onEnd:function(){node.style.visibility="hidden";node.style.top="-9999px";}}),dojo.fadeOut({node:this._underlay.domNode,duration:this.duration,onEnd:dojo.hitch(this._underlay,"hide")})]);},uninitialize:function(){if(this._fadeIn&&this._fadeIn.status()=="playing"){this._fadeIn.stop();}if(this._fadeOut&&this._fadeOut.status()=="playing"){this._fadeOut.stop();}if(this._underlay){this._underlay.destroy();}},_position:function(){if(dojo.hasClass(dojo.body(),"dojoMove")){return;}var _150=dijit.getViewport();var mb=dojo.marginBox(this.domNode);var _152=this.domNode.style;_152.left=Math.floor((_150.l+(_150.w-mb.w)/2))+"px";_152.top=Math.floor((_150.t+(_150.h-mb.h)/2))+"px";},_onKey:function(evt){if(evt.keyCode){var node=evt.target;if(evt.keyCode==dojo.keys.TAB){this._getFocusItems(this.domNode);}var _155=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.keyCode==dojo.keys.TAB){if(!_155){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.keyCode==dojo.keys.TAB&&!evt.shiftKey){if(!_155){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{while(node){if(node==this.domNode){if(evt.keyCode==dojo.keys.ESCAPE){this.hide();}else{return;}}node=node.parentNode;}if(evt.keyCode!=dojo.keys.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(dojo.doc.documentElement,"onkeypress",this,"_onKey"));dojo.style(this.domNode,"opacity",0);this.domNode.style.visibility="";this.open=true;this._loadCheck();this._position();this._fadeIn.play();this._savedFocus=dijit.getFocus(this);this._getFocusItems(this.domNode);setTimeout(dojo.hitch(this,function(){dijit.focus(this._firstFocusItem);}),50);},hide:function(){if(!this._alreadyInitialized){return;}if(this._fadeIn.status()=="playing"){this._fadeIn.stop();}this._fadeOut.play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this.refocus){this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));}this.open=false;},layout:function(){if(this.domNode.style.visibility!="hidden"){this._underlay.layout();this._position();}},destroy:function(){dojo.forEach(this._modalconnects,dojo.disconnect);if(this.refocus&&this.open){var fo=this._savedFocus;setTimeout(dojo.hitch(dijit,"focus",fo),25);}this.inherited(arguments);}});dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,_firstFocusItem:null,_lastFocusItem:null,templateString:null,templateString:"<div class=\"dijitTooltipDialog\" 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=\"presenation\"></div>\n</div>\n",postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");this.containerNode.title=this.title;},orient:function(node,_158,_159){this.domNode.className="dijitTooltipDialog "+" dijitTooltipAB"+(_159.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_159.charAt(0)=="T"?"Below":"Above");},onOpen:function(pos){this._getFocusItems(this.containerNode);this.orient(this.domNode,pos.aroundCorner,pos.corner);this._loadCheck();dijit.focus(this._firstFocusItem);},_onKey:function(evt){var node=evt.target;if(evt.keyCode==dojo.keys.TAB){this._getFocusItems(this.containerNode);}var _15d=(this._firstFocusItem==this._lastFocusItem);if(evt.keyCode==dojo.keys.ESCAPE){this.onCancel();}else{if(node==this._firstFocusItem&&evt.shiftKey&&evt.keyCode==dojo.keys.TAB){if(!_15d){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.keyCode==dojo.keys.TAB&&!evt.shiftKey){if(!_15d){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{if(evt.keyCode==dojo.keys.TAB){evt.stopPropagation();}}}}}});}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.doc.selection){return dojo.doc.selection.type.toLowerCase();}else{var _15e="text";var oSel;try{oSel=dojo.global.getSelection();}catch(e){}if(oSel&&oSel.rangeCount==1){var _160=oSel.getRangeAt(0);if((_160.startContainer==_160.endContainer)&&((_160.endOffset-_160.startOffset)==1)&&(_160.startContainer.nodeType!=3)){_15e="control";}}return _15e;}},getSelectedText:function(){if(dojo.doc.selection){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().text;}else{var _161=dojo.global.getSelection();if(_161){return _161.toString();}}return "";},getSelectedHtml:function(){if(dojo.doc.selection){if(dijit._editor.selection.getType()=="control"){return null;}return dojo.doc.selection.createRange().htmlText;}else{var _162=dojo.global.getSelection();if(_162&&_162.rangeCount){var frag=_162.getRangeAt(0).cloneContents();var div=dojo.doc.createElement("div");div.appendChild(frag);return div.innerHTML;}return null;}},getSelectedElement:function(){if(this.getType()=="control"){if(dojo.doc.selection){var _165=dojo.doc.selection.createRange();if(_165&&_165.item){return dojo.doc.selection.createRange().item(0);}}else{var _166=dojo.global.getSelection();return _166.anchorNode.childNodes[_166.anchorOffset];}}return null;},getParentElement:function(){if(this.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(dojo.doc.selection){return dojo.doc.selection.createRange().parentElement();}else{var _168=dojo.global.getSelection();if(_168){var node=_168.anchorNode;while(node&&(node.nodeType!=1)){node=node.parentNode;}return node;}}}return null;},hasAncestorElement:function(_16a){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_16b){var node=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(node,arguments);},isTag:function(node,tags){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;}}}return "";},getParentOfType:function(node,tags){while(node){if(this.isTag(node,tags).length){return node;}node=node.parentNode;}return null;},collapse:function(_174){if(window["getSelection"]){var _175=dojo.global.getSelection();if(_175.removeAllRanges){if(_174){_175.collapseToStart();}else{_175.collapseToEnd();}}else{_175.collapse(_174);}}else{if(dojo.doc.selection){var _176=dojo.doc.selection.createRange();_176.collapse(_174);_176.select();}}},remove:function(){var _s=dojo.doc.selection;if(_s){if(_s.type.toLowerCase()!="none"){_s.clear();}return _s;}else{_s=dojo.global.getSelection();_s.deleteFromDocument();return _s;}},selectElementChildren:function(_178,_179){var _17a=dojo.global;var _17b=dojo.doc;_178=dojo.byId(_178);if(_17b.selection&&dojo.body().createTextRange){var _17c=_178.ownerDocument.body.createTextRange();_17c.moveToElementText(_178);if(!_179){try{_17c.select();}catch(e){}}}else{if(_17a.getSelection){var _17d=_17a.getSelection();if(_17d.setBaseAndExtent){_17d.setBaseAndExtent(_178,0,_178,_178.innerText.length-1);}else{if(_17d.selectAllChildren){_17d.selectAllChildren(_178);}}}}},selectElement:function(_17e,_17f){var _180,_181=dojo.doc;_17e=dojo.byId(_17e);if(_181.selection&&dojo.body().createTextRange){try{_180=dojo.body().createControlRange();_180.addElement(_17e);if(!_17f){_180.select();}}catch(e){this.selectElementChildren(_17e,_17f);}}else{if(dojo.global.getSelection){var _182=dojo.global.getSelection();if(_182.removeAllRanges){_180=_181.createRange();_180.selectNode(_17e);_182.removeAllRanges();_182.addRange(_180);}}}}});}if(!dojo._hasResource["dijit._editor.html"]){dojo._hasResource["dijit._editor.html"]=true;dojo.provide("dijit._editor.html");dijit._editor.escapeXml=function(str,_184){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_184){str=str.replace(/'/gm,"&#39;");}return str;};dijit._editor.getNodeHtml=function(node){var _186;switch(node.nodeType){case 1:_186="<"+node.nodeName.toLowerCase();var _187=[];if(dojo.isIE&&node.outerHTML){var s=node.outerHTML;s=s.substr(0,s.indexOf(">"));s=s.replace(/(['"])[^"']*\1/g,"");var reg=/([^\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")){_187.push([key,node.getAttribute("_djrealurl")]);continue;}}if(key=="style"){_187.push([key,node.style.cssText.toLowerCase()]);}else{_187.push([key,key=="class"?node.className:node.getAttribute(key)]);}}}}else{var attr,i=0,_18e=node.attributes;while((attr=_18e[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");}}_187.push([n,v]);}}}_187.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});i=0;while((attr=_187[i++])){_186+=" "+attr[0]+"=\""+(dojo.isString(attr[1])?dijit._editor.escapeXml(attr[1],true):attr[1])+"\"";}if(node.childNodes.length){_186+=">"+dijit._editor.getChildrenHtml(node)+"</"+node.nodeName.toLowerCase()+">";}else{_186+=" />";}break;case 3:_186=dijit._editor.escapeXml(node.nodeValue,true);break;case 8:_186="<!--"+dijit._editor.escapeXml(node.nodeValue,true)+"-->";break;default:_186="Element not recognized - Type: "+node.nodeType+" Name: "+node.nodeName;}return _186;};dijit._editor.getChildrenHtml=function(dom){var out="";if(!dom){return out;}var _195=dom["childNodes"]||dom;var i=0;var node;while((node=_195[i++])){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 _198=dojo.doc.createElement("textarea");_198.id=dijit._scopeName+"._editor.RichText.savedContent";var s=_198.style;s.display="none";s.position="absolute";s.top="-100px";s.left="-100px";s.height="3px";s.width="3px";dojo.body().appendChild(_198);})();}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,{constructor:function(){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this._keyHandlers={};this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));if(dojo.isMoz){this.contentPreFilters.push(this._fixContentForMoz);this.contentPostFilters.push(this._removeMozBogus);}else{if(dojo.isSafari){this.contentPostFilters.push(this._removeSafariBogus);}}this.onLoadDeferred=new dojo.Deferred();},inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",onLoadDeferred:null,postCreate:function(){dojo.publish(dijit._scopeName+"._editor.RichText::init",[this]);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var exec=function(cmd,arg){return arguments.length==1?function(){this.execCommand(cmd);}:function(){this.execCommand(cmd,arg);};};var _19d={b:exec("bold"),i:exec("italic"),u:exec("underline"),a:exec("selectall"),s:function(){this.save(true);},"1":exec("formatblock","h1"),"2":exec("formatblock","h2"),"3":exec("formatblock","h3"),"4":exec("formatblock","h4"),"\\":exec("insertunorderedlist")};if(!dojo.isIE){_19d.Z=exec("redo");}for(var key in _19d){this.addKeyHandler(key,this.KEY_CTRL,_19d[key]);}},events:["onKeyPress","onKeyDown","onKeyUp","onClick"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(this._editorCommandsLocalized){return;}this._editorCommandsLocalized=true;var _19f=["p","pre","address","h1","h2","h3","h4","h5","h6","ol","div","ul"];var _1a0="",_1a1,i=0;while((_1a1=_19f[i++])){if(_1a1.charAt(1)!="l"){_1a0+="<"+_1a1+"><span>content</span></"+_1a1+">";}else{_1a0+="<"+_1a1+"><li>content</li></"+_1a1+">";}}var div=dojo.doc.createElement("div");div.style.position="absolute";div.style.left="-2000px";div.style.top="-2000px";dojo.doc.body.appendChild(div);div.innerHTML=_1a0;var node=div.firstChild;while(node){dijit._editor.selection.selectElement(node.firstChild);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[node.firstChild]);var _1a5=node.tagName.toLowerCase();this._local2NativeFormatNames[_1a5]=dojo.doc.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_1a5]]=_1a5;node=node.nextSibling;}dojo.doc.body.removeChild(div);},open:function(_1a6){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)&&(_1a6["nodeName"])){this.domNode=_1a6;}var html;if((this.domNode["nodeName"])&&(this.domNode.nodeName.toLowerCase()=="textarea")){this.textarea=this.domNode;this.name=this.textarea.name;html=this._preFilterContent(this.textarea.value);this.domNode=dojo.doc.createElement("div");this.domNode.setAttribute("widgetId",this.id);this.textarea.removeAttribute("widgetId");this.domNode.cssText=this.textarea.cssText;this.domNode.className+=" "+this.textarea.className;dojo.place(this.domNode,this.textarea,"before");var _1a8=dojo.hitch(this,function(){dojo.attr(this.textarea,"tabIndex","-1");with(this.textarea.style){display="block";position="absolute";left=top="-1000px";if(dojo.isIE){this.__overflow=overflow;overflow="hidden";}}});if(dojo.isIE){setTimeout(_1a8,10);}else{_1a8();}}else{html=this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));this.domNode.innerHTML="";}if(html==""){html="&nbsp;";}var _1a9=dojo.contentBox(this.domNode);this._oldHeight=_1a9.h;this._oldWidth=_1a9.w;if((this.domNode["nodeName"])&&(this.domNode.nodeName=="LI")){this.domNode.innerHTML=" <br>";}this.editingArea=dojo.doc.createElement("div");this.domNode.appendChild(this.editingArea);if(this.name!=""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){var _1aa=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");if(_1aa.value!=""){var _1ab=_1aa.value.split(this._SEPARATOR),i=0,dat;while((dat=_1ab[i++])){var data=dat.split(":");if(data[0]==this.name){html=data[1];_1ab.splice(i,1);break;}}}this.connect(window,"onbeforeunload","_saveContent");}this.isClosed=false;if(dojo.isIE||dojo.isSafari||dojo.isOpera){if(dojo.config["useXDomain"]&&!dojo.config["dojoBlankHtmlUrl"]){console.debug("dijit._editor.RichText: 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");}var burl=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"");var ifr=this.editorObject=this.iframe=dojo.doc.createElement("iframe");ifr.id=this.id+"_iframe";ifr.src=burl;ifr.style.border="none";ifr.style.width="100%";ifr.frameBorder=0;this.editingArea.appendChild(ifr);var h=null;var _1b2=dojo.hitch(this,function(){if(h){dojo.disconnect(h);h=null;}this.window=ifr.contentWindow;var d=this.document=this.window.document;d.open();d.write(this._getIframeDocTxt(html));d.close();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;}if(dojo.isIE){this._localizeEditorCommands();}this.onLoad();this.savedContent=this.getValue(true);});if(dojo.isIE&&dojo.isIE<7){var t=setInterval(function(){if(ifr.contentWindow.isLoaded){clearInterval(t);_1b2();}},100);}else{h=dojo.connect(((dojo.isIE)?ifr.contentWindow:ifr),"onload",_1b2);}}else{this._drawIframe(html);this.savedContent=this.getValue(true);}if(this.domNode.nodeName=="LI"){this.domNode.lastChild.style.marginTop="-1.2em";}this.domNode.className+=" RichTextEditable";},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_localizedIframeTitles:null,_getIframeDocTxt:function(html){var _cs=dojo.getComputedStyle(this.domNode);if(dojo.isIE||(!this.height&&!dojo.isMoz)){html="<div>"+html+"</div>";}var font=[_cs.fontWeight,_cs.fontSize,_cs.fontFamily].join(" ");var _1b8=_cs.lineHeight;if(_1b8.indexOf("px")>=0){_1b8=parseFloat(_1b8)/parseFloat(_cs.fontSize);}else{if(_1b8.indexOf("em")>=0){_1b8=parseFloat(_1b8);}else{_1b8="1.0";}}return [this.isLeftToRight()?"<html><head>":"<html dir='rtl'><head>",(dojo.isMoz?"<title>"+this._localizedIframeTitles.iframeEditTitle+"</title>":""),"<style>","body,html {","\tbackground:transparent;","\tfont:",font,";","\tpadding: 1em 0 0 0;","\tmargin: -1em 0 0 0;","\theight: 100%;","}","body{","\ttop:0px; left:0px; right:0px;",((this.height||dojo.isOpera)?"":"position: fixed;"),"\tmin-height:",this.minHeight,";","\tline-height:",_1b8,"}","p{ margin: 1em 0 !important; }",(this.height?"":"body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"),"li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ","li{ min-height:1.2em; }","</style>",this._applyEditingAreaStyleSheets(),"</head><body>"+html+"</body></html>"].join("");},_drawIframe:function(html){if(!this.iframe){var ifr=this.iframe=dojo.doc.createElement("iframe");ifr.id=this.id;var ifrs=ifr.style;ifrs.border="none";ifrs.lineHeight="0";ifrs.verticalAlign="bottom";this.editorObject=this.iframe;this._localizedIframeTitles=dojo.i18n.getLocalization("dijit.form","Textarea");var _1bc=dojo.query("label[for=\""+this.id+"\"]");if(_1bc.length){this._localizedIframeTitles.iframeEditTitle=_1bc[0].innerHTML+" "+this._localizedIframeTitles.iframeEditTitle;}}this.iframe.style.width=this.inheritWidth?this._oldWidth:"100%";if(this.height){this.iframe.style.height=this.height;}else{this.iframe.height=this._oldHeight;}var _1bd;if(this.textarea){_1bd=this.srcNodeRef;}else{_1bd=dojo.doc.createElement("div");_1bd.style.display="none";_1bd.innerHTML=html;this.editingArea.appendChild(_1bd);}this.editingArea.appendChild(this.iframe);var _1be=false;var _1bf=this.iframe.contentDocument;_1bf.open();if(dojo.isAIR){_1bf.body.innerHTML=html;}else{_1bf.write(this._getIframeDocTxt(html));}_1bf.close();var _1c0=dojo.hitch(this,function(){if(!_1be){_1be=true;}else{return;}if(!this.editNode){try{if(this.iframe.contentWindow){this.window=this.iframe.contentWindow;this.document=this.iframe.contentWindow.document;}else{if(this.iframe.contentDocument){this.window=this.iframe.contentDocument.window;this.document=this.iframe.contentDocument;}}if(!this.document.body){throw "Error";}}catch(e){setTimeout(_1c0,500);_1be=false;return;}dojo._destroyElement(_1bd);this.onLoad();}else{dojo._destroyElement(_1bd);this.editNode.innerHTML=html;this.onDisplayChanged();}this._preDomFilterContent(this.editNode);});_1c0();},_applyEditingAreaStyleSheets:function(){var _1c1=[];if(this.styleSheets){_1c1=this.styleSheets.split(";");this.styleSheets="";}_1c1=_1c1.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var text="",i=0,url;while((url=_1c1[i++])){var _1c5=(new dojo._Url(dojo.global.location,url)).toString();this.editingAreaStyleSheets.push(_1c5);text+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_1c5+"\"/>";}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);if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var head=this.document.getElementsByTagName("head")[0];var _1c9=this.document.createElement("link");with(_1c9){rel="stylesheet";type="text/css";href=url;}head.appendChild(_1c9);}},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 _1cc=dojo.indexOf(this.editingAreaStyleSheets,url);if(_1cc==-1){return;}delete this.editingAreaStyleSheets[_1cc];dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();},disabled:true,_mozSettingProps:["styleWithCSS","insertBrOnReturn"],setDisabled:function(_1cd){if(dojo.isIE||dojo.isSafari||dojo.isOpera){if(dojo.isIE){this.editNode.unselectable="on";}this.editNode.contentEditable=!_1cd;if(dojo.isIE){var _1ce=this;setTimeout(function(){_1ce.editNode.unselectable="off";},0);}}else{if(_1cd){this._mozSettings=[false,this.blockNodeForEnter==="BR"];}this.document.designMode=(_1cd?"off":"on");if(!_1cd&&this._mozSettings){dojo.forEach(this._mozSettingProps,function(s,i){this.document.execCommand(s,false,this._mozSettings[i]);},this);}}this.disabled=_1cd;},_isResized:function(){return false;},onLoad:function(e){this.isLoaded=true;if(!this.window.__registeredWindow){this.window.__registeredWindow=true;dijit.registerWin(this.window);}if(!dojo.isIE&&(this.height||dojo.isMoz)){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _1d2=this;if(dojo.isIE){var _1d3=this.tabStop=dojo.doc.createElement("<div tabIndex=-1>");this.editingArea.appendChild(_1d3);this.iframe.onfocus=function(){_1d2.editNode.setActive();};}}try{this.setDisabled(false);}catch(e){var _1d4=dojo.connect(this,"onClick",this,function(){this.setDisabled(false);dojo.disconnect(_1d4);});}this._preDomFilterContent(this.editNode);var _1d5=this.events.concat(this.captureEvents),i=0,et;while((et=_1d5[i++])){this.connect(this.document,et.toLowerCase(),et);}if(!dojo.isIE){try{this.document.execCommand("styleWithCSS",false,false);}catch(e2){}}else{this.connect(this.document,"onmousedown","_onMouseDown");this.editNode.style.zoom=1;}if(this.focusOnLoad){setTimeout(dojo.hitch(this,"focus"),0);}this.onDisplayChanged(e);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}},onKeyDown:function(e){if(dojo.isIE){if(e.keyCode==dojo.keys.TAB&&e.shiftKey&&!e.ctrlKey&&!e.altKey){this.iframe.focus();}else{if(e.keyCode==dojo.keys.TAB&&!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);}}}}}else{if(dojo.isMoz){if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey&&this.iframe){this.iframe.contentDocument.title=this._localizedIframeTitles.iframeFocusTitle;this.iframe.focus();dojo.stopEvent(e);}else{if(e.keyCode==dojo.keys.TAB&&e.shiftKey){if(this.toolbar){this.toolbar.focus();}dojo.stopEvent(e);}}}}},onKeyUp:function(e){return;},KEY_CTRL:1,KEY_SHIFT:2,onKeyPress:function(e){var _1db=(e.ctrlKey&&!e.altKey)?this.KEY_CTRL:0|e.shiftKey?this.KEY_SHIFT:0;var key=e.keyChar||e.keyCode;if(this._keyHandlers[key]){var _1dd=this._keyHandlers[key],i=0,h;while((h=_1dd[i++])){if(_1db==h.modifiers){if(!h.handler.apply(this,arguments)){e.preventDefault();}break;}}}setTimeout(dojo.hitch(this,function(){this.onKeyPressed(e);}),1);},addKeyHandler:function(key,_1e1,_1e2){if(!dojo.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({modifiers:_1e1||0,handler:_1e2});},onKeyPressed:function(e){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onMouseDown:function(e){if(!this._focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _c=this.getValue(true);if(_c!=this.savedContent){this.onChange(_c);this.savedContent=_c;}if(dojo.isMoz&&this.iframe){this.iframe.contentDocument.title=this._localizedIframeTitles.iframeEditTitle;}},_initialFocus:true,_onFocus:function(e){this.inherited(arguments);if(dojo.isMoz&&this._initialFocus){this._initialFocus=false;if(this.editNode.innerHTML.replace(/^\s+|\s+$/g,"")=="&nbsp;"){this.placeCursorAtStart();}}},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(!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){if(this._updateTimer){clearTimeout(this._updateTimer);}this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);}},onNormalizedDisplayChanged:function(){this._updateTimer=null;},onChange:function(_1ea){},_normalizeCommand:function(cmd){var _1ec=cmd.toLowerCase();if(_1ec=="hilitecolor"&&!dojo.isMoz){_1ec="backcolor";}return _1ec;},queryCommandAvailable:function(_1ed){var ie=1;var _1ef=1<<1;var _1f0=1<<2;var _1f1=1<<3;var _1f2=1<<4;var _1f3=dojo.isSafari;function isSupportedBy(_1f4){return {ie:Boolean(_1f4&ie),mozilla:Boolean(_1f4&_1ef),safari:Boolean(_1f4&_1f0),safari420:Boolean(_1f4&_1f2),opera:Boolean(_1f4&_1f1)};};var _1f5=null;switch(_1ed.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":_1f5=isSupportedBy(_1ef|ie|_1f0|_1f1);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":_1f5=isSupportedBy(_1ef|ie|_1f1|_1f2);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_1f5=isSupportedBy(ie);break;case "cut":case "copy":case "paste":_1f5=isSupportedBy(ie|_1ef|_1f2);break;case "inserttable":_1f5=isSupportedBy(_1ef|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_1f5=isSupportedBy(ie|_1ef);break;default:return false;}return (dojo.isIE&&_1f5.ie)||(dojo.isMoz&&_1f5.mozilla)||(dojo.isSafari&&_1f5.safari)||(_1f3&&_1f5.safari420)||(dojo.isOpera&&_1f5.opera);},execCommand:function(_1f6,_1f7){var _1f8;this.focus();_1f6=this._normalizeCommand(_1f6);if(_1f7!=undefined){if(_1f6=="heading"){throw new Error("unimplemented");}else{if((_1f6=="formatblock")&&dojo.isIE){_1f7="<"+_1f7+">";}}}if(_1f6=="inserthtml"){_1f7=this._preFilterContent(_1f7);if(dojo.isIE){var _1f9=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()=="CONTROL"){var n=_1f9.item(0);while(_1f9.length){_1f9.remove(_1f9.item(0));}n.outerHTML=_1f7;}else{_1f9.pasteHTML(_1f7);}_1f9.select();_1f8=true;}else{if(dojo.isMoz&&!_1f7.length){dojo.withGlobal(this.window,"remove",dijit._editor.selection);_1f8=true;}else{_1f8=this.document.execCommand(_1f6,false,_1f7);}}}else{if((_1f6=="unlink")&&(this.queryCommandEnabled("unlink"))&&(dojo.isMoz||dojo.isSafari)){var _1fb=this.window.getSelection();var a=dojo.withGlobal(this.window,"getAncestorElement",dijit._editor.selection,["a"]);dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[a]);_1f8=this.document.execCommand("unlink",false,null);}else{if((_1f6=="hilitecolor")&&(dojo.isMoz)){this.document.execCommand("styleWithCSS",false,true);_1f8=this.document.execCommand(_1f6,false,_1f7);this.document.execCommand("styleWithCSS",false,false);}else{if((dojo.isIE)&&((_1f6=="backcolor")||(_1f6=="forecolor"))){_1f7=arguments.length>1?_1f7:null;_1f8=this.document.execCommand(_1f6,false,_1f7);}else{_1f7=arguments.length>1?_1f7:null;if(_1f7||_1f6!="createlink"){_1f8=this.document.execCommand(_1f6,false,_1f7);}}}}}this.onDisplayChanged();return _1f8;},queryCommandEnabled:function(_1fd){if(this.disabled){return false;}_1fd=this._normalizeCommand(_1fd);if(dojo.isMoz||dojo.isSafari){if(_1fd=="unlink"){return dojo.withGlobal(this.window,"hasAncestorElement",dijit._editor.selection,["a"]);}else{if(_1fd=="inserttable"){return true;}}}if(dojo.isSafari){if(_1fd=="copy"){_1fd="cut";}else{if(_1fd=="paste"){return true;}}}var elem=dojo.isIE?this.document.selection.createRange():this.document;return elem.queryCommandEnabled(_1fd);},queryCommandState:function(_1ff){if(this.disabled){return false;}_1ff=this._normalizeCommand(_1ff);return this.document.queryCommandState(_1ff);},queryCommandValue:function(_200){if(this.disabled){return false;}_200=this._normalizeCommand(_200);if(dojo.isIE&&_200=="formatblock"){return this._local2NativeFormatNames[this.document.queryCommandValue(_200)];}return this.document.queryCommandValue(_200);},placeCursorAtStart:function(){this.focus();var _201=false;if(dojo.isMoz){var _202=this.editNode.firstChild;while(_202){if(_202.nodeType==3){if(_202.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_201=true;dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_202]);break;}}else{if(_202.nodeType==1){_201=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[_202]);break;}}_202=_202.nextSibling;}}else{_201=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[this.editNode]);}if(_201){dojo.withGlobal(this.window,"collapse",dijit._editor.selection,[true]);}},placeCursorAtEnd:function(){this.focus();var _203=false;if(dojo.isMoz){var last=this.editNode.lastChild;while(last){if(last.nodeType==3){if(last.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_203=true;dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last]);break;}}else{if(last.nodeType==1){_203=true;if(last.lastChild){dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last.lastChild]);}else{dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[last]);}break;}}last=last.previousSibling;}}else{_203=true;dojo.withGlobal(this.window,"selectElementChildren",dijit._editor.selection,[this.editNode]);}if(_203){dojo.withGlobal(this.window,"collapse",dijit._editor.selection,[false]);}},getValue:function(_205){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_205);},setValue:function(html){if(!this.isLoaded){this.onLoadDeferred.addCallback(dojo.hitch(this,function(){this.setValue(html);}));return;}if(this.textarea&&(this.isClosed||!this.isLoaded)){this.textarea.value=html;}else{html=this._preFilterContent(html);var node=this.isClosed?this.domNode:this.editNode;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(dojo.isMoz&&!html){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,_20f){var ec;if(!dojo.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_20f&&dom["cloneNode"]){dom=dom.cloneNode(true);}dojo.forEach(this.contentDomPostFilters,function(ef){dom=ef(dom);});}ec=dijit._editor.getChildrenHtml(dom);}else{ec=dom;}if(!ec.replace(/^(?:\s|\xA0)+/g,"").replace(/(?:\s|\xA0)+$/g,"").length){ec="";}dojo.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(e){var _214=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");_214.value+=this._SEPARATOR+this.name+":"+this.getValue();},escapeXml:function(str,_216){dojo.deprecated("dijit.Editor::escapeXml is deprecated","use dijit._editor.escapeXml instead",2);return dijit._editor.escapeXml(str,_216);},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,_21a){if(this.isClosed){return false;}if(!arguments.length){save=true;}this._content=this.getValue();var _21b=(this.savedContent!=this._content);if(this.interval){clearInterval(this.interval);}if(this.textarea){with(this.textarea.style){position="";left=top="";if(dojo.isIE){overflow=this.__overflow;this.__overflow=null;}}this.textarea.value=save?this._content:this.savedContent;dojo._destroyElement(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=save?this._content:this.savedContent;}dojo.removeClass(this.domNode,"RichTextEditable");this.isClosed=true;this.isLoaded=false;delete this.editNode;if(this.window&&this.window._frameElement){this.window._frameElement=null;}this.window=null;this.document=null;this.editingArea=null;this.editorObject=null;return _21b;},destroyRendering:function(){},destroy:function(){this.destroyRendering();if(!this.isClosed){this.close(false);}this.inherited("destroy",arguments);},_removeMozBogus:function(html){return html.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"");},_removeSafariBogus:function(html){return html.replace(/\sclass="webkit-block-placeholder"/gi,"");},_fixContentForMoz:function(html){return html.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_srcInImgRegex:/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,_hrefInARegex:/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,_preFixUrlAttributes:function(html){return html.replace(this._hrefInARegex,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(this._srcInImgRegex,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");}});}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 dijitToolbar\" waiRole=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",tabIndex:"0",postCreate:function(){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);}});dojo.declare("dijit.ToolbarSeparator",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\"></div>",postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return 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:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",_onChangeMonitor:"",_onClick:function(e){if(this.disabled||this.readOnly){dojo.stopEvent(e);return false;}this._clicked();return this.onClick(e);},_onButtonClick:function(e){if(this._onClick(e)===false){dojo.stopEvent(e);}else{if(this.type=="submit"&&!this.focusNode.form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _223=dijit.byNode(node);if(_223&&typeof _223._onSubmit=="function"){_223._onSubmit(e);break;}}}}},postCreate:function(){if(this.showLabel==false){var _224="";this.label=this.containerNode.innerHTML;_224=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");this.titleNode.title=_224;dojo.addClass(this.containerNode,"dijitDisplayNone");}dojo.setSelectable(this.focusNode,false);this.inherited(arguments);},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_227){this.containerNode.innerHTML=this.label=_227;this._layoutHack();if(this.showLabel==false){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container],{baseClass:"dijitDropDownButton",templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",_fillContent:function(){if(this.srcNodeRef){var _228=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_228[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown){var _229=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_229);delete this.dropDownContainer;}dijit.popup.prepare(this.dropDown.domNode);this.inherited(arguments);},destroyDescendants:function(){if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}this.inherited(arguments);},_onArrowClick:function(e){if(this.disabled||this.readOnly){return;}this._toggleDropDown();},_onDropDownClick:function(e){var _22c=dojo.isFF&&dojo.isFF<3&&navigator.appVersion.indexOf("Macintosh")!=-1;if(!_22c||e.detail!=0||this._seenKeydown){this._onArrowClick(e);}this._seenKeydown=false;},_onDropDownKeydown:function(e){this._seenKeydown=true;},_onDropDownBlur:function(e){this._seenKeydown=false;},_onKey:function(e){if(this.disabled||this.readOnly){return;}if(e.keyCode==dojo.keys.DOWN_ARROW){if(!this.dropDown||this.dropDown.domNode.style.visibility=="hidden"){dojo.stopEvent(e);this._toggleDropDown();}}},_onBlur:function(){this._closeDropDown();this.inherited(arguments);},_toggleDropDown:function(){if(this.disabled||this.readOnly){return;}dijit.focus(this.popupStateNode);var _230=this.dropDown;if(!_230){return;}if(!this._opened){if(_230.href&&!_230.isLoaded){var self=this;var _232=dojo.connect(_230,"onLoad",function(){dojo.disconnect(_232);self._openDropDown();});_230._loadCheck(true);return;}else{this._openDropDown();}}else{this._closeDropDown();}},_openDropDown:function(){var _233=this.dropDown;var _234=_233.domNode.style.width;var self=this;dijit.popup.open({parent:this,popup:_233,around:this.domNode,orient:this.isLeftToRight()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"},onExecute:function(){self._closeDropDown(true);},onCancel:function(){self._closeDropDown(true);},onClose:function(){_233.domNode.style.width=_234;self.popupStateNode.removeAttribute("popupActive");this._opened=false;}});if(this.domNode.offsetWidth>_233.domNode.offsetWidth){var _236=null;if(!this.isLeftToRight()){_236=_233.domNode.parentNode;var _237=_236.offsetLeft+_236.offsetWidth;}dojo.marginBox(_233.domNode,{w:this.domNode.offsetWidth});if(_236){_236.style.left=_237-this.domNode.offsetWidth+"px";}}this.popupStateNode.setAttribute("popupActive","true");this._opened=true;if(_233.focus){_233.focus();}},_closeDropDown:function(_238){if(this._opened){dijit.popup.close(this.dropDown);if(_238){this.focus();}this._opened=false;}}});dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{templateString:"<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\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</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._FormWidget.prototype.attributeMap),{id:"",name:""}),optionsTitle:"",baseClass:"dijitComboButton",_focusedNode:null,postCreate:function(){this.inherited(arguments);this._focalNodes=[this.titleNode,this.popupStateNode];dojo.forEach(this._focalNodes,dojo.hitch(this,function(node){if(dojo.isIE){this.connect(node,"onactivate",this._onNodeFocus);this.connect(node,"ondeactivate",this._onNodeBlur);}else{this.connect(node,"onfocus",this._onNodeFocus);this.connect(node,"onblur",this._onNodeBlur);}}));},focusFocalNode:function(node){this._focusedNode=node;dijit.focus(node);},hasNextFocalNode:function(){return this._focusedNode!==this.getFocalNodes()[1];},focusNext:function(){this._focusedNode=this.getFocalNodes()[this._focusedNode?1:0];dijit.focus(this._focusedNode);},hasPrevFocalNode:function(){return this._focusedNode!==this.getFocalNodes()[0];},focusPrev:function(){this._focusedNode=this.getFocalNodes()[this._focusedNode?0:1];dijit.focus(this._focusedNode);},getFocalNodes:function(){return this._focalNodes;},_onNodeFocus:function(evt){this._focusedNode=evt.currentTarget;var fnc=this._focusedNode==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.addClass(this._focusedNode,fnc);},_onNodeBlur:function(evt){var fnc=evt.currentTarget==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";dojo.removeClass(evt.currentTarget,fnc);},_onBlur:function(){this.inherited(arguments);this._focusedNode=null;}});dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,_onChangeMonitor:"checked",attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){this.setAttribute("checked",!this.checked);},setAttribute:function(attr,_241){this.inherited(arguments);switch(attr){case "checked":dijit.setWaiState(this.focusNode||this.domNode,"pressed",this.checked);this._setStateClass();this._handleOnChange(this.checked,true);}},setChecked:function(_242){dojo.deprecated("setChecked("+_242+") is deprecated. Use setAttribute('checked',"+_242+") instead.","","2.0");this.setAttribute("checked",_242);},postCreate:function(){this.inherited(arguments);this.setAttribute("checked",this.checked);}});}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){if(args){dojo.mixin(this,args);}this._connects=[];},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,queryCommand:null,command:"",commandArg:null,useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(key){return this.editor.commands[key];},_initButton:function(_246){if(this.command.length){var _247=this.getLabel(this.command);var _248=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){_246=dojo.mixin({label:_247,showLabel:false,iconClass:_248,dropDown:this.dropDown,tabIndex:"-1"},_246||{});this.button=new this.buttonClass(_246);}}},destroy:function(f){dojo.forEach(this._connects,dojo.disconnect);},connect:function(o,f,tf){this._connects.push(dojo.connect(o,f,this,tf));},updateState:function(){var _e=this.editor;var _c=this.command;if(!_e){return;}if(!_e.isLoaded){return;}if(!_c.length){return;}if(this.button){try{var _24f=_e.queryCommandEnabled(_c);this.button.setAttribute("disabled",!_24f);if(typeof this.button.checked=="boolean"){this.button.setAttribute("checked",_e.queryCommandState(_c));}}catch(e){console.debug(e);}}},setEditor:function(_250){this.editor=_250;this._initButton();if(this.command.length&&!this.editor.queryCommandAvailable(this.command)){if(this.button){this.button.domNode.style.display="none";}}if(this.button&&this.useDefaultCommand){this.connect(this.button,"onClick",dojo.hitch(this.editor,"execCommand",this.command,this.commandArg));}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_251){if(this.button){_251.addChild(this.button);}}});}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"];}this._plugins=[];this._editInterval=this.editActionInterval*1000;},postCreate:function(){if(this.customUndo){dojo["require"]("dijit._editor.range");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){this.toolbar=new dijit.Toolbar({});dojo.place(this.toolbar.domNode,this.editingArea,"before");}dojo.forEach(this.plugins,this.addPlugin,this);this.onNormalizedDisplayChanged();},destroy:function(){dojo.forEach(this._plugins,function(p){if(p&&p.destroy){p.destroy();}});this._plugins=[];this.toolbar.destroy();delete this.toolbar;this.inherited(arguments);},addPlugin:function(_253,_254){var args=dojo.isString(_253)?{name:_253}:_253;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",_253);return;}_253=o.plugin;}if(arguments.length>1){this._plugins[_254]=_253;}else{this._plugins.push(_253);}_253.setEditor(this);if(dojo.isFunction(_253.setToolbar)){_253.setToolbar(this.toolbar);}},customUndo:dojo.isIE,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{try{if(this.customUndo){this.endEditing();this._beginEditing();}var r=this.inherited("execCommand",arguments);if(this.customUndo){this._endEditing();}return r;}catch(e){if(dojo.isMoz&&/copy|cut|paste/.test(cmd)){var sub=dojo.string.substitute,_25c={cut:"X",copy:"C",paste:"V"},_25d=navigator.userAgent.indexOf("Macintosh")!=-1;alert(sub(this.commands.systemShortcutFF,[this.commands[cmd],sub(this.commands[_25d?"appleKey":"ctrlKey"],[_25c[cmd]])]));}return false;}}},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 _260=b;if(dojo.isIE){if(dojo.isArray(b)){_260=[];dojo.forEach(b,function(n){_260.push(dijit.range.getNode(n,this.editNode));},this);}}else{var r=dijit.range.create();r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);_260=r;}dojo.withGlobal(this.window,"moveToBookmark",dijit,[_260]);},_changeToStep:function(from,to){this.setValue(to.text);var b=to.bookmark;if(!b){return;}this._moveToBookmark(b);},undo:function(){this.endEditing(true);var s=this._steps.pop();if(this._steps.length>0){this.focus();this._changeToStep(s,this._steps[this._steps.length-1]);this._undoedSteps.push(s);this.onDisplayChanged();return true;}return false;},redo:function(){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();return true;}return false;},endEditing:function(_268){if(this._editTimer){clearTimeout(this._editTimer);}if(this._inEditing){this._endEditing(_268);this._inEditing=false;}},_getBookmark:function(){var b=dojo.withGlobal(this.window,dijit.getBookmark);var tmp=[];if(dojo.isIE){if(dojo.isArray(b)){dojo.forEach(b,function(n){tmp.push(dijit.range.getIndex(n,this.editNode).o);},this);b=tmp;}}else{tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;b={startContainer:tmp,startOffset:b.startOffset,endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,endOffset:b.endOffset};}return b;},_beginEditing:function(cmd){if(this._steps.length===0){this._steps.push({"text":this.savedContent,"bookmark":this._getBookmark()});}},_endEditing:function(_26d){var v=this.getValue(true);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){if(!this.customUndo){this.inherited("onKeyDown",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("onKeyDown",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);},onClick:function(){this.endEditing(true);this.inherited("onClick",arguments);}});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 "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()});}o.plugin=p;});}if(!dojo._hasResource["dijit.Menu"]){dojo._hasResource["dijit.Menu"]=true;dojo.provide("dijit.Menu");dojo.declare("dijit.Menu",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{constructor:function(){this._bindings=[];},templateString:"<table class=\"dijit dijitMenu dijitReset dijitMenuTable\" waiRole=\"menu\" dojoAttachEvent=\"onkeypress:_onKeyPress\">"+"<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>"+"</table>",targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,parentMenu:null,popupDelay:500,_contextMenuWithMouse:false,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(dojo.body());}else{dojo.forEach(this.targetNodeIds,this.bindDomNode,this);}this.connectKeyNavHandlers([dojo.keys.UP_ARROW],[dojo.keys.DOWN_ARROW]);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_277){_277.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_278){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.keyCode){case dojo.keys.RIGHT_ARROW:this._moveToPopup(evt);dojo.stopEvent(evt);break;case dojo.keys.LEFT_ARROW:if(this.parentMenu){this.onCancel(false);}else{dojo.stopEvent(evt);}break;}},onItemHover:function(item){this.focusChild(item);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(dojo.hitch(this,"_openPopup"),this.popupDelay);}},_onChildBlur:function(item){dijit.popup.close(item.popup);item._blur();this._stopPopupTimer();},onItemUnhover:function(item){},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(item,evt){if(item.disabled){return false;}if(item.popup){if(!this.is_open){this._openPopup();}}else{this.onExecute();item.onClick(evt);}},_iframeContentWindow:function(_281){var win=dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(_281))||dijit.Menu._iframeContentDocument(_281)["__parent__"]||(_281.name&&dojo.doc.frames[_281.name])||null;return win;},_iframeContentDocument:function(_283){var doc=_283.contentDocument||(_283.contentWindow&&_283.contentWindow.document)||(_283.name&&dojo.doc.frames[_283.name]&&dojo.doc.frames[_283.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var win=dijit.getDocumentWindow(node.ownerDocument);if(node.tagName.toLowerCase()=="iframe"){win=this._iframeContentWindow(node);node=dojo.withGlobal(win,dojo.body);}var cn=(node==dojo.body()?dojo.doc:node);node[this.id]=this._bindings.push([dojo.connect(cn,(this.leftClickToOpen)?"onclick":"oncontextmenu",this,"_openMyself"),dojo.connect(cn,"onkeydown",this,"_contextKey"),dojo.connect(cn,"onmousedown",this,"_contextMouse")]);},unBindDomNode:function(_288){var node=dojo.byId(_288);if(node){var bid=node[this.id]-1,b=this._bindings[bid];dojo.forEach(b,dojo.disconnect);delete this._bindings[bid];}},_contextKey:function(e){this._contextMenuWithMouse=false;if(e.keyCode==dojo.keys.F10){dojo.stopEvent(e);if(e.shiftKey&&e.type=="keydown"){var _e={target:e.target,pageX:e.pageX,pageY:e.pageY};_e.preventDefault=_e.stopPropagation=function(){};window.setTimeout(dojo.hitch(this,function(){this._openMyself(_e);}),1);}}},_contextMouse:function(e){this._contextMenuWithMouse=true;},_openMyself:function(e){if(this.leftClickToOpen&&e.button>0){return;}dojo.stopEvent(e);var x,y;if(dojo.isSafari||this._contextMenuWithMouse){x=e.pageX;y=e.pageY;}else{var _292=dojo.coords(e.target,true);x=_292.x+10;y=_292.y+10;}var self=this;var _294=dijit.getFocus(this);function closeAndRestoreFocus(){dijit.focus(_294);dijit.popup.close(self);};dijit.popup.open({popup:this,x:x,y:y,onExecute:closeAndRestoreFocus,onCancel:closeAndRestoreFocus,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);dijit.popup.close(this);};},onOpen:function(e){this.isShowingNow=true;},onClose:function(){this._stopPopupTimer();this.parentMenu=null;this.isShowingNow=false;this.currentPopup=null;if(this.focusedChild){this._onChildBlur(this.focusedChild);this.focusedChild=null;}},_openPopup:function(){this._stopPopupTimer();var _296=this.focusedChild;var _297=_296.popup;if(_297.isShowingNow){return;}_297.parentMenu=this;var self=this;dijit.popup.open({parent:this,popup:_297,around:_296.arrowCell,orient:this.isLeftToRight()?{"TR":"TL","TL":"TR"}:{"TL":"TR","TR":"TL"},onCancel:function(){dijit.popup.close(_297);_296.focus();self.currentPopup=null;}});this.currentPopup=_297;if(_297.focus){_297.focus();}},uninitialize:function(){dojo.forEach(this.targetNodeIds,this.unBindDomNode,this);this.inherited(arguments);}});dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitReset dijitMenuItem\" "+"dojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">"+"<td class=\"dijitReset\"><div class=\"dijitMenuItemIcon ${iconClass}\" dojoAttachPoint=\"iconNode\"></div></td>"+"<td tabIndex=\"-1\" class=\"dijitReset dijitMenuItemLabel\" dojoAttachPoint=\"containerNode,focusNode\" waiRole=\"menuitem\"></td>"+"<td class=\"dijitReset\" dojoAttachPoint=\"arrowCell\">"+"<div class=\"dijitMenuExpand\" dojoAttachPoint=\"expand\" style=\"display:none\">"+"<span class=\"dijitInline dijitArrowNode dijitMenuExpandInner\">+</span>"+"</div>"+"</td>"+"</tr>",label:"",iconClass:"",disabled:false,postCreate:function(){dojo.setSelectable(this.domNode,false);this.setDisabled(this.disabled);if(this.label){this.setLabel(this.label);}},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);},_onClick:function(evt){this.getParent().onItemClick(this,evt);dojo.stopEvent(evt);},onClick:function(evt){},focus:function(){dojo.addClass(this.domNode,"dijitMenuItemHover");try{dijit.focus(this.containerNode);}catch(e){}},_blur:function(){dojo.removeClass(this.domNode,"dijitMenuItemHover");},setLabel:function(_29b){this.containerNode.innerHTML=this.label=_29b;},setDisabled:function(_29c){this.disabled=_29c;dojo[_29c?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");dijit.setWaiState(this.containerNode,"disabled",_29c?"true":"false");}});dojo.declare("dijit.PopupMenuItem",dijit.MenuItem,{_fillContent:function(){if(this.srcNodeRef){var _29d=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_29d[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.domNode.style.display="none";dojo.addClass(this.expand,"dijitMenuExpandEnabled");dojo.style(this.expand,"display","");dijit.setWaiState(this.containerNode,"haspopup","true");},destroyDescendants:function(){if(this.popup){this.popup.destroyRecursive();delete this.popup;}this.inherited(arguments);}});dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitMenuSeparator\"><td colspan=3>"+"<div class=\"dijitMenuSeparatorTop\"></div>"+"<div class=\"dijitMenuSeparatorBottom\"></div>"+"</td></tr>",postCreate:function(){dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.regexp.escapeString=function(str,_2a0){return str.replace(/([\.$?*!=:|{}\(\)\[\]\\\/^])/g,function(ch){if(_2a0&&_2a0.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_2a4){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("|"),_2a4);};dojo.regexp.group=function(_2a7,_2a8){return "("+(_2a8?"?:":"")+_2a7+")";};}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.number.format=function(_2a9,_2aa){_2aa=dojo.mixin({},_2aa||{});var _2ab=dojo.i18n.normalizeLocale(_2aa.locale);var _2ac=dojo.i18n.getLocalization("dojo.cldr","number",_2ab);_2aa.customs=_2ac;var _2ad=_2aa.pattern||_2ac[(_2aa.type||"decimal")+"Format"];if(isNaN(_2a9)){return null;}return dojo.number._applyPattern(_2a9,_2ad,_2aa);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_2ae,_2af,_2b0){_2b0=_2b0||{};var _2b1=_2b0.customs.group;var _2b2=_2b0.customs.decimal;var _2b3=_2af.split(";");var _2b4=_2b3[0];_2af=_2b3[(_2ae<0)?1:0]||("-"+_2b4);if(_2af.indexOf("%")!=-1){_2ae*=100;}else{if(_2af.indexOf("‰")!=-1){_2ae*=1000;}else{if(_2af.indexOf("¤")!=-1){_2b1=_2b0.customs.currencyGroup||_2b1;_2b2=_2b0.customs.currencyDecimal||_2b2;_2af=_2af.replace(/\u00a4{1,3}/,function(_2b5){var prop=["symbol","currency","displayName"][_2b5.length-1];return _2b0[prop]||_2b0.currency||"";});}else{if(_2af.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _2b7=dojo.number._numberPatternRE;var _2b8=_2b4.match(_2b7);if(!_2b8){throw new Error("unable to find a number expression in pattern: "+_2af);}return _2af.replace(_2b7,dojo.number._formatAbsolute(_2ae,_2b8[0],{decimal:_2b2,group:_2b1,places:_2b0.places}));};dojo.number.round=function(_2b9,_2ba,_2bb){var _2bc=String(_2b9).split(".");var _2bd=(_2bc[1]&&_2bc[1].length)||0;if(_2bd>_2ba){var _2be=Math.pow(10,_2ba);if(_2bb>0){_2be*=10/_2bb;_2ba++;}_2b9=Math.round(_2b9*_2be)/_2be;_2bc=String(_2b9).split(".");_2bd=(_2bc[1]&&_2bc[1].length)||0;if(_2bd>_2ba){_2bc[1]=_2bc[1].substr(0,_2ba);_2b9=Number(_2bc.join("."));}}return _2b9;};dojo.number._formatAbsolute=function(_2bf,_2c0,_2c1){_2c1=_2c1||{};if(_2c1.places===true){_2c1.places=0;}if(_2c1.places===Infinity){_2c1.places=6;}var _2c2=_2c0.split(".");var _2c3=(_2c1.places>=0)?_2c1.places:(_2c2[1]&&_2c2[1].length)||0;if(!(_2c1.round<0)){_2bf=dojo.number.round(_2bf,_2c3,_2c1.round);}var _2c4=String(Math.abs(_2bf)).split(".");var _2c5=_2c4[1]||"";if(_2c1.places){_2c4[1]=dojo.string.pad(_2c5.substr(0,_2c1.places),_2c1.places,"0",true);}else{if(_2c2[1]&&_2c1.places!==0){var pad=_2c2[1].lastIndexOf("0")+1;if(pad>_2c5.length){_2c4[1]=dojo.string.pad(_2c5,pad,"0",true);}var _2c7=_2c2[1].length;if(_2c7<_2c5.length){_2c4[1]=_2c5.substr(0,_2c7);}}else{if(_2c4[1]){_2c4.pop();}}}var _2c8=_2c2[0].replace(",","");pad=_2c8.indexOf("0");if(pad!=-1){pad=_2c8.length-pad;if(pad>_2c4[0].length){_2c4[0]=dojo.string.pad(_2c4[0],pad);}if(_2c8.indexOf("#")==-1){_2c4[0]=_2c4[0].substr(_2c4[0].length-pad);}}var _2c9=_2c2[0].lastIndexOf(",");var _2ca,_2cb;if(_2c9!=-1){_2ca=_2c2[0].length-_2c9-1;var _2cc=_2c2[0].substr(0,_2c9);_2c9=_2cc.lastIndexOf(",");if(_2c9!=-1){_2cb=_2cc.length-_2c9-1;}}var _2cd=[];for(var _2ce=_2c4[0];_2ce;){var off=_2ce.length-_2ca;_2cd.push((off>0)?_2ce.substr(off):_2ce);_2ce=(off>0)?_2ce.slice(0,off):"";if(_2cb){_2ca=_2cb;delete _2cb;}}_2c4[0]=_2cd.reverse().join(_2c1.group||",");return _2c4.join(_2c1.decimal||".");};dojo.number.regexp=function(_2d0){return dojo.number._parseInfo(_2d0).regexp;};dojo.number._parseInfo=function(_2d1){_2d1=_2d1||{};var _2d2=dojo.i18n.normalizeLocale(_2d1.locale);var _2d3=dojo.i18n.getLocalization("dojo.cldr","number",_2d2);var _2d4=_2d1.pattern||_2d3[(_2d1.type||"decimal")+"Format"];var _2d5=_2d3.group;var _2d6=_2d3.decimal;var _2d7=1;if(_2d4.indexOf("%")!=-1){_2d7/=100;}else{if(_2d4.indexOf("‰")!=-1){_2d7/=1000;}else{var _2d8=_2d4.indexOf("¤")!=-1;if(_2d8){_2d5=_2d3.currencyGroup||_2d5;_2d6=_2d3.currencyDecimal||_2d6;}}}var _2d9=_2d4.split(";");if(_2d9.length==1){_2d9.push("-"+_2d9[0]);}var re=dojo.regexp.buildGroupRE(_2d9,function(_2db){_2db="(?:"+dojo.regexp.escapeString(_2db,".")+")";return _2db.replace(dojo.number._numberPatternRE,function(_2dc){var _2dd={signed:false,separator:_2d1.strict?_2d5:[_2d5,""],fractional:_2d1.fractional,decimal:_2d6,exponent:false};var _2de=_2dc.split(".");var _2df=_2d1.places;if(_2de.length==1||_2df===0){_2dd.fractional=false;}else{if(_2df===undefined){_2df=_2de[1].lastIndexOf("0")+1;}if(_2df&&_2d1.fractional==undefined){_2dd.fractional=true;}if(!_2d1.places&&(_2df<_2de[1].length)){_2df+=","+_2de[1].length;}_2dd.places=_2df;}var _2e0=_2de[0].split(",");if(_2e0.length>1){_2dd.groupSize=_2e0.pop().length;if(_2e0.length>1){_2dd.groupSize2=_2e0.pop().length;}}return "("+dojo.number._realNumberRegexp(_2dd)+")";});},true);if(_2d8){re=re.replace(/(\s*)(\u00a4{1,3})(\s*)/g,function(_2e1,_2e2,_2e3,_2e4){var prop=["symbol","currency","displayName"][_2e3.length-1];var _2e6=dojo.regexp.escapeString(_2d1[prop]||_2d1.currency||"");_2e2=_2e2?"\\s":"";_2e4=_2e4?"\\s":"";if(!_2d1.strict){if(_2e2){_2e2+="*";}if(_2e4){_2e4+="*";}return "(?:"+_2e2+_2e6+_2e4+")?";}return _2e2+_2e6+_2e4;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_2d5,decimal:_2d6,factor:_2d7};};dojo.number.parse=function(_2e7,_2e8){var info=dojo.number._parseInfo(_2e8);var _2ea=(new RegExp("^"+info.regexp+"$")).exec(_2e7);if(!_2ea){return NaN;}var _2eb=_2ea[1];if(!_2ea[1]){if(!_2ea[2]){return NaN;}_2eb=_2ea[2];info.factor*=-1;}_2eb=_2eb.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return Number(_2eb)*info.factor;};dojo.number._realNumberRegexp=function(_2ec){_2ec=_2ec||{};if(!("places" in _2ec)){_2ec.places=Infinity;}if(typeof _2ec.decimal!="string"){_2ec.decimal=".";}if(!("fractional" in _2ec)||/^0/.test(_2ec.places)){_2ec.fractional=[true,false];}if(!("exponent" in _2ec)){_2ec.exponent=[true,false];}if(!("eSigned" in _2ec)){_2ec.eSigned=[true,false];}var _2ed=dojo.number._integerRegexp(_2ec);var _2ee=dojo.regexp.buildGroupRE(_2ec.fractional,function(q){var re="";if(q&&(_2ec.places!==0)){re="\\"+_2ec.decimal;if(_2ec.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_2ec.places+"}";}}return re;},true);var _2f1=dojo.regexp.buildGroupRE(_2ec.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_2ec.eSigned})+")";}return "";});var _2f3=_2ed+_2ee;if(_2ee){_2f3="(?:(?:"+_2f3+")|(?:"+_2ee+"))";}return _2f3+_2f1;};dojo.number._integerRegexp=function(_2f4){_2f4=_2f4||{};if(!("signed" in _2f4)){_2f4.signed=[true,false];}if(!("separator" in _2f4)){_2f4.separator="";}else{if(!("groupSize" in _2f4)){_2f4.groupSize=3;}}var _2f5=dojo.regexp.buildGroupRE(_2f4.signed,function(q){return q?"[-+]":"";},true);var _2f7=dojo.regexp.buildGroupRE(_2f4.separator,function(sep){if(!sep){return "(?:0|[1-9]\\d*)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_2f4.groupSize,grp2=_2f4.groupSize2;if(grp2){var _2fb="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_2fb+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_2fb;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _2f5+_2f7;};}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,templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" 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=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postCreate:function(){this.inherited("postCreate",arguments);this.inteterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath);this.update();},update:function(_2fc){dojo.mixin(this,_2fc||{});var _2fd=1,_2fe;if(this.indeterminate){_2fe="addClass";dijit.removeWaiState(this.internalProgress,"valuenow");dijit.removeWaiState(this.internalProgress,"valuemin");dijit.removeWaiState(this.internalProgress,"valuemax");}else{_2fe="removeClass";if(String(this.progress).indexOf("%")!=-1){_2fd=Math.min(parseFloat(this.progress)/100,1);this.progress=_2fd*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_2fd=this.progress/this.maximum;}var text=this.report(_2fd);this.label.firstChild.nodeValue=text;dijit.setWaiState(this.internalProgress,"describedby",this.label.id);dijit.setWaiState(this.internalProgress,"valuenow",this.progress);dijit.setWaiState(this.internalProgress,"valuemin",0);dijit.setWaiState(this.internalProgress,"valuemax",this.maximum);}dojo[_2fe](this.domNode,"dijitProgressBarIndeterminate");this.internalProgress.style.width=(_2fd*100)+"%";this.onChange();},report:function(_300){return dojo.number.format(_300,{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],{title:"",open:true,duration:250,baseClass:"dijitTitlePane",templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\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",postCreate:function(){this.setTitle(this.title);if(!this.open){this.hideNode.style.display=this.wipeNode.style.display="none";}this._setCss();dojo.setSelectable(this.titleNode,false);this.inherited(arguments);dijit.setWaiState(this.containerNode,"labelledby",this.titleNode.id);dijit.setWaiState(this.focusNode,"haspopup","true");var _301=this.hideNode,_302=this.wipeNode;this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){_301.style.display="";}});this._wipeOut=dojo.fx.wipeOut({node:this.wipeNode,duration:this.duration,onEnd:function(){_301.style.display="none";}});},setContent:function(_303){if(!this.open||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn.status()=="playing"){this._wipeIn.stop();}dojo.marginBox(this.wipeNode,{h:dojo.marginBox(this.wipeNode).h});this.inherited(arguments);this._wipeIn.play();}},toggle:function(){dojo.forEach([this._wipeIn,this._wipeOut],function(_304){if(_304.status()=="playing"){_304.stop();}});this[this.open?"_wipeOut":"_wipeIn"].play();this.open=!this.open;this._loadCheck();this._setCss();},_setCss:function(){var _305=["dijitClosed","dijitOpen"];var _306=this.open;var node=this.titleBarNode||this.focusNode;dojo.removeClass(node,_305[!_306+0]);node.className+=" "+_305[_306+0];this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){if(e.keyCode==dojo.keys.ENTER||e.charCode==dojo.keys.SPACE){this.toggle();}else{if(e.keyCode==dojo.keys.DOWN_ARROW&&this.open){this.containerNode.focus();e.preventDefault();}}},_handleFocus:function(e){dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,this.baseClass+"Focused");},setTitle:function(_30a){this.titleNode.innerHTML=_30a;}});}if(!dojo._hasResource["dijit.Tooltip"]){dojo._hasResource["dijit.Tooltip"]=true;dojo.provide("dijit.Tooltip");dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:200,templateString:"<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(_30b,_30c,_30d){if(this.aroundNode&&this.aroundNode===_30c){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_30b;this.domNode.style.top=(this.domNode.offsetTop+1)+"px";var _30e={};var ltr=this.isLeftToRight();dojo.forEach((_30d&&_30d.length)?_30d:dijit.Tooltip.defaultPosition,function(pos){switch(pos){case "after":_30e[ltr?"BR":"BL"]=ltr?"BL":"BR";break;case "before":_30e[ltr?"BL":"BR"]=ltr?"BR":"BL";break;case "below":_30e[ltr?"BL":"BR"]=ltr?"TL":"TR";_30e[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above":default:_30e[ltr?"TL":"TR"]=ltr?"BL":"BR";_30e[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});var pos=dijit.placeOnScreenAroundElement(this.domNode,_30c,_30e,dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_30c;},orient:function(node,_313,_314){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"}[_313+"-"+_314];},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_315){if(!this.aroundNode||this.aroundNode!==_315){return;}if(this._onDeck){this._onDeck=null;return;}this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();},_onHide:function(){this.domNode.style.cssText="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}}});dijit.showTooltip=function(_316,_317,_318){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_316,_317,_318);};dijit.hideTooltip=function(_319){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_319);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],postCreate:function(){if(this.srcNodeRef){this.srcNodeRef.style.display="none";}this._connectNodes=[];dojo.forEach(this.connectId,function(id){var node=dojo.byId(id);if(node){this._connectNodes.push(node);dojo.forEach(["onMouseOver","onMouseOut","onFocus","onBlur","onHover","onUnHover"],function(_31c){this.connect(node,_31c.toLowerCase(),"_"+_31c);},this);if(dojo.isIE){node.style.zoom=1;}}},this);},_onMouseOver:function(e){this._onHover(e);},_onMouseOut:function(e){if(dojo.isDescendant(e.relatedTarget,e.target)){return;}this._onUnHover(e);},_onFocus:function(e){this._focus=true;this._onHover(e);this.inherited(arguments);},_onBlur:function(e){this._focus=false;this._onUnHover(e);this.inherited(arguments);},_onHover:function(e){if(!this._showTimer){var _322=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_322);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_324){_324=_324||this._connectNodes[0];if(!_324){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_324,this.position);this._connectNode=_324;},close:function(){dijit.hideTooltip(this._connectNode);delete this._connectNode;if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},uninitialize:function(){this.close();}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_326,_327){var c=document.cookie;if(arguments.length==1){var _329=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _329?decodeURIComponent(_329[1]):undefined;}else{_327=_327||{};var exp=_327.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_327.expires=d;}if(exp&&exp.toUTCString){_327.expires=exp.toUTCString();}_326=encodeURIComponent(_326);var _32c=name+"="+_326;for(propName in _327){_32c+="; "+propName;var _32d=_327[propName];if(_32d!==true){_32c+="="+_32d;}}document.cookie=_32c;}};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"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",postCreate:function(){this.setLabelNode(this.label);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_330=tree.model;if(tree._v10Compat&&item===_330.root){item=null;}this.iconNode.className="dijitInline dijitTreeIcon "+tree.getIconClass(item,this.isExpanded);this.labelNode.className="dijitTreeLabel "+tree.getLabelClass(item,this.isExpanded);},_updateLayout:function(){var _331=this.getParent();if(!_331||_331.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_332){var _333=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"];var idx=_332?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.forEach(_333,function(s){dojo.removeClass(this.expandoNode,s);},this);dojo.addClass(this.expandoNode,_333[idx]);this.expandoNodeText.innerHTML=_332?"*":(this.isExpandable?(this.isExpanded?"-":"+"):"*");},expand:function(){if(this.isExpanded){return;}if(this._wipeOut.status()=="playing"){this._wipeOut.stop();}this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");dijit.setWaiRole(this.containerNode,"group");this.contentNode.className="dijitTreeContent dijitTreeContentExpanded";this._setExpando();this._updateItemClasses(this.item);this._wipeIn.play();},collapse:function(){if(!this.isExpanded){return;}if(this._wipeIn.status()=="playing"){this._wipeIn.stop();}this.isExpanded=false;dijit.setWaiState(this.labelNode,"expanded","false");this.contentNode.className="dijitTreeContent";this._setExpando();this._updateItemClasses(this.item);this._wipeOut.play();},setLabelNode:function(_336){this.labelNode.innerHTML="";this.labelNode.appendChild(dojo.doc.createTextNode(_336));},setChildItems:function(_337){var tree=this.tree,_339=tree.model;this.getChildren().forEach(function(_33a){dijit._Container.prototype.removeChild.call(this,_33a);},this);this.state="LOADED";if(_337&&_337.length>0){this.isExpandable=true;if(!this.containerNode){this.containerNode=this.tree.containerNodeTemplate.cloneNode(true);this.domNode.appendChild(this.containerNode);}dojo.forEach(_337,function(item){var id=_339.getIdentity(item),_33d=tree._itemNodeMap[id],node=(_33d&&!_33d.getParent())?_33d:new dijit._TreeNode({item:item,tree:tree,isExpandable:_339.mayHaveChildren(item),label:tree.getLabel(item)});this.addChild(node);tree._itemNodeMap[id]=node;if(this.tree.persist){if(tree._openedItemIds[id]){tree._expandNode(node);}}},this);dojo.forEach(this.getChildren(),function(_33f,idx){_33f._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}if(!this.parent){var fc=this.tree.showRoot?this:this.getChildren()[0],_342=fc?fc.labelNode:this.domNode;_342.setAttribute("tabIndex","0");}if(this.containerNode&&!this._wipeIn){this._wipeIn=dojo.fx.wipeIn({node:this.containerNode,duration:150});this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:150});}},removeChild:function(node){this.inherited(arguments);var _344=this.getChildren();if(_344.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_344,function(_345){_345._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onNodeFocus:function(evt){var node=dijit.getEnclosingWidget(evt.target);this.tree._onTreeFocus(node);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],openOnClick:false,templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",isExpandable:true,isTree:true,persist:true,dndController:null,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,_publish:function(_348,_349){dojo.publish(this.id,[dojo.mixin({tree:this,event:_348},_349||{})]);},postMixInProperties:function(){this.tree=this;this._itemNodeMap={};if(!this.cookieName){this.cookieName=this.id+"SaveStateCookie";}},postCreate:function(){if(this.persist){var _34a=dojo.cookie(this.cookieName);this._openedItemIds={};if(_34a){dojo.forEach(_34a.split(","),function(item){this._openedItemIds[item]=true;},this);}}var div=dojo.doc.createElement("div");div.style.display="none";div.className="dijitTreeContainer";dijit.setWaiRole(div,"presentation");this.containerNodeTemplate=div;if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this._load();this.inherited("postCreate",arguments);if(this.dndController){if(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _34d={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_34d[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_34d);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _34f={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_34f.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_34f.getChildren=dojo.hitch(this,function(item,_351,_352){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_351,_352);});}this.model=new dijit.tree.ForestStoreModel(_34f);this.showRoot=Boolean(this.label);},_load:function(){this.model.getRoot(dojo.hitch(this,function(item){var rn=this.rootNode=new dijit._TreeNode({item:item,tree:this,isExpandable:true,label:this.label||this.getLabel(item)});if(!this.showRoot){rn.rowNode.style.display="none";}this.domNode.appendChild(rn.domNode);this._itemNodeMap[this.model.getIdentity(item)]=rn;rn._updateLayout();this._expandNode(rn);}),function(err){console.error(this,": error loading root: ",err);});},mayHaveChildren:function(item){},getItemChildren:function(_357,_358){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_35b){return (!item||this.model.mayHaveChildren(item))?(_35b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_35d){},_onKeyPress:function(e){if(e.altKey){return;}var _35f=dijit.getEnclosingWidget(e.target);if(!_35f){return;}if(e.charCode){var _360=e.charCode;if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){_360=(String.fromCharCode(_360)).toLowerCase();this._onLetterKeyNav({node:_35f,key:_360});dojo.stopEvent(e);}}else{var map=this._keyHandlerMap;if(!map){map={};map[dojo.keys.ENTER]="_onEnterKey";map[this.isLeftToRight()?dojo.keys.LEFT_ARROW:dojo.keys.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?dojo.keys.RIGHT_ARROW:dojo.keys.LEFT_ARROW]="_onRightArrow";map[dojo.keys.UP_ARROW]="_onUpArrow";map[dojo.keys.DOWN_ARROW]="_onDownArrow";map[dojo.keys.HOME]="_onHomeKey";map[dojo.keys.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[e.keyCode]){this[this._keyHandlerMap[e.keyCode]]({node:_35f,item:_35f.item});dojo.stopEvent(e);}}},_onEnterKey:function(_362){this._publish("execute",{item:_362.item,node:_362.node});this.onClick(_362.item,_362.node);},_onDownArrow:function(_363){var node=this._getNextNode(_363.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_365){var node=_365.node;var _367=node.getPreviousSibling();if(_367){node=_367;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _368=node.getChildren();node=_368[_368.length-1];}}else{var _369=node.getParent();if(!(!this.showRoot&&_369===this.rootNode)){node=_369;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_36a){var node=_36a.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(_36c){var node=_36c.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{node=node.getParent();if(node&&node.isTreeNode){this.focusNode(node);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_36f){var node=this;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},_onLetterKeyNav:function(_372){var node=startNode=_372.node,key=_372.key;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==startNode&&(node.label.charAt(0).toLowerCase()!=key));if(node&&node.isTreeNode){if(node!==startNode){this.focusNode(node);}}},_onClick:function(e){var _376=e.target;var _377=dijit.getEnclosingWidget(_376);if(!_377||!_377.isTreeNode){return;}if((this.openOnClick&&_377.isExpandable)||(_376==_377.expandoNode||_376==_377.expandoNodeText)){if(_377.isExpandable){this._onExpandoClick({node:_377});}}else{this._publish("execute",{item:_377.item,node:_377});this.onClick(_377.item,_377);this.focusNode(_377);}dojo.stopEvent(e);},_onExpandoClick:function(_378){var node=_378.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(item,node){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _37d=node.getNextSibling();if(_37d){return _37d;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();if(this.persist&&node.item){delete this._openedItemIds[this.model.getIdentity(node.item)];this._saveState();}}},_expandNode:function(node){if(!node.isExpandable){return;}var _380=this.model,item=node.item;switch(node.state){case "LOADING":return;case "UNCHECKED":node.markProcessing();var _382=this;_380.getChildren(item,function(_383){node.unmarkProcessing();node.setChildItems(_383);_382._expandNode(node);},function(err){console.error(_382,": error loading root children: ",err);});break;default:node.expand();if(this.persist&&item){this._openedItemIds[_380.getIdentity(item)]=true;this._saveState();}}},blurNode:function(){var node=this.lastFocused;if(!node){return;}var _386=node.labelNode;dojo.removeClass(_386,"dijitTreeLabelFocused");_386.setAttribute("tabIndex","-1");dijit.setWaiState(_386,"selected",false);this.lastFocused=null;},focusNode:function(node){node.labelNode.focus();},_onBlur:function(){this.inherited(arguments);if(this.lastFocused){var _388=this.lastFocused.labelNode;dojo.removeClass(_388,"dijitTreeLabelFocused");}},_onTreeFocus:function(node){if(node){if(node!=this.lastFocused){this.blurNode();}var _38a=node.labelNode;_38a.setAttribute("tabIndex","0");dijit.setWaiState(_38a,"selected",true);dojo.addClass(_38a,"dijitTreeLabelFocused");this.lastFocused=node;}},_onItemDelete:function(item){var _38c=this.model.getIdentity(item);var node=this._itemNodeMap[_38c];if(node){var _38e=node.getParent();if(_38e){_38e.removeChild(node);}delete this._itemNodeMap[_38c];node.destroyRecursive();}},_onItemChange:function(item){var _390=this.model,_391=_390.getIdentity(item),node=this._itemNodeMap[_391];if(node){node.setLabelNode(this.getLabel(item));node._updateItemClasses(item);}},_onItemChildrenChange:function(_393,_394){var _395=this.model,_396=_395.getIdentity(_393),_397=this._itemNodeMap[_396];if(_397){_397.setChildItems(_394);}},_saveState:function(){if(!this.persist){return;}var ary=[];for(var id in this._openedItemIds){ary.push(id);}dojo.cookie(this.cookieName,ary.join(","));},destroy:function(){if(this.rootNode){this.rootNode.destroyRecursive();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();}});dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],root:null,query:null,constructor:function(args){dojo.mixin(this,args);this.connects=[];var _39b=this.store;if(!_39b.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_39b.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_39b,"onNew",this,"_onNewItem"),dojo.connect(_39b,"onDelete",this,"_onDeleteItem"),dojo.connect(_39b,"onSet",this,"_onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_39c,_39d){if(this.root){_39c(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_39e){if(_39e.length!=1){throw new Error(this.declaredClass+": query "+query+" returned "+_39e.length+" items, but must return exactly one item");}this.root=_39e[0];_39c(this.root);}),onError:_39d});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_3a1,_3a2,_3a3){var _3a4=this.store;var _3a5=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_3a4.getValues(_3a1,this.childrenAttrs[i]);_3a5=_3a5.concat(vals);}var _3a8=0;dojo.forEach(_3a5,function(item){if(!_3a4.isItemLoaded(item)){_3a8++;}});if(_3a8==0){_3a2(_3a5);}else{var _3aa=function _3aa(item){if(--_3a8==0){_3a2(_3a5);}};dojo.forEach(_3a5,function(item){if(!_3a4.isItemLoaded(item)){_3a4.loadItem({item:item,onItem:_3aa,onError:_3a3});}});}},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){return this.store.getLabel(item);},newItem:function(args,_3b0){var _3b1={parent:_3b0,attribute:this.childrenAttrs[0]};return this.store.newItem(args,_3b1);},pasteItem:function(_3b2,_3b3,_3b4,_3b5){var _3b6=this.store,_3b7=this.childrenAttrs[0];if(_3b3){dojo.forEach(this.childrenAttrs,function(attr){if(_3b6.containsValue(_3b3,attr,_3b2)){if(!_3b5){var _3b9=dojo.filter(_3b6.getValues(_3b3,attr),function(x){return x!=_3b2;});_3b6.setValues(_3b3,attr,_3b9);}_3b7=attr;}});}if(_3b4){_3b6.setValues(_3b4,_3b7,_3b6.getValues(_3b4,_3b7).concat(_3b2));}},onChange:function(item){},onChildrenChange:function(_3bc,_3bd){},_onNewItem:function(item,_3bf){if(!_3bf){return;}this.getChildren(_3bf.item,dojo.hitch(this,function(_3c0){this.onChildrenChange(_3bf.item,_3c0);}));},_onDeleteItem:function(item){},_onSetItem:function(item,_3c3,_3c4,_3c5){if(dojo.indexOf(this.childrenAttrs,_3c3)!=-1){this.getChildren(item,dojo.hitch(this,function(_3c6){this.onChildrenChange(item,_3c6);}));}else{this.onChange(item);}}});dojo.declare("dijit.tree.ForestStoreModel",dijit.tree.TreeStoreModel,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_3c7){this.root={store:this,root:true,id:_3c7.rootId,label:_3c7.rootLabel,children:_3c7.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_3c9,_3ca,_3cb){if(_3c9===this.root){if(this.root.children){_3ca(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_3cc){this.root.children=_3cc;_3ca(_3cc);}),onError:_3cb});}}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,_3d0){if(_3d0===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_3d2,_3d3,_3d4,_3d5){if(_3d3===this.root){if(!_3d5){this.onLeaveRoot(_3d2);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_3d2,_3d3===this.root?null:_3d3,_3d4===this.root?null:_3d4);if(_3d4===this.root){this.onAddToRoot(_3d2);}},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 _3d8=this,_3d9=this.root.children;this.store.fetch({query:this.query,onComplete:function(_3da){_3d8.root.children=_3da;if(_3d9.length!=_3da.length||dojo.some(_3d9,function(item,idx){return _3da[idx]!=item;})){_3d8.onChildrenChange(_3d8.root,_3da);}}});},_onNewItem:function(item,_3de){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.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:"",templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",baseClass:"dijitTextBox",attributeMap:dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),{maxLength:"focusNode"}),getDisplayedValue:function(){return this.filter(this.textbox.value);},getValue:function(){return this.parse(this.getDisplayedValue(),this.constraints);},setValue:function(_3e0,_3e1,_3e2){var _3e3=this.filter(_3e0);if((((typeof _3e3==typeof _3e0)&&(_3e0!==undefined))||(_3e0===null))&&(_3e2==null||_3e2==undefined)){_3e2=this.format(_3e3,this.constraints);}if(_3e2!=null&&_3e2!=undefined){this.textbox.value=_3e2;}dijit.form.TextBox.superclass.setValue.call(this,_3e3,_3e1);},setDisplayedValue:function(_3e4,_3e5){this.textbox.value=_3e4;this.setValue(this.getValue(),_3e5);},format:function(_3e6,_3e7){return ((_3e6==null||_3e6==undefined)?"":(_3e6.toString?_3e6.toString():_3e6));},parse:function(_3e8,_3e9){return _3e8;},postCreate:function(){this.textbox.setAttribute("value",this.getDisplayedValue());this.inherited(arguments);this._layoutHack();},filter:function(val){if(val===null||val===undefined){return "";}else{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.setValue(this.getValue(),(this.isValid?this.isValid():true));},_onBlur:function(){this._setBlurValue();this.inherited(arguments);},onkeyup:function(){}});dijit.selectInputText=function(_3ec,_3ed,stop){var _3ef=dojo.global;var _3f0=dojo.doc;_3ec=dojo.byId(_3ec);if(isNaN(_3ed)){_3ed=0;}if(isNaN(stop)){stop=_3ec.value?_3ec.value.length:0;}_3ec.focus();if(_3f0["selection"]&&dojo.body()["createTextRange"]){if(_3ec.createTextRange){var _3f1=_3ec.createTextRange();with(_3f1){collapse(true);moveStart("character",_3ed);moveEnd("character",stop);select();}}}else{if(_3ef["getSelection"]){var _3f2=_3ef.getSelection();if(_3ec.setSelectionRange){_3ec.setSelectionRange(_3ed,stop);}}}};}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",editorParams:{},onChange:function(_3f3){},width:"100%",value:"",noValueIndicator:"<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.displayNode=this.srcNodeRef;var _3f4={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _3f4){this.connect(this.displayNode,name,_3f4[name]);}dijit.setWaiRole(this.displayNode,"button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}this.setValue(this.value||this.displayNode.innerHTML);},setDisabled:function(_3f6){this.disabled=_3f6;dijit.setWaiState(this.focusNode||this.domNode,"disabled",_3f6);},_onMouseOver:function(){dojo.addClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onMouseOut:function(){dojo.removeClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");},_onClick:function(e){if(this.disabled){return;}if(e){dojo.stopEvent(e);}this._onMouseOut();setTimeout(dojo.hitch(this,"_edit"),0);},_edit:function(){this.editing=true;var _3f8=(this.renderAsHtml?this.value:this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));var _3f9=dojo.doc.createElement("span");dojo.place(_3f9,this.domNode,"before");var ew=this.editWidget=new dijit._InlineEditor({value:dojo.trim(_3f8),autoSave:this.autoSave,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,renderAsHtml:this.renderAsHtml,editor:this.editor,editorParams:this.editorParams,style:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel"),width:this.width},_3f9);var ews=ew.domNode.style;this.displayNode.style.display="none";ews.position="static";ews.visibility="visible";this.domNode=ew.domNode;setTimeout(function(){ew.focus();},100);},_showText:function(_3fc){this.displayNode.style.display="";var ew=this.editWidget;var ews=ew.domNode.style;ews.position="absolute";ews.visibility="hidden";this.domNode=this.displayNode;if(_3fc){dijit.focus(this.displayNode);}ews.display="none";setTimeout(function(){ew.destroy();delete ew;if(dojo.isIE){dijit.focus(dijit.getFocus());}},1000);},save:function(_3ff){this.editing=false;var _400=this.editWidget.getValue()+"";if(!this.renderAsHtml){_400=_400.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");}this.setValue(_400);this.onChange(_400);this._showText(_3ff);},setValue:function(val){this.value=val;this.displayNode.innerHTML=dojo.trim(val)||this.noValueIndicator;},getValue:function(){return this.value;},cancel:function(_402){this.editing=false;this._showText(_402);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",widgetsInTemplate:true,postMixInProperties:function(){this.inherited("postMixInProperties",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 ew=this.editWidget=new cls(this.editorParams,this.editorPlaceholder);var _406=this.style;dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"],function(prop){ew.focusNode.style[prop]=_406[prop];},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_406[prop];},this);if(this.width=="100%"){ew.domNode.style.width="100%";this.domNode.style.display="block";}else{ew.domNode.style.width=this.width+(Number(this.width)==this.width?"px":"");}this.connect(ew,"onChange","_onChange");this.connect(ew.focusNode||ew.domNode,"onkeypress","_onKeyPress");(this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget,this.value,false);this._initialText=this.getValue();if(this.autoSave){this.buttonContainer.style.display="none";}},destroy:function(){this.editWidget.destroy();this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return ew.getDisplayedValue?ew.getDisplayedValue():ew.getValue();},_onKeyPress:function(e){if(this._exitInProgress){return;}if(this.autoSave){if(e.altKey||e.ctrlKey){return;}if(e.keyCode==dojo.keys.ESCAPE){dojo.stopEvent(e);this._exitInProgress=true;this.cancel(true);}else{if(e.keyCode==dojo.keys.ENTER){dojo.stopEvent(e);this._exitInProgress=true;this.save(true);}else{if(e.keyCode==dojo.keys.TAB){this._exitInProgress=true;setTimeout(dojo.hitch(this,"save",false),0);}}}}else{var _40b=this;setTimeout(function(){_40b.saveButton.setAttribute("disabled",_40b.getValue()==_40b._initialText);},100);}},_onBlur:function(){this.inherited(arguments);if(this._exitInProgress){return;}if(this.autoSave){this._exitInProgress=true;if(this.getValue()==this._initialText){this.cancel(false);}else{this.save(false);}}},enableSave:function(){return this.editWidget.isValid?this.editWidget.isValid():true;},_onChange:function(){if(this._exitInProgress){return;}if(this.autoSave){this._exitInProgress=true;this.save(true);}else{this.saveButton.setAttribute("disabled",(this.getValue()==this._initialText)||!this.enableSave());}},enableSave:function(){return this.editWidget.isValid?this.editWidget.isValid():true;},focus:function(){this.editWidget.focus();dijit.selectInputText(this.editWidget.focusNode);}});}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:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",baseClass:"dijitCheckBox",type:"checkbox",value:"on",setValue:function(_40c){if(typeof _40c=="string"){this.setAttribute("value",_40c);_40c=true;}this.setAttribute("checked",_40c);},_getValueDeprecated:false,getValue:function(){return (this.checked?this.value:false);},reset:function(){this.inherited(arguments);this.setAttribute("value",this._resetValueAttr);},postCreate:function(){this.inherited(arguments);this._resetValueAttr=this.value;}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_groups:{},postCreate:function(){(this._groups[this.name]=this._groups[this.name]||[]).push(this);this.inherited(arguments);},uninitialize:function(){dojo.forEach(this._groups[this.name],function(_40d,i,arr){if(_40d===this){arr.splice(i,1);return;}},this);},setAttribute:function(attr,_411){this.inherited(arguments);switch(attr){case "checked":if(this.checked){dojo.forEach(this._groups[this.name],function(_412){if(_412!=this&&_412.checked){_412.setAttribute("checked",false);}},this);}}},_clicked:function(e){if(!this.checked){this.setAttribute("checked",true);}}});}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:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",constraints:{},regExp:".*",regExpGen:function(_414){return this.regExp;},state:"",tooltipPosition:[],setValue:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_415,_416){return (new RegExp("^("+this.regExpGen(_416)+")"+(this.required?"":"?")+"$")).test(_415)&&(!this.required||!this._isEmpty(_415))&&(this._isEmpty(_415)||this.parse(_415,_416)!==undefined);},isValid:function(_417){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_418){return /^\s*$/.test(_418);},getErrorMessage:function(_419){return this.invalidMessage;},getPromptMessage:function(_41a){return this.promptMessage;},validate:function(_41b){var _41c="";var _41d=this.isValid(_41b);var _41e=this._isEmpty(this.textbox.value);this.state=(_41d||(!this._hasBeenBlurred&&_41e))?"":"Error";this._setStateClass();dijit.setWaiState(this.focusNode,"invalid",_41d?"false":"true");if(_41b){if(_41e){_41c=this.getPromptMessage(true);}if(!_41c&&this.state=="Error"){_41c=this.getErrorMessage(true);}}this.displayMessage(_41c);return _41d;},_message:"",displayMessage:function(_41f){if(this._message==_41f){return;}this._message=_41f;dijit.hideTooltip(this.domNode);if(_41f){dijit.showTooltip(_41f,this.domNode,this.tooltipPosition);}},_refreshState:function(){this.validate(this._focused);},_update:function(e){this._refreshState();this._onMouse(e);},_onkeyup:function(e){this._update(e);this.onkeyup(e);},constructor:function(){this.constraints={};},postMixInProperties:function(){this.inherited(arguments);this.constraints.locale=this.lang;this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}var p=this.regExpGen(this.constraints);this.regExp=p;}});dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{serialize:function(val,_424){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.getValue());return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},setAttribute:function(attr,_427){this.inherited(arguments);switch(attr){case "disabled":if(this.valueNode){this.valueNode.disabled=this.disabled;}}},postCreate:function(){var _428=this.textbox;var _429=(this.valueNode=dojo.doc.createElement("input"));_429.setAttribute("type",_428.type);_429.setAttribute("value",this.toString());dojo.style(_429,"display","none");_429.name=this.textbox.name;_429.disabled=this.textbox.disabled;this.textbox.name=this.textbox.name+"_displayed_";this.textbox.removeAttribute("name");dojo.place(_429,_428,"after");this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",compare:function(val1,val2){return val1-val2;},rangeCheck:function(_42c,_42d){var _42e="min" in _42d;var _42f="max" in _42d;if(_42e||_42f){return (!_42e||this.compare(_42c,_42d.min)>=0)&&(!_42f||this.compare(_42c,_42d.max)<=0);}return true;},isInRange:function(_430){return this.rangeCheck(this.getValue(),this.constraints);},isValid:function(_431){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_431));},getErrorMessage:function(_432){if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this,false)&&!this.isInRange(_432)){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;}},postCreate:function(){this.inherited(arguments);if(this.constraints.min!==undefined){dijit.setWaiState(this.focusNode,"valuemin",this.constraints.min);}if(this.constraints.max!==undefined){dijit.setWaiState(this.focusNode,"valuemax",this.constraints.max);}},setValue:function(_433,_434){dijit.setWaiState(this.focusNode,"valuenow",_433);this.inherited("setValue",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,query:{},autoComplete:true,searchDelay:100,searchAttr:"name",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitComboBox",_getCaretPos:function(_435){var pos=0;if(typeof (_435.selectionStart)=="number"){pos=_435.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_435.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(_439,_43a){_43a=parseInt(_43a);dijit.selectInputText(_439,_43a,_43a);},_setAttribute:function(attr,_43c){if(attr=="disabled"){dijit.setWaiState(this.comboNode,"disabled",_43c);}},_onKeyPress:function(evt){if(evt.altKey||(evt.ctrlKey&&evt.charCode!=118)){return;}var _43e=false;var pw=this._popupWidget;var dk=dojo.keys;if(this._isShowingNow){pw.handleKey(evt);}switch(evt.keyCode){case dk.PAGE_DOWN:case dk.DOWN_ARROW:if(!this._isShowingNow||this._prev_key_esc){this._arrowPressed();_43e=true;}else{this._announceOption(pw.getHighlightedOption());}dojo.stopEvent(evt);this._prev_key_backspace=false;this._prev_key_esc=false;break;case dk.PAGE_UP:case dk.UP_ARROW:if(this._isShowingNow){this._announceOption(pw.getHighlightedOption());}dojo.stopEvent(evt);this._prev_key_backspace=false;this._prev_key_esc=false;break;case dk.ENTER:var _441;if(this._isShowingNow&&(_441=pw.getHighlightedOption())){if(_441==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_441==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this.setDisplayedValue(this.getDisplayedValue());}evt.preventDefault();case dk.TAB:var _442=this.getDisplayedValue();if(pw&&(_442==pw._messages["previousMessage"]||_442==pw._messages["nextMessage"])){break;}if(this._isShowingNow){this._prev_key_backspace=false;this._prev_key_esc=false;if(pw.getHighlightedOption()){pw.setValue({target:pw.getHighlightedOption()},true);}this._hideResultList();}break;case dk.SPACE:this._prev_key_backspace=false;this._prev_key_esc=false;if(this._isShowingNow&&pw.getHighlightedOption()){dojo.stopEvent(evt);this._selectOption();this._hideResultList();}else{_43e=true;}break;case dk.ESCAPE:this._prev_key_backspace=false;this._prev_key_esc=true;if(this._isShowingNow){dojo.stopEvent(evt);this._hideResultList();}this.inherited(arguments);break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_esc=false;this._prev_key_backspace=true;_43e=true;break;case dk.RIGHT_ARROW:case dk.LEFT_ARROW:this._prev_key_backspace=false;this._prev_key_esc=false;break;default:this._prev_key_backspace=false;this._prev_key_esc=false;if(dojo.isIE||evt.charCode!=0){_43e=true;}}if(this.searchTimer){clearTimeout(this.searchTimer);}if(_43e){setTimeout(dojo.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _445=this.ignoreCase?"toLowerCase":"substr";if(text[_445](0).indexOf(this.focusNode.value[_445](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(_447,_448){if(this.disabled||this.readOnly||(_448.query[this.searchAttr]!=this._lastQuery)){return;}this._popupWidget.clearResultList();if(!_447.length){this._hideResultList();return;}var _449=new String(this.store.getValue(_447[0],this.searchAttr));if(_449&&this.autoComplete&&!this._prev_key_backspace&&(_448.query[this.searchAttr]!="*")){this._autoCompleteText(_449);}this._popupWidget.createOptions(_447,_448,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_448.direction){if(1==_448.direction){this._popupWidget.highlightFirstOption();}else{if(-1==_448.direction){this._popupWidget.highlightLastOption();}}this._announceOption(this._popupWidget.getHighlightedOption());}},_showResultList:function(){this._hideResultList();var _44a=this._popupWidget.getItems(),_44b=Math.min(_44a.length,this.maxListLength);this._arrowPressed();this.displayMessage("");with(this._popupWidget.domNode.style){width="";height="";}var best=this.open();var _44d=dojo.marginBox(this._popupWidget.domNode);this._popupWidget.domNode.style.overflow=((best.h==_44d.h)&&(best.w==_44d.w))?"hidden":"auto";var _44e=best.w;if(best.h<this._popupWidget.domNode.scrollHeight){_44e+=16;}dojo.marginBox(this._popupWidget.domNode,{h:best.h,w:Math.max(_44e,this.domNode.offsetWidth)});dijit.setWaiState(this.comboNode,"expanded","true");},_hideResultList:function(){if(this._isShowingNow){dijit.popup.close(this._popupWidget);this._arrowIdle();this._isShowingNow=false;dijit.setWaiState(this.comboNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _44f=this.getDisplayedValue();var pw=this._popupWidget;if(pw&&(_44f==pw._messages["previousMessage"]||_44f==pw._messages["nextMessage"])){this.setValue(this._lastValueReported,true);}else{this.setDisplayedValue(_44f);}},_onBlur:function(){this._hideResultList();this._arrowIdle();this.inherited(arguments);},_announceOption:function(node){if(node==null){return;}var _452;if(node==this._popupWidget.nextButton||node==this._popupWidget.previousButton){_452=node.innerHTML;}else{_452=this.store.getValue(node.item,this.searchAttr);}this.focusNode.value=this.focusNode.value.substring(0,this._getCaretPos(this.focusNode));dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_452);},_selectOption:function(evt){var tgt=null;if(!evt){evt={target:this._popupWidget.getHighlightedOption()};}if(!evt.target){this.setDisplayedValue(this.getDisplayedValue());return;}else{tgt=evt.target;}if(!evt.noHide){this._hideResultList();this._setCaretPos(this.focusNode,this.store.getValue(tgt.item,this.searchAttr).length);}this._doSelect(tgt);},_doSelect:function(tgt){this.item=tgt.item;this.setValue(this.store.getValue(tgt.item,this.searchAttr),true);},_onArrowMouseDown:function(evt){if(this.disabled||this.readOnly){return;}dojo.stopEvent(evt);this.focus();if(this._isShowingNow){this._hideResultList();}else{this._startSearch("");}},_startSearchFromInput:function(){this._startSearch(this.focusNode.value);},_getQueryString:function(text){return dojo.string.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this._popupWidget){var _459=this.id+"_popup";this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_459});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_459);}this.item=null;var _45a=dojo.clone(this.query);this._lastQuery=_45a[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_45b,_45c){var _45d=this.store.fetch({queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_45b,onComplete:dojo.hitch(this,"_openResultList"),onError:function(_45e){console.error("dijit.form.ComboBox: "+_45e);dojo.hitch(_45c,"_hideResultList")();},start:0,count:this.pageSize});var _45f=function(_460,_461){_460.start+=_460.count*_461;_460.direction=_461;this.store.fetch(_460);};this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_45f,_45d);},_45a,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},_arrowPressed:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.addClass(this.downArrowNode,"dijitArrowButtonActive");}},_arrowIdle:function(){if(!this.disabled&&!this.readOnly&&this.hasDownArrow){dojo.removeClass(this.downArrowNode,"dojoArrowButtonPushed");}},compositionend:function(evt){this.onkeypress({charCode:-1});},constructor:function(){this.query={};},postMixInProperties:function(){if(!this.hasDownArrow){this.baseClass="dijitTextBox";}if(!this.store){var _463=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_463);if(!this.value||((typeof _463.selectedIndex=="number")&&_463.selectedIndex.toString()===this.value)){var item=this.store.fetchSelectedItem();if(item){this.value=this.store.getValue(item,this._getValueField());}}}},_postCreate:function(){var _465=dojo.query("label[for=\""+this.id+"\"]");if(_465.length){_465[0].id=(this.id+"_label");var cn=this.comboNode;dijit.setWaiState(cn,"labelledby",_465[0].id);dijit.setWaiState(cn,"disabled",this.disabled);}},uninitialize:function(){if(this._popupWidget){this._hideResultList();this._popupWidget.destroy();}},_getMenuLabelFromItem:function(item){return {html:false,label:this.store.getValue(item,this.searchAttr)};},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);}});dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated],{templateString:"<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"+"</ul>",_messages:null,postMixInProperties:function(){this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);this.inherited("postMixInProperties",arguments);},setValue:function(_468){this.value=_468;this.onChange(_468);},onChange:function(_469){},onPage:function(_46a){},postCreate:function(){this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];this.inherited("postCreate",arguments);},onClose:function(){this._blurOptionNode();},_createOption:function(item,_46c){var _46d=_46c(item);var _46e=dojo.doc.createElement("li");dijit.setWaiRole(_46e,"option");if(_46d.html){_46e.innerHTML=_46d.label;}else{_46e.appendChild(dojo.doc.createTextNode(_46d.label));}if(_46e.innerHTML==""){_46e.innerHTML="&nbsp;";}_46e.item=item;return _46e;},createOptions:function(_46f,_470,_471){this.previousButton.style.display=(_470.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_46f,function(item,i){var _474=this._createOption(item,_471);_474.className="dijitMenuItem";dojo.attr(_474,"id",this.id+i);this.domNode.insertBefore(_474,this.nextButton);},this);this.nextButton.style.display=(_470.count==_46f.length)?"":"none";dojo.attr(this.nextButton,"id",this.id+"_next");},clearResultList:function(){while(this.domNode.childNodes.length>2){this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);}},getItems:function(){return this.domNode.childNodes;},getListLength:function(){return this.domNode.childNodes.length-2;},_onMouseDown:function(evt){dojo.stopEvent(evt);},_onMouseUp:function(evt){if(evt.target===this.domNode){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.setValue({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,"dijitMenuItemHover");}},_blurOptionNode:function(){if(this._highlighted_option){dojo.removeClass(this._highlighted_option,"dijitMenuItemHover");this._highlighted_option=null;}},_highlightNextOption:function(){var fc=this.domNode.firstChild;if(!this.getHighlightedOption()){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);}}dijit.scrollIntoView(this._highlighted_option);},highlightFirstOption:function(){this._focusOptionNode(this.domNode.firstChild.nextSibling);dijit.scrollIntoView(this._highlighted_option);},highlightLastOption:function(){this._focusOptionNode(this.domNode.lastChild.previousSibling);dijit.scrollIntoView(this._highlighted_option);},_highlightPrevOption:function(){var lc=this.domNode.lastChild;if(!this.getHighlightedOption()){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);}}dijit.scrollIntoView(this._highlighted_option);},_page:function(up){var _481=0;var _482=this.domNode.scrollTop;var _483=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_481<_483){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 _484=this.domNode.scrollTop;_481+=(_484-_482)*(up?-1:1);_482=_484;}},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.keyCode){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],{postMixInProperties:function(){dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this,arguments);dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this,arguments);},postCreate:function(){dijit.form.ComboBoxMixin.prototype._postCreate.apply(this,arguments);dijit.form.ValidationTextBox.prototype.postCreate.apply(this,arguments);},setAttribute:function(attr,_488){dijit.form.ValidationTextBox.prototype.setAttribute.apply(this,arguments);dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this,arguments);}});dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(root){this.root=root;},getValue:function(item,_48b,_48c){return (_48b=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_48d){return true;},fetch:function(args){var _48f="^"+args.query.name.replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g,"\\$1").replace("*",".*")+"$",_490=new RegExp(_48f,args.queryOptions.ignoreCase?"i":""),_491=dojo.query("> option",this.root).filter(function(_492){return (_492.innerText||_492.textContent||"").match(_490);});var _493=args.start||0,end=("count" in args&&args.count!=Infinity)?(_493+args.count):_491.length;args.onComplete(_491.slice(_493,end),args);return args;},close:function(_495){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 dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",root)[0];}});}if(!dojo._hasResource["dojo.cldr.monetary"]){dojo._hasResource["dojo.cldr.monetary"]=true;dojo.provide("dojo.cldr.monetary");dojo.cldr.monetary.getData=function(code){var _49d={ADP:0,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,XOF:0,XPF:0};var _49e={CHF:5};var _49f=_49d[code],_4a0=_49e[code];if(typeof _49f=="undefined"){_49f=2;}if(typeof _4a0=="undefined"){_4a0=0;}return {places:_49f,round:_4a0};};}if(!dojo._hasResource["dojo.currency"]){dojo._hasResource["dojo.currency"]=true;dojo.provide("dojo.currency");dojo.currency._mixInDefaults=function(_4a1){_4a1=_4a1||{};_4a1.type="currency";var _4a2=dojo.i18n.getLocalization("dojo.cldr","currency",_4a1.locale)||{};var iso=_4a1.currency;var data=dojo.cldr.monetary.getData(iso);dojo.forEach(["displayName","symbol","group","decimal"],function(prop){data[prop]=_4a2[iso+"_"+prop];});data.fractional=[true,false];return dojo.mixin(data,_4a1);};dojo.currency.format=function(_4a6,_4a7){return dojo.number.format(_4a6,dojo.currency._mixInDefaults(_4a7));};dojo.currency.regexp=function(_4a8){return dojo.number.regexp(dojo.currency._mixInDefaults(_4a8));};dojo.currency.parse=function(_4a9,_4aa){return dojo.number.parse(_4a9,dojo.currency._mixInDefaults(_4aa));};}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,editOptions:{pattern:"#.######"},_onFocus:function(){this.setValue(this.getValue(),false);this.inherited(arguments);},_formatter:dojo.number.format,format:function(_4ab,_4ac){if(typeof _4ab=="string"){return _4ab;}if(isNaN(_4ab)){return "";}if(this.editOptions&&this._focused){_4ac=dojo.mixin(dojo.mixin({},this.editOptions),this.constraints);}return this._formatter(_4ab,_4ac);},parse:dojo.number.parse,filter:function(_4ad){if(typeof _4ad=="string"){return this.inherited("filter",arguments);}return isNaN(_4ad)?"":_4ad;},value:NaN});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:"",regExpGen:dojo.currency.regexp,_formatter:dojo.currency.format,parse:dojo.currency.parse,postMixInProperties:function(){if(this.constraints===dijit.form.ValidationTextBox.prototype.constraints){this.constraints={};}this.constraints.currency=this.currency;dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this,arguments);}});}if(!dojo._hasResource["dojo.cldr.supplemental"]){dojo._hasResource["dojo.cldr.supplemental"]=true;dojo.provide("dojo.cldr.supplemental");dojo.cldr.supplemental.getFirstDayOfWeek=function(_4ae){var _4af={mv:5,ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,tn:6,ye:6,as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,mh: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,za:0,zw:0,et:0,mw:0,ng:0,tj:0,sy:4};var _4b0=dojo.cldr.supplemental._region(_4ae);var dow=_4af[_4b0];return (dow===undefined)?1:dow;};dojo.cldr.supplemental._region=function(_4b2){_4b2=dojo.i18n.normalizeLocale(_4b2);var tags=_4b2.split("-");var _4b4=tags[1];if(!_4b4){_4b4={de:"de",en:"us",es:"es",fi:"fi",fr:"fr",hu:"hu",it:"it",ja:"jp",ko:"kr",nl:"nl",pt:"br",sv:"se",zh:"cn"}[tags[0]];}else{if(_4b4.length==4){_4b4=tags[2];}}return _4b4;};dojo.cldr.supplemental.getWeekend=function(_4b5){var _4b6={eg:5,il:5,sy:5,"in":0,ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4};var _4b7={ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,eg:6,il:6,sy:6};var _4b8=dojo.cldr.supplemental._region(_4b5);var _4b9=_4b6[_4b8];var end=_4b7[_4b8];if(_4b9===undefined){_4b9=6;}if(end===undefined){end=0;}return {start:_4b9,end:end};};}if(!dojo._hasResource["dojo.date"]){dojo._hasResource["dojo.date"]=true;dojo.provide("dojo.date");dojo.date.getDaysInMonth=function(_4bb){var _4bc=_4bb.getMonth();var days=[31,28,31,30,31,30,31,31,30,31,30,31];if(_4bc==1&&dojo.date.isLeapYear(_4bb)){return 29;}return days[_4bc];};dojo.date.isLeapYear=function(_4be){var year=_4be.getFullYear();return !(year%400)||(!(year%4)&&!!(year%100));};dojo.date.getTimezoneName=function(_4c0){var str=_4c0.toString();var tz="";var _4c3;var pos=str.indexOf("(");if(pos>-1){tz=str.substring(++pos,str.indexOf(")"));}else{var pat=/([A-Z\/]+) \d{4}$/;if((_4c3=str.match(pat))){tz=_4c3[1];}else{str=_4c0.toLocaleString();pat=/ ([A-Z\/]+)$/;if((_4c3=str.match(pat))){tz=_4c3[1];}}}return (tz=="AM"||tz=="PM")?"":tz;};dojo.date.compare=function(_4c6,_4c7,_4c8){_4c6=new Date(Number(_4c6));_4c7=new Date(Number(_4c7||new Date()));if(_4c8!=="undefined"){if(_4c8=="date"){_4c6.setHours(0,0,0,0);_4c7.setHours(0,0,0,0);}else{if(_4c8=="time"){_4c6.setFullYear(0,0,0);_4c7.setFullYear(0,0,0);}}}if(_4c6>_4c7){return 1;}if(_4c6<_4c7){return -1;}return 0;};dojo.date.add=function(date,_4ca,_4cb){var sum=new Date(Number(date));var _4cd=false;var _4ce="Date";switch(_4ca){case "day":break;case "weekday":var days,_4d0;var mod=_4cb%5;if(!mod){days=(_4cb>0)?5:-5;_4d0=(_4cb>0)?((_4cb-5)/5):((_4cb+5)/5);}else{days=mod;_4d0=parseInt(_4cb/5);}var strt=date.getDay();var adj=0;if(strt==6&&_4cb>0){adj=1;}else{if(strt==0&&_4cb<0){adj=-1;}}var trgt=strt+days;if(trgt==0||trgt==6){adj=(_4cb>0)?2:-2;}_4cb=(7*_4d0)+days+adj;break;case "year":_4ce="FullYear";_4cd=true;break;case "week":_4cb*=7;break;case "quarter":_4cb*=3;case "month":_4cd=true;_4ce="Month";break;case "hour":case "minute":case "second":case "millisecond":_4ce="UTC"+_4ca.charAt(0).toUpperCase()+_4ca.substring(1)+"s";}if(_4ce){sum["set"+_4ce](sum["get"+_4ce]()+_4cb);}if(_4cd&&(sum.getDate()<date.getDate())){sum.setDate(0);}return sum;};dojo.date.difference=function(_4d5,_4d6,_4d7){_4d6=_4d6||new Date();_4d7=_4d7||"day";var _4d8=_4d6.getFullYear()-_4d5.getFullYear();var _4d9=1;switch(_4d7){case "quarter":var m1=_4d5.getMonth();var m2=_4d6.getMonth();var q1=Math.floor(m1/3)+1;var q2=Math.floor(m2/3)+1;q2+=(_4d8*4);_4d9=q2-q1;break;case "weekday":var days=Math.round(dojo.date.difference(_4d5,_4d6,"day"));var _4df=parseInt(dojo.date.difference(_4d5,_4d6,"week"));var mod=days%7;if(mod==0){days=_4df*5;}else{var adj=0;var aDay=_4d5.getDay();var bDay=_4d6.getDay();_4df=parseInt(days/7);mod=days%7;var _4e4=new Date(_4d5);_4e4.setDate(_4e4.getDate()+(_4df*7));var _4e5=_4e4.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 (_4e5+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 (_4e5+mod)<0:adj=2;}}}days+=adj;days-=(_4df*2);}_4d9=days;break;case "year":_4d9=_4d8;break;case "month":_4d9=(_4d6.getMonth()-_4d5.getMonth())+(_4d8*12);break;case "week":_4d9=parseInt(dojo.date.difference(_4d5,_4d6,"day")/7);break;case "day":_4d9/=24;case "hour":_4d9/=60;case "minute":_4d9/=60;case "second":_4d9/=1000;case "millisecond":_4d9*=_4d6.getTime()-_4d5.getTime();}return Math.round(_4d9);};}if(!dojo._hasResource["dojo.date.locale"]){dojo._hasResource["dojo.date.locale"]=true;dojo.provide("dojo.date.locale");(function(){function formatPattern(_4e6,_4e7,_4e8,_4e9){return _4e9.replace(/([a-z])\1*/ig,function(_4ea){var s,pad;var c=_4ea.charAt(0);var l=_4ea.length;var _4ef=["abbr","wide","narrow"];switch(c){case "G":s=_4e7[(l<4)?"eraAbbr":"eraNames"][_4e6.getFullYear()<0?0:1];break;case "y":s=_4e6.getFullYear();switch(l){case 1:break;case 2:if(!_4e8){s=String(s);s=s.substr(s.length-2);break;}default:pad=true;}break;case "Q":case "q":s=Math.ceil((_4e6.getMonth()+1)/3);pad=true;break;case "M":case "L":var m=_4e6.getMonth();var _4f1;switch(l){case 1:case 2:s=m+1;pad=true;break;case 3:case 4:case 5:_4f1=_4ef[l-3];break;}if(_4f1){var _4f2=(c=="L")?"standalone":"format";var _4f3=["months",_4f2,_4f1].join("-");s=_4e7[_4f3][m];}break;case "w":var _4f4=0;s=dojo.date.locale._getWeekOfYear(_4e6,_4f4);pad=true;break;case "d":s=_4e6.getDate();pad=true;break;case "D":s=dojo.date.locale._getDayOfYear(_4e6);pad=true;break;case "E":case "e":case "c":var d=_4e6.getDay();var _4f6;switch(l){case 1:case 2:if(c=="e"){var _4f7=dojo.cldr.supplemental.getFirstDayOfWeek(options.locale);d=(d-_4f7+7)%7;}if(c!="c"){s=d+1;pad=true;break;}case 3:case 4:case 5:_4f6=_4ef[l-3];break;}if(_4f6){var _4f8=(c=="c")?"standalone":"format";var _4f9=["days",_4f8,_4f6].join("-");s=_4e7[_4f9][d];}break;case "a":var _4fa=(_4e6.getHours()<12)?"am":"pm";s=_4e7[_4fa];break;case "h":case "H":case "K":case "k":var h=_4e6.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=_4e6.getMinutes();pad=true;break;case "s":s=_4e6.getSeconds();pad=true;break;case "S":s=Math.round(_4e6.getMilliseconds()*Math.pow(10,l-3));pad=true;break;case "v":case "z":s=dojo.date.getTimezoneName(_4e6);if(s){break;}l=4;case "Z":var _4fc=_4e6.getTimezoneOffset();var tz=[(_4fc<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_4fc)/60),2),dojo.string.pad(Math.abs(_4fc)%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: "+_4e9);}if(pad){s=dojo.string.pad(s,l);}return s;});};dojo.date.locale.format=function(_4fe,_4ff){_4ff=_4ff||{};var _500=dojo.i18n.normalizeLocale(_4ff.locale);var _501=_4ff.formatLength||"short";var _502=dojo.date.locale._getGregorianBundle(_500);var str=[];var _504=dojo.hitch(this,formatPattern,_4fe,_502,_4ff.fullYear);if(_4ff.selector=="year"){var year=_4fe.getFullYear();if(_500.match(/^zh|^ja/)){year+="年";}return year;}if(_4ff.selector!="time"){var _506=_4ff.datePattern||_502["dateFormat-"+_501];if(_506){str.push(_processPattern(_506,_504));}}if(_4ff.selector!="date"){var _507=_4ff.timePattern||_502["timeFormat-"+_501];if(_507){str.push(_processPattern(_507,_504));}}var _508=str.join(" ");return _508;};dojo.date.locale.regexp=function(_509){return dojo.date.locale._parseInfo(_509).regexp;};dojo.date.locale._parseInfo=function(_50a){_50a=_50a||{};var _50b=dojo.i18n.normalizeLocale(_50a.locale);var _50c=dojo.date.locale._getGregorianBundle(_50b);var _50d=_50a.formatLength||"short";var _50e=_50a.datePattern||_50c["dateFormat-"+_50d];var _50f=_50a.timePattern||_50c["timeFormat-"+_50d];var _510;if(_50a.selector=="date"){_510=_50e;}else{if(_50a.selector=="time"){_510=_50f;}else{_510=_50e+" "+_50f;}}var _511=[];var re=_processPattern(_510,dojo.hitch(this,_buildDateTimeRE,_511,_50c,_50a));return {regexp:re,tokens:_511,bundle:_50c};};dojo.date.locale.parse=function(_513,_514){var info=dojo.date.locale._parseInfo(_514);var _516=info.tokens,_517=info.bundle;var re=new RegExp("^"+info.regexp+"$");var _519=re.exec(_513);if(!_519){return null;}var _51a=["abbr","wide","narrow"];var _51b=[1970,0,1,0,0,0,0];var amPm="";var _51d=dojo.every(_519,function(v,i){if(!i){return true;}var _520=_516[i-1];var l=_520.length;switch(_520.charAt(0)){case "y":if(l!=2&&_514.strict){_51b[0]=v;}else{if(v<100){v=Number(v);var year=""+new Date().getFullYear();var _523=year.substring(0,2)*100;var _524=Math.min(Number(year.substring(2,4))+20,99);var num=(v<_524)?_523+v:_523-100+v;_51b[0]=num;}else{if(_514.strict){return false;}_51b[0]=v;}}break;case "M":if(l>2){var _526=_517["months-format-"+_51a[l-3]].concat();if(!_514.strict){v=v.replace(".","").toLowerCase();_526=dojo.map(_526,function(s){return s.replace(".","").toLowerCase();});}v=dojo.indexOf(_526,v);if(v==-1){return false;}}else{v--;}_51b[1]=v;break;case "E":case "e":var days=_517["days-format-"+_51a[l-3]].concat();if(!_514.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":_51b[1]=0;case "d":_51b[2]=v;break;case "a":var am=_514.am||_517.am;var pm=_514.pm||_517.pm;if(!_514.strict){var _52c=/\./g;v=v.replace(_52c,"").toLowerCase();am=am.replace(_52c,"").toLowerCase();pm=pm.replace(_52c,"").toLowerCase();}if(_514.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;}_51b[3]=v;break;case "m":_51b[4]=v;break;case "s":_51b[5]=v;break;case "S":_51b[6]=v;}return true;});var _52d=+_51b[3];if(amPm==="p"&&_52d<12){_51b[3]=_52d+12;}else{if(amPm==="a"&&_52d==12){_51b[3]=0;}}var _52e=new Date(_51b[0],_51b[1],_51b[2],_51b[3],_51b[4],_51b[5],_51b[6]);if(_514.strict){_52e.setFullYear(_51b[0]);}var _52f=_516.join("");if(!_51d||(_52f.indexOf("M")!=-1&&_52e.getMonth()!=_51b[1])||(_52f.indexOf("d")!=-1&&_52e.getDate()!=_51b[2])){return null;}return _52e;};function _processPattern(_530,_531,_532,_533){var _534=function(x){return x;};_531=_531||_534;_532=_532||_534;_533=_533||_534;var _536=_530.match(/(''|[^'])+/g);var _537=false;dojo.forEach(_536,function(_538,i){if(!_538){_536[i]="";}else{_536[i]=(_537?_532:_531)(_538);_537=!_537;}});return _533(_536.join(""));};function _buildDateTimeRE(_53a,_53b,_53c,_53d){_53d=dojo.regexp.escapeString(_53d);if(!_53c.strict){_53d=_53d.replace(" a"," ?a");}return _53d.replace(/([a-z])\1*/ig,function(_53e){var s;var c=_53e.charAt(0);var l=_53e.length;var p2="",p3="";if(_53c.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=p2+"[1-9]|[12]\\d|3[01]";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=_53c.am||_53b.am||"AM";var pm=_53c.pm||_53b.pm||"PM";if(_53c.strict){s=am+"|"+pm;}else{s=am+"|"+pm;if(am!=am.toLowerCase()){s+="|"+am.toLowerCase();}if(pm!=pm.toLowerCase()){s+="|"+pm.toLowerCase();}}break;default:s=".*";}if(_53a){_53a.push(_53e);}return "("+s+")";}).replace(/[\xa0 ]/g,"[\\s\\xa0]");};})();(function(){var _546=[];dojo.date.locale.addCustomFormats=function(_547,_548){_546.push({pkg:_547,name:_548});};dojo.date.locale._getGregorianBundle=function(_549){var _54a={};dojo.forEach(_546,function(desc){var _54c=dojo.i18n.getLocalization(desc.pkg,desc.name,_549);_54a=dojo.mixin(_54a,_54c);},this);return _54a;};})();dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");dojo.date.locale.getNames=function(item,type,use,_550){var _551;var _552=dojo.date.locale._getGregorianBundle(_550);var _553=[item,use,type];if(use=="standAlone"){_551=_552[_553.join("-")];}_553[1]="format";return (_551||_552[_553.join("-")]).concat();};dojo.date.locale.isWeekend=function(_554,_555){var _556=dojo.cldr.supplemental.getWeekend(_555);var day=(_554||new Date()).getDay();if(_556.end<_556.start){_556.end+=7;if(day<_556.start){day+=7;}}return day>=_556.start&&day<=_556.end;};dojo.date.locale._getDayOfYear=function(_558){return dojo.date.difference(new Date(_558.getFullYear(),0,1),_558)+1;};dojo.date.locale._getWeekOfYear=function(_559,_55a){if(arguments.length==1){_55a=0;}var _55b=new Date(_559.getFullYear(),0,1).getDay();var adj=(_55b-_55a+7)%7;var week=Math.floor((dojo.date.locale._getDayOfYear(_559)+adj-1)/7);if(_55b==_55a){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],{templateString:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><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>\t\n",value:new Date(),dayWidth:"narrow",setValue:function(_55e){if(!this.value||dojo.date.compare(_55e,this.value)){_55e=new Date(_55e);this.displayMonth=new Date(_55e);if(!this.isDisabledDate(_55e,this.lang)){this.value=_55e;this.value.setHours(0,0,0,0);this.onChange(this.value);}this._populateGrid();}},_setText:function(node,text){while(node.firstChild){node.removeChild(node.firstChild);}node.appendChild(dojo.doc.createTextNode(text));},_populateGrid:function(){var _561=this.displayMonth;_561.setDate(1);var _562=_561.getDay();var _563=dojo.date.getDaysInMonth(_561);var _564=dojo.date.getDaysInMonth(dojo.date.add(_561,"month",-1));var _565=new Date();var _566=this.value;var _567=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);if(_567>_562){_567-=7;}dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_568,i){i+=_567;var date=new Date(_561);var _56b,_56c="dijitCalendar",adj=0;if(i<_562){_56b=_564-_562+i+1;adj=-1;_56c+="Previous";}else{if(i>=(_562+_563)){_56b=i-_562-_563+1;adj=1;_56c+="Next";}else{_56b=i-_562+1;_56c+="Current";}}if(adj){date=dojo.date.add(date,"month",adj);}date.setDate(_56b);if(!dojo.date.compare(date,_565,"date")){_56c="dijitCalendarCurrentDate "+_56c;}if(!dojo.date.compare(date,_566,"date")){_56c="dijitCalendarSelectedDate "+_56c;}if(this.isDisabledDate(date,this.lang)){_56c="dijitCalendarDisabledDate "+_56c;}var _56e=this.getClassForDate(date,this.lang);if(_56e){_56c+=_56e+" "+_56c;}_568.className=_56c+"Month dijitCalendarDateTemplate";_568.dijitDateValue=date.valueOf();var _56f=dojo.query(".dijitCalendarDateLabel",_568)[0];this._setText(_56f,date.getDate());},this);var _570=dojo.date.locale.getNames("months","wide","standAlone",this.lang);this._setText(this.monthLabelNode,_570[_561.getMonth()]);var y=_561.getFullYear()-1;var d=new Date();dojo.forEach(["previous","current","next"],function(name){d.setFullYear(y++);this._setText(this[name+"YearLabelNode"],dojo.date.locale.format(d,{selector:"year",locale:this.lang}));},this);var _574=this;var _575=function(_576,_577,adj){dijit.typematic.addMouseListener(_574[_576],_574,function(_579){if(_579>=0){_574._adjustDisplay(_577,adj);}},0.8,500);};_575("incrementMonth","month",1);_575("decrementMonth","month",-1);_575("nextYearLabelNode","year",1);_575("previousYearLabelNode","year",-1);},goToToday:function(){this.setValue(new Date());},postCreate:function(){this.inherited(arguments);var _57a=dojo.hitch(this,function(_57b,n){var _57d=dojo.query(_57b,this.domNode)[0];for(var i=0;i<n;i++){_57d.parentNode.appendChild(_57d.cloneNode(true));}});_57a(".dijitCalendarDayLabelTemplate",6);_57a(".dijitCalendarDateTemplate",6);_57a(".dijitCalendarWeekTemplate",5);var _57f=dojo.date.locale.getNames("days",this.dayWidth,"standAlone",this.lang);var _580=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_581,i){this._setText(_581,_57f[(i+_580)%7]);},this);var _583=dojo.date.locale.getNames("months","wide","standAlone",this.lang);dojo.forEach(_583,function(name){var _585=dojo.doc.createElement("div");this._setText(_585,name);this.monthLabelSpacer.appendChild(_585);},this);this.value=null;this.setValue(new Date());},_adjustDisplay:function(part,_587){this.displayMonth=dojo.date.add(this.displayMonth,part,_587);this._populateGrid();},_onDayClick:function(evt){var node=evt.target;dojo.stopEvent(evt);while(!node.dijitDateValue){node=node.parentNode;}if(!dojo.hasClass(node,"dijitCalendarDisabledDate")){this.setValue(node.dijitDateValue);this.onValueSelected(this.value);}},onValueSelected:function(date){},onChange:function(date){},isDisabledDate:function(_58c,_58d){},getClassForDate:function(_58e,_58f){}});}if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){dojo._hasResource["dijit.form._DateTimeTextBox"]=true;dojo.provide("dijit.form._DateTimeTextBox");dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,compare:dojo.date.compare,format:function(_590,_591){if(!_590){return "";}return dojo.date.locale.format(_590,_591);},parse:function(_592,_593){return dojo.date.locale.parse(_592,_593)||undefined;},serialize:dojo.date.stamp.toISOString,value:new Date(""),popupClass:"",_selector:"",postMixInProperties:function(){this.inherited(arguments);if(!this.value||this.value.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){this.value=undefined;}var _594=this.constraints;_594.selector=this._selector;_594.fullYear=true;var _595=dojo.date.stamp.fromISOString;if(typeof _594.min=="string"){_594.min=_595(_594.min);}if(typeof _594.max=="string"){_594.max=_595(_594.max);}},_onFocus:function(evt){this._open();},setValue:function(_597,_598,_599){this.inherited(arguments);if(this._picker){if(!_597){_597=new Date();}this._picker.setValue(_597);}},_open:function(){if(this.disabled||this.readOnly||!this.popupClass){return;}var _59a=this;if(!this._picker){var _59b=dojo.getObject(this.popupClass,false);this._picker=new _59b({onValueSelected:function(_59c){_59a.focus();setTimeout(dojo.hitch(_59a,"_close"),1);dijit.form._DateTimeTextBox.superclass.setValue.call(_59a,_59c,true);},lang:_59a.lang,constraints:_59a.constraints,isDisabledDate:function(date){var _59e=dojo.date.compare;var _59f=_59a.constraints;return _59f&&(_59f.min&&(_59e(_59f.min,date,"date")>0)||(_59f.max&&_59e(_59f.max,date,"date")<0));}});this._picker.setValue(this.getValue()||new Date());}if(!this._opened){dijit.popup.open({parent:this,popup:this._picker,around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){_59a._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);},getDisplayedValue:function(){return this.textbox.value;},setDisplayedValue:function(_5a0,_5a1){this.setValue(this.parse(_5a0,this.constraints),_5a1,_5a0);},destroy:function(){if(this._picker){this._picker.destroy();delete this._picker;}this.inherited(arguments);},_onKeyPress:function(e){if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this,arguments)){if(this._opened&&e.keyCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){this._close();dojo.stopEvent(e);}}}});}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,{popupClass:"dijit._Calendar",_selector:"date"});}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],{labelAttr:"",labelType:"text",_isvalid:true,_lastDisplayedValue:"",isValid:function(){return this._isvalid;},_callbackSetLabel:function(_5a3,_5a4,_5a5){if(_5a4&&_5a4.query[this.searchAttr]!=this._lastQuery){return;}if(!_5a3.length){if(!this._focused){this.valueNode.value="";}dijit.form.TextBox.superclass.setValue.call(this,undefined,!this._focused);this._isvalid=false;this.validate(this._focused);}else{this._setValueFromItem(_5a3[0],_5a5);}},_openResultList:function(_5a6,_5a7){if(_5a7.query[this.searchAttr]!=this._lastQuery){return;}this._isvalid=_5a6.length!=0;this.validate(true);dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);},getValue:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValue:function(_5a8,_5a9,_5aa){this.valueNode.value=_5a8;dijit.form.FilteringSelect.superclass.setValue.call(this,_5a8,_5aa,_5a9);this._lastDisplayedValue=_5a9;},setValue:function(_5ab,_5ac){var self=this;var _5ae=function(item,_5b0){if(item){if(self.store.isItemLoaded(item)){self._callbackSetLabel([item],undefined,_5b0);}else{self.store.loadItem({item:item,onItem:function(_5b1,_5b2){self._callbackSetLabel(_5b1,_5b2,_5b0);}});}}else{self._isvalid=false;self.validate(false);}};this.store.fetchItemByIdentity({identity:_5ab,onItem:function(item){_5ae(item,_5ac);}});},_setValueFromItem:function(item,_5b5){this._isvalid=true;this._setValue(this.store.getIdentity(item),this.labelFunc(item,this.store),_5b5);},labelFunc:function(item,_5b7){return _5b7.getValue(item,this.searchAttr);},_doSelect:function(tgt){this.item=tgt.item;this._setValueFromItem(tgt.item,true);},setDisplayedValue:function(_5b9,_5ba){if(this.store){var _5bb=dojo.clone(this.query);this._lastQuery=_5bb[this.searchAttr]=_5b9;this.textbox.value=_5b9;this._lastDisplayedValue=_5b9;var _5bc=this;this.store.fetch({query:_5bb,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_5bd,_5be){dojo.hitch(_5bc,"_callbackSetLabel")(_5bd,_5be,_5ba);},onError:function(_5bf){console.error("dijit.form.FilteringSelect: "+_5bf);dojo.hitch(_5bc,"_setValue")(undefined,_5b9,false);}});}},_getMenuLabelFromItem:function(item){if(this.labelAttr){return {html:this.labelType=="html",label:this.store.getValue(item,this.labelAttr)};}else{return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this,arguments);}},postMixInProperties:function(){dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this,arguments);dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this,arguments);},postCreate:function(){dijit.form.ComboBoxMixin.prototype._postCreate.apply(this,arguments);dijit.form.MappedTextBox.prototype.postCreate.apply(this,arguments);},setAttribute:function(attr,_5c2){dijit.form.MappedTextBox.prototype.setAttribute.apply(this,arguments);dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this,arguments);},undo:function(){this.setDisplayedValue(this._lastDisplayedValue);},_valueChanged:function(){return this.getDisplayedValue()!=this._lastDisplayedValue;}});}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,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",baseClass:"dijitSpinner",adjust:function(val,_5c4){return val;},_arrowState:function(node,_5c6){this._active=_5c6;this.stateModifier=node.getAttribute("stateModifier")||"";this._setStateClass();},_arrowPressed:function(_5c7,_5c8){if(this.disabled||this.readOnly){return;}this._arrowState(_5c7,true);this.setValue(this.adjust(this.getValue(),_5c8*this.smallDelta),false);dijit.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(node){this._wheelTimer=null;if(this.disabled||this.readOnly){return;}this._arrowState(node,false);},_typematicCallback:function(_5ca,node,evt){if(node==this.textbox){node=(evt.keyCode==dojo.keys.UP_ARROW)?this.upArrowNode:this.downArrowNode;}if(_5ca==-1){this._arrowReleased(node);}else{this._arrowPressed(node,(node==this.upArrowNode)?1:-1);}},_wheelTimer:null,_mouseWheeled:function(evt){dojo.stopEvent(evt);var _5ce=0;if(typeof evt.wheelDelta=="number"){_5ce=evt.wheelDelta;}else{if(typeof evt.detail=="number"){_5ce=-evt.detail;}}var node,dir;if(_5ce>0){node=this.upArrowNode;dir=+1;}else{if(_5ce<0){node=this.downArrowNode;dir=-1;}else{return;}}this._arrowPressed(node,dir);if(this._wheelTimer!=null){clearTimeout(this._wheelTimer);}var _5d1=this;this._wheelTimer=setTimeout(function(){_5d1._arrowReleased(node);},50);},postCreate:function(){this.inherited("postCreate",arguments);this.connect(this.textbox,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));if(dojo.isIE){var _5d2=this;this.connect(this.domNode,"onresize",function(){setTimeout(dojo.hitch(_5d2,function(){this.upArrowNode.style.behavior="";this.downArrowNode.style.behavior="";this._setStateClass();}),0);});}}});}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],{required:true,adjust:function(val,_5d4){var _5d5=val+_5d4;if(isNaN(val)||isNaN(_5d5)){return val;}if((typeof this.constraints.max=="number")&&(_5d5>this.constraints.max)){_5d5=this.constraints.max;}if((typeof this.constraints.min=="number")&&(_5d5<this.constraints.min)){_5d5=this.constraints.min;}return _5d5;}});}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(_5d6,node){return new dojo.dnd.move.constrainedMoveable(node,_5d6);},constructor:function(node,_5d9){if(!_5d9){_5d9={};}this.constraints=_5d9.constraints;this.within=_5d9.within;},onFirstMove:function(_5da){var c=this.constraintBox=this.constraints.call(this,_5da);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo.marginBox(_5da.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_5dd,_5de){var c=this.constraintBox,s=_5dd.node.style;s.left=(_5de.l<c.l?c.l:c.r<_5de.l?c.r:_5de.l)+"px";s.top=(_5de.t<c.t?c.t:c.b<_5de.t?c.b:_5de.t)+"px";}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_5e1,node){return new dojo.dnd.move.boxConstrainedMoveable(node,_5e1);},constructor:function(node,_5e4){var box=_5e4&&_5e4.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_5e6,node){return new dojo.dnd.move.parentConstrainedMoveable(node,_5e6);},constructor:function(node,_5e9){var area=_5e9&&_5e9.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,_5f0){dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");var _5f1=function(node,e,_5f4){dojo.dnd.Mover.call(this,node,e,_5f4);};dojo.extend(_5f1,dojo.dnd.Mover.prototype);dojo.extend(_5f1,{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(_5f0){var mb=dojo.marginBox(this.node);c.r-=mb.w;c.b-=mb.h;}}});return _5f1;};dojo.dnd.move.boxConstrainedMover=function(box,_5fd){dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");return dojo.dnd.move.constrainedMover(function(){return box;},_5fd);};dojo.dnd.move.parentConstrainedMover=function(area,_5ff){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,_5ff);};dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;}if(!dojo._hasResource["dijit.form.Slider"]){dojo._hasResource["dijit.form.Slider"]=true;dojo.provide("dijit.form.Slider");dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></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\" dojoAttachEvent=\"onclick: decrement\"><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 dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></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=\"onclick:_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 dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><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\" style=\"text-align:center;\"></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:1000,widgetsInTemplate:true,attributeMap:dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),{id:"",name:"valueNode"}),baseClass:"dijitSlider",_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_startingPixelCount:"l",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey){return;}switch(e.keyCode){case dojo.keys.HOME:this.setValue(this.minimum,true);break;case dojo.keys.END:this.setValue(this.maximum,true);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:this.inherited(arguments);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 _608=dojo.coords(this.sliderBarContainer,true);var _609=e[this._mousePixelCoord]-_608[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_608[this._pixelCount]-_609):_609,_608[this._pixelCount],true);},_setPixelValue:function(_60a,_60b,_60c){if(this.disabled||this.readOnly){return;}_60a=_60a<0?0:_60b<_60a?_60b:_60a;var _60d=this.discreteValues;if(_60d<=1||_60d==Infinity){_60d=_60b;}_60d--;var _60e=_60b/_60d;var _60f=Math.round(_60a/_60e);this.setValue((this.maximum-this.minimum)*_60f/_60d+this.minimum,_60c);},setValue:function(_610,_611){this.valueNode.value=this.value=_610;dijit.setWaiState(this.focusNode,"valuenow",_610);this.inherited(arguments);var _612=(_610-this.minimum)/(this.maximum-this.minimum);var _613=(this._descending===false)?this.remainingBar:this.progressBar;var _614=(this._descending===false)?this.progressBar:this.remainingBar;if(_611&&this.slideDuration>0&&_613.style[this._progressPixelSize]){var _615=this;var _616={};var _617=parseFloat(_613.style[this._progressPixelSize]);var _618=this.slideDuration*(_612-_617/100);if(_618==0){return;}if(_618<0){_618=0-_618;}_616[this._progressPixelSize]={start:_617,end:_612*100,units:"%"};dojo.animateProperty({node:_613,duration:_618,onAnimate:function(v){_614.style[_615._progressPixelSize]=(100-parseFloat(v[_615._progressPixelSize]))+"%";},properties:_616}).play();}else{_613.style[this._progressPixelSize]=(_612*100)+"%";_614.style[this._progressPixelSize]=((1-_612)*100)+"%";}},_bumpValue:function(_61a){if(this.disabled||this.readOnly){return;}var s=dojo.getComputedStyle(this.sliderBarContainer);var c=dojo._getContentBox(this.sliderBarContainer,s);var _61d=this.discreteValues;if(_61d<=1||_61d==Infinity){_61d=c[this._pixelCount];}_61d--;var _61e=(this.value-this.minimum)*_61d/(this.maximum-this.minimum)+_61a;if(_61e<0){_61e=0;}if(_61e>_61d){_61e=_61d;}_61e=_61e*(this.maximum-this.minimum)/_61d+this.minimum;this.setValue(_61e,true);},_onClkIncBumper:function(){this.setValue(this._descending===false?this.minimum:this.maximum,true);},_onClkDecBumper:function(){this.setValue(this._descending===false?this.maximum:this.minimum,true);},decrement:function(e){this._bumpValue(e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){dojo.stopEvent(evt);var _622=0;if(typeof evt.wheelDelta=="number"){_622=evt.wheelDelta;}else{if(typeof evt.detail=="number"){_622=-evt.detail;}}if(_622>0){this.increment(evt);}else{if(_622<0){this.decrement(evt);}}},startup:function(){dojo.forEach(this.getChildren(),function(_623){if(this[_623.container]!=this.containerNode){this[_623.container].appendChild(_623.domNode);}},this);},postCreate:function(){if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";}this.connect(this.domNode,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");var _624=this;var _625=function(){dijit.form._SliderMover.apply(this,arguments);this.widget=_624;};dojo.extend(_625,dijit.form._SliderMover.prototype);this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_625});dijit.setWaiState(this.focusNode,"valuemin",this.minimum);dijit.setWaiState(this.focusNode,"valuemax",this.maximum);this.inherited(arguments);},destroy:function(){this._movable.destroy();this.inherited(arguments);}});dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\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=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><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 dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_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\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></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\" style=\"text-align:center;height:100%;\"></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 dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_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=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></table>\n",_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_startingPixelCount:"t",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,startup:function(){if(this._started){return;}if(!this.isLeftToRight()&&dojo.isMoz){if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}}this.inherited(arguments);},_isReversed:function(){return this._descending;},_topButtonClicked:function(e){if(this._descending){this.increment(e);}else{this.decrement(e);}},_bottomButtonClicked:function(e){if(this._descending){this.decrement(e);}else{this.increment(e);}},_rtlRectify:function(_628){var _629=[];while(_628.firstChild){_629.push(_628.firstChild);_628.removeChild(_628.firstChild);}for(var i=_629.length-1;i>=0;i--){if(_629[i]){_628.appendChild(_629[i]);}}}});dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){var _62c=this.widget;var _62d=_62c._abspos;if(!_62d){_62d=_62c._abspos=dojo.coords(_62c.sliderBarContainer,true);_62c._setPixelValue_=dojo.hitch(_62c,"_setPixelValue");_62c._isReversed_=_62c._isReversed();}var _62e=e[_62c._mousePixelCoord]-_62d[_62c._startingPixelCoord];_62c._setPixelValue_(_62c._isReversed_?(_62d[_62c._pixelCount]-_62e):_62e,_62d[_62c._pixelCount],false);},destroy:function(e){dojo.dnd.Mover.prototype.destroy.apply(this,arguments);var _630=this.widget;_630.setValue(_630.value,true);}});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 _633;if(this.count==1){_633=this._genHTML(50,0);}else{var i;var _635=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_633=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_633+=this._genHTML(_635*i,i);}_633+=this._genHTML(100,this.count-1);}else{_633=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_633+=this._genHTML(100-_635*i,i);}_633+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_633;}});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.HorizontalRuleLabels",dijit.form.HorizontalRule,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</span></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 _639=this.labels;if(!_639.length){_639=dojo.query("> li",this.srcNodeRef).map(function(node){return String(node.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_639.length&&this.count>1){var _63b=this.minimum;var inc=(this.maximum-_63b)/(this.count-1);for(var i=0;i<this.count;i++){_639.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":dojo.number.format(_63b,this.constraints));_63b+=inc;}}return _639;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});dojo.declare("dijit.form.VerticalRuleLabels",dijit.form.HorizontalRuleLabels,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></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.Textarea"]){dojo._hasResource["dijit.form.Textarea"]=true;dojo.provide("dijit.form.Textarea");dojo.declare("dijit.form.Textarea",dijit.form._FormValueWidget,{attributeMap:dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),{style:"styleNode","class":"styleNode"}),templateString:(dojo.isIE||dojo.isSafari||dojo.isFF)?((dojo.isIE||dojo.isSafari||dojo.isFF>=3)?"<fieldset id=\"${id}\" class=\"dijitInline dijitInputField dijitTextArea\" dojoAttachPoint=\"styleNode\" waiRole=\"presentation\"><div dojoAttachPoint=\"editNode,focusNode,eventNode\" dojoAttachEvent=\"onpaste:_changing,oncut:_changing\" waiRole=\"textarea\" style=\"text-decoration:none;display:block;overflow:auto;\" contentEditable=\"true\"></div>":"<span id=\"${id}\" class=\"dijitReset\">"+"<iframe src=\"javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>\""+" dojoAttachPoint=\"iframe,styleNode\" dojoAttachEvent=\"onblur:_onIframeBlur\" class=\"dijitInline dijitInputField dijitTextArea\"></iframe>")+"<textarea name=\"${name}\" value=\"${value}\" dojoAttachPoint=\"formValueNode\" style=\"display:none;\"></textarea>"+((dojo.isIE||dojo.isSafari||dojo.isFF>=3)?"</fieldset>":"</span>"):"<textarea id=\"${id}\" name=\"${name}\" value=\"${value}\" dojoAttachPoint=\"formValueNode,editNode,focusNode,styleNode\" class=\"dijitInputField dijitTextArea\">"+dojo.isFF+"</textarea>",setAttribute:function(attr,_640){this.inherited(arguments);switch(attr){case "disabled":this.formValueNode.disabled=this.disabled;case "readOnly":if(dojo.isIE||dojo.isSafari||dojo.isFF>=3){this.editNode.contentEditable=(!this.disabled&&!this.readOnly);}else{if(dojo.isFF){this.iframe.contentDocument.designMode=(this.disabled||this.readOnly)?"off":"on";}}}},focus:function(){if(!this.disabled&&!this.readOnly){this._changing();}dijit.focus(this.iframe||this.focusNode);},setValue:function(_641,_642){var _643=this.editNode;if(typeof _641=="string"){_643.innerHTML="";if(_641.split){var _644=this;var _645=true;dojo.forEach(_641.split("\n"),function(line){if(_645){_645=false;}else{_643.appendChild(dojo.doc.createElement("BR"));}if(line){_643.appendChild(dojo.doc.createTextNode(line));}});}else{if(_641){_643.appendChild(dojo.doc.createTextNode(_641));}}if(!dojo.isIE){_643.appendChild(dojo.doc.createElement("BR"));}}else{_641=_643.innerHTML;if(this.iframe){_641=_641.replace(/<div><\/div>\r?\n?$/i,"");}_641=_641.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");if(!dojo.isIE){_641=_641.replace(/\n$/,"");}}this.value=this.formValueNode.value=_641;if(this.iframe){var _647=dojo.doc.createElement("div");_643.appendChild(_647);var _648=_647.offsetTop;if(_643.scrollWidth>_643.clientWidth){_648+=16;}if(this.lastHeight!=_648){if(_648==0){_648=16;}dojo.contentBox(this.iframe,{h:_648});this.lastHeight=_648;}_643.removeChild(_647);}dijit.form.Textarea.superclass.setValue.call(this,this.getValue(),_642);},getValue:function(){return this.value.replace(/\r/g,"");},postMixInProperties:function(){this.inherited(arguments);if(this.srcNodeRef&&this.srcNodeRef.innerHTML!=""){this.value=this.srcNodeRef.innerHTML;this.srcNodeRef.innerHTML="";}if((!this.value||this.value=="")&&this.srcNodeRef&&this.srcNodeRef.value){this.value=this.srcNodeRef.value;}if(!this.value){this.value="";}this.value=this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");if(dojo.isFF==2){var _649=dojo.i18n.getLocalization("dijit.form","Textarea");this._iframeEditTitle=_649.iframeEditTitle;this._iframeFocusTitle=_649.iframeFocusTitle;var _64a=dojo.query("label[for=\""+this.id+"\"]");if(_64a.length){this._iframeEditTitle=_64a[0].innerHTML+" "+this._iframeEditTitle;}var body=this.focusNode=this.editNode=dojo.doc.createElement("BODY");body.style.margin="0px";body.style.padding="0px";body.style.border="0px";}},postCreate:function(){if(dojo.isIE||dojo.isSafari||dojo.isFF>=3){this.domNode.style.overflowY="hidden";}else{if(dojo.isFF){var w=this.iframe.contentWindow;var _64d="";try{_64d=this.iframe.contentDocument.title;}catch(e){}if(!w||!_64d){this.iframe.postCreate=dojo.hitch(this,this.postCreate);return;}var d=w.document;d.getElementsByTagName("HTML")[0].replaceChild(this.editNode,d.getElementsByTagName("BODY")[0]);if(!this.isLeftToRight()){d.getElementsByTagName("HTML")[0].dir="rtl";}this.iframe.style.overflowY="hidden";this.eventNode=d;w.addEventListener("resize",dojo.hitch(this,this._changed),false);}else{this.focusNode=this.domNode;}}if(this.eventNode){this.connect(this.eventNode,"keypress",this._onKeyPress);this.connect(this.eventNode,"mousemove",this._changed);this.connect(this.eventNode,"focus",this._focused);this.connect(this.eventNode,"blur",this._blurred);}if(this.editNode){this.connect(this.editNode,"change",this._changed);}this.inherited("postCreate",arguments);},_focused:function(e){dojo.addClass(this.iframe||this.domNode,"dijitInputFieldFocused");this._changed(e);},_blurred:function(e){dojo.removeClass(this.iframe||this.domNode,"dijitInputFieldFocused");this._changed(e,true);},_onIframeBlur:function(){this.iframe.contentDocument.title=this._iframeEditTitle;},_onKeyPress:function(e){if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey&&this.iframe){this.iframe.contentDocument.title=this._iframeFocusTitle;this.iframe.focus();dojo.stopEvent(e);}else{if(e.keyCode==dojo.keys.ENTER){e.stopPropagation();}else{if(this.inherited("_onKeyPress",arguments)&&this.iframe){var te=dojo.doc.createEvent("KeyEvents");te.initKeyEvent("keypress",true,true,null,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.keyCode,e.charCode);this.iframe.dispatchEvent(te);}}}this._changing();},_changing:function(e){setTimeout(dojo.hitch(this,"_changed",e,false),1);},_changed:function(e,_655){if(this.iframe&&this.iframe.contentDocument.designMode!="on"&&!this.disabled&&!this.readOnly){this.iframe.contentDocument.designMode="on";}this.setValue(null,_655||false);}});}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,_started:false,postCreate:function(){dijit.setWaiRole((this.containerNode||this.domNode),"tabpanel");this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _656=this.getChildren();dojo.forEach(_656,this._setupChild,this);dojo.some(_656,function(_657){if(_657.selected){this.selectedChildWidget=_657;}return _657.selected;},this);var _658=this.selectedChildWidget;if(!_658&&_656[0]){_658=this.selectedChildWidget=_656[0];_658.selected=true;}if(_658){this._showChild(_658);}dojo.publish(this.id+"-startup",[{children:_656,selected:_658}]);this.inherited(arguments);},_setupChild:function(page){page.domNode.style.display="none";page.domNode.style.position="relative";return page;},addChild:function(_65a,_65b){dijit._Container.prototype.addChild.apply(this,arguments);_65a=this._setupChild(_65a);if(this._started){this.layout();dojo.publish(this.id+"-addChild",[_65a,_65b]);if(!this.selectedChildWidget){this.selectChild(_65a);}}},removeChild:function(page){dijit._Container.prototype.removeChild.apply(this,arguments);if(this._beingDestroyed){return;}if(this._started){dojo.publish(this.id+"-removeChild",[page]);this.layout();}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _65d=this.getChildren();if(_65d.length){this.selectChild(_65d[0]);}}}},selectChild:function(page){page=dijit.byId(page);if(this.selectedChildWidget!=page){this._transition(page,this.selectedChildWidget);this.selectedChildWidget=page;dojo.publish(this.id+"-selectChild",[page]);}},_transition:function(_65f,_660){if(_660){this._hideChild(_660);}this._showChild(_65f);if(this.doLayout&&_65f.resize){_65f.resize(this._containerContentBox||this._contentBox);}},_adjacent:function(_661){var _662=this.getChildren();var _663=dojo.indexOf(_662,this.selectedChildWidget);_663+=_661?1:_662.length-1;return _662[_663%_662.length];},forward:function(){this.selectChild(this._adjacent(true));},back:function(){this.selectChild(this._adjacent(false));},_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._contentBox);}},_showChild:function(page){var _666=this.getChildren();page.isFirstChild=(page==_666[0]);page.isLastChild=(page==_666[_666.length-1]);page.selected=true;page.domNode.style.display="";if(page._loadCheck){page._loadCheck();}if(page.onShow){page.onShow();}},_hideChild:function(page){page.selected=false;page.domNode.style.display="none";if(page.onHide){page.onHide();}},closeChild:function(page){var _669=page.onClose(this,page);if(_669){this.removeChild(page);page.destroyRecursive();}},destroy:function(){this._beingDestroyed=true;this.inherited(arguments);}});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.pane2menu={};this._subscriptions=[dojo.subscribe(this.containerId+"-startup",this,"onStartup"),dojo.subscribe(this.containerId+"-addChild",this,"onAddChild"),dojo.subscribe(this.containerId+"-removeChild",this,"onRemoveChild"),dojo.subscribe(this.containerId+"-selectChild",this,"onSelectChild"),dojo.subscribe(this.containerId+"-containerKeyPress",this,"onContainerKeyPress")];},onStartup:function(info){dojo.forEach(info.children,this.onAddChild,this);this.onSelectChild(info.selected);},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(pane);}dojo.forEach(this._subscriptions,dojo.unsubscribe);this.inherited(arguments);},onAddChild:function(page,_66d){var _66e=dojo.doc.createElement("span");this.domNode.appendChild(_66e);var cls=dojo.getObject(this.buttonWidget);var _670=new cls({label:page.title,closeButton:page.closable},_66e);this.addChild(_670,_66d);this.pane2button[page]=_670;page.controlButton=_670;dojo.connect(_670,"onClick",dojo.hitch(this,"onButtonClick",page));if(page.closable){dojo.connect(_670,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page));var _671=dojo.i18n.getLocalization("dijit","common");var _672=new dijit.Menu({targetNodeIds:[_670.id],id:_670.id+"_Menu"});var _673=new dijit.MenuItem({label:_671.itemClose});dojo.connect(_673,"onClick",dojo.hitch(this,"onCloseButtonClick",page));_672.addChild(_673);this.pane2menu[page]=_672;}if(!this._currentChild){_670.focusNode.setAttribute("tabIndex","0");this._currentChild=page;}if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}var _675=this.pane2button[page];var menu=this.pane2menu[page];if(menu){menu.destroy();}if(_675){_675.destroy();}this.pane2button[page]=null;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _678=this.pane2button[this._currentChild];_678.setAttribute("checked",false);_678.focusNode.setAttribute("tabIndex","-1");}var _679=this.pane2button[page];_679.setAttribute("checked",true);this._currentChild=page;_679.focusNode.setAttribute("tabIndex","0");var _67a=dijit.byId(this.containerId);dijit.setWaiState(_67a.containerNode||_67a.domNode,"labelledby",_679.id);},onButtonClick:function(page){var _67c=dijit.byId(this.containerId);_67c.selectChild(page);},onCloseButtonClick:function(page){var _67e=dijit.byId(this.containerId);_67e.closeChild(page);var b=this.pane2button[this._currentChild];if(b){dijit.focus(b.focusNode||b.domNode);}},adjacent:function(_680){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_680=!_680;}var _681=this.getChildren();var _682=dojo.indexOf(_681,this.pane2button[this._currentChild]);var _683=_680?1:_681.length-1;return _681[(_682+_683)%_681.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _685=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.keyCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_685=false;}break;case k.PAGE_UP:if(e.ctrlKey){_685=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_685=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_685=true;}break;case k.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);break;default:if(e.ctrlKey){if(e.keyCode==k.TAB){this.adjacent(!e.shiftKey).onClick();dojo.stopEvent(e);}else{if(e.keyChar=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);}}}}if(_685!==null){this.adjacent(_685).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();}});dojo.extend(dijit._Widget,{title:"",selected:false,closable:false,onClose:function(){return true;}});}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:250,_verticalSpace:0,postCreate:function(){this.domNode.style.overflow="hidden";this.inherited("postCreate",arguments);dijit.setWaiRole(this.domNode,"tablist");dojo.addClass(this.domNode,"dijitAccordionContainer");},startup:function(){if(this._started){return;}this.inherited("startup",arguments);if(this.selectedChildWidget){var _68b=this.selectedChildWidget.containerNode.style;_68b.display="";_68b.overflow="auto";this.selectedChildWidget._setSelectedState(true);}},layout:function(){var _68c=0;var _68d=this.selectedChildWidget;dojo.forEach(this.getChildren(),function(_68e){_68c+=_68e.getTitleHeight();});var _68f=this._contentBox;this._verticalSpace=(_68f.h-_68c);if(_68d){_68d.containerNode.style.height=this._verticalSpace+"px";}},_setupChild:function(page){return page;},_transition:function(_691,_692){if(this._inTransition){return;}this._inTransition=true;var _693=[];var _694=this._verticalSpace;if(_691){_691.setSelected(true);var _695=_691.containerNode;_695.style.display="";_693.push(dojo.animateProperty({node:_695,duration:this.duration,properties:{height:{start:"1",end:_694}},onEnd:function(){_695.style.overflow="auto";}}));}if(_692){_692.setSelected(false);var _696=_692.containerNode;_696.style.overflow="hidden";_693.push(dojo.animateProperty({node:_696,duration:this.duration,properties:{height:{start:_694,end:"1"}},onEnd:function(){_696.style.display="none";}}));}this._inTransition=false;dojo.fx.combine(_693).play();},_onKeyPress:function(e){if(this.disabled||e.altKey||!(e._dijitWidget||e.ctrlKey)){return;}var k=dojo.keys;var _699=e._dijitWidget;switch(e.keyCode){case k.LEFT_ARROW:case k.UP_ARROW:if(_699){this._adjacent(false)._onTitleClick();dojo.stopEvent(e);}break;case k.PAGE_UP:if(e.ctrlKey){this._adjacent(false)._onTitleClick();dojo.stopEvent(e);}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(_699){this._adjacent(true)._onTitleClick();dojo.stopEvent(e);}break;case k.PAGE_DOWN:if(e.ctrlKey){this._adjacent(true)._onTitleClick();dojo.stopEvent(e);}break;default:if(e.ctrlKey&&e.keyCode==k.TAB){this._adjacent(e._dijitWidget,!e.shiftKey)._onTitleClick();dojo.stopEvent(e);}}}});dojo.declare("dijit.layout.AccordionPane",[dijit.layout.ContentPane,dijit._Templated,dijit._Contained],{templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",postCreate:function(){this.inherited("postCreate",arguments);dojo.setSelectable(this.titleNode,false);this.setSelected(this.selected);},getTitleHeight:function(){return dojo.marginBox(this.titleNode).h;},_onTitleClick:function(){var _69a=this.getParent();if(!_69a._inTransition){_69a.selectChild(this);dijit.focus(this.focusNode);}},_onTitleKeyPress:function(evt){evt._dijitWidget=this;return this.getParent()._onKeyPress(evt);},_setSelectedState:function(_69c){this.selected=_69c;dojo[(_69c?"addClass":"removeClass")](this.titleNode,"dijitAccordionTitle-selected");this.focusNode.setAttribute("tabIndex",_69c?"0":"-1");},_handleFocus:function(e){dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,"dijitAccordionFocused");},setSelected:function(_69e){this._setSelectedState(_69e);if(_69e){this.onSelected();this._loadCheck(true);}},onSelected:function(){}});}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",liveSplitters:true,persist:false,_splitterClass:"dijit.layout._Splitter",postCreate:function(){this.inherited(arguments);this._splitters={};this._splitterThickness={};dojo.addClass(this.domNode,"dijitBorderContainer");},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_69f){var _6a0=_69f.region;if(_6a0){_69f.domNode.style.position="absolute";var ltr=this.isLeftToRight();if(_6a0=="leading"){_6a0=ltr?"left":"right";}if(_6a0=="trailing"){_6a0=ltr?"right":"left";}this["_"+_6a0]=_69f.domNode;this["_"+_6a0+"Widget"]=_69f;if(_69f.splitter){var _6a2=dojo.getObject(this._splitterClass);var flip={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"};var _6a4=dojo.query("[region="+flip[_69f.region]+"]",this.domNode);var _6a5=new _6a2({container:this,child:_69f,region:_6a0,oppNode:_6a4[0],live:this.liveSplitters});this._splitters[_6a0]=_6a5.domNode;dojo.place(_6a5.domNode,_69f.domNode,"after");this._computeSplitterThickness(_6a0);}_69f.region=_6a0;}},_computeSplitterThickness:function(_6a6){var re=new RegExp("top|bottom");this._splitterThickness[_6a6]=dojo.marginBox(this._splitters[_6a6])[(re.test(_6a6)?"h":"w")];},layout:function(){this._layoutChildren();},addChild:function(_6a8,_6a9){this.inherited(arguments);this._setupChild(_6a8);if(this._started){this._layoutChildren();}},removeChild:function(_6aa){var _6ab=_6aa.region;var _6ac=this._splitters[_6ab];if(_6ac){dijit.byNode(_6ac).destroy();delete this._splitters[_6ab];delete this._splitterThickness[_6ab];}this.inherited(arguments);delete this["_"+_6ab];delete this["_"+_6ab+"Widget"];if(this._started){this._layoutChildren(_6aa.region);}},_layoutChildren:function(_6ad){var _6ae=(this.design=="sidebar");var _6af=0,_6b0=0,_6b1=0,_6b2=0;var _6b3={},_6b4={},_6b5={},_6b6={},_6b7=(this._center&&this._center.style)||{};var _6b8=/left|right/.test(_6ad);var _6b9=!_6ad||(!_6b8&&!_6ae);var _6ba=!_6ad||(_6b8&&_6ae);if(this._top){_6b3=_6ba&&this._top.style;_6af=dojo.marginBox(this._top).h;}if(this._left){_6b4=_6b9&&this._left.style;_6b1=dojo.marginBox(this._left).w;}if(this._right){_6b5=_6b9&&this._right.style;_6b2=dojo.marginBox(this._right).w;}if(this._bottom){_6b6=_6ba&&this._bottom.style;_6b0=dojo.marginBox(this._bottom).h;}var _6bb=this._splitters;var _6bc=_6bb.top;var _6bd=_6bb.bottom;var _6be=_6bb.left;var _6bf=_6bb.right;var _6c0=this._splitterThickness;var _6c1=_6c0.top||0;var _6c2=_6c0.left||0;var _6c3=_6c0.right||0;var _6c4=_6c0.bottom||0;if(_6c2>50||_6c3>50){setTimeout(dojo.hitch(this,function(){for(var _6c5 in this._splitters){this._computeSplitterThickness(_6c5);}this._layoutChildren();}),50);return false;}var _6c6={left:(_6ae?_6b1+_6c2:"0")+"px",right:(_6ae?_6b2+_6c3:"0")+"px"};if(_6bc){dojo.mixin(_6bc.style,_6c6);_6bc.style.top=_6af+"px";}if(_6bd){dojo.mixin(_6bd.style,_6c6);_6bd.style.bottom=_6b0+"px";}_6c6={top:(_6ae?"0":_6af+_6c1)+"px",bottom:(_6ae?"0":_6b0+_6c4)+"px"};if(_6be){dojo.mixin(_6be.style,_6c6);_6be.style.left=_6b1+"px";}if(_6bf){dojo.mixin(_6bf.style,_6c6);_6bf.style.right=_6b2+"px";}dojo.mixin(_6b7,{top:_6af+_6c1+"px",left:_6b1+_6c2+"px",right:_6b2+_6c3+"px",bottom:_6b0+_6c4+"px"});var _6c7={top:_6ae?"0":_6b7.top,bottom:_6ae?"0":_6b7.bottom};dojo.mixin(_6b4,_6c7);dojo.mixin(_6b5,_6c7);_6b4.left=_6b5.right=_6b3.top=_6b6.bottom="0";if(_6ae){_6b3.left=_6b6.left=_6b1+(this.isLeftToRight()?_6c2:0)+"px";_6b3.right=_6b6.right=_6b2+(this.isLeftToRight()?0:_6c3)+"px";}else{_6b3.left=_6b3.right=_6b6.left=_6b6.right="0";}var _6c8=dojo.isIE||dojo.some(this.getChildren(),function(_6c9){return _6c9.domNode.tagName=="TEXTAREA";});if(_6c8){var _6ca=function(n,b){n=dojo.byId(n);var s=dojo.getComputedStyle(n);if(!b){return dojo._getBorderBox(n,s);}var me=dojo._getMarginExtents(n,s);dojo._setMarginBox(n,b.l,b.t,b.w+me.w,b.h+me.h,s);return null;};var _6cf=function(_6d0,dim){if(_6d0){_6d0.resize?_6d0.resize(dim):dojo.marginBox(_6d0.domNode,dim);}};var _6d2=_6ca(this.domNode);var _6d3=_6d2.h;var _6d4=_6d3;if(this._top){_6d4-=_6af;}if(this._bottom){_6d4-=_6b0;}if(_6bc){_6d4-=_6c1;}if(_6bd){_6d4-=_6c4;}var _6d5={h:_6d4};var _6d6=_6ae?_6d3:_6d4;if(_6be){_6be.style.height=_6d6;}if(_6bf){_6bf.style.height=_6d6;}_6cf(this._leftWidget,{h:_6d6});_6cf(this._rightWidget,{h:_6d6});var _6d7=_6d2.w;var _6d8=_6d7;if(this._left){_6d8-=_6b1;}if(this._right){_6d8-=_6b2;}if(_6be){_6d8-=_6c2;}if(_6bf){_6d8-=_6c3;}_6d5.w=_6d8;var _6d9=_6ae?_6d8:_6d7;if(_6bc){_6bc.style.width=_6d9;}if(_6bd){_6bd.style.width=_6d9;}_6cf(this._topWidget,{w:_6d9});_6cf(this._bottomWidget,{w:_6d9});_6cf(this._centerWidget,_6d5);}else{var _6da={};if(_6ad){_6da[_6ad]=_6da.center=true;if(/top|bottom/.test(_6ad)&&this.design!="sidebar"){_6da.left=_6da.right=true;}else{if(/left|right/.test(_6ad)&&this.design=="sidebar"){_6da.top=_6da.bottom=true;}}}dojo.forEach(this.getChildren(),function(_6db){if(_6db.resize&&(!_6ad||_6db.region in _6da)){_6db.resize();}},this);}}});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\" 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._minSize=this.child.minSize;this._computeMaxSize();this.connect(this.container,"layout",dojo.hitch(this,this._computeMaxSize));this._cookieName=this.container.id+"_"+this.region;if(this.container.persist){var _6dc=dojo.cookie(this._cookieName);if(_6dc){this.child.domNode.style[this.horizontal?"height":"width"]=_6dc;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w";var _6de=dojo.contentBox(this.container.domNode)[dim]-(this.oppNode?dojo.marginBox(this.oppNode)[dim]:0);this._maxSize=Math.min(this.child.maxSize,_6de);},_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");}else{this.cover.style.zIndex=1;}if(this.fake){dojo._destroyElement(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");var _6e0=this._factor,max=this._maxSize,min=this._minSize||10;var axis=this.horizontal?"pageY":"pageX";var _6e4=e[axis];var _6e5=this.domNode.style;var dim=this.horizontal?"h":"w";var _6e7=dojo.marginBox(this.child.domNode)[dim];var _6e8=parseInt(this.domNode.style[this.region]);var _6e9=this._resize;var _6ea=this.region;var mb={};var _6ec=this.child.domNode;var _6ed=dojo.hitch(this.container,this.container._layoutChildren);var de=dojo.doc.body;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_6f0){var _6f1=e[axis]-_6e4,_6f2=_6e0*_6f1+_6e7,_6f3=Math.max(Math.min(_6f2,max),min);if(_6e9||_6f0){mb[dim]=_6f3;dojo.marginBox(_6ec,mb);_6ed(_6ea);}_6e5[_6ea]=_6e0*_6f1+_6e8+(_6f3-_6f2)+"px";}),dojo.connect(de,"onmouseup",this,"_stopDrag")]);dojo.stopEvent(e);},_stopDrag:function(e){try{if(this.cover){this.cover.style.zIndex=-1;}if(this.fake){dojo._destroyElement(this.fake);}dojo.removeClass(this.domNode,"dijitSplitterActive");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"]);}},_cleanupHandlers:function(){dojo.forEach(this._handlers,dojo.disconnect);delete this._handlers;},_onKeyPress:function(e){this._resize=true;var _6f6=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.keyCode){case _6f6?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;break;case _6f6?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _6f9=dojo.marginBox(this.child.domNode)[_6f6?"h":"w"]+this._factor*tick;var mb={};mb[this.horizontal?"h":"w"]=Math.max(Math.min(_6f9,this._maxSize),this._minSize);dojo.marginBox(this.child.domNode,mb);this.container._layoutChildren(this.region);dojo.stopEvent(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.fake;this.inherited(arguments);}});}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,{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(_6fb,_6fc){dijit._Container.prototype.addChild.apply(this,arguments);if(this._started){dijit.layout.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_6fd){dijit._Container.prototype.removeChild.apply(this,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\"></div>",postCreate:function(){if(this.srcNodeRef){this.title+=this.srcNodeRef.innerHTML;}this.inherited("postCreate",arguments);}});}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,postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.isHorizontal=(this.orientation=="horizontal");},postCreate:function(){this.inherited("postCreate",arguments);this.sizers=[];dojo.addClass(this.domNode,"dijitSplitContainer");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 _6fe=this.virtualSizer=dojo.doc.createElement("div");_6fe.style.position="relative";_6fe.style.zIndex=10;_6fe.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_6fe);dojo.setSelectable(_6fe,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(_6ff,i,_701){this._injectChild(_6ff);if(i<_701.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_injectChild:function(_702){_702.domNode.style.position="absolute";dojo.addClass(_702.domNode,"dijitSplitPane");},_addSizer:function(){var i=this.sizers.length;var _704=this.sizers[i]=dojo.doc.createElement("div");this.domNode.appendChild(_704);_704.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _705=dojo.doc.createElement("div");_705.className="thumb";_704.appendChild(_705);var self=this;var _707=(function(){var _708=i;return function(e){self.beginSizing(e,_708);};})();this.connect(_704,"onmousedown",_707);dojo.setSelectable(_704,false);},removeChild:function(_70a){if(this.sizers.length){var i=dojo.indexOf(this.getChildren(),_70a);if(i!=-1){if(i==this.sizers.length){i--;}dojo._destroyElement(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_70c,_70d){this.inherited("addChild",arguments);if(this._started){this._injectChild(_70c);var _70e=this.getChildren();if(_70e.length>1){this._addSizer();}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _70f=this.getChildren();if(!_70f.length){return;}var _710=this.isHorizontal?this.paneWidth:this.paneHeight;if(_70f.length>1){_710-=this.sizerWidth*(_70f.length-1);}var _711=0;dojo.forEach(_70f,function(_712){_711+=_712.sizeShare;});var _713=_710/_711;var _714=0;dojo.forEach(_70f.slice(0,_70f.length-1),function(_715){var size=Math.round(_713*_715.sizeShare);_715.sizeActual=size;_714+=size;});_70f[_70f.length-1].sizeActual=_710-_714;this._checkSizes();var pos=0;var size=_70f[0].sizeActual;this._movePanel(_70f[0],pos,size);_70f[0].position=pos;pos+=size;if(!this.sizers){return;}dojo.some(_70f.slice(1),function(_719,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;size=_719.sizeActual;this._movePanel(_719,pos,size);_719.position=pos;pos+=size;},this);},_movePanel:function(_71b,pos,size){if(this.isHorizontal){_71b.domNode.style.left=pos+"px";_71b.domNode.style.top=0;var box={w:size,h:this.paneHeight};if(_71b.resize){_71b.resize(box);}else{dojo.marginBox(_71b.domNode,box);}}else{_71b.domNode.style.left=0;_71b.domNode.style.top=pos+"px";var box={w:this.paneWidth,h:size};if(_71b.resize){_71b.resize(box);}else{dojo.marginBox(_71b.domNode,box);}}},_moveSlider:function(_71f,pos,size){if(this.isHorizontal){_71f.style.left=pos+"px";_71f.style.top=0;dojo.marginBox(_71f,{w:size,h:this.paneHeight});}else{_71f.style.left=0;_71f.style.top=pos+"px";dojo.marginBox(_71f,{w:this.paneWidth,h:size});}},_growPane:function(_722,pane){if(_722>0){if(pane.sizeActual>pane.sizeMin){if((pane.sizeActual-pane.sizeMin)>_722){pane.sizeActual=pane.sizeActual-_722;_722=0;}else{_722-=pane.sizeActual-pane.sizeMin;pane.sizeActual=pane.sizeMin;}}}return _722;},_checkSizes:function(){var _724=0;var _725=0;var _726=this.getChildren();dojo.forEach(_726,function(_727){_725+=_727.sizeActual;_724+=_727.sizeMin;});if(_724<=_725){var _728=0;dojo.forEach(_726,function(_729){if(_729.sizeActual<_729.sizeMin){_728+=_729.sizeMin-_729.sizeActual;_729.sizeActual=_729.sizeMin;}});if(_728>0){var list=this.isDraggingLeft?_726.reverse():_726;dojo.forEach(list,function(_72b){_728=this._growPane(_728,_72b);},this);}}else{dojo.forEach(_726,function(_72c){_72c.sizeActual=Math.round(_725*(_72c.sizeMin/_724));});}},beginSizing:function(e,i){var _72f=this.getChildren();this.paneBefore=_72f[i];this.paneAfter=_72f[i+1];this.isSizing=true;this.sizingSplitter=this.sizers[i];if(!this.cover){this.cover=dojo.doc.createElement("div");this.domNode.appendChild(this.cover);var s=this.cover.style;s.position="absolute";s.zIndex=1;s.top=0;s.left=0;s.width="100%";s.height="100%";}else{this.cover.style.zIndex=1;}this.sizingSplitter.style.zIndex=2;this.originPos=dojo.coords(_72f[0].domNode,true);if(this.isHorizontal){var _731=(e.layerX?e.layerX:e.offsetX);var _732=e.pageX;this.originPos=this.originPos.x;}else{var _731=(e.layerY?e.layerY:e.offsetY);var _732=e.pageY;this.originPos=this.originPos.y;}this.startPoint=this.lastPoint=_732;this.screenToClientOffset=_732-_731;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 _73b=this.paneBefore.position;var _73c=this.paneAfter.position+this.paneAfter.sizeActual;this.paneBefore.sizeActual=pos-_73b;this.paneAfter.position=pos+this.sizerWidth;this.paneAfter.sizeActual=_73c-this.paneAfter.position;dojo.forEach(this.getChildren(),function(_73d){_73d.sizeShare=_73d.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(_740,i){var _742=this._getCookieName(i);var _743=dojo.cookie(_742);if(_743){var pos=parseInt(_743);if(typeof pos=="number"){_740.sizeShare=pos;}}},this);},_saveState:function(){dojo.forEach(this.getChildren(),function(_745,i){dojo.cookie(this._getCookieName(i),_745.sizeShare);},this);}});dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});}if(!dojo._hasResource["dijit.layout.TabContainer"]){dojo._hasResource["dijit.layout.TabContainer"]=true;dojo.provide("dijit.layout.TabContainer");dojo.declare("dijit.layout.TabContainer",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",templateString:null,templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",_controllerWidget:"dijit.layout.TabController",postCreate:function(){this.inherited(arguments);var _747=dojo.getObject(this._controllerWidget);this.tablist=new _747({id:this.id+"_tablist",tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id},this.tablistNode);},_setupChild:function(tab){dojo.addClass(tab.domNode,"dijitTabPane");this.inherited(arguments);return tab;},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);if(dojo.isSafari){setTimeout(dojo.hitch(this,"layout"),0);}if(dojo.isIE&&!this.isLeftToRight()&&this.tabPosition=="right-h"&&this.tablist&&this.tablist.pane2button){for(var pane in this.tablist.pane2button){var _74a=this.tablist.pane2button[pane];if(!_74a.closeButton){continue;}tabButtonStyle=_74a.closeButtonNode.style;tabButtonStyle.position="absolute";if(dojo.isIE<7){tabButtonStyle.left=_74a.domNode.offsetWidth+"px";}else{tabButtonStyle.padding="0px";}}}},layout:function(){if(!this.doLayout){return;}var _74b=this.tabPosition.replace(/-h/,"");var _74c=[{domNode:this.tablist.domNode,layoutAlign:_74b},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_74c);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_74c[1]);if(this.selectedChildWidget){this._showChild(this.selectedChildWidget);if(this.doLayout&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._containerContentBox);}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",doLayout:true,buttonWidget:"dijit.layout._TabButton",postMixInProperties:function(){this["class"]="dijitTabLabels-"+this.tabPosition+(this.doLayout?"":" dijitTabNoLayout");this.inherited(arguments);},_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _74d=0;for(var pane in this.pane2button){_74d=Math.max(_74d,dojo.marginBox(this.pane2button[pane].innerDiv).w);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_74d+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t </span>\n </div>\n </div>\n</div>\n",postCreate:function(){if(this.closeButton){dojo.addClass(this.innerDiv,"dijitClosable");}else{this.closeButtonNode.style.display="none";}this.inherited(arguments);dojo.setSelectable(this.containerNode,false);}});}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",["he","nl","tr","no","ko","el","en","en-gb","ROOT","zh-cn","hu","es","fi-fi","pt-br","fi","he-il","xx","ru","it","fr","cs","de-de","fr-fr","it-it","es-es","ja","da","pl","de","sv","pt","zh-tw","pt-pt","nl-nl","ko-kr","ar","en-us","zh","ja-jp"]);
diff --git a/includes/js/dijit/dijit-all.js.uncompressed.js b/includes/js/dijit/dijit-all.js.uncompressed.js
new file mode 100644
index 0000000..72dfa1e
--- /dev/null
+++ b/includes/js/dijit/dijit-all.js.uncompressed.js
@@ -0,0 +1,16235 @@
+/*
+ Copyright (c) 2004-2008, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+ This is a compiled version of Dojo, built for deployment and not for
+ development. To get an editable version, please visit:
+
+ http://dojotoolkit.org
+
+ for documentation and information on getting the source.
+*/
+
+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];
+ if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){
+ var r = c[0];
+ if(r.charAt(r.length - 1) == "%"){
+ // 3 rgb percentage values
+ var 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.Color.named = dojo.mixin({
+ 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]
+}, dojo.Color.named);
+
+}
+
+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.
+ 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.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],
+ {
+ // 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();
+ //
+ // 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,
+
+ // palette: String
+ // Size of grid, either "7x10" or "3x4".
+ palette: "7x10",
+
+ //_value: String
+ // The value of the selected color.
+ value: null,
+
+ //_currentFocus: Integer
+ // Index of the currently focused color.
+ _currentFocus: 0,
+
+ // _xDim: Integer
+ // This is the number of colors horizontally across.
+ _xDim: null,
+
+ // _yDim: Integer
+ /// This is the number of colors vertically down.
+ _yDim: null,
+
+ // _palettes: Map
+ // This represents the value of the colors.
+ // The first level is a hashmap of the different arrays 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: Map
+ // This is stores the path to the palette images
+ _imagePaths: {
+ "7x10": dojo.moduleUrl("dijit", "templates/colors7x10.png"),
+ "3x4": dojo.moduleUrl("dijit", "templates/colors3x4.png")
+ },
+
+ // _paletteCoords: Map
+ // This is a map that is used to calculate the coordinates of the
+ // images that make up the palette.
+ _paletteCoords: {
+ "leftOffset": 3, "topOffset": 3,
+ "cWidth": 20, "cHeight": 20
+
+ },
+
+ // templatePath: String
+ // Path to the template of this widget.
+ templateString:"<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\">\n\t</div>\t\n</div>\n",
+
+ // _paletteDims: Object
+ // Size of the supported palettes for alignment purposes.
+ _paletteDims: {
+ "7x10": {"width": "206px", "height": "145px"},
+ "3x4": {"width": "86px", "height": "64px"}
+ },
+
+ // tabIndex: String
+ // Widget tabindex.
+ tabIndex: "0",
+
+ postCreate: function(){
+ // A name has to be given to the colorMap, this needs to be unique per Palette.
+ dojo.mixin(this.divNode.style, this._paletteDims[this.palette]);
+ this.imageNode.setAttribute("src", this._imagePaths[this.palette]);
+ var choices = this._palettes[this.palette];
+ this.domNode.style.position = "relative";
+ this._cellNodes = [];
+ this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
+ var url = dojo.moduleUrl("dojo", "resources/blank.gif"),
+ colorObject = new dojo.Color(),
+ coords = this._paletteCoords;
+ for(var row=0; row < choices.length; row++){
+ for(var col=0; col < choices[row].length; col++) {
+ var imgNode = dojo.doc.createElement("img");
+ imgNode.src = url;
+ dojo.addClass(imgNode, "dijitPaletteImg");
+ var color = choices[row][col],
+ colorValue = colorObject.setColor(dojo.Color.named[color]);
+ imgNode.alt = this.colorNames[color];
+ imgNode.color = colorValue.toHex();
+ var imgStyle = imgNode.style;
+ imgStyle.color = imgStyle.backgroundColor = imgNode.color;
+ var cellNode = dojo.doc.createElement("span");
+ cellNode.appendChild(imgNode);
+ dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) {
+ this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
+ }, this);
+ this.divNode.appendChild(cellNode);
+ var cellStyle = cellNode.style;
+ cellStyle.top = coords.topOffset + (row * coords.cHeight) + "px";
+ cellStyle.left = coords.leftOffset + (col * coords.cWidth) + "px";
+ dojo.attr(cellNode, "tabindex", "-1");
+ cellNode.title = this.colorNames[color];
+ dojo.addClass(cellNode, "dijitPaletteCell");
+ dijit.setWaiRole(cellNode, "gridcell");
+ cellNode.index = this._cellNodes.length;
+ this._cellNodes.push(cellNode);
+ }
+ }
+ this._xDim = choices[0].length;
+ this._yDim = choices.length;
+ this.connect(this.divNode, "onfocus", "_onDivNodeFocus");
+
+ // 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 color.
+ // 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: 1,
+ LEFT_ARROW: -1
+ };
+ for(var key in keyIncrementMap){
+ this._connects.push(dijit.typematic.addKeyListener(this.domNode,
+ {keyCode: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));
+ }
+ },
+
+ focus: function(){
+ // summary:
+ // Focus this ColorPalette. Puts focus on the first swatch.
+ this._focusFirst();
+ },
+
+ onChange: function(color){
+ // summary:
+ // Callback when a color is selected.
+ // color: String
+ // Hex value corresponding to color.
+// console.debug("Color selected is: "+color);
+ },
+
+ _focusFirst: function(){
+ this._currentFocus = 0;
+ var cellNode = this._cellNodes[this._currentFocus];
+ window.setTimeout(function(){dijit.focus(cellNode)}, 0);
+ },
+
+ _onDivNodeFocus: function(evt){
+ // focus bubbles on Firefox 2, so just make sure that focus has really
+ // gone to the container
+ if(evt.target === this.divNode){
+ this._focusFirst();
+ }
+ },
+
+ _onFocus: function(){
+ // while focus is on the palette, set its tabindex to -1 so that on a
+ // shift-tab from a cell, the container is not in the tab order
+ dojo.attr(this.divNode, "tabindex", "-1");
+ },
+
+ _onBlur: function(){
+ this._removeCellHighlight(this._currentFocus);
+ // when focus leaves the palette, restore its tabindex, since it was
+ // modified by _onFocus().
+ dojo.attr(this.divNode, "tabindex", this.tabIndex);
+ },
+
+ _onCellDijitclick: function(/*Event*/ evt){
+ // summary:
+ // Handler for click, enter key & space key. Selects the color.
+ // evt:
+ // The event.
+ var target = evt.currentTarget;
+ if (this._currentFocus != target.index){
+ this._currentFocus = target.index;
+ window.setTimeout(function(){dijit.focus(target)}, 0);
+ }
+ this._selectColor(target);
+ dojo.stopEvent(evt);
+ },
+
+ _onCellMouseEnter: function(/*Event*/ evt){
+ // summary:
+ // Handler for onMouseOver. Put focus on the color under the mouse.
+ // evt:
+ // The mouse event.
+ var target = evt.currentTarget;
+ window.setTimeout(function(){dijit.focus(target)}, 0);
+ },
+
+ _onCellFocus: function(/*Event*/ evt){
+ // summary:
+ // Handler for onFocus. Removes highlight of
+ // the color that just lost focus, and highlights
+ // the new color.
+ // evt:
+ // The focus event.
+ this._removeCellHighlight(this._currentFocus);
+ this._currentFocus = evt.currentTarget.index;
+ dojo.addClass(evt.currentTarget, "dijitPaletteCellHighlight");
+ },
+
+ _onCellBlur: function(/*Event*/ evt){
+ // summary:
+ // needed for Firefox 2 on Mac OS X
+ this._removeCellHighlight(this._currentFocus);
+ },
+
+ _removeCellHighlight: function(index){
+ dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight");
+ },
+
+ _selectColor: function(selectNode){
+ // summary:
+ // This selects a color. It triggers the onChange event
+ // area:
+ // The area node that covers the color being selected.
+ var img = selectNode.getElementsByTagName("img")[0];
+ this.onChange(this.value = img.color);
+ },
+
+ _navigateByKey: function(increment, typeCount){
+ // summary:
+ // This is the callback for typematic.
+ // It changes the focus and the highlighed color.
+ // increment:
+ // How much the key is navigated.
+ // typeCount:
+ // How many times typematic has fired.
+
+ // typecount == -1 means the key is released.
+ if(typeCount == -1){ return; }
+
+ var newFocusIndex = this._currentFocus + increment;
+ if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1)
+ {
+ var focusNode = this._cellNodes[newFocusIndex];
+ focusNode.focus();
+ }
+ }
+});
+
+}
+
+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 user to declare new widget
+ // classes directly from a snippet of markup.
+
+ _noScript: true,
+ widgetClass: "",
+ replaceVars: true,
+ defaults: null,
+ mixins: [],
+ buildRendering: function(){
+ var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef);
+ var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan();
+ var scripts = dojo.query("> script[type^='dojo/']", src).orphan();
+ var srcType = src.nodeName;
+
+ var propList = this.defaults||{};
+
+ // 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 ];
+
+ if(preambles.length){
+ // we only support one preamble. So be it.
+ propList.preamble = dojo.parser._functionFromScript(preambles[0]);
+ }
+
+ var parsedScripts = dojo.map(scripts, function(s){
+ var evt = s.getAttribute("event")||"postscript";
+ return {
+ event: evt,
+ func: dojo.parser._functionFromScript(s)
+ };
+ });
+
+ // do the connects for each <script type="dojo/connect" event="foo"> block and make
+ // all <script type="dojo/method"> tags execute right after construction
+ this.mixins.push(function(){
+ dojo.forEach(parsedScripts, function(s){
+ dojo.connect(this, s.event, this, s.func);
+ }, this);
+ });
+
+ 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+">";
+ // console.debug(propList.templateString);
+
+ // 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
+ dojo.declare(
+ this.widgetClass,
+ this.mixins,
+ propList
+ );
+ }
+ }
+);
+
+}
+
+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._copyKey = navigator.appVersion.indexOf("Macintosh") < 0 ? "ctrlKey" : "metaKey";
+
+dojo.dnd.getCopyKeyState = function(e) {
+ // summary: abstracts away the difference between selection on Mac and PC,
+ // and returns the state of the "copy" key to be pressed.
+ // e: Event: mouse event
+ return e[dojo.dnd._copyKey]; // Boolean
+};
+
+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)
+
+ // 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._abs(n, true);
+ // console.debug(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
+ b.l += t.x + n.scrollLeft;
+ b.t += t.y + 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 - b.l, ry = e.pageY - b.t, dx = 0, dy = 0;
+ if(rx > 0 && rx < b.w){
+ if(rx < w){
+ dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
+ }else if(rx > b.w - w){
+ dx = dojo.dnd.H_AUTOSCROLL_VALUE;
+ }
+ }
+ //console.debug("ry =", ry, "b.h =", b.h, "h =", h);
+ if(ry > 0 && ry < b.h){
+ if(ry < h){
+ dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
+ }else if(ry > b.h - h){
+ dy = dojo.dnd.V_AUTOSCROLL_VALUE;
+ }
+ }
+ var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
+ n.scrollLeft = n.scrollLeft + dx;
+ n.scrollTop = n.scrollTop + dy;
+ // if(dx || dy){ console.debug(oldLeft + ", " + oldTop + "\n" + dx + ", " + dy + "\n" + n.scrollLeft + ", " + n.scrollTop); }
+ 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, "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});
+ },
+ onMouseUp: function(e){
+ if(this.mouseButton == e.button){
+ this.destroy();
+ }
+ },
+ // utilities
+ onFirstMove: function(){
+ // summary: makes the node absolute; it is meant to be called only once
+ var s = this.node.style, l, t;
+ switch(s.position){
+ case "relative":
+ case "absolute":
+ // assume that left and top values are in pixels already
+ l = Math.round(parseFloat(s.left));
+ t = Math.round(parseFloat(s.top));
+ break;
+ default:
+ s.position = "absolute"; // enforcing the absolute mode
+ var m = dojo.marginBox(this.node);
+ l = m.l;
+ t = m.t;
+ break;
+ }
+ this.marginBox.l = l - this.marginBox.l;
+ this.marginBox.t = t - this.marginBox.t;
+ this.host.onFirstMove(this);
+ 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 = 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.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: Object: an optional object with additional parameters;
+ // following parameters are recognized:
+ // handle: Node: a node (or node's id), which is used as a mouse handle
+ // if omitted, the node itself is used as a handle
+ // delay: Number: delay move by this number of pixels
+ // skip: Boolean: skip move of form elements
+ // mover: Object: a constructor of custom Mover
+ 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"));
+ this.events.push(dojo.connect(this.handle, "onmouseup", this, "onMouseUp"));
+ this._lastX = e.pageX;
+ this._lastY = e.pageY;
+ }else{
+ new this.mover(this.node, e, this);
+ }
+ 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);
+ new this.mover(this.node, e, this);
+ }
+ dojo.stopEvent(e);
+ },
+ onMouseUp: function(e){
+ // summary: event processor for onmouseup, used only for delayed delayed drags
+ // e: Event: mouse event
+ dojo.disconnect(this.events.pop());
+ dojo.disconnect(this.events.pop());
+ },
+ 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
+ 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){
+ // 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){
+ // 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.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");
+
+
+
+(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, which makes a node moveable with a timer
+ // node: Node: a node (or node's id) to be moved
+ // params: Object: an optional object with additional parameters.
+ // See dojo.dnd.Moveable for details on general parameters.
+ // Following parameters are specific for this class:
+ // timeout: Number: delay move by this number of ms
+ // accumulating position changes during the timeout
+
+ // 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"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.fx"] = true;
+dojo.provide("dojo.fx");
+dojo.provide("dojo.fx.Toggler");
+
+/*=====
+dojo.fx = {
+ // summary: Effects library on top of Base animations
+};
+=====*/
+
+(function(){
+ var _baseObj = {
+ _fire: function(evt, args){
+ if(this[evt]){
+ this[evt].apply(this, args||[]);
+ }
+ return this;
+ }
+ };
+
+ var _chain = function(animations){
+ this._index = -1;
+ this._animations = animations||[];
+ this._current = this._onAnimateCtx = this._onEndCtx = null;
+
+ this.duration = 0;
+ dojo.forEach(this._animations, function(a){
+ this.duration += a.duration;
+ if(a.delay){ this.duration += a.delay; }
+ }, this);
+ };
+ dojo.extend(_chain, {
+ _onAnimate: function(){
+ this._fire("onAnimate", arguments);
+ },
+ _onEnd: function(){
+ dojo.disconnect(this._onAnimateCtx);
+ dojo.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 = dojo.connect(this._current, "onAnimate", this, "_onAnimate");
+ this._onEndCtx = dojo.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 = dojo.connect(this._current, "beforeBegin", this, function(){
+ this._fire("beforeBegin");
+ }),
+ onBegin = dojo.connect(this._current, "onBegin", this, function(arg){
+ this._fire("onBegin", arguments);
+ }),
+ onPlay = dojo.connect(this._current, "onPlay", this, function(arg){
+ this._fire("onPlay", arguments);
+ dojo.disconnect(beforeBegin);
+ dojo.disconnect(onBegin);
+ dojo.disconnect(onPlay);
+ });
+ if(this._onAnimateCtx){
+ dojo.disconnect(this._onAnimateCtx);
+ }
+ this._onAnimateCtx = dojo.connect(this._current, "onAnimate", this, "_onAnimate");
+ if(this._onEndCtx){
+ dojo.disconnect(this._onEndCtx);
+ }
+ this._onEndCtx = dojo.connect(this._current, "onEnd", this, "_onEnd");
+ this._current.play.apply(this._current, arguments);
+ return this;
+ },
+ pause: function(){
+ if(this._current){
+ var e = dojo.connect(this._current, "onPause", this, function(arg){
+ this._fire("onPause", arguments);
+ dojo.disconnect(e);
+ });
+ this._current.pause();
+ }
+ return this;
+ },
+ gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){
+ this.pause();
+ var offset = this.duration * percent;
+ this._current = null;
+ dojo.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 / _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 = dojo.connect(this._current, "onStop", this, function(arg){
+ this._fire("onStop", arguments);
+ dojo.disconnect(e);
+ });
+ this._current.stop();
+ }
+ return this;
+ },
+ status: function(){
+ return this._current ? this._current.status() : "stopped";
+ },
+ destroy: function(){
+ if(this._onAnimateCtx){ dojo.disconnect(this._onAnimateCtx); }
+ if(this._onEndCtx){ dojo.disconnect(this._onEndCtx); }
+ }
+ });
+ dojo.extend(_chain, _baseObj);
+
+ dojo.fx.chain = function(/*dojo._Animation[]*/ animations){
+ // summary: Chain a list of dojo._Animation s to run in sequence
+ // example:
+ // | 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;
+ dojo.forEach(animations, function(a){
+ var duration = a.duration;
+ if(a.delay){ duration += a.delay; }
+ if(this.duration < duration){ this.duration = duration; }
+ this._connects.push(dojo.connect(a, "onEnd", this, "_onEnd"));
+ }, this);
+
+ this._pseudoAnimation = new dojo._Animation({curve: [0, 1], duration: this.duration});
+ dojo.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop"],
+ function(evt){
+ this._connects.push(dojo.connect(this._pseudoAnimation, evt, dojo.hitch(this, "_fire", evt)));
+ },
+ this
+ );
+ };
+ dojo.extend(_combine, {
+ _doAction: function(action, args){
+ dojo.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;
+ dojo.forEach(this._animations, function(a){
+ a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay);
+ });
+ this._call("gotoProcent", 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(){
+ dojo.forEach(this._connects, dojo.disconnect);
+ }
+ });
+ dojo.extend(_combine, _baseObj);
+
+ dojo.fx.combine = function(/*dojo._Animation[]*/ animations){
+ // summary: Combine a list of dojo._Animation s to run in parallel
+ // example:
+ // | dojo.fx.combine([
+ // | dojo.fadeIn({ node:node }),
+ // | dojo.fadeOut({ node:otherNode })
+ // | ]).play();
+ return new _combine(animations); // dojo._Animation
+ };
+})();
+
+dojo.declare("dojo.fx.Toggler", null, {
+ // summary:
+ // 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.
+ //
+ // example:
+ // | var t = new dojo.fx.Toggler({
+ // | node: "nodeId",
+ // | showDuration: 500,
+ // | // hideDuration will default to "200"
+ // | showFunc: dojo.wipeIn,
+ // | // hideFunc will default to "fadeOut"
+ // | });
+ // | t.show(100); // delay showing for 100ms
+ // | // ...time passes...
+ // | t.hide();
+
+ // 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.
+
+ 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));
+ },
+
+ // node: DomNode
+ // the node to toggle
+ 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,
+
+ /*=====
+ _showArgs: null,
+ _showAnim: null,
+
+ _hideArgs: null,
+ _hideAnim: null,
+
+ _isShowing: false,
+ _isHiding: false,
+ =====*/
+
+ show: function(delay){
+ // summary: Toggle the node to showing
+ return this.showAnim.play(delay || 0);
+ },
+
+ hide: function(delay){
+ // summary: Toggle the node to hidden
+ return this.hideAnim.play(delay || 0);
+ }
+});
+
+dojo.fx.wipeIn = function(/*Object*/ args){
+ // summary
+ // 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.node = dojo.byId(args.node);
+ var node = args.node, s = node.style;
+
+ var anim = dojo.animateProperty(dojo.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
+ s.overflow="hidden";
+ if(s.visibility=="hidden"||s.display=="none"){
+ s.height="1px";
+ s.display="";
+ s.visibility="";
+ return 1;
+ }else{
+ var height = dojo.style(node, "height");
+ return Math.max(height, 1);
+ }
+ },
+ end: function(){
+ return node.scrollHeight;
+ }
+ }
+ }
+ }, args));
+
+ dojo.connect(anim, "onEnd", function(){
+ s.height = "auto";
+ });
+
+ return anim; // dojo._Animation
+}
+
+dojo.fx.wipeOut = function(/*Object*/ args){
+ // summary
+ // Returns an animation that will shrink node defined in "args"
+ // from it's current height to 1px, and then hide it.
+ var node = args.node = dojo.byId(args.node);
+ var s = node.style;
+
+ var anim = dojo.animateProperty(dojo.mixin({
+ properties: {
+ height: {
+ end: 1 // 0 causes IE to display the whole panel
+ }
+ }
+ }, args));
+
+ dojo.connect(anim, "beforeBegin", function(){
+ s.overflow = "hidden";
+ s.display = "";
+ });
+ dojo.connect(anim, "onEnd", function(){
+ s.height = "auto";
+ s.display = "none";
+ });
+
+ return anim; // dojo._Animation
+}
+
+dojo.fx.slideTo = function(/*Object?*/ args){
+ // summary
+ // Returns an animation that will slide "node"
+ // defined in args Object from its current position to
+ // the position defined by (args.left, args.top).
+ // example:
+ // | dojo.fx.slideTo({ node: node, left:"40", top:"50", unit:"px" }).play()
+
+ var node = (args.node = dojo.byId(args.node));
+
+ var top = null;
+ var left = null;
+
+ var init = (function(n){
+ return function(){
+ var cs = dojo.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 = dojo.coords(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 = dojo.animateProperty(dojo.mixin({
+ properties: {
+ top: { end: args.top||0 },
+ left: { end: args.left||0 }
+ }
+ }, args));
+ dojo.connect(anim, "beforeBegin", anim, init);
+
+ return anim; // dojo._Animation
+}
+
+}
+
+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.declare(
+ "dijit.layout.ContentPane",
+ dijit._Widget,
+{
+ // summary:
+ // A widget that acts as a Container for other widgets, and includes a ajax interface
+ // description:
+ // A widget that can be used as a standalone widget
+ // or as a baseclass 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 .setContent('<b>new content</b>')
+ //
+ // Or you can send it a NodeList, .setContent(dojo.query('div [class=selected]', userSelection))
+ // please note that the nodes in NodeList will copied, not moved
+ //
+ // To do a ajax update use .setHref('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; see setHref();
+ href: "",
+
+ // extractContent: Boolean
+ // Extract visible content from inside of <body> .... </body>
+ extractContent: false,
+
+ // parseOnLoad: Boolean
+ // parse content and create the widgets, if any
+ parseOnLoad: true,
+
+ // preventCache: Boolean
+ // Cache content retreived externally
+ preventCache: false,
+
+ // preload: Boolean
+ // Force load of data 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: Boolean
+ // Tells loading status see onLoad|onUnload for event hooks
+ isLoaded: false,
+
+ // class: String
+ // Class name to apply to ContentPane dom nodes
+ // TODO: this should be called "baseClass" like in the other widgets
+ "class": "dijitContentPane",
+
+ // doLayout: String/Boolean
+ // false - don't adjust size of children
+ // true - looks for the first sizable child widget (ie, having resize() method) and sets it's size to
+ // however big the ContentPane is (TODO: implement)
+ // auto - if there is a single sizable child widget (ie, having resize() method), set it's size to
+ // however big the ContentPane is
+ doLayout: "auto",
+
+ postCreate: function(){
+ // remove the title attribute so it doesn't show up when i hover
+ // over a node
+ this.domNode.title = "";
+
+ if(!this.containerNode){
+ // make getDescendants() work
+ this.containerNode = this.domNode;
+ }
+
+ if(this.preload){
+ this._loadCheck();
+ }
+
+ var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
+ this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
+ this.errorMessage = dojo.string.substitute(this.errorMessage, messages);
+ var curRole = dijit.getWaiRole(this.domNode);
+ if (!curRole){
+ dijit.setWaiRole(this.domNode, "group");
+ }
+
+ // for programatically created ContentPane (with <span> tag), need to muck w/CSS
+ // or it's as though overflow:visible is set
+ dojo.addClass(this.domNode, this["class"]);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ if(this.doLayout != "false" && this.doLayout !== false){
+ this._checkIfSingleChild();
+ if(this._singleChild){
+ this._singleChild.startup();
+ }
+ }
+ this._loadCheck();
+ this.inherited(arguments);
+ },
+
+ _checkIfSingleChild: function(){
+ // summary:
+ // Test if we have exactly one 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.
+
+ // TODO: if there are two child widgets (a data store and a TabContainer, for example),
+ // should still find the TabContainer
+ var childNodes = dojo.query(">", this.containerNode || this.domNode),
+ childWidgets = childNodes.filter("[widgetId]");
+
+ if(childNodes.length == 1 && childWidgets.length == 1){
+ this.isContainer = true;
+ this._singleChild = dijit.byNode(childWidgets[0]);
+ }else{
+ delete this.isContainer;
+ delete this._singleChild;
+ }
+ },
+
+ refresh: function(){
+ // summary:
+ // Force a refresh (re-download) of content, be sure to turn off cache
+
+ // we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+ return this._prepareLoad(true);
+ },
+
+ setHref: function(/*String|Uri*/ href){
+ // summary:
+ // 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
+ this.href = href;
+
+ // we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+ return this._prepareLoad();
+ },
+
+ setContent: function(/*String|DomNode|Nodelist*/data){
+ // summary:
+ // 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 cant run refresh and clear content
+ // refresh should only work if we downloaded the content
+ if(!this._isDownloaded){
+ this.href = "";
+ this._onUnloadHandler();
+ }
+
+ this._setContent(data || "");
+
+ this._isDownloaded = false; // must be set after _setContent(..), pathadjust in dojox.layout.ContentPane
+
+ if(this.parseOnLoad){
+ this._createSubWidgets();
+ }
+
+ if(this.doLayout != "false" && this.doLayout !== false){
+ this._checkIfSingleChild();
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.startup();
+ this._singleChild.resize(this._contentBox || dojo.contentBox(this.containerNode || this.domNode));
+ }
+ }
+
+ this._onLoadHandler();
+ },
+
+ cancel: function(){
+ // summary:
+ // Cancels a inflight download of content
+ if(this._xhrDfd && (this._xhrDfd.fired == -1)){
+ this._xhrDfd.cancel();
+ }
+ delete this._xhrDfd; // garbage collect
+ },
+
+ destroy: function(){
+ // if we have multiple controllers destroying us, bail after the first
+ if(this._beingDestroyed){
+ return;
+ }
+ // make sure we call onUnload
+ this._onUnloadHandler();
+ this._beingDestroyed = true;
+ this.inherited("destroy",arguments);
+ },
+
+ resize: function(size){
+ dojo.marginBox(this.domNode, size);
+
+ // Compute content box size in case we [later] need to size child
+ // 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 node = this.containerNode || this.domNode,
+ mb = dojo.mixin(dojo.marginBox(node), size||{});
+
+ this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+ // If we have a single widget child then size it to fit snugly within my borders
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.resize(this._contentBox);
+ }
+ },
+
+ _prepareLoad: function(forceLoad){
+ // sets up for a xhrLoad, load is deferred until widget onShow
+ // cancels a inflight download
+ this.cancel();
+ this.isLoaded = false;
+ this._loadCheck(forceLoad);
+ },
+
+ _isShown: function(){
+ // summary: returns true if the content is currently shown
+ if("open" in this){
+ return this.open; // for TitlePane, etc.
+ }else{
+ var node = this.domNode;
+ return (node.style.display != 'none') && (node.style.visibility != 'hidden');
+ }
+ },
+
+ _loadCheck: function(/*Boolean*/ forceLoad){
+ // call this when you change onShow (onSelected) status when selected in parent container
+ // it's used as a trigger for href download when this.domNode.display != 'none'
+
+ // sequence:
+ // if no href -> bail
+ // forceLoad -> always load
+ // this.preload -> load when download not in progress, domNode display doesn't matter
+ // this.refreshOnShow -> load when download in progress bails, domNode display !='none' AND
+ // this.open !== false (undefined is ok), isLoaded doesn't matter
+ // else -> load when download not in progress, if this.open !== false (undefined is ok) AND
+ // domNode display != 'none', isLoaded must be false
+
+ var displayState = this._isShown();
+
+ if(this.href &&
+ (forceLoad ||
+ (this.preload && !this._xhrDfd) ||
+ (this.refreshOnShow && displayState && !this._xhrDfd) ||
+ (!this.isLoaded && displayState && !this._xhrDfd)
+ )
+ ){
+ this._downloadExternalContent();
+ }
+ },
+
+ _downloadExternalContent: function(){
+ this._onUnloadHandler();
+
+ // display loading message
+ this._setContent(
+ this.onDownloadStart.call(this)
+ );
+
+ 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.onDownloadEnd.call(self);
+ self._isDownloaded = true;
+ self.setContent.call(self, html); // onload event is called from here
+ }catch(err){
+ self._onError.call(self, 'Content', err); // onContentError
+ }
+ delete self._xhrDfd;
+ return html;
+ });
+
+ hand.addErrback(function(err){
+ if(!hand.cancelled){
+ // show error message in the pane
+ self._onError.call(self, 'Download', err); // onDownloadError
+ }
+ delete self._xhrDfd;
+ return err;
+ });
+ },
+
+ _onLoadHandler: function(){
+ this.isLoaded = true;
+ try{
+ this.onLoad.call(this);
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onLoad code');
+ }
+ },
+
+ _onUnloadHandler: function(){
+ this.isLoaded = false;
+ this.cancel();
+ try{
+ this.onUnload.call(this);
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onUnload code');
+ }
+ },
+
+ _setContent: function(cont){
+ this.destroyDescendants();
+
+ try{
+ var node = this.containerNode || this.domNode;
+ while(node.firstChild){
+ dojo._destroyElement(node.firstChild);
+ }
+ if(typeof cont == "string"){
+ // dijit.ContentPane does only minimal fixes,
+ // No pathAdjustments, script retrieval, style clean etc
+ // some of these should be available in the dojox.layout.ContentPane
+ if(this.extractContent){
+ match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(match){ cont = match[1]; }
+ }
+ node.innerHTML = cont;
+ }else{
+ // domNode or NodeList
+ if(cont.nodeType){ // domNode (htmlNode 1 or textNode 3)
+ node.appendChild(cont);
+ }else{// nodelist or array such as dojo.Nodelist
+ dojo.forEach(cont, function(n){
+ node.appendChild(n.cloneNode(true));
+ });
+ }
+ }
+ }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
+ var errMess = this.onContentError(e);
+ try{
+ node.innerHTML = errMess;
+ }catch(e){
+ console.error('Fatal '+this.id+' could not change content due to '+e.message, e);
+ }
+ }
+ },
+
+ _onError: function(type, err, consoleText){
+ // 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.call(this, errText);
+ }
+ },
+
+ _createSubWidgets: function(){
+ // summary: scan my contents and create subwidgets
+ var rootNode = this.containerNode || this.domNode;
+ try{
+ dojo.parser.parse(rootNode, true);
+ }catch(e){
+ this._onError('Content', e, "Couldn't create widgets in "+this.id
+ +(this.href ? " from "+this.href : ""));
+ }
+ },
+
+ // EVENT's, should be overide-able
+ onLoad: function(e){
+ // summary:
+ // Event hook, is called after everything is loaded and widgetified
+ },
+
+ onUnload: function(e){
+ // summary:
+ // Event hook, is called before old content is cleared
+ },
+
+ onDownloadStart: function(){
+ // summary:
+ // called before download starts
+ // 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
+ return this.loadingMessage;
+ },
+
+ onContentError: function(/*Error*/ error){
+ // summary:
+ // called on DOM faults, require fault etc in content
+ // default is to display errormessage inside pane
+ },
+
+ onDownloadError: function(/*Error*/ error){
+ // summary:
+ // Called when download error occurs, default is to display
+ // errormessage inside pane. Overide function to change that.
+ // The string returned by this function will be the html
+ // that tells the user a error happend
+ return this.errorMessage;
+ },
+
+ onDownloadEnd: function(){
+ // summary:
+ // called when download is finished
+ }
+});
+
+}
+
+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._FormMixin", null,
+ {
+ //
+ // 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').setValues(myObj);
+ // |
+ // | myObj=dijit.byId('myForm').getValues();
+
+ // 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.validate || widget.validate();
+ if (!valid && !didFocus) {
+ // Set focus of the first non-valid widget
+ dijit.scrollIntoView(widget.containerNode||widget.domNode);
+ widget.focus();
+ didFocus = true;
+ }
+ return valid;
+ }), "return item;");
+ },
+
+ setValues: function(/*object*/obj){
+ // summary: fill in form values from a JSON structure
+
+ // 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);
+ });
+
+ // call setValue() or setAttribute('checked') for each widget, according to obj
+ for(var name in map){
+ var widgets = map[name], // array of widgets w/this name
+ values = dojo.getObject(name, false, obj); // list of values for those widgets
+ 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.setValue(dojo.indexOf(values, w.value) != -1);
+ });
+ }else if(widgets[0]._multiValue){
+ // it takes an array (e.g. multi-select)
+ widgets[0].setValue(values);
+ }else{
+ // otherwise, values is a list of values to be assigned sequentially to each widget
+ dojo.forEach(widgets, function(w, i){
+ w.setValue(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 setValue() on the widget)
+
+ 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(){
+ // summary: generate JSON structure from form values
+
+ // get widget values
+ var obj = { };
+ dojo.forEach(this.getDescendants(), function(widget){
+ var name = widget.name;
+ if(!name){ return; }
+
+ // Single value widget (checkbox, radio, or plain <input> type widget
+ var value = (widget.getValue && !widget._getValueDeprecated) ? widget.getValue() : widget.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{
+ // 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{
+ // plain input
+ 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: make sure that every widget that has a validator function returns true
+ return dojo.every(this.getDescendants(), function(widget){
+ return !widget.isValid || widget.isValid();
+ });
+ }
+ });
+
+dojo.declare(
+ "dijit.form.Form",
+ [dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+ {
+ // summary:
+ // Adds conveniences to regular HTML form
+
+ // HTML <FORM> attributes
+ name: "",
+ action: "",
+ method: "",
+ encType: "",
+ "accept-charset": "",
+ accept: "",
+ target: "",
+
+ templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' name='${name}'></form>",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {action: "", method: "", encType: "", "accept-charset": "", accept: "", target: ""}),
+
+ execute: function(/*Object*/ formContents){
+ // summary:
+ // Deprecated: use submit()
+ },
+
+ onExecute: function(){
+ // summary:
+ // Deprecated: use onSubmit()
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "encType":
+ if(dojo.isIE){ this.domNode.encoding = value; }
+ }
+ },
+
+ postCreate: function(){
+ // IE tries to hide encType
+ if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
+ var item = this.srcNodeRef.attributes.getNamedItem('encType');
+ if(item && !item.specified && (typeof item.value == "string")){
+ this.setAttribute('encType', item.value);
+ }
+ }
+ 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
+ return true; // Boolean
+ },
+
+ _onReset: function(e){
+ // 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.currentTarget, target: e.target
+ };
+ // if return value is not exactly false, and haven't called preventDefault(), then reset
+ if(!(this.onReset(faux) === false) && faux.returnValue){
+ this.reset();
+ }
+ dojo.stopEvent(e);
+ return false;
+ },
+
+ _onSubmit: function(e){
+ var fp = dijit.form.Form.prototype;
+ // TODO: remove ths 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. 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
+
+ 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.Dialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Dialog"] = true;
+dojo.provide("dijit.Dialog");
+
+
+
+
+
+
+
+
+
+
+dojo.declare(
+ "dijit.DialogUnderlay",
+ [dijit._Widget, dijit._Templated],
+ {
+ // summary: The component that grays out the screen behind the dialog
+
+ // 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' id='${id}_wrapper'><div class='dijitDialogUnderlay ${class}' id='${id}' dojoAttachPoint='node'></div></div>",
+
+ attributeMap: {},
+
+ postCreate: function(){
+ // summary: Append the underlay to the body
+ dojo.body().appendChild(this.domNode);
+ this.bgIframe = new dijit.BackgroundIframe(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.
+
+ var viewport = dijit.getViewport();
+ var is = this.node.style,
+ os = this.domNode.style;
+
+ os.top = viewport.t + "px";
+ os.left = viewport.l + "px";
+ is.width = viewport.w + "px";
+ is.height = viewport.h + "px";
+
+ // process twice since the scroll bar may have been removed
+ // by the previous resizing
+ var viewport2 = dijit.getViewport();
+ if(viewport.w != viewport2.w){ is.width = viewport2.w + "px"; }
+ if(viewport.h != viewport2.h){ is.height = viewport2.h + "px"; }
+ },
+
+ show: function(){
+ // summary: Show the dialog underlay
+ this.domNode.style.display = "block";
+ this.layout();
+ if(this.bgIframe.iframe){
+ this.bgIframe.iframe.style.display = "block";
+ }
+ this._resizeHandler = this.connect(window, "onresize", "layout");
+ },
+
+ hide: function(){
+ // summary: hides the dialog underlay
+ this.domNode.style.display = "none";
+ if(this.bgIframe.iframe){
+ this.bgIframe.iframe.style.display = "none";
+ }
+ this.disconnect(this._resizeHandler);
+ },
+
+ uninitialize: function(){
+ if(this.bgIframe){
+ this.bgIframe.destroy();
+ }
+ }
+ }
+);
+
+
+dojo.declare("dijit._DialogMixin", null,
+ {
+ attributeMap: dijit._Widget.prototype.attributeMap,
+
+ // execute: Function
+ // User defined function to do stuff when the user hits the submit button
+ execute: function(/*Object*/ formContents){},
+
+ // onCancel: Function
+ // Callback when user has canceled dialog, to notify container
+ // (user shouldn't override)
+ onCancel: function(){},
+
+ // onExecute: Function
+ // Callback when user is about to execute dialog, to notify container
+ // (user shouldn't override)
+ onExecute: function(){},
+
+ _onSubmit: function(){
+ // summary: callback when user hits submit button
+ this.onExecute(); // notify container that we are about to execute
+ this.execute(this.getValues());
+ },
+
+ _getFocusItems: function(/*Node*/ dialogNode){
+ // find focusable Items each time a dialog is opened
+ var focusItem = dijit.getFirstInTabbingOrder(dialogNode);
+ this._firstFocusItem = focusItem ? focusItem : dialogNode;
+ focusItem = dijit.getLastInTabbingOrder(dialogNode);
+ this._lastFocusItem = focusItem ? focusItem : this._firstFocusItem;
+ if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" && dojo.attr(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;
+ }
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.Dialog",
+ [dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+ {
+ // 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:
+ // | <div id="test">test content</div>
+ // | ...
+ // | var foo = new dijit.Dialog({ title: "test dialog" },dojo.byId("test"));
+ // | foo.startup();
+
+ templateString: null,
+ templateString:"<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\">${title}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n",
+
+ // open: Boolean
+ // is True or False depending on state of dialog
+ open: false,
+
+ // duration: Integer
+ // The time in milliseconds it takes the dialog to fade in and out
+ duration: 400,
+
+ // 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,
+
+ // _firstFocusItem: DomNode
+ // The pointer to the first focusable node in the dialog
+ _firstFocusItem:null,
+
+ // _lastFocusItem: DomNode
+ // The pointer to which node has focus prior to our dialog
+ _lastFocusItem:null,
+
+ // doLayout: 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,
+
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {title: "titleBar"}),
+
+ postCreate: function(){
+ dojo.body().appendChild(this.domNode);
+ this.inherited(arguments);
+ var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+ if(this.closeButtonNode){
+ this.closeButtonNode.setAttribute("title", _nlsResources.buttonCancel);
+ }
+ if(this.closeText){
+ this.closeText.setAttribute("title", _nlsResources.buttonCancel);
+ }
+ var s = this.domNode.style;
+ s.visibility = "hidden";
+ s.position = "absolute";
+ s.display = "";
+ s.top = "-9999px";
+
+ this.connect(this, "onExecute", "hide");
+ this.connect(this, "onCancel", "hide");
+ this._modalconnects = [];
+ },
+
+ onLoad: function(){
+ // summary: when href is specified we need to reposition the dialog after the data is loaded
+ this._position();
+ this.inherited(arguments);
+ },
+
+ _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)
+
+ if(this.titleBar){
+ this._moveable = new dojo.dnd.TimedMoveable(this.domNode, { handle: this.titleBar, timeout: 0 });
+ }
+
+ this._underlay = new dijit.DialogUnderlay({
+ id: this.id+"_underlay",
+ "class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
+ });
+
+ var node = this.domNode;
+ this._fadeIn = dojo.fx.combine(
+ [dojo.fadeIn({
+ node: node,
+ duration: this.duration
+ }),
+ dojo.fadeIn({
+ node: this._underlay.domNode,
+ duration: this.duration,
+ onBegin: dojo.hitch(this._underlay, "show")
+ })
+ ]
+ );
+
+ this._fadeOut = dojo.fx.combine(
+ [dojo.fadeOut({
+ node: node,
+ duration: this.duration,
+ onEnd: function(){
+ node.style.visibility="hidden";
+ node.style.top = "-9999px";
+ }
+ }),
+ dojo.fadeOut({
+ node: this._underlay.domNode,
+ duration: this.duration,
+ onEnd: dojo.hitch(this._underlay, "hide")
+ })
+ ]
+ );
+ },
+
+ uninitialize: function(){
+ if(this._fadeIn && this._fadeIn.status() == "playing"){
+ this._fadeIn.stop();
+ }
+ if(this._fadeOut && this._fadeOut.status() == "playing"){
+ this._fadeOut.stop();
+ }
+ if(this._underlay){
+ this._underlay.destroy();
+ }
+ },
+
+ _position: function(){
+ // summary: position modal dialog in center of screen
+
+ if(dojo.hasClass(dojo.body(),"dojoMove")){ return; }
+ var viewport = dijit.getViewport();
+ var mb = dojo.marginBox(this.domNode);
+
+ var style = this.domNode.style;
+ style.left = Math.floor((viewport.l + (viewport.w - mb.w)/2)) + "px";
+ style.top = Math.floor((viewport.t + (viewport.h - mb.h)/2)) + "px";
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary: handles the keyboard events for accessibility reasons
+ if(evt.keyCode){
+ var node = evt.target;
+ if (evt.keyCode == dojo.keys.TAB){
+ this._getFocusItems(this.domNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ // see if we are shift-tabbing from first focusable item on dialog
+ if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+ if(!singleFocusItem){
+ dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.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){
+ if(evt.keyCode == dojo.keys.ESCAPE){
+ this.hide();
+ }else{
+ return; // just let it go
+ }
+ }
+ node = node.parentNode;
+ }
+ // this key is for the disabled document window
+ if(evt.keyCode != dojo.keys.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(dojo.doc.documentElement, "onkeypress", this, "_onKey"));
+
+ dojo.style(this.domNode, "opacity", 0);
+ this.domNode.style.visibility="";
+ this.open = true;
+ this._loadCheck(); // lazy load trigger
+
+ this._position();
+
+ this._fadeIn.play();
+
+ this._savedFocus = dijit.getFocus(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);
+
+ // set timeout to allow the browser to render dialog
+ setTimeout(dojo.hitch(this, function(){
+ dijit.focus(this._firstFocusItem);
+ }), 50);
+ },
+
+ hide: function(){
+ // summary: Hide the dialog
+
+ // if we haven't been initialized yet then we aren't showing and we can just return
+ if(!this._alreadyInitialized){
+ return;
+ }
+
+ if(this._fadeIn.status() == "playing"){
+ this._fadeIn.stop();
+ }
+ this._fadeOut.play();
+
+ if (this._scrollConnected){
+ this._scrollConnected = false;
+ }
+ dojo.forEach(this._modalconnects, dojo.disconnect);
+ this._modalconnects = [];
+ if(this.refocus){
+ this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));
+ }
+ this.open = false;
+ },
+
+ layout: function() {
+ // summary: position the Dialog and the underlay
+ if(this.domNode.style.visibility != "hidden"){
+ this._underlay.layout();
+ this._position();
+ }
+ },
+
+ destroy: function(){
+ dojo.forEach(this._modalconnects, dojo.disconnect);
+ if(this.refocus && this.open){
+ var fo = this._savedFocus;
+ setTimeout(dojo.hitch(dijit,"focus",fo),25);
+ }
+ this.inherited(arguments);
+ }
+ }
+);
+
+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: 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,
+
+ // _firstFocusItem: DomNode
+ // The pointer to the first focusable node in the dialog
+ _firstFocusItem:null,
+
+ // _lastFocusItem: DomNode
+ // The domNode that had focus before we took it.
+ _lastFocusItem: null,
+
+ templateString: null,
+ templateString:"<div class=\"dijitTooltipDialog\" 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=\"presenation\"></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.domNode.className="dijitTooltipDialog " +" dijitTooltipAB"+(corner.charAt(1)=='L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0)=='T' ? "Below" : "Above");
+ },
+
+ onOpen: function(/*Object*/ pos){
+ // summary: called when dialog is displayed
+
+ this._getFocusItems(this.containerNode);
+ this.orient(this.domNode,pos.aroundCorner, pos.corner);
+ this._loadCheck(); // lazy load trigger
+ dijit.focus(this._firstFocusItem);
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary: keep keyboard focus in dialog; close dialog on escape key
+ var node = evt.target;
+ if (evt.keyCode == dojo.keys.TAB){
+ this._getFocusItems(this.containerNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ if(evt.keyCode == dojo.keys.ESCAPE){
+ this.onCancel();
+ }else if(node == this._firstFocusItem && evt.shiftKey && evt.keyCode == dojo.keys.TAB){
+ if(!singleFocusItem){
+ dijit.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(node == this._lastFocusItem && evt.keyCode == dojo.keys.TAB && !evt.shiftKey){
+ if(!singleFocusItem){
+ dijit.focus(this._firstFocusItem); // send focus to first item in dialog
+ }
+ dojo.stopEvent(evt);
+ }else if(evt.keyCode == dojo.keys.TAB){
+ // we want the browser's default tab handling to move focus
+ // but we don't want the tab to propagate upwards
+ evt.stopPropagation();
+ }
+ }
+ }
+);
+
+
+}
+
+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.doc.selection){ //IE
+ 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;
+ }
+ },
+
+ getSelectedText: function(){
+ // summary:
+ // Return the text (no html tags) included in the current selection or null if no text is selected
+ if(dojo.doc.selection){ //IE
+ 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();
+ }
+ }
+ return ''
+ },
+
+ getSelectedHtml: function(){
+ // summary:
+ // Return the html of the current selection or null if unavailable
+ if(dojo.doc.selection){ //IE
+ 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 frag = selection.getRangeAt(0).cloneContents();
+ var div = dojo.doc.createElement("div");
+ div.appendChild(frag);
+ return div.innerHTML;
+ }
+ 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(this.getType() == "control"){
+ if(dojo.doc.selection){ //IE
+ 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(this.getType() == "control"){
+ var p = this.getSelectedElement();
+ if(p){ return p.parentNode; }
+ }else{
+ if(dojo.doc.selection){ //IE
+ return dojo.doc.selection.createRange().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)
+ return this.getAncestorElement.apply(this, arguments) != null;
+ },
+
+ 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)
+
+ var node = this.getSelectedElement() || this.getParentElement();
+ return this.getParentOfType(node, arguments);
+ },
+
+ isTag: function(/*DomNode*/node, /*Array*/tags){
+ 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;
+ }
+ }
+ }
+ return "";
+ },
+
+ getParentOfType: function(/*DomNode*/node, /*Array*/tags){
+ while(node){
+ if(this.isTag(node, tags).length){
+ return node;
+ }
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ collapse: function(/*Boolean*/beginning) {
+ // summary: clear current selection
+ 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.doc.selection){ // IE
+ var range = dojo.doc.selection.createRange();
+ range.collapse(beginning);
+ range.select();
+ }
+ },
+
+ remove: function(){
+ // summary: delete current selection
+ var _s = dojo.doc.selection;
+ if(_s){ //IE
+ if(_s.type.toLowerCase() != "none"){
+ _s.clear();
+ }
+ return _s;
+ }else{
+ _s = dojo.global.getSelection();
+ _s.deleteFromDocument();
+ return _s;
+ }
+ },
+
+ selectElementChildren: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+ // summary:
+ // clear previous selection and select the content of the node
+ // (excluding the node itself)
+ var _window = dojo.global;
+ var _document = dojo.doc;
+ element = dojo.byId(element);
+ if(_document.selection && dojo.body().createTextRange){ // IE
+ var 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(_window.getSelection){
+ var selection = _window.getSelection();
+ if(selection.setBaseAndExtent){ // Safari
+ selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
+ }else if(selection.selectAllChildren){ // Mozilla
+ selection.selectAllChildren(element);
+ }
+ }
+ },
+
+ selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
+ // summary:
+ // clear previous selection and select element (including all its children)
+ var range, _document = dojo.doc;
+ element = dojo.byId(element);
+ if(_document.selection && dojo.body().createTextRange){ // IE
+ 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 = dojo.global.getSelection();
+ // FIXME: does this work on Safari?
+ if(selection.removeAllRanges){ // Mozilla
+ range = _document.createRange();
+ range.selectNode(element);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ }
+ }
+});
+
+}
+
+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
+ output = '<'+node.nodeName.toLowerCase();
+
+ //store the list of attributes and sort it to have the
+ //attributes appear in the dictionary order
+ var attrarray = [];
+ if(dojo.isIE && node.outerHTML){
+ var s = node.outerHTML;
+ s = s.substr(0,s.indexOf('>'));
+ s = s.replace(/(['"])[^"']*\1/g, '');//to make the following regexp safe
+ var reg = /([^\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;
+ }
+ }
+ if(key=='style'){
+ attrarray.push([key, node.style.cssText.toLowerCase()]);
+ }else{
+ attrarray.push([key, key=='class'?node.className:node.getAttribute(key)]);
+ }
+ }
+ }
+ }else{
+ var attr, i=0, attrs = node.attributes;
+ while((attr=attrs[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);
+ });
+ i=0;
+ while((attr=attrarray[i++])){
+ output += ' '+attr[0]+'="'+
+ (dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1],true) : attr[1])+'"';
+ }
+ if(node.childNodes.length){
+ output += '>' + dijit._editor.getChildrenHtml(node)+'</'+node.nodeName.toLowerCase()+'>';
+ }else{
+ output += ' />';
+ }
+ break;
+ 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;
+ var i=0;
+ var node;
+ while((node=nodes[i++])){
+ 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";
+ var s = savetextarea.style;
+ s.display='none';
+ s.position='absolute';
+ s.top="-100px";
+ s.left="-100px";
+ s.height="3px";
+ s.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, {
+ constructor: function(){
+ // summary:
+ // dijit._editor.RichText is the core of the WYSIWYG editor in dojo, which
+ // provides the basic editing features. It also encapsulates the differences
+ // of different js engines for various browsers
+ //
+ // contentPreFilters: Array
+ // pre content filter function register array.
+ // these filters will be executed before the actual
+ // editing area get the html content
+ this.contentPreFilters = [];
+
+ // contentPostFilters: Array
+ // post content filter function register array.
+ // these will be used on the resulting html
+ // from contentDomPostFilters. The resuling
+ // content is the final html (returned by getValue())
+ this.contentPostFilters = [];
+
+ // contentDomPreFilters: Array
+ // 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: Array
+ // 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: Array
+ // array to store all the stylesheets applied to the editing area
+ this.editingAreaStyleSheets=[];
+
+ this._keyHandlers = {};
+ this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
+ if(dojo.isMoz){
+ this.contentPreFilters.push(this._fixContentForMoz);
+ this.contentPostFilters.push(this._removeMozBogus);
+ }else if(dojo.isSafari){
+ this.contentPostFilters.push(this._removeSafariBogus);
+ }
+ //this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
+
+ this.onLoadDeferred = new dojo.Deferred();
+ },
+
+ // inheritWidth: Boolean
+ // whether to inherit the parent's width or simply use 100%
+ inheritWidth: false,
+
+ // focusOnLoad: Boolean
+ // whether focusing into this instance of richtext when page onload
+ focusOnLoad: false,
+
+ // name: String
+ // If a save name is specified the content is saved and restored when the user
+ // leave this page can come back, or if the editor is not properly closed after
+ // editing has started.
+ name: "",
+
+ // styleSheets: String
+ // semicolon (";") separated list of css files for the editing area
+ styleSheets: "",
+
+ // _content: 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=""
+ height: "300px",
+
+ // minHeight: String
+ // The minimum height that the editor should have
+ minHeight: "1em",
+
+ // isClosed: Boolean
+ isClosed: true,
+
+ // isLoaded: Boolean
+ isLoaded: false,
+
+ // _SEPARATOR: String
+ // used to concat contents from multiple textareas into a single string
+ _SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@",
+
+ // onLoadDeferred: dojo.Deferred
+ // deferred which is fired when the editor finishes loading
+ onLoadDeferred: null,
+
+ postCreate: function(){
+ // summary: init
+ 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.
+ var exec = function(cmd, arg){
+ return arguments.length == 1 ? function(){ this.execCommand(cmd); } :
+ function(){ this.execCommand(cmd, arg); };
+ };
+
+ var ctrlKeyHandlers = { b: exec("bold"),
+ i: exec("italic"),
+ u: exec("underline"),
+ a: exec("selectall"),
+ s: function(){ this.save(true); },
+
+ "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, this.KEY_CTRL, ctrlKeyHandlers[key]);
+ }
+ },
+
+ // events: Array
+ // events which should be connected to the underlying editing area
+ events: ["onKeyPress", "onKeyDown", "onKeyUp", "onClick"],
+
+ // events: Array
+ // events which should be connected to the underlying editing
+ // area, events in this array will be addListener with
+ // capture=true
+ captureEvents: [],
+
+ _editorCommandsLocalized: false,
+ _localizeEditorCommands: function(){
+ 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
+
+ //in the array below, ul can not come directly after ol,
+ //otherwise the queryCommandValue returns Normal for it
+ var formats = ['p', 'pre', 'address', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'div', 'ul'];
+ var localhtml = "", format, i=0;
+ while((format=formats[i++])){
+ if(format.charAt(1) != 'l'){
+ localhtml += "<"+format+"><span>content</span></"+format+">";
+ }else{
+ localhtml += "<"+format+"><li>content</li></"+format+">";
+ }
+ }
+ //queryCommandValue returns empty if we hide editNode, so move it out of screen temporary
+ var div=dojo.doc.createElement('div');
+ div.style.position = "absolute";
+ div.style.left = "-2000px";
+ div.style.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] = dojo.doc.queryCommandValue("formatblock");//this.queryCommandValue("formatblock");
+ this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
+ node = node.nextSibling;
+ }
+ dojo.doc.body.removeChild(div);
+ },
+
+ open: function(/*DomNode?*/element){
+ // summary:
+ // Transforms the node referenced in this.domNode into a rich text editing
+ // node. This will result in the creation and replacement with an <iframe>
+ // if designMode(FF)/contentEditable(IE) is used.
+
+ 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"])){ this.domNode = element; } // else unchanged
+
+ var html;
+ if( (this.domNode["nodeName"])&&
+ (this.domNode.nodeName.toLowerCase() == "textarea")){
+ // if we were created from a textarea, then we need to create a
+ // new editing harness node.
+ this.textarea = this.domNode;
+ this.name=this.textarea.name;
+ html = this._preFilterContent(this.textarea.value);
+ this.domNode = dojo.doc.createElement("div");
+ this.domNode.setAttribute('widgetId',this.id);
+ this.textarea.removeAttribute('widgetId');
+ this.domNode.cssText = this.textarea.cssText;
+ this.domNode.className += " "+this.textarea.className;
+ dojo.place(this.domNode, this.textarea, "before");
+ var tmpFunc = dojo.hitch(this, function(){
+ //some browsers refuse to submit display=none textarea, so
+ //move the textarea out of screen instead
+ dojo.attr(this.textarea, 'tabIndex', '-1');
+ with(this.textarea.style){
+ display = "block";
+ position = "absolute";
+ left = top = "-1000px";
+
+ if(dojo.isIE){ //nasty IE bug: abnormal formatting if overflow is not hidden
+ this.__overflow = overflow;
+ overflow = "hidden";
+ }
+ }
+ });
+ if(dojo.isIE){
+ setTimeout(tmpFunc, 10);
+ }else{
+ tmpFunc();
+ }
+
+ // this.domNode.innerHTML = html;
+
+// if(this.textarea.form){
+// // FIXME: port: this used to be before advice!!!
+// dojo.connect(this.textarea.form, "onsubmit", this, function(){
+// // FIXME: should we be calling close() here instead?
+// this.textarea.value = this.getValue();
+// });
+// }
+ }else{
+ html = this._preFilterContent(dijit._editor.getChildrenHtml(this.domNode));
+ this.domNode.innerHTML = '';
+ }
+ if(html == ""){ html = "&nbsp;"; }
+
+ var content = dojo.contentBox(this.domNode);
+ // var content = dojo.contentBox(this.srcNodeRef);
+ this._oldHeight = content.h;
+ this._oldWidth = content.w;
+
+ // 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( (this.domNode["nodeName"]) &&
+ (this.domNode.nodeName == "LI") ){
+ this.domNode.innerHTML = " <br>";
+ }
+
+ this.editingArea = dojo.doc.createElement("div");
+ this.domNode.appendChild(this.editingArea);
+
+ 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);
+ break;
+ }
+ }
+ }
+
+ // FIXME: need to do something different for Opera/Safari
+ this.connect(window, "onbeforeunload", "_saveContent");
+ // dojo.connect(window, "onunload", this, "_saveContent");
+ }
+
+ this.isClosed = false;
+ // Safari's selections go all out of whack if we do it inline,
+ // so for now IE is our only hero
+ //if(typeof dojo.doc.body.contentEditable != "undefined"){
+ if(dojo.isIE || dojo.isSafari || dojo.isOpera){ // contentEditable, easy
+
+ if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){
+ console.debug("dijit._editor.RichText: 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");
+ }
+
+ var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"");
+ var ifr = this.editorObject = this.iframe = dojo.doc.createElement('iframe');
+ ifr.id = this.id+"_iframe";
+ ifr.src = burl;
+ ifr.style.border = "none";
+ ifr.style.width = "100%";
+ ifr.frameBorder = 0;
+ // ifr.style.scrolling = this.height ? "auto" : "vertical";
+ this.editingArea.appendChild(ifr);
+ var h = null; // set later in non-ie6 branch
+ var loadFunc = dojo.hitch( this, function(){
+ if(h){ dojo.disconnect(h); h = null; }
+ this.window = ifr.contentWindow;
+ var d = this.document = this.window.document;
+ d.open();
+ d.write(this._getIframeDocTxt(html));
+ d.close();
+
+ 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;
+ }
+
+ if(dojo.isIE){
+ this._localizeEditorCommands();
+ }
+
+ this.onLoad();
+ this.savedContent = this.getValue(true);
+ });
+ if(dojo.isIE && dojo.isIE < 7){ // IE 6 is a steaming pile...
+ var t = setInterval(function(){
+ if(ifr.contentWindow.isLoaded){
+ clearInterval(t);
+ loadFunc();
+ }
+ }, 100);
+ }else{ // blissful sanity!
+ h = dojo.connect(
+ ((dojo.isIE) ? ifr.contentWindow : ifr), "onload", loadFunc
+ );
+ }
+ }else{ // designMode in iframe
+ this._drawIframe(html);
+ this.savedContent = this.getValue(true);
+ }
+
+ // TODO: this is a guess at the default line-height, kinda works
+ if(this.domNode.nodeName == "LI"){ this.domNode.lastChild.style.marginTop = "-1.2em"; }
+ this.domNode.className += " RichTextEditable";
+ },
+
+ //static cache variables shared among all instance of this class
+ _local2NativeFormatNames: {},
+ _native2LocalFormatNames: {},
+ _localizedIframeTitles: null,
+
+ _getIframeDocTxt: function(/* String */ html){
+ var _cs = dojo.getComputedStyle(this.domNode);
+ if(dojo.isIE || (!this.height && !dojo.isMoz)){
+ html="<div>"+html+"</div>";
+ }
+ 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{
+ lineHeight = "1.0";
+ }
+ return [
+ this.isLeftToRight() ? "<html><head>" : "<html dir='rtl'><head>",
+ (dojo.isMoz ? "<title>" + this._localizedIframeTitles.iframeEditTitle + "</title>" : ""),
+ "<style>",
+ "body,html {",
+ " background:transparent;",
+ " font:", font, ";",
+ " padding: 1em 0 0 0;",
+ " margin: -1em 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+ " height: 100%;",
+ "}",
+ // TODO: left positioning will cause contents to disappear out of view
+ // if it gets too wide for the visible area
+ "body{",
+ " top:0px; left:0px; right:0px;",
+ ((this.height||dojo.isOpera) ? "" : "position: fixed;"),
+ // FIXME: IE 6 won't understand min-height?
+ " min-height:", this.minHeight, ";",
+ " line-height:", lineHeight,
+ "}",
+ "p{ margin: 1em 0 !important; }",
+ (this.height ? // height:auto undoes the height:100%
+ "" : "body,html{height:auto;overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*for FF to show vertical scrollbar*/}"
+ ),
+ "li > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; } ",
+ "li{ min-height:1.2em; }",
+ "</style>",
+ this._applyEditingAreaStyleSheets(),
+ "</head><body>"+html+"</body></html>"
+ ].join(""); // String
+ },
+
+ _drawIframe: function(/*String*/html){
+ // summary:
+ // Draws an iFrame using the existing one if one exists.
+ // Used by Mozilla, Safari, and Opera
+
+ if(!this.iframe){
+ var ifr = this.iframe = dojo.doc.createElement("iframe");
+ ifr.id=this.id;
+ // this.iframe.src = "about:blank";
+ // dojo.doc.body.appendChild(this.iframe);
+ // console.debug(this.iframe.contentDocument.open());
+ // dojo.body().appendChild(this.iframe);
+ var ifrs = ifr.style;
+ // ifrs.border = "1px solid black";
+ ifrs.border = "none";
+ ifrs.lineHeight = "0"; // squash line height
+ ifrs.verticalAlign = "bottom";
+// ifrs.scrolling = this.height ? "auto" : "vertical";
+ this.editorObject = this.iframe;
+ // get screen reader text for mozilla here, too
+ this._localizedIframeTitles = dojo.i18n.getLocalization("dijit.form", "Textarea");
+ // need to find any associated label element and update iframe document title
+ var label=dojo.query('label[for="'+this.id+'"]');
+ if(label.length){
+ this._localizedIframeTitles.iframeEditTitle = label[0].innerHTML + " " + this._localizedIframeTitles.iframeEditTitle;
+ }
+ }
+ // opera likes this to be outside the with block
+ // this.iframe.src = "javascript:void(0)";//dojo.uri.dojoUri("src/widget/templates/richtextframe.html") + ((dojo.doc.domain != currentDomain) ? ("#"+dojo.doc.domain) : "");
+ this.iframe.style.width = this.inheritWidth ? this._oldWidth : "100%";
+
+ if(this.height){
+ this.iframe.style.height = this.height;
+ }else{
+ this.iframe.height = this._oldHeight;
+ }
+
+ var tmpContent;
+ if(this.textarea){
+ tmpContent = this.srcNodeRef;
+ }else{
+ tmpContent = dojo.doc.createElement('div');
+ tmpContent.style.display="none";
+ tmpContent.innerHTML = html;
+ //append tmpContent to under the current domNode so that the margin
+ //calculation below is correct
+ this.editingArea.appendChild(tmpContent);
+ }
+
+ this.editingArea.appendChild(this.iframe);
+
+ //do we want to show the content before the editing area finish loading here?
+ //if external style sheets are used for the editing area, the appearance now
+ //and after loading of the editing area won't be the same (and padding/margin
+ //calculation above may not be accurate)
+ // tmpContent.style.display = "none";
+ // this.editingArea.appendChild(this.iframe);
+
+ var _iframeInitialized = false;
+ // console.debug(this.iframe);
+ // var contentDoc = this.iframe.contentWindow.document;
+
+
+ // note that on Safari lower than 420+, we have to get the iframe
+ // by ID in order to get something w/ a contentDocument property
+
+ var contentDoc = this.iframe.contentDocument;
+ contentDoc.open();
+ if(dojo.isAIR){
+ contentDoc.body.innerHTML = html;
+ }else{
+ contentDoc.write(this._getIframeDocTxt(html));
+ }
+ contentDoc.close();
+
+ // now we wait for onload. Janky hack!
+ var ifrFunc = dojo.hitch(this, function(){
+ if(!_iframeInitialized){
+ _iframeInitialized = true;
+ }else{ return; }
+ if(!this.editNode){
+ try{
+ if(this.iframe.contentWindow){
+ this.window = this.iframe.contentWindow;
+ this.document = this.iframe.contentWindow.document
+ }else if(this.iframe.contentDocument){
+ // for opera
+ this.window = this.iframe.contentDocument.window;
+ this.document = this.iframe.contentDocument;
+ }
+ if(!this.document.body){
+ throw 'Error';
+ }
+ }catch(e){
+ setTimeout(ifrFunc,500);
+ _iframeInitialized = false;
+ return;
+ }
+
+ dojo._destroyElement(tmpContent);
+ this.onLoad();
+ }else{
+ dojo._destroyElement(tmpContent);
+ this.editNode.innerHTML = html;
+ this.onDisplayChanged();
+ }
+ this._preDomFilterContent(this.editNode);
+ });
+
+ ifrFunc();
+ },
+
+ _applyEditingAreaStyleSheets: function(){
+ // summary:
+ // apply the specified css files in styleSheets
+ 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);
+ 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");
+ with(stylesheet){
+ rel="stylesheet";
+ type="text/css";
+ 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: true,
+ _mozSettingProps: ['styleWithCSS','insertBrOnReturn'],
+ setDisabled: function(/*Boolean*/ disabled){
+ if(dojo.isIE || dojo.isSafari || dojo.isOpera){
+ if(dojo.isIE){ this.editNode.unselectable = "on"; } // prevent IE from setting focus
+ this.editNode.contentEditable = !disabled;
+ if(dojo.isIE){
+ var _this = this;
+ setTimeout(function(){ _this.editNode.unselectable = "off"; }, 0);
+ }
+ }else{ //moz
+ if(disabled){
+ //AP: why isn't this set in the constructor, or put in mozSettingProps as a hash?
+ this._mozSettings=[false,this.blockNodeForEnter==='BR'];
+ }
+ this.document.designMode=(disabled?'off':'on');
+ if(!disabled && this._mozSettings){
+ dojo.forEach(this._mozSettingProps, function(s,i){
+ this.document.execCommand(s,false,this._mozSettings[i]);
+ },this);
+ }
+// this.document.execCommand('contentReadOnly', false, disabled);
+// if(disabled){
+// this.blur(); //to remove the blinking caret
+// }
+ }
+ this.disabled = disabled;
+ },
+
+/* Event handlers
+ *****************/
+
+ _isResized: function(){ return false; },
+
+ onLoad: function(/* Event */ e){
+ // summary: handler after the content of the document finishes loading
+ this.isLoaded = true;
+ if(!this.window.__registeredWindow){
+ this.window.__registeredWindow=true;
+ dijit.registerWin(this.window);
+ }
+ if(!dojo.isIE && (this.height || dojo.isMoz)){
+ this.editNode=this.document.body;
+ }else{
+ 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(); }
+ }
+ }
+
+ try{
+ this.setDisabled(false);
+ }catch(e){
+ // Firefox throws an exception if the editor is initially hidden
+ // so, if this fails, try again onClick by adding "once" advice
+ var handle = dojo.connect(this, "onClick", this, function(){
+ this.setDisabled(false);
+ dojo.disconnect(handle);
+ });
+ }
+
+ this._preDomFilterContent(this.editNode);
+
+ var events=this.events.concat(this.captureEvents),i=0,et;
+ while((et=events[i++])){
+ this.connect(this.document, et.toLowerCase(), et);
+ }
+ if(!dojo.isIE){
+ try{ // sanity check for Mozilla
+ //AP: what's the point of this?
+// this.document.execCommand("useCSS", false, true); // old moz call
+ this.document.execCommand("styleWithCSS", false, false); // new moz call
+ //this.document.execCommand("insertBrOnReturn", false, false); // new moz call
+ }catch(e2){ }
+ // FIXME: when scrollbars appear/disappear this needs to be fired
+ }else{ // IE contentEditable
+ // give the node Layout on IE
+ this.connect(this.document, "onmousedown", "_onMouseDown"); // #4996 fix focus
+ this.editNode.style.zoom = 1.0;
+ }
+
+ if(this.focusOnLoad){
+ setTimeout(dojo.hitch(this, "focus"), 0); // have to wait for IE to set unselectable=off
+ }
+
+ this.onDisplayChanged(e);
+ if(this.onLoadDeferred){
+ this.onLoadDeferred.callback(true);
+ }
+ },
+
+ onKeyDown: function(/* Event */ e){
+ // summary: Fired on keydown
+
+ // 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(dojo.isIE){
+ if(e.keyCode == dojo.keys.TAB && e.shiftKey && !e.ctrlKey && !e.altKey){
+ // focus the BODY so the browser will tab away from it instead
+ this.iframe.focus();
+ }else if(e.keyCode == dojo.keys.TAB && !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);
+ }
+ }else if(dojo.isMoz){
+ if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+ // update iframe document title for screen reader
+ this.iframe.contentDocument.title = this._localizedIframeTitles.iframeFocusTitle;
+
+ // Place focus on the iframe. A subsequent tab or shift tab will put focus
+ // on the correct control.
+ this.iframe.focus(); // this.focus(); won't work
+ dojo.stopEvent(e);
+ }else if(e.keyCode == dojo.keys.TAB && e.shiftKey){
+ // if there is a toolbar, set focus to it, otherwise ignore
+ if(this.toolbar){
+ this.toolbar.focus();
+ }
+ dojo.stopEvent(e);
+ }
+ }
+ },
+
+ onKeyUp: function(e){
+ // summary: Fired on keyup
+ return;
+ },
+
+ KEY_CTRL: 1,
+ KEY_SHIFT: 2,
+
+ onKeyPress: function(e){
+ // summary: Fired on keypress
+
+ // handle the various key events
+ var modifiers = (e.ctrlKey && !e.altKey) ? this.KEY_CTRL : 0 | e.shiftKey ? this.KEY_SHIFT : 0;
+
+ var key = e.keyChar || e.keyCode;
+ if(this._keyHandlers[key]){
+ // console.debug("char:", e.key);
+ var handlers = this._keyHandlers[key], i = 0, h;
+ while((h = handlers[i++])){
+ if(modifiers == h.modifiers){
+ if(!h.handler.apply(this,arguments)){
+ e.preventDefault();
+ }
+ break;
+ }
+ }
+ }
+
+ // function call after the character has been inserted
+ setTimeout(dojo.hitch(this, function(){
+ this.onKeyPressed(e);
+ }), 1);
+ },
+
+ addKeyHandler: function(/*String*/key, /*Int*/modifiers, /*Function*/handler){
+ // summary: add a handler for a keyboard shortcut
+ if(!dojo.isArray(this._keyHandlers[key])){ this._keyHandlers[key] = []; }
+ this._keyHandlers[key].push({
+ modifiers: modifiers || 0,
+ handler: handler
+ });
+ },
+
+ onKeyPressed: function(/*Event*/e){
+ this.onDisplayChanged(/*e*/); // can't pass in e
+ },
+
+ onClick: function(/*Event*/e){
+// console.info('onClick',this._tryDesignModeOn);
+ this.onDisplayChanged(e);
+ },
+
+ _onMouseDown: function(/*Event*/e){ // IE only to prevent 2 clicks to focus
+ if(!this._focused && !this.disabled){
+ this.focus();
+ }
+ },
+
+ _onBlur: function(e){
+ this.inherited(arguments);
+ var _c=this.getValue(true);
+ if(_c!=this.savedContent){
+ this.onChange(_c);
+ this.savedContent=_c;
+ }
+ if(dojo.isMoz && this.iframe){
+ this.iframe.contentDocument.title = this._localizedIframeTitles.iframeEditTitle;
+ }
+ },
+ _initialFocus: true,
+ _onFocus: function(/*Event*/e){
+ // summary: Fired on focus
+ this.inherited(arguments);
+ if(dojo.isMoz && this._initialFocus){
+ this._initialFocus = false;
+ if(this.editNode.innerHTML.replace(/^\s+|\s+$/g, "") == "&nbsp;"){
+ this.placeCursorAtStart();
+// this.execCommand("selectall");
+// this.window.getSelection().collapseToStart();
+ }
+ }
+ },
+
+ // TODO: why is this needed - should we deprecate this ?
+ blur: function(){
+ // summary: remove focus from this instance
+ 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 instance
+ 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
+
+// var _t=new Date();
+ if(!this._updateTimer){
+// this._lastUpdate=_t;
+ if(this._updateTimer){
+ clearTimeout(this._updateTimer);
+ }
+ this._updateTimer=setTimeout(dojo.hitch(this,this.onNormalizedDisplayChanged),this.updateInterval);
+ }
+ },
+ onNormalizedDisplayChanged: function(){
+ // summary:
+ // This event is fired every updateInterval ms or more
+ // description:
+ // If something needs to happen immidiately after a
+ // user change, please use onDisplayChanged instead
+ this._updateTimer=null;
+ },
+ onChange: function(newContent){
+ // summary:
+ // this is fired if and only if the editor loses focus and
+ // the content is changed
+
+// console.log('onChange',newContent);
+ },
+ _normalizeCommand: function(/*String*/cmd){
+ // summary:
+ // Used as the advice function by dojo.connect to map our
+ // normalized set of commands to those supported by the target
+ // browser
+
+ var command = cmd.toLowerCase();
+ if(command == "hilitecolor" && !dojo.isMoz){
+ command = "backcolor";
+ }
+
+ return command;
+ },
+
+ 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
+ var ie = 1;
+ var mozilla = 1 << 1;
+ var safari = 1 << 2;
+ var opera = 1 << 3;
+ var safari420 = 1 << 4;
+
+ var gt420 = dojo.isSafari;
+
+ function isSupportedBy(browsers){
+ return {
+ ie: Boolean(browsers & ie),
+ mozilla: Boolean(browsers & mozilla),
+ safari: Boolean(browsers & safari),
+ safari420: Boolean(browsers & safari420),
+ 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 | safari | 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":
+ supportedBy = isSupportedBy(mozilla | ie | opera | safari420);
+ 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 | safari420);
+ 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.isSafari && supportedBy.safari) ||
+ (gt420 && supportedBy.safari420) ||
+ (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
+ 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);
+ if(argument != undefined){
+ if(command == "heading"){
+ throw new Error("unimplemented");
+ }else if((command == "formatblock") && dojo.isIE){
+ argument = '<'+argument+'>';
+ }
+ }
+ if(command == "inserthtml"){
+ argument=this._preFilterContent(argument);
+ 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);
+ returnValue=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
+ dojo.withGlobal(this.window,'remove',dijit._editor.selection);
+ returnValue=true;
+ }else{
+ returnValue=this.document.execCommand(command, false, argument);
+ }
+ }else if(
+ (command == "unlink")&&
+ (this.queryCommandEnabled("unlink"))&&
+ (dojo.isMoz || dojo.isSafari)
+ ){
+ // fix up unlink in Mozilla to unlink the link and not just the selection
+
+ // grab selection
+ // Mozilla gets upset if we just store the range so we have to
+ // get the basic properties and recreate to save the selection
+ var selection = this.window.getSelection();
+ // var selectionRange = selection.getRangeAt(0);
+ // var selectionStartContainer = selectionRange.startContainer;
+ // var selectionStartOffset = selectionRange.startOffset;
+ // var selectionEndContainer = selectionRange.endContainer;
+ // var selectionEndOffset = selectionRange.endOffset;
+
+ // select our link and unlink
+ var a = dojo.withGlobal(this.window, "getAncestorElement",dijit._editor.selection, ['a']);
+ dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [a]);
+
+ returnValue=this.document.execCommand("unlink", false, null);
+ }else if((command == "hilitecolor")&&(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(command, false, argument);
+ this.document.execCommand("styleWithCSS", false, false);
+
+ }else if((dojo.isIE)&&( (command == "backcolor")||(command == "forecolor") )){
+ // 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 = arguments.length > 1 ? argument : null;
+ returnValue = this.document.execCommand(command, false, argument);
+
+ // timeout is workaround for weird IE behavior were the text
+ // selection gets correctly re-created, but subsequent input
+ // apparently isn't bound to it
+// setTimeout(function(){tr.select();}, 1);
+ }else{
+ argument = arguments.length > 1 ? argument : null;
+// if(dojo.isMoz){
+// this.document = this.iframe.contentWindow.document
+// }
+
+ 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
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ if(dojo.isMoz || dojo.isSafari){
+ if(command == "unlink"){ // mozilla returns true always
+ // console.debug(dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']));
+ return dojo.withGlobal(this.window, "hasAncestorElement",dijit._editor.selection, ['a']);
+ }else if(command == "inserttable"){
+ return true;
+ }
+ }
+ //see #4109
+ if(dojo.isSafari){
+ if(command == "copy"){
+ command = "cut";
+ }else if(command == "paste"){
+ return true;
+ }
+ }
+
+ // return this.document.queryCommandEnabled(command);
+ var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
+ return elem.queryCommandEnabled(command);
+ },
+
+ queryCommandState: function(command){
+ // summary: check the state of a given command
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ return this.document.queryCommandState(command);
+ },
+
+ queryCommandValue: function(command){
+ // summary: check the value of a given command
+
+ if(this.disabled){ return false; }
+ command = this._normalizeCommand(command);
+ if(dojo.isIE && command == "formatblock"){
+ return this._local2NativeFormatNames[this.document.queryCommandValue(command)];
+ }
+ return this.document.queryCommandValue(command);
+ },
+
+ // Misc.
+
+ placeCursorAtStart: function(){
+ // summary:
+ // place the cursor at the start of the editing area
+ this.focus();
+
+ //see comments in placeCursorAtEnd
+ var isvalid=false;
+ if(dojo.isMoz){
+ var first=this.editNode.firstChild;
+ while(first){
+ if(first.nodeType == 3){
+ if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElement", dijit._editor.selection, [first]);
+ break;
+ }
+ }else if(first.nodeType == 1){
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [first]);
+ break;
+ }
+ first = first.nextSibling;
+ }
+ }else{
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+ }
+ if(isvalid){
+ dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [true]);
+ }
+ },
+
+ placeCursorAtEnd: function(){
+ // summary:
+ // place the cursor at the end of the editing area
+ 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;
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+ break;
+ }
+ }else if(last.nodeType == 1){
+ isvalid=true;
+ if(last.lastChild){
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last.lastChild]);
+ }else{
+ dojo.withGlobal(this.window, "selectElement",dijit._editor.selection, [last]);
+ }
+ break;
+ }
+ last = last.previousSibling;
+ }
+ }else{
+ isvalid=true;
+ dojo.withGlobal(this.window, "selectElementChildren",dijit._editor.selection, [this.editNode]);
+ }
+ if(isvalid){
+ dojo.withGlobal(this.window, "collapse", dijit._editor.selection, [false]);
+ }
+ },
+
+ getValue: function(/*Boolean?*/nonDestructive){
+ // summary:
+ // return the current content of the editing area (post filters are applied)
+ if(this.textarea){
+ if(this.isClosed || !this.isLoaded){
+ return this.textarea.value;
+ }
+ }
+
+ return this._postFilterContent(null, nonDestructive);
+ },
+
+ setValue: function(/*String*/html){
+ // summary:
+ // this function set the content. No undo history is preserved
+
+ if(!this.isLoaded){
+ // try again after the editor is finished loading
+ this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
+ this.setValue(html);
+ }));
+ return;
+ }
+
+ if(this.textarea && (this.isClosed || !this.isLoaded)){
+ this.textarea.value=html;
+ }else{
+ html = this._preFilterContent(html);
+ var node = this.isClosed ? this.domNode : this.editNode;
+ 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)
+ 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(dojo.isMoz && !html){ 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
+ var ec = html;
+ dojo.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } });
+ return ec;
+ },
+ _preDomFilterContent: function(/*DomNode*/dom){
+ // summary:
+ // filter the input
+ 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
+ var ec;
+ if(!dojo.isString(dom)){
+ dom = dom || this.editNode;
+ if(this.contentDomPostFilters.length){
+ if(nonDestructive && dom['cloneNode']){
+ dom = dom.cloneNode(true);
+ }
+ dojo.forEach(this.contentDomPostFilters, function(ef){
+ dom = ef(dom);
+ });
+ }
+ ec = dijit._editor.getChildrenHtml(dom);
+ }else{
+ ec = dom;
+ }
+
+ if(!ec.replace(/^(?:\s|\xA0)+/g, "").replace(/(?:\s|\xA0)+$/g,"").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
+ var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
+ saveTextarea.value += this._SEPARATOR + this.name + ":" + this.getValue();
+ },
+
+ escapeXml: function(/*String*/str, /*Boolean*/noSingleQuotes){
+ dojo.deprecated('dijit.Editor::escapeXml is deprecated','use dijit._editor.escapeXml instead', 2);
+ return dijit._editor.escapeXml(str,noSingleQuotes);
+ },
+
+ getNodeHtml: function(/* DomNode */node){
+ dojo.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit._editor.getNodeHtml instead', 2);
+ return dijit._editor.getNodeHtml(node);
+ },
+
+ getNodeChildrenHtml: function(/* DomNode */dom){
+ dojo.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit._editor.getChildrenHtml instead', 2);
+ return dijit._editor.getChildrenHtml(dom);
+ },
+
+ close: function(/*Boolean*/save, /*Boolean*/force){
+ // 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.
+ // force:
+ 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.textarea){
+ with(this.textarea.style){
+ position = "";
+ left = top = "";
+ if(dojo.isIE){
+ overflow = this.__overflow;
+ this.__overflow = null;
+ }
+ }
+ this.textarea.value = save ? this._content : this.savedContent;
+ dojo._destroyElement(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;
+// }
+// }
+ this.domNode.innerHTML = save ? this._content : this.savedContent;
+ }
+
+ dojo.removeClass(this.domNode, "RichTextEditable");
+ this.isClosed = true;
+ this.isLoaded = false;
+ // FIXME: is this always the right thing to do?
+ delete this.editNode;
+
+ 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
+ },
+
+ destroyRendering: function(){
+ // summary: stub
+ },
+
+ destroy: function(){
+ this.destroyRendering();
+ if(!this.isClosed){ this.close(false); }
+ this.inherited("destroy",arguments);
+ //dijit._editor.RichText.superclass.destroy.call(this);
+ },
+
+ _removeMozBogus: function(/* String */ html){
+ return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, ''); // String
+ },
+ _removeSafariBogus: function(/* String */ html){
+ return html.replace(/\sclass="webkit-block-placeholder"/gi, ''); // String
+ },
+ _fixContentForMoz: function(/* String */ html){
+ // summary:
+ // Moz can not handle strong/em tags correctly, convert them to b/i
+ return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
+ .replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String
+ },
+
+ _srcInImgRegex : /(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi ,
+ _hrefInARegex : /(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi ,
+
+ _preFixUrlAttributes: function(/* String */ html){
+ return html.replace(this._hrefInARegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
+ .replace(this._srcInImgRegex, '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+ }
+});
+
+}
+
+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 dijitToolbar" 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>',
+
+ tabIndex: "0",
+
+ postCreate: function(){
+ 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);
+ }
+}
+);
+
+// Combine with dijit.MenuSeparator??
+dojo.declare("dijit.ToolbarSeparator",
+ [ dijit._Widget, dijit._Templated ],
+ {
+ // summary: A spacer between two Toolbar items
+ templateString: '<div class="dijitToolbarSeparator dijitInline"></div>',
+ postCreate: function(){ dojo.setSelectable(this.domNode, false); },
+ isFocusable: function(){
+ // summary: This widget isn't focusable, so pass along that fact.
+ return false;
+ }
+
+});
+
+}
+
+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.
+ //
+ // 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: String
+ // text to display in button
+ label: "",
+
+ // showLabel: Boolean
+ // whether or not to display the text label in button
+ showLabel: true,
+
+ // iconClass: String
+ // class to apply to div in button to make it display an icon
+ iconClass: "",
+
+ type: "button",
+ baseClass: "dijitButton",
+ templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",
+
+ _onChangeMonitor: '',
+ // TODO: set button's title to this.containerNode.innerText
+
+ _onClick: function(/*Event*/ e){
+ // summary: internal function to handle click actions
+ if(this.disabled || this.readOnly){
+ dojo.stopEvent(e); // needed for checkbox
+ return false;
+ }
+ this._clicked(); // widget click actions
+ return this.onClick(e); // user click actions
+ },
+
+ _onButtonClick: function(/*Event*/ e){
+ // summary: callback when the user mouse clicks the button portion
+ if(this._onClick(e) === false){ // returning nothing is same as true
+ dojo.stopEvent(e);
+ }else if(this.type=="submit" && !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;
+ }
+ }
+ }
+ },
+
+ postCreate: function(){
+ // summary:
+ // get label and set as title on button icon if necessary
+ if (this.showLabel == false){
+ var labelText = "";
+ this.label = this.containerNode.innerHTML;
+ labelText = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ // set title attrib on iconNode
+ this.titleNode.title=labelText;
+ dojo.addClass(this.containerNode,"dijitDisplayNone");
+ }
+ dojo.setSelectable(this.focusNode, false);
+ this.inherited(arguments);
+ },
+
+ onClick: function(/*Event*/ e){
+ // summary: user callback for when button is clicked
+ // if type="submit", return true to perform submit
+ return true;
+ },
+
+ _clicked: function(/*Event*/ e){
+ // summary: internal replaceable function for when the button is clicked
+ },
+
+ setLabel: function(/*String*/ content){
+ // summary: reset the label (text) of the button; takes an HTML string
+ this.containerNode.innerHTML = this.label = content;
+ this._layoutHack();
+ if (this.showLabel == false){
+ this.titleNode.title=dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ }
+ }
+});
+
+
+dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container], {
+ // summary: A button with a popup
+ //
+ // 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:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",
+
+ _fillContent: function(){
+ // 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.prepare(this.dropDown.domNode);
+
+ this.inherited(arguments);
+ },
+
+ destroyDescendants: function(){
+ if(this.dropDown){
+ this.dropDown.destroyRecursive();
+ delete this.dropDown;
+ }
+ this.inherited(arguments);
+ },
+
+ _onArrowClick: function(/*Event*/ e){
+ // summary: callback when the user mouse clicks on menu popup node
+ if(this.disabled || this.readOnly){ return; }
+ this._toggleDropDown();
+ },
+
+ _onDropDownClick: function(/*Event*/ e){
+ // on Firefox 2 on the Mac it is possible to fire onclick
+ // by pressing enter down on a second element and transferring
+ // focus to the DropDownButton;
+ // we want to prevent opening our menu in this situation
+ // and only do so if we have seen a keydown on this button;
+ // e.detail != 0 means that we were fired by mouse
+ var isMacFFlessThan3 = dojo.isFF && dojo.isFF < 3
+ && navigator.appVersion.indexOf("Macintosh") != -1;
+ if(!isMacFFlessThan3 || e.detail != 0 || this._seenKeydown){
+ this._onArrowClick(e);
+ }
+ this._seenKeydown = false;
+ },
+
+ _onDropDownKeydown: function(/*Event*/ e){
+ this._seenKeydown = true;
+ },
+
+ _onDropDownBlur: function(/*Event*/ e){
+ this._seenKeydown = false;
+ },
+
+ _onKey: function(/*Event*/ e){
+ // summary: callback when the user presses a key on menu popup node
+ if(this.disabled || this.readOnly){ return; }
+ if(e.keyCode == dojo.keys.DOWN_ARROW){
+ if(!this.dropDown || this.dropDown.domNode.style.visibility=="hidden"){
+ dojo.stopEvent(e);
+ this._toggleDropDown();
+ }
+ }
+ },
+
+ _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);
+ },
+
+ _toggleDropDown: function(){
+ // summary: toggle the drop-down widget; if it is up, close it, if not, open it
+ if(this.disabled || this.readOnly){ return; }
+ dijit.focus(this.popupStateNode);
+ var dropDown = this.dropDown;
+ if(!dropDown){ return; }
+ if(!this._opened){
+ // If there's an href, then load that first, so we don't get a flicker
+ if(dropDown.href && !dropDown.isLoaded){
+ var self = this;
+ var handler = dojo.connect(dropDown, "onLoad", function(){
+ dojo.disconnect(handler);
+ self._openDropDown();
+ });
+ dropDown._loadCheck(true);
+ return;
+ }else{
+ this._openDropDown();
+ }
+ }else{
+ this._closeDropDown();
+ }
+ },
+
+ _openDropDown: function(){
+ var dropDown = this.dropDown;
+ var oldWidth=dropDown.domNode.style.width;
+ var self = this;
+
+ dijit.popup.open({
+ parent: this,
+ popup: dropDown,
+ around: this.domNode,
+ orient:
+ // TODO: add user-defined positioning option, like in Tooltip.js
+ this.isLeftToRight() ? {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'}
+ : {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'},
+ onExecute: function(){
+ self._closeDropDown(true);
+ },
+ onCancel: function(){
+ self._closeDropDown(true);
+ },
+ onClose: function(){
+ dropDown.domNode.style.width = oldWidth;
+ self.popupStateNode.removeAttribute("popupActive");
+ this._opened = false;
+ }
+ });
+ if(this.domNode.offsetWidth > dropDown.domNode.offsetWidth){
+ var adjustNode = null;
+ if(!this.isLeftToRight()){
+ adjustNode = dropDown.domNode.parentNode;
+ var oldRight = adjustNode.offsetLeft + adjustNode.offsetWidth;
+ }
+ // make menu at least as wide as the button
+ dojo.marginBox(dropDown.domNode, {w: this.domNode.offsetWidth});
+ if(adjustNode){
+ adjustNode.style.left = oldRight - this.domNode.offsetWidth + "px";
+ }
+ }
+ this.popupStateNode.setAttribute("popupActive", "true");
+ this._opened=true;
+ if(dropDown.focus){
+ dropDown.focus();
+ }
+ // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+ },
+
+ _closeDropDown: function(/*Boolean*/ focus){
+ if(this._opened){
+ dijit.popup.close(this.dropDown);
+ if(focus){ this.focus(); }
+ this._opened = false;
+ }
+ }
+});
+
+dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
+ // summary: A Normal Button with a DropDown
+ //
+ // 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:"<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\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</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._FormWidget.prototype.attributeMap),
+ {id:"", name:""}),
+
+ // optionsTitle: String
+ // text that describes the options menu (accessibility)
+ optionsTitle: "",
+
+ baseClass: "dijitComboButton",
+
+ _focusedNode: null,
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this._focalNodes = [this.titleNode, this.popupStateNode];
+ dojo.forEach(this._focalNodes, dojo.hitch(this, function(node){
+ if(dojo.isIE){
+ this.connect(node, "onactivate", this._onNodeFocus);
+ this.connect(node, "ondeactivate", this._onNodeBlur);
+ }else{
+ this.connect(node, "onfocus", this._onNodeFocus);
+ this.connect(node, "onblur", this._onNodeBlur);
+ }
+ }));
+ },
+
+ focusFocalNode: function(node){
+ // summary: Focus the focal node node.
+ this._focusedNode = node;
+ dijit.focus(node);
+ },
+
+ hasNextFocalNode: function(){
+ // summary: Returns true if this widget has no node currently
+ // focused or if there is a node following the focused one.
+ // False is returned if the last node has focus.
+ return this._focusedNode !== this.getFocalNodes()[1];
+ },
+
+ focusNext: function(){
+ // summary: Focus the focal node following the current node with focus
+ // or the first one if no node currently has focus.
+ this._focusedNode = this.getFocalNodes()[this._focusedNode ? 1 : 0];
+ dijit.focus(this._focusedNode);
+ },
+
+ hasPrevFocalNode: function(){
+ // summary: Returns true if this widget has no node currently
+ // focused or if there is a node before the focused one.
+ // False is returned if the first node has focus.
+ return this._focusedNode !== this.getFocalNodes()[0];
+ },
+
+ focusPrev: function(){
+ // summary: Focus the focal node before the current node with focus
+ // or the last one if no node currently has focus.
+ this._focusedNode = this.getFocalNodes()[this._focusedNode ? 0 : 1];
+ dijit.focus(this._focusedNode);
+ },
+
+ getFocalNodes: function(){
+ // summary: Returns an array of focal nodes for this widget.
+ return this._focalNodes;
+ },
+
+ _onNodeFocus: function(evt){
+ this._focusedNode = evt.currentTarget;
+ var fnc = this._focusedNode == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+ dojo.addClass(this._focusedNode, fnc);
+ },
+
+ _onNodeBlur: function(evt){
+ var fnc = evt.currentTarget == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+ dojo.removeClass(evt.currentTarget, fnc);
+ },
+
+ _onBlur: function(){
+ this.inherited(arguments);
+ this._focusedNode = null;
+ }
+});
+
+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,
+
+ _onChangeMonitor: 'checked',
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),
+ {checked:"focusNode"}),
+
+ _clicked: function(/*Event*/ evt){
+ this.setAttribute('checked', !this.checked);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "checked":
+ dijit.setWaiState(this.focusNode || this.domNode, "pressed", this.checked);
+ this._setStateClass();
+ this._handleOnChange(this.checked, true);
+ }
+ },
+
+
+ setChecked: function(/*Boolean*/ checked){
+ // summary:
+ // Programatically deselect the button
+ dojo.deprecated("setChecked("+checked+") is deprecated. Use setAttribute('checked',"+checked+") instead.", "", "2.0");
+ this.setAttribute('checked', checked);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.setAttribute('checked', this.checked); //to initially set wai pressed state
+ }
+});
+
+}
+
+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
+ // This represents a "plugin" to the editor, which is basically
+ // a single button on the Toolbar and some associated code
+ constructor: function(/*Object?*/args, /*DomNode?*/node){
+ if(args){
+ dojo.mixin(this, args);
+ }
+ this._connects=[];
+ },
+
+ editor: null,
+ iconClassPrefix: "dijitEditorIcon",
+ button: null,
+ queryCommand: null,
+ command: "",
+ commandArg: null,
+ useDefaultCommand: true,
+ buttonClass: dijit.form.Button,
+ getLabel: function(key){
+ return this.editor.commands[key];
+ },
+ _initButton: function(props){
+ if(this.command.length){
+ var label = this.getLabel(this.command);
+ var className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1);
+ if(!this.button){
+ props = dojo.mixin({
+ label: label,
+ showLabel: false,
+ iconClass: className,
+ dropDown: this.dropDown,
+ tabIndex: "-1"
+ }, props || {});
+ this.button = new this.buttonClass(props);
+ }
+ }
+ },
+ destroy: function(f){
+ dojo.forEach(this._connects, dojo.disconnect);
+ },
+ connect: function(o, f, tf){
+ this._connects.push(dojo.connect(o, f, this, tf));
+ },
+ updateState: function(){
+ var _e = this.editor;
+ var _c = this.command;
+ if(!_e){ return; }
+ if(!_e.isLoaded){ return; }
+ if(!_c.length){ return; }
+ if(this.button){
+ try{
+ var enabled = _e.queryCommandEnabled(_c);
+ this.button.setAttribute('disabled', !enabled);
+ if(typeof this.button.checked == 'boolean'){
+ this.button.setAttribute('checked', _e.queryCommandState(_c));
+ }
+ }catch(e){
+ console.debug(e);
+ }
+ }
+ },
+ setEditor: function(/*Widget*/editor){
+ // FIXME: detatch 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();
+
+ // FIXME: wire up editor to button here!
+ if(this.command.length &&
+ !this.editor.queryCommandAvailable(this.command)
+ ){
+ // console.debug("hiding:", this.command);
+ if(this.button){
+ this.button.domNode.style.display = "none";
+ }
+ }
+ if(this.button && this.useDefaultCommand){
+ this.connect(this.button, "onClick",
+ dojo.hitch(this.editor, "execCommand", this.command, this.commandArg)
+ );
+ }
+ this.connect(this.editor, "onNormalizedDisplayChanged", "updateState");
+ },
+ setToolbar: function(/*Widget*/toolbar){
+ if(this.button){
+ toolbar.addChild(this.button);
+ }
+ // console.debug("adding", this.button, "to:", toolbar);
+ }
+});
+
+}
+
+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
+
+ // plugins: Array
+ // a list of plugin names (as strings) or instances (as objects)
+ // for this widget.
+ plugins: null,
+
+ // extraPlugins: Array
+ // a list of extra plugin names which will be appended to plugins array
+ 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"/*"createLink"*/];
+ }
+
+ this._plugins=[];
+ this._editInterval = this.editActionInterval * 1000;
+ },
+
+ postCreate: function(){
+ //for custom undo/redo
+ if(this.customUndo){
+ dojo['require']("dijit._editor.range");
+ this._steps=this._steps.slice(0);
+ this._undoedSteps=this._undoedSteps.slice(0);
+// this.addKeyHandler('z',this.KEY_CTRL,this.undo);
+// this.addKeyHandler('y',this.KEY_CTRL,this.redo);
+ }
+ if(dojo.isArray(this.extraPlugins)){
+ this.plugins=this.plugins.concat(this.extraPlugins);
+ }
+
+// try{
+ this.inherited(arguments);
+// dijit.Editor.superclass.postCreate.apply(this, 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({});
+ dojo.place(this.toolbar.domNode, this.editingArea, "before");
+ }
+
+ dojo.forEach(this.plugins, this.addPlugin, this);
+ this.onNormalizedDisplayChanged(); //update toolbar button status
+// }catch(e){ console.debug(e); }
+ },
+ destroy: function(){
+ dojo.forEach(this._plugins, function(p){
+ if(p && p.destroy){
+ p.destroy();
+ }
+ });
+ this._plugins=[];
+ this.toolbar.destroy(); 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. Required.
+ // args: This object will be passed to the plugin constructor.
+ // index:
+ // Integer, optional. 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);
+ }
+ },
+ /* 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.
+ customUndo: dojo.isIE,
+
+ // 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 stop 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){
+ 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{
+ try{
+ if(this.customUndo){
+ this.endEditing();
+ this._beginEditing();
+ }
+ var r = this.inherited('execCommand',arguments);
+ if(this.customUndo){
+ this._endEditing();
+ }
+ return r;
+ }catch(e){
+ if(dojo.isMoz && /copy|cut|paste/.test(cmd)){
+ // Warn user of platform limitation. Cannot programmatically access keyboard. See ticket #4136
+ var sub = dojo.string.substitute,
+ accel = {cut:'X', copy:'C', paste:'V'},
+ isMac = navigator.userAgent.indexOf("Macintosh") != -1;
+ alert(sub(this.commands.systemShortcutFF,
+ [this.commands[cmd], sub(this.commands[isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+ }
+ return false;
+ }
+ }
+ },
+ 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 bookmark=b;
+ if(dojo.isIE){
+ if(dojo.isArray(b)){//IE CONTROL
+ bookmark=[];
+ dojo.forEach(b,function(n){
+ bookmark.push(dijit.range.getNode(n,this.editNode));
+ },this);
+ }
+ }else{//w3c range
+ var r=dijit.range.create();
+ r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);
+ r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);
+ bookmark=r;
+ }
+ dojo.withGlobal(this.window,'moveToBookmark',dijit,[bookmark]);
+ },
+ _changeToStep: function(from,to){
+ this.setValue(to.text);
+ var b=to.bookmark;
+ if(!b){ return; }
+ this._moveToBookmark(b);
+ },
+ undo: function(){
+// console.log('undo');
+ this.endEditing(true);
+ var s=this._steps.pop();
+ if(this._steps.length>0){
+ this.focus();
+ this._changeToStep(s,this._steps[this._steps.length-1]);
+ this._undoedSteps.push(s);
+ this.onDisplayChanged();
+ return true;
+ }
+ return false;
+ },
+ redo: function(){
+// console.log('redo');
+ 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();
+ return true;
+ }
+ return false;
+ },
+ endEditing: function(ignore_caret){
+ if(this._editTimer){
+ clearTimeout(this._editTimer);
+ }
+ if(this._inEditing){
+ this._endEditing(ignore_caret);
+ this._inEditing=false;
+ }
+ },
+ _getBookmark: function(){
+ var b=dojo.withGlobal(this.window,dijit.getBookmark);
+ var tmp=[];
+ if(dojo.isIE){
+ if(dojo.isArray(b)){//CONTROL
+ dojo.forEach(b,function(n){
+ tmp.push(dijit.range.getIndex(n,this.editNode).o);
+ },this);
+ b=tmp;
+ }
+ }else{//w3c range
+ tmp=dijit.range.getIndex(b.startContainer,this.editNode).o;
+ b={startContainer:tmp,
+ startOffset:b.startOffset,
+ endContainer:b.endContainer===b.startContainer?tmp:dijit.range.getIndex(b.endContainer,this.editNode).o,
+ endOffset:b.endOffset};
+ }
+ return b;
+ },
+ _beginEditing: function(cmd){
+ if(this._steps.length===0){
+ this._steps.push({'text':this.savedContent,'bookmark':this._getBookmark()});
+ }
+ },
+ _endEditing: function(ignore_caret){
+ var v=this.getValue(true);
+
+ this._undoedSteps=[];//clear undoed steps
+ this._steps.push({text: v, bookmark: this._getBookmark()});
+ },
+ onKeyDown: function(e){
+ if(!this.customUndo){
+ this.inherited('onKeyDown',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('onKeyDown',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(){
+ this.inherited('_onBlur',arguments);
+ this.endEditing(true);
+ },
+ onClick: function(){
+ this.endEditing(true);
+ this.inherited('onClick',arguments);
+ }
+ /* end of custom undo/redo support */
+ }
+);
+
+/* the following code is to registered a handler to get default plugins */
+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 "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() });
+ }
+// console.log('name',name,p);
+ o.plugin=p;
+});
+
+}
+
+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.Menu",
+ [dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
+ {
+ // summary
+ // A context menu you can assign to multiple elements
+
+ constructor: function(){
+ this._bindings = [];
+ },
+
+ templateString:
+ '<table class="dijit dijitMenu dijitReset dijitMenuTable" waiRole="menu" dojoAttachEvent="onkeypress:_onKeyPress">' +
+ '<tbody class="dijitReset" dojoAttachPoint="containerNode"></tbody>'+
+ '</table>',
+
+ // targetNodeIds: 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: Boolean
+ // if true, right clicking anywhere on the window will cause this context menu to open;
+ // if false, must specify targetNodeIds
+ contextMenuForWindow: false,
+
+ // leftClickToOpen: Boolean
+ // If true, menu will open on left click instead of right click, similiar to a file menu.
+ leftClickToOpen: false,
+
+ // parentMenu: 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,
+
+ // _contextMenuWithMouse: Boolean
+ // used to record mouse and keyboard events to determine if a context
+ // menu is being opened with the keyboard or the mouse
+ _contextMenuWithMouse: false,
+
+ postCreate: function(){
+ if(this.contextMenuForWindow){
+ this.bindDomNode(dojo.body());
+ }else{
+ dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
+ }
+ this.connectKeyNavHandlers([dojo.keys.UP_ARROW], [dojo.keys.DOWN_ARROW]);
+ },
+
+ 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
+ },
+
+ onCancel: function(/*Boolean*/ closeAll){
+ // summary: attach point for notification about when the user cancels the current menu
+ },
+
+ _moveToPopup: function(/*Event*/ evt){
+ if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+ this.focusedChild._onClick(evt);
+ }
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary: Handle keyboard based menu navigation.
+ if(evt.ctrlKey || evt.altKey){ return; }
+
+ switch(evt.keyCode){
+ case dojo.keys.RIGHT_ARROW:
+ this._moveToPopup(evt);
+ dojo.stopEvent(evt);
+ break;
+ case dojo.keys.LEFT_ARROW:
+ if(this.parentMenu){
+ this.onCancel(false);
+ }else{
+ dojo.stopEvent(evt);
+ }
+ break;
+ }
+ },
+
+ onItemHover: function(/*MenuItem*/ item){
+ // summary: Called when cursor is over a MenuItem
+ this.focusChild(item);
+
+ if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
+ this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
+ }
+ },
+
+ _onChildBlur: function(item){
+ // summary: Close all popups that are open and descendants of this menu
+ dijit.popup.close(item.popup);
+ item._blur();
+ this._stopPopupTimer();
+ },
+
+ onItemUnhover: function(/*MenuItem*/ item){
+ // summary: Callback fires when mouse exits a MenuItem
+ },
+
+ _stopPopupTimer: function(){
+ if(this.hover_timer){
+ clearTimeout(this.hover_timer);
+ this.hover_timer = null;
+ }
+ },
+
+ _getTopMenu: function(){
+ for(var top=this; top.parentMenu; top=top.parentMenu);
+ return top;
+ },
+
+ onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+ // summary: user defined function to handle clicks on an item
+ if(item.disabled){ return false; }
+
+ if(item.popup){
+ if(!this.is_open){
+ 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);
+ }
+ },
+
+ // thanks burstlib!
+ _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
+ // summary:
+ // Returns the window reference of the passed iframe
+ var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+ // Moz. TODO: is this available when defaultView isn't?
+ dijit.Menu._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
+ 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);
+
+ //TODO: this is to support context popups in Editor. Maybe this shouldn't be in dijit.Menu
+ var win = dijit.getDocumentWindow(node.ownerDocument);
+ if(node.tagName.toLowerCase()=="iframe"){
+ win = this._iframeContentWindow(node);
+ node = dojo.withGlobal(win, dojo.body);
+ }
+
+ // to capture these events at the top level,
+ // attach to document, not body
+ var cn = (node == dojo.body() ? dojo.doc : node);
+
+ node[this.id] = this._bindings.push([
+ dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
+ dojo.connect(cn, "onkeydown", this, "_contextKey"),
+ dojo.connect(cn, "onmousedown", this, "_contextMouse")
+ ]);
+ },
+
+ unBindDomNode: function(/*String|DomNode*/ nodeName){
+ // summary: detach menu from given node
+ var node = dojo.byId(nodeName);
+ if(node){
+ var bid = node[this.id]-1, b = this._bindings[bid];
+ dojo.forEach(b, dojo.disconnect);
+ delete this._bindings[bid];
+ }
+ },
+
+ _contextKey: function(e){
+ this._contextMenuWithMouse = false;
+ if(e.keyCode == dojo.keys.F10){
+ dojo.stopEvent(e);
+ if(e.shiftKey && e.type=="keydown"){
+ // FF: copying the wrong property from e will cause the system
+ // context menu to appear in spite of stopEvent. Don't know
+ // exactly which properties cause this effect.
+ var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
+ _e.preventDefault = _e.stopPropagation = function(){};
+ // IE: without the delay, focus work in "open" causes the system
+ // context menu to appear in spite of stopEvent.
+ window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
+ }
+ }
+ },
+
+ _contextMouse: function(e){
+ this._contextMenuWithMouse = true;
+ },
+
+ _openMyself: function(/*Event*/ e){
+ // summary:
+ // Internal function for opening myself when the user
+ // does a right-click or something similar
+
+ if(this.leftClickToOpen&&e.button>0){
+ return;
+ }
+ dojo.stopEvent(e);
+
+ // Get coordinates.
+ // if we are opening the menu with the mouse or on safari open
+ // the menu at the mouse cursor
+ // (Safari does not have a keyboard command to open the context menu
+ // and we don't currently have a reliable way to determine
+ // _contextMenuWithMouse on Safari)
+ var x,y;
+ if(dojo.isSafari || this._contextMenuWithMouse){
+ x=e.pageX;
+ y=e.pageY;
+ }else{
+ // otherwise open near e.target
+ var coords = dojo.coords(e.target, true);
+ x = coords.x + 10;
+ y = coords.y + 10;
+ }
+
+ var self=this;
+ var savedFocus = dijit.getFocus(this);
+ function closeAndRestoreFocus(){
+ // user has clicked on a menu or popup
+ dijit.focus(savedFocus);
+ dijit.popup.close(self);
+ }
+ dijit.popup.open({
+ popup: this,
+ x: x,
+ y: 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
+ }
+ },
+
+ onOpen: function(/*Event*/ e){
+ // summary: Open menu relative to the mouse
+ this.isShowingNow = true;
+ },
+
+ onClose: function(){
+ // summary: callback when this menu is closed
+ this._stopPopupTimer();
+ this.parentMenu = null;
+ this.isShowingNow = false;
+ this.currentPopup = null;
+ if(this.focusedChild){
+ this._onChildBlur(this.focusedChild);
+ this.focusedChild = null;
+ }
+ },
+
+ _openPopup: function(){
+ // summary: open the popup to the side of the current menu item
+ this._stopPopupTimer();
+ var from_item = this.focusedChild;
+ var popup = from_item.popup;
+
+ if(popup.isShowingNow){ return; }
+ popup.parentMenu = this;
+ var self = this;
+ dijit.popup.open({
+ parent: this,
+ popup: popup,
+ around: from_item.arrowCell,
+ orient: this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'},
+ onCancel: function(){
+ // called when the child menu is canceled
+ dijit.popup.close(popup);
+ from_item.focus(); // put focus back on my node
+ self.currentPopup = null;
+ }
+ });
+
+ this.currentPopup = popup;
+
+ if(popup.focus){
+ popup.focus();
+ }
+ },
+
+ uninitialize: function(){
+ dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ this.inherited(arguments);
+ }
+}
+);
+
+dojo.declare("dijit.MenuItem",
+ [dijit._Widget, dijit._Templated, dijit._Contained],
+ {
+ // summary: A line item in a Menu Widget
+
+ // Make 3 columns
+ // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
+ templateString:
+ '<tr class="dijitReset dijitMenuItem" '
+ +'dojoAttachEvent="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">'
+ +'<td class="dijitReset"><div class="dijitMenuItemIcon ${iconClass}" dojoAttachPoint="iconNode"></div></td>'
+ +'<td tabIndex="-1" class="dijitReset dijitMenuItemLabel" dojoAttachPoint="containerNode,focusNode" waiRole="menuitem"></td>'
+ +'<td class="dijitReset" dojoAttachPoint="arrowCell">'
+ +'<div class="dijitMenuExpand" dojoAttachPoint="expand" style="display:none">'
+ +'<span class="dijitInline dijitArrowNode dijitMenuExpandInner">+</span>'
+ +'</div>'
+ +'</td>'
+ +'</tr>',
+
+ // label: String
+ // menu text
+ label: '',
+
+ // iconClass: String
+ // class to apply to div in button to make it display an icon
+ iconClass: "",
+
+ // disabled: Boolean
+ // if true, the menu item is disabled
+ // if false, the menu item is enabled
+ disabled: false,
+
+ postCreate: function(){
+ dojo.setSelectable(this.domNode, false);
+ this.setDisabled(this.disabled);
+ if(this.label){
+ this.setLabel(this.label);
+ }
+ },
+
+ _onHover: function(){
+ // summary: callback when mouse is moved onto menu item
+ this.getParent().onItemHover(this);
+ },
+
+ _onUnhover: function(){
+ // summary: callback when mouse is moved off of menu item
+
+ // if we are unhovering the currently selected item
+ // then unselect it
+ this.getParent().onItemUnhover(this);
+ },
+
+ _onClick: function(evt){
+ this.getParent().onItemClick(this, evt);
+ dojo.stopEvent(evt);
+ },
+
+ onClick: function(/*Event*/ evt){
+ // summary: User defined function to handle clicks
+ },
+
+ focus: function(){
+ dojo.addClass(this.domNode, 'dijitMenuItemHover');
+ try{
+ dijit.focus(this.containerNode);
+ }catch(e){
+ // this throws on IE (at least) in some scenarios
+ }
+ },
+
+ _blur: function(){
+ dojo.removeClass(this.domNode, 'dijitMenuItemHover');
+ },
+
+ setLabel: function(/*String*/ value){
+ this.containerNode.innerHTML=this.label=value;
+ },
+
+ setDisabled: function(/*Boolean*/ value){
+ // summary: enable or disable this menu item
+ this.disabled = value;
+ dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
+ dijit.setWaiState(this.containerNode, 'disabled', value ? 'true' : 'false');
+ }
+});
+
+dojo.declare("dijit.PopupMenuItem",
+ dijit.MenuItem,
+ {
+ _fillContent: function(){
+ // summary: The innerHTML contains both the menu item text and a popup widget
+ // description: 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>
+ 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.domNode.style.display="none";
+ dojo.addClass(this.expand, "dijitMenuExpandEnabled");
+ dojo.style(this.expand, "display", "");
+ dijit.setWaiState(this.containerNode, "haspopup", "true");
+ },
+
+ destroyDescendants: function(){
+ if(this.popup){
+ this.popup.destroyRecursive();
+ delete this.popup;
+ }
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare("dijit.MenuSeparator",
+ [dijit._Widget, dijit._Templated, dijit._Contained],
+ {
+ // summary: A line between two menu items
+
+ templateString: '<tr class="dijitMenuSeparator"><td colspan=3>'
+ +'<div class="dijitMenuSeparatorTop"></div>'
+ +'<div class="dijitMenuSeparatorBottom"></div>'
+ +'</td></tr>',
+
+ postCreate: function(){
+ dojo.setSelectable(this.domNode, false);
+ },
+
+ isFocusable: function(){
+ // summary: over ride to always return false
+ return false; // Boolean
+ }
+});
+
+}
+
+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(/([\f\b\n\t\r[\^$|?*+(){}])/gm, "\\$1"); // string
+ 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.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
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific, 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 don't round.
+ // currency: String?
+ // an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+ // symbol: String?
+ // localized currency symbol
+ // locale: String?
+ // override the locale used to determine formatting rules
+ this.pattern = pattern;
+ this.type = type;
+ this.places = places;
+ this.round = round;
+ this.currency = currency;
+ this.symbol = symbol;
+ this.locale = locale;
+}
+=====*/
+
+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
+ // [CLDR](http://unicode.org/cldr) as well as the appropriate symbols and
+ // delimiters. See <http://www.unicode.org/reports/tr35/#Number_Elements>
+ // value:
+ // the number to be formatted. If not a valid JavaScript number,
+ // return null.
+
+ options = dojo.mixin({}, options || {});
+ var locale = dojo.i18n.normalizeLocale(options.locale);
+ var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+ options.customs = bundle;
+ var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+ if(isNaN(value)){ 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;
+ var decimal = options.customs.decimal;
+
+ var patternList = pattern.split(';');
+ var 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);
+ }
+ return pattern.replace(numberPatternRE,
+ dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places}));
+}
+
+dojo.number.round = function(/*Number*/value, /*Number*/places, /*Number?*/multiple){
+ // summary:
+ // Rounds the number at the given number of places
+ // value:
+ // the number to round
+ // places:
+ // the number of decimal places where rounding takes place
+ // multiple:
+ // rounds next place to nearest multiple
+
+ var pieces = String(value).split(".");
+ var length = (pieces[1] && pieces[1].length) || 0;
+ if(length > places){
+ var factor = Math.pow(10, places);
+ if(multiple > 0){factor *= 10/multiple;places++;} //FIXME
+ value = Math.round(value * factor)/factor;
+
+ // truncate to remove any residual floating point values
+ pieces = String(value).split(".");
+ length = (pieces[1] && pieces[1].length) || 0;
+ if(length > places){
+ pieces[1] = pieces[1].substr(0, places);
+ value = Number(pieces.join("."));
+ }
+ }
+ return value; //Number
+}
+
+/*=====
+dojo.number.__FormatAbsoluteOptions = function(){
+ // decimal: String?
+ // the decimal separator
+ // group: String?
+ // the group separator
+ // places: Integer?
+ // number of decimal 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(".");
+ var maxPlaces = (options.places >= 0) ? options.places : (patternParts[1] && patternParts[1].length) || 0;
+ if(!(options.round < 0)){
+ value = dojo.number.round(value, maxPlaces, options.round);
+ }
+
+ var valueParts = String(Math.abs(value)).split(".");
+ var fractional = valueParts[1] || "";
+ if(options.places){
+ valueParts[1] = dojo.string.pad(fractional.substr(0, options.places), options.places, '0', true);
+ }else if(patternParts[1] && options.places !== 0){
+ // Pad fractional with trailing zeros
+ var pad = patternParts[1].lastIndexOf("0") + 1;
+ if(pad > fractional.length){
+ valueParts[1] = dojo.string.pad(fractional, pad, '0', true);
+ }
+
+ // Truncate fractional
+ var places = patternParts[1].length;
+ if(places < fractional.length){
+ valueParts[1] = fractional.substr(0, places);
+ }
+ }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(',');
+ var 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 pattern with this string. Default is provided based on
+ // locale.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific, percent, currency. decimal by default.
+ // locale: String?
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default
+ // places: Number|String?
+ // number of decimal places to accept: Infinity, a positive number, or
+ // a range "n,m". By default, defined by pattern.
+ 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);
+ var bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale);
+ var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"];
+//TODO: memoize?
+ var group = bundle.group;
+ var decimal = bundle.decimal;
+ var 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};
+ var parts = format.split('.');
+ var places = options.places;
+ if(parts.length == 1 || places === 0){flags.fractional = false;}
+ else{
+ if(places === undefined){ places = parts[1].lastIndexOf('0')+1; }
+ 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*)(\u00a4{1,3})(\s*)/g, function(match, before, target, after){
+ var prop = ["symbol", "currency", "displayName"][target.length-1];
+ var symbol = dojo.regexp.escapeString(options[prop] || options.currency || "");
+ before = before ? "\\s" : "";
+ after = after ? "\\s" : "";
+ 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 pattern with this string. Default is provided based on
+ // locale.
+ // type: String?
+ // choose a format type based on the locale from the following:
+ // decimal, scientific, percent, currency. decimal by default.
+ // locale: String
+ // override the locale used to determine formatting rules
+ // strict: Boolean?
+ // strict parsing, false by default
+ // currency: Object
+ // object with currency information
+ this.pattern = pattern;
+ this.type = type;
+ this.locale = locale;
+ this.strict = strict;
+ this.currency = currency;
+}
+=====*/
+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)
+ // expression:
+ // A string representation of a Number
+ var info = dojo.number._parseInfo(options);
+ var 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 Number(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 allowed. Can be true, false, or [true,
+ // false]. Default is [true, false]
+ // 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 paramters
+ 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]; }
+
+ // integer RE
+ var integerRE = dojo.number._integerRegexp(flags);
+
+ // decimal RE
+ var 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
+ );
+
+ // exponent RE
+ var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
+ function(q){
+ if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; }
+ return "";
+ }
+ );
+
+ // real number RE
+ 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 paramters
+ flags = flags || {};
+ if(!("signed" in flags)){ flags.signed = [true, false]; }
+ if(!("separator" in flags)){
+ flags.separator = "";
+ }else if(!("groupSize" in flags)){
+ flags.groupSize = 3;
+ }
+ // build sign RE
+ var signRE = dojo.regexp.buildGroupRE(flags.signed,
+ function(q) { return q ? "[-+]" : ""; },
+ true
+ );
+
+ // number RE
+ var numberRE = dojo.regexp.buildGroupRE(flags.separator,
+ function(sep){
+ if(!sep){
+ return "(?:0|[1-9]\\d*)";
+ }
+
+ sep = dojo.regexp.escapeString(sep);
+ if(sep == " "){ sep = "\\s"; }
+ else if(sep == "\xa0"){ sep = "\\s\\xa0"; }
+
+ var grp = flags.groupSize, grp2 = flags.groupSize2;
+ 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
+ );
+
+ // integer RE
+ 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
+ //
+ // example:
+ // | <div dojoType="ProgressBar"
+ // | places="0"
+ // | progress="..." maximum="...">
+ // | </div>
+ //
+ // progress: String (Percentage or Number)
+ // initial progress value.
+ // with "%": percentage value, 0% <= progress <= 100%
+ // or without "%": absolute value, 0 <= progress <= maximum
+ progress: "0",
+
+ // maximum: Float
+ // max sample number
+ maximum: 100,
+
+ // places: Number
+ // number of places to show in values; 0 by default
+ places: 0,
+
+ // indeterminate: Boolean
+ // If false: show progress.
+ // If true: show that a process is underway but that the progress is unknown
+ indeterminate: false,
+
+ templateString:"<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" tabindex=\"0\" 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=\"inteterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\"\n\t></img\n></div>\n",
+
+ _indeterminateHighContrastImagePath:
+ dojo.moduleUrl("dijit", "themes/a11y/indeterminate_progress.gif"),
+
+ // public functions
+ postCreate: function(){
+ this.inherited("postCreate",arguments);
+ this.inteterminateHighContrastImage.setAttribute("src",
+ this._indeterminateHighContrastImagePath);
+ this.update();
+ },
+
+ update: function(/*Object?*/attributes){
+ // summary: update progress information
+ //
+ // attributes: may provide progress and/or maximum properties on this parameter,
+ // see attribute specs for details.
+ dojo.mixin(this, attributes||{});
+ var percent = 1, classFunc;
+ if(this.indeterminate){
+ classFunc = "addClass";
+ dijit.removeWaiState(this.internalProgress, "valuenow");
+ dijit.removeWaiState(this.internalProgress, "valuemin");
+ dijit.removeWaiState(this.internalProgress, "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(this.internalProgress, "describedby", this.label.id);
+ dijit.setWaiState(this.internalProgress, "valuenow", this.progress);
+ dijit.setWaiState(this.internalProgress, "valuemin", 0);
+ dijit.setWaiState(this.internalProgress, "valuemax", this.maximum);
+ }
+ dojo[classFunc](this.domNode, "dijitProgressBarIndeterminate");
+ this.internalProgress.style.width = (percent * 100) + "%";
+ this.onChange();
+ },
+
+ report: function(/*float*/percent){
+ // Generates message to show; may be overridden by user
+ return dojo.number.format(percent, {type: "percent", places: this.places, locale: this.lang});
+ },
+
+ onChange: function(){
+ // summary: User definable function fired when progress updates.
+ }
+});
+
+}
+
+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],
+{
+ // summary: A pane with a title on top, that can be opened or collapsed.
+ //
+ // description: An accessible container with a Title Heading, and a content
+ // section that slides open and closed. TitlePane is an extension to
+ // ContentPane, providing all the usesful content-control aspects from.
+ //
+ // 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,
+
+ // duration: Integer
+ // Time in milliseconds to fade in/fade out
+ duration: 250,
+
+ // baseClass: String
+ // The root className to use for the various states of this widget
+ baseClass: "dijitTitlePane",
+
+ templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<div dojoAttachPoint=\"arrowNode\" class=\"dijitInline dijitArrowNode\"><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span></div>\n\t\t<div dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"containerNode\" waiRole=\"region\" tabindex=\"-1\">\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",
+
+ postCreate: function(){
+ this.setTitle(this.title);
+ if(!this.open){
+ this.hideNode.style.display = this.wipeNode.style.display = "none";
+ }
+ this._setCss();
+ dojo.setSelectable(this.titleNode, false);
+ this.inherited(arguments);
+ dijit.setWaiState(this.containerNode, "labelledby", this.titleNode.id);
+ dijit.setWaiState(this.focusNode, "haspopup", "true");
+
+ // 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";
+ }
+ });
+ },
+
+ setContent: function(content){
+ // summary:
+ // Typically called when an href is loaded. Our job is to make the animation smooth
+ if(!this.open || 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.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
+ this._wipeIn.play();
+ }
+ },
+
+ toggle: function(){
+ // summary: switches between opened and closed state
+ dojo.forEach([this._wipeIn, this._wipeOut], function(animation){
+ if(animation.status() == "playing"){
+ animation.stop();
+ }
+ });
+
+ this[this.open ? "_wipeOut" : "_wipeIn"].play();
+ 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 we have setHref when hidden)
+ this._loadCheck();
+
+ this._setCss();
+ },
+
+ _setCss: function(){
+ // summary: set the open/close css state for the TitlePane
+ var classes = ["dijitClosed", "dijitOpen"];
+ var boolIndex = this.open;
+ var node = this.titleBarNode || this.focusNode
+ dojo.removeClass(node, classes[!boolIndex+0]);
+ node.className += " " + classes[boolIndex+0];
+
+ // provide a character based indicator for images-off mode
+ this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
+ },
+
+ _onTitleKey: function(/*Event*/ e){
+ // summary: callback when user hits a key
+ if(e.keyCode == dojo.keys.ENTER || e.charCode == dojo.keys.SPACE){
+ this.toggle();
+ }else if(e.keyCode == dojo.keys.DOWN_ARROW && this.open){
+ this.containerNode.focus();
+ e.preventDefault();
+ }
+ },
+
+ _handleFocus: function(/*Event*/ e){
+ // summary: handle blur and focus for this widget
+
+ // add/removeClass is safe to call without hasClass in this case
+ dojo[(e.type == "focus" ? "addClass" : "removeClass")](this.focusNode, this.baseClass + "Focused");
+ },
+
+ setTitle: function(/*String*/ title){
+ // summary: sets the text of the title
+ this.titleNode.innerHTML = title;
+ }
+});
+
+}
+
+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
+
+ // duration: Integer
+ // Milliseconds to fade in/fade out
+ duration: 200,
+
+ templateString:"<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){
+ // summary:
+ // Display tooltip w/specified contents to right specified node
+ // (To left if there's no space on the right, or if LTR==right)
+
+ 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;
+
+ // Firefox bug. when innerHTML changes to be shorter than previous
+ // one, the node size will not be updated until it moves.
+ this.domNode.style.top = (this.domNode.offsetTop + 1) + "px";
+
+ // position the element and change CSS according to position[] (a list of positions to try)
+ var align = {};
+ var ltr = this.isLeftToRight();
+ dojo.forEach( (position && position.length) ? position : dijit.Tooltip.defaultPosition, function(pos){
+ switch(pos){
+ case "after":
+ align[ltr ? "BR" : "BL"] = ltr ? "BL" : "BR";
+ break;
+ case "before":
+ align[ltr ? "BL" : "BR"] = ltr ? "BR" : "BL";
+ break;
+ case "below":
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR";
+ align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL";
+ break;
+ case "above":
+ default:
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR";
+ align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL";
+ break;
+ }
+ });
+ var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, align, 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
+ 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(){
+ 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.aroundNode || this.aroundNode !== aroundNode){
+ return;
+ }
+ if(this._onDeck){
+ // this hide request is for a show() that hasn't even started yet;
+ // just cancel the pending show()
+ this._onDeck=null;
+ return;
+ }
+ this.fadeIn.stop();
+ this.isShowingNow = false;
+ this.aroundNode = null;
+ this.fadeOut.play();
+ },
+
+ _onHide: function(){
+ this.domNode.style.cssText=""; // to position offscreen again
+ 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){
+ // 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);
+};
+
+dijit.hideTooltip = function(aroundNode){
+ // summary: hide the tooltip
+ if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
+ return dijit._masterTT.hide(aroundNode);
+};
+
+dojo.declare(
+ "dijit.Tooltip",
+ dijit._Widget,
+ {
+ // summary
+ // Pops up a tooltip (a help message) when you hover over a node.
+
+ // label: String
+ // Text to display in the tooltip.
+ // Specified as innerHTML when creating the widget from markup.
+ label: "",
+
+ // showDelay: Integer
+ // Number of milliseconds to wait after hovering over/focusing on the object, before
+ // the tooltip is displayed.
+ showDelay: 400,
+
+ // connectId: String[]
+ // Id(s) of domNodes to attach the tooltip to.
+ // When user hovers over any of the specified dom nodes, the tooltip will appear.
+ connectId: [],
+
+ // position: String[]
+ // See description of dijit.Tooltip.defaultPosition for details on position parameter.
+ position: [],
+
+ postCreate: function(){
+ if(this.srcNodeRef){
+ this.srcNodeRef.style.display = "none";
+ }
+
+ this._connectNodes = [];
+
+ dojo.forEach(this.connectId, function(id) {
+ var node = dojo.byId(id);
+ if (node) {
+ this._connectNodes.push(node);
+ dojo.forEach(["onMouseOver", "onMouseOut", "onFocus", "onBlur", "onHover", "onUnHover"], function(event){
+ this.connect(node, event.toLowerCase(), "_"+event);
+ }, this);
+ if(dojo.isIE){
+ // BiDi workaround
+ node.style.zoom = 1;
+ }
+ }
+ }, this);
+ },
+
+ _onMouseOver: function(/*Event*/ e){
+ this._onHover(e);
+ },
+
+ _onMouseOut: function(/*Event*/ e){
+ if(dojo.isDescendant(e.relatedTarget, e.target)){
+ // false event; just moved from target to target child; ignore.
+ return;
+ }
+ this._onUnHover(e);
+ },
+
+ _onFocus: function(/*Event*/ e){
+ this._focus = true;
+ this._onHover(e);
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(/*Event*/ e){
+ this._focus = false;
+ this._onUnHover(e);
+ this.inherited(arguments);
+ },
+
+ _onHover: function(/*Event*/ e){
+ if(!this._showTimer){
+ var target = e.target;
+ this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay);
+ }
+ },
+
+ _onUnHover: function(/*Event*/ e){
+ // keep a tooltip open if the associated element has focus
+ 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.
+ target = target || this._connectNodes[0];
+ if(!target){ return; }
+
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position);
+
+ this._connectNode = target;
+ },
+
+ close: function(){
+ // summary: hide the tooltip; usually not called directly.
+ dijit.hideTooltip(this._connectNode);
+ delete this._connectNode;
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ },
+
+ uninitialize: function(){
+ this.close();
+ }
+ }
+);
+
+// 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["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;
+ 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"]){ //_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],
+{
+ // summary
+ // Single node within a tree
+
+ // item: dojo.data.Item
+ // the dojo.data entry this tree represents
+ item: null,
+
+ isTreeNode: true,
+
+ // label: String
+ // Text of this tree node
+ label: "",
+
+ isExpandable: null, // show expando node
+
+ isExpanded: false,
+
+ // state: 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:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><div dojoAttachPoint=\"contentNode\" class=\"dijitTreeContent\" waiRole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"iconNode\" class=\"dijitInline dijitTreeIcon\" waiRole=\"presentation\"></div>\n\t\t\t<span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" wairole=\"treeitem\" tabindex=\"-1\" waiState=\"selected-false\" dojoAttachEvent=\"onfocus:_onNodeFocus\"></span>\n\t\t</div\n\t></div>\n</div>\n",
+
+ postCreate: function(){
+ // set label, escaping special characters
+ this.setLabelNode(this.label);
+
+ // 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);
+ }
+ },
+
+ markProcessing: function(){
+ // summary: visually denote that tree is loading data, etc.
+ this.state = "LOADING";
+ this._setExpando(true);
+ },
+
+ unmarkProcessing: function(){
+ // summary: clear markup from markProcessing() call
+ 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)
+ 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.iconNode.className = "dijitInline dijitTreeIcon " + tree.getIconClass(item, this.isExpanded);
+ this.labelNode.className = "dijitTreeLabel " + tree.getLabelClass(item, this.isExpanded);
+ },
+
+ _updateLayout: function(){
+ // summary: set appropriate CSS classes for this.domNode
+ 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
+
+ // apply the appropriate class to the expando node
+ var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
+ "dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"];
+ var idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3);
+ dojo.forEach(styles,
+ function(s){
+ dojo.removeClass(this.expandoNode, s);
+ }, this
+ );
+ dojo.addClass(this.expandoNode, styles[idx]);
+
+ // provide a non-image based indicator for images-off mode
+ this.expandoNodeText.innerHTML =
+ processing ? "*" :
+ (this.isExpandable ?
+ (this.isExpanded ? "-" : "+") : "*");
+ },
+
+ expand: function(){
+ // summary: show my children
+ if(this.isExpanded){ return; }
+ // cancel in progress collapse operation
+ if(this._wipeOut.status() == "playing"){
+ this._wipeOut.stop();
+ }
+
+ this.isExpanded = true;
+ dijit.setWaiState(this.labelNode, "expanded", "true");
+ dijit.setWaiRole(this.containerNode, "group");
+ this.contentNode.className = "dijitTreeContent dijitTreeContentExpanded";
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ this._wipeIn.play();
+ },
+
+ collapse: function(){
+ if(!this.isExpanded){ return; }
+
+ // cancel in progress expand operation
+ if(this._wipeIn.status() == "playing"){
+ this._wipeIn.stop();
+ }
+
+ this.isExpanded = false;
+ dijit.setWaiState(this.labelNode, "expanded", "false");
+ this.contentNode.className = "dijitTreeContent";
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ this._wipeOut.play();
+ },
+
+ setLabelNode: function(label){
+ this.labelNode.innerHTML="";
+ this.labelNode.appendChild(dojo.doc.createTextNode(label));
+ },
+
+ setChildItems: function(/* Object[] */ items){
+ // summary:
+ // Sets the child items of this node, removing/adding nodes
+ // from current children to match specified items[] array.
+
+ var tree = this.tree,
+ model = tree.model;
+
+ // 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.
+ this.getChildren().forEach(function(child){
+ dijit._Container.prototype.removeChild.call(this, child);
+ }, this);
+
+ this.state = "LOADED";
+
+ if(items && items.length > 0){
+ this.isExpandable = true;
+ if(!this.containerNode){ // maybe this node was unfolderized and still has container
+ this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);
+ this.domNode.appendChild(this.containerNode);
+ }
+
+ // 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),
+ existingNode = tree._itemNodeMap[id],
+ node =
+ ( existingNode && !existingNode.getParent() ) ?
+ existingNode :
+ new dijit._TreeNode({
+ item: item,
+ tree: tree,
+ isExpandable: model.mayHaveChildren(item),
+ label: tree.getLabel(item)
+ });
+ this.addChild(node);
+ // note: this won't work if there are two nodes for one item (multi-parented items); will be fixed later
+ tree._itemNodeMap[id] = node;
+ if(this.tree.persist){
+ if(tree._openedItemIds[id]){
+ 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);
+ }
+
+ // On initial tree show, put focus on either the root node of the tree,
+ // or the first child, if the root node is hidden
+ if(!this.parent){
+ var fc = this.tree.showRoot ? this : this.getChildren()[0],
+ tabnode = fc ? fc.labelNode : this.domNode;
+ tabnode.setAttribute("tabIndex", "0");
+ }
+
+ // create animations for showing/hiding the children (if children exist)
+ if(this.containerNode && !this._wipeIn){
+ this._wipeIn = dojo.fx.wipeIn({node: this.containerNode, duration: 150});
+ this._wipeOut = dojo.fx.wipeOut({node: this.containerNode, duration: 150});
+ }
+ },
+
+ 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()
+ this.isExpandable = true;
+ this._setExpando(false);
+ },
+
+ _onNodeFocus: function(evt){
+ var node = dijit.getEnclosingWidget(evt.target);
+ this.tree._onTreeFocus(node);
+ }
+});
+
+dojo.declare(
+ "dijit.Tree",
+ [dijit._Widget, dijit._Templated],
+{
+ // summary
+ // This widget displays hierarchical data from a store. A query is specified
+ // to get the "top level children" from a data store, and then those items are
+ // queried for their children and so on (but lazily, as the user clicks the expand node).
+ //
+ // Thus in the default mode of operation this widget is technically a forest, not a tree,
+ // in that there can be multiple "top level children". However, if you specify label,
+ // then a special top level node (not corresponding to any item in the datastore) is
+ // created, to father all the top level children.
+
+ // store: String||dojo.data.Store
+ // The store to get data to display in the tree.
+ // May remove for 2.0 in favor of "model".
+ store: null,
+
+ // model: dijit.Tree.model
+ // Alternate interface from store to access data (and changes to data) in the tree
+ model: null,
+
+ // query: anything
+ // Specifies datastore query to return the root item for the tree.
+ //
+ // Deprecated functionality: if the query returns multiple items, the tree is given
+ // a fake root node (not corresponding to any item in the data store),
+ // whose children are the items that match this query.
+ //
+ // The root node is shown or hidden based on whether a label is specified.
+ //
+ // Having a query return multiple items is deprecated.
+ // If your store doesn't have a root item, wrap the store with
+ // dijit.tree.ForestStoreModel, and specify model=myModel
+ //
+ // example:
+ // {type:'continent'}
+ query: null,
+
+ // label: 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: Boolean
+ // Should the root node be displayed, or hidden?
+ showRoot: true,
+
+ // childrenAttr: String[]
+ // one ore more attributes that holds children of a tree node
+ childrenAttr: ["children"],
+
+ // openOnClick: Boolean
+ // If true, clicking a folder node's label will open it, rather than calling onClick()
+ openOnClick: false,
+
+ templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress\">\n</div>\n",
+
+ isExpandable: true,
+
+ isTree: true,
+
+ // persist: Boolean
+ // enables/disables use of cookies for state saving.
+ persist: true,
+
+ // dndController: String
+ // class name to use as as the dnd controller
+ dndController: null,
+
+ //parameters to pull off of the tree and pass on to the dndController as its params
+ dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance"],
+
+ //declare the above items so they can be pulled from the tree's markup
+ onDndDrop:null,
+ itemCreator:null,
+ onDndCancel:null,
+ checkAcceptance:null,
+ checkItemAcceptance:null,
+
+ _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;
+
+ this._itemNodeMap={};
+
+ if(!this.cookieName){
+ this.cookieName = this.id + "SaveStateCookie";
+ }
+ },
+
+ postCreate: function(){
+ // 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);
+ }
+ }
+
+ // make template for container node (we will clone this and insert it into
+ // any nodes that have children)
+ var div = dojo.doc.createElement('div');
+ div.style.display = 'none';
+ div.className = "dijitTreeContainer";
+ dijit.setWaiRole(div, "presentation");
+ this.containerNodeTemplate = div;
+
+ // 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");
+ // TODO: monitor item deletes so we don't end up w/orphaned nodes?
+
+ this._load();
+
+ this.inherited("postCreate", 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);
+ },
+
+ _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 = new dijit._TreeNode({
+ item: item,
+ tree: this,
+ isExpandable: true,
+ label: this.label || this.getLabel(item)
+ });
+ if(!this.showRoot){
+ rn.rowNode.style.display="none";
+ }
+ this.domNode.appendChild(rn.domNode);
+ this._itemNodeMap[this.model.getIdentity(item)] = rn;
+
+ rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname
+
+ // load top level children
+ this._expandNode(rn);
+ }),
+ function(err){
+ console.error(this, ": error loading root: ", err);
+ }
+ );
+ },
+
+ ////////////// Data store related functions //////////////////////
+ // These just get passed to the model; they are here for back-compat
+
+ mayHaveChildren: function(/*dojo.data.Item*/ item){
+ // summary
+ // User 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)
+ },
+
+ getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
+ // summary
+ // User overridable function that return array of child items of given parent item,
+ // or if parentItem==null then return top items in tree
+ },
+
+ ///////////////////////////////////////////////////////
+ // Functions for converting an item to a TreeNode
+ getLabel: function(/*dojo.data.Item*/ item){
+ // summary: user overridable function to get the label for a tree node (given the item)
+ return this.model.getLabel(item); // String
+ },
+
+ getIconClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ // summary: user overridable function to return CSS class name to display icon
+ return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
+ },
+
+ getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+ // summary: user overridable function to return CSS class name to display label
+ },
+
+ /////////// Keyboard and Mouse handlers ////////////////////
+
+ _onKeyPress: function(/*Event*/ e){
+ // summary: translates keypress events into commands for the controller
+ if(e.altKey){ return; }
+ var treeNode = dijit.getEnclosingWidget(e.target);
+ if(!treeNode){ return; }
+
+ // Note: On IE e.keyCode is not 0 for printables so check e.charCode.
+ // In dojo charCode is universally 0 for non-printables.
+ if(e.charCode){ // handle printables (letter navigation)
+ // Check for key navigation.
+ var navKey = e.charCode;
+ if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+ navKey = (String.fromCharCode(navKey)).toLowerCase();
+ this._onLetterKeyNav( { node: treeNode, key: navKey } );
+ dojo.stopEvent(e);
+ }
+ }else{ // handle non-printables (arrow keys)
+ var map = this._keyHandlerMap;
+ if(!map){
+ // setup table mapping keys to events
+ map = {};
+ map[dojo.keys.ENTER]="_onEnterKey";
+ map[this.isLeftToRight() ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW]="_onLeftArrow";
+ map[this.isLeftToRight() ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW]="_onRightArrow";
+ map[dojo.keys.UP_ARROW]="_onUpArrow";
+ map[dojo.keys.DOWN_ARROW]="_onDownArrow";
+ map[dojo.keys.HOME]="_onHomeKey";
+ map[dojo.keys.END]="_onEndKey";
+ this._keyHandlerMap = map;
+ }
+ if(this._keyHandlerMap[e.keyCode]){
+ this[this._keyHandlerMap[e.keyCode]]( { node: treeNode, item: treeNode.item } );
+ dojo.stopEvent(e);
+ }
+ }
+ },
+
+ _onEnterKey: function(/*Object*/ message){
+ this._publish("execute", { item: message.item, node: message.node} );
+ this.onClick(message.item, message.node);
+ },
+
+ _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{
+ node = node.getParent();
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ _onHomeKey: function(){
+ // summary: home pressed; get first visible node, set focus there
+ var node = this._getRootOrFirstNode();
+ if(node){
+ this.focusNode(node);
+ }
+ },
+
+ _onEndKey: function(/*Object*/ message){
+ // summary: end pressed; go to last visible node
+
+ var node = this;
+ while(node.isExpanded){
+ var c = node.getChildren();
+ node = c[c.length - 1];
+ }
+
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ },
+
+ _onLetterKeyNav: function(message){
+ // summary: letter key pressed; search for node starting with first char = key
+ var node = startNode = message.node,
+ key = message.key;
+ do{
+ node = this._getNextNode(node);
+ //check for last node, jump to first node if necessary
+ if(!node){
+ node = this._getRootOrFirstNode();
+ }
+ }while(node !== startNode && (node.label.charAt(0).toLowerCase() != key));
+ if(node && node.isTreeNode){
+ // no need to set focus if back where we started
+ if(node !== startNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ _onClick: function(/*Event*/ e){
+ // summary: translates click events into commands for the controller to process
+ var domElement = e.target;
+
+ // find node
+ var nodeWidget = dijit.getEnclosingWidget(domElement);
+ if(!nodeWidget || !nodeWidget.isTreeNode){
+ return;
+ }
+
+ if( (this.openOnClick && nodeWidget.isExpandable) ||
+ (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
+ // 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} );
+ this.onClick(nodeWidget.item, nodeWidget);
+ 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){
+ // summary: user overridable function for executing a tree item
+ },
+
+ _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.isExpandable){
+ if(node.state == "LOADING"){
+ // ignore clicks while we are in the process of loading data
+ return;
+ }
+
+ node.collapse();
+ if(this.persist && node.item){
+ delete this._openedItemIds[this.model.getIdentity(node.item)];
+ this._saveState();
+ }
+ }
+ },
+
+ _expandNode: function(/*_TreeNode*/ node){
+ // summary: called when the user has requested to expand the node
+
+ if(!node.isExpandable){
+ return;
+ }
+
+ var model = this.model,
+ item = node.item;
+
+ switch(node.state){
+ case "LOADING":
+ // ignore clicks while we are in the process of loading data
+ return;
+
+ case "UNCHECKED":
+ // need to load all the children, and then expand
+ node.markProcessing();
+ var _this = this;
+ model.getChildren(item, function(items){
+ node.unmarkProcessing();
+ node.setChildItems(items);
+ _this._expandNode(node);
+ },
+ function(err){
+ console.error(_this, ": error loading root children: ", err);
+ });
+ break;
+
+ default:
+ // data is already loaded; just proceed
+ node.expand();
+ if(this.persist && item){
+ this._openedItemIds[model.getIdentity(item)] = true;
+ this._saveState();
+ }
+ }
+ },
+
+ ////////////////// Miscellaneous functions ////////////////
+
+ blurNode: function(){
+ // summary
+ // Removes focus from the currently focused node (which must be visible).
+ // Usually not called directly (just call focusNode() on another node instead)
+ var node = this.lastFocused;
+ if(!node){ return; }
+ var labelNode = node.labelNode;
+ dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+ labelNode.setAttribute("tabIndex", "-1");
+ dijit.setWaiState(labelNode, "selected", false);
+ this.lastFocused = null;
+ },
+
+ focusNode: function(/* _tree.Node */ node){
+ // summary
+ // Focus on the specified node (which must be visible)
+
+ // set focus so that the label will be voiced using screen readers
+ node.labelNode.focus();
+ },
+
+ _onBlur: function(){
+ // summary:
+ // We've moved away from the whole tree. The currently "focused" node
+ // (see focusNode above) should remain as the lastFocused node so we can
+ // tab back into the tree. Just change CSS to get rid of the dotted border
+ // until that time
+
+ this.inherited(arguments);
+ if(this.lastFocused){
+ var labelNode = this.lastFocused.labelNode;
+ dojo.removeClass(labelNode, "dijitTreeLabelFocused");
+ }
+ },
+
+ _onTreeFocus: function(/*Widget*/ node){
+ // summary:
+ // called from onFocus handler of treeitem labelNode to set styles, wai state and tabindex
+ // for currently focused treeitem.
+
+ if (node){
+ if(node != this.lastFocused){
+ this.blurNode();
+ }
+ var labelNode = node.labelNode;
+ // set tabIndex so that the tab key can find this node
+ labelNode.setAttribute("tabIndex", "0");
+ dijit.setWaiState(labelNode, "selected", true);
+ dojo.addClass(labelNode, "dijitTreeLabelFocused");
+ this.lastFocused = node;
+ }
+ },
+
+ //////////////// Events from the model //////////////////////////
+
+ _onItemDelete: function(/*Object*/ item){
+ //summary: delete event from the store
+ // TODO: currently this isn't called, and technically doesn't need to be,
+ // but it would help with garbage collection
+
+ var identity = this.model.getIdentity(item);
+ var node = this._itemNodeMap[identity];
+
+ if(node){
+ var parent = node.getParent();
+ if(parent){
+ // if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+ parent.removeChild(node);
+ }
+ delete this._itemNodeMap[identity];
+ node.destroyRecursive();
+ }
+ },
+
+ _onItemChange: function(/*Item*/ item){
+ //summary: set data event on an item in the store
+ var model = this.model,
+ identity = model.getIdentity(item),
+ node = this._itemNodeMap[identity];
+
+ if(node){
+ node.setLabelNode(this.getLabel(item));
+ node._updateItemClasses(item);
+ }
+ },
+
+ _onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+ //summary: set data event on an item in the store
+ var model = this.model,
+ identity = model.getIdentity(parent),
+ parentNode = this._itemNodeMap[identity];
+
+ if(parentNode){
+ parentNode.setChildItems(newChildrenList);
+ }
+ },
+
+ /////////////// Miscellaneous funcs
+
+ _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(","));
+ },
+
+ destroy: function(){
+ if(this.rootNode){
+ this.rootNode.destroyRecursive();
+ }
+ 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();
+ }
+});
+
+
+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 ore more attributes that holds children of a tree node
+ childrenAttrs: ["children"],
+
+ // root: 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,
+
+ constructor: function(/* Object */ args){
+ // summary: passed the arguments listed above (store, etc)
+ 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);
+ },
+
+ // =======================================================================
+ // 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 " + 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;
+
+ // 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;
+ dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+
+ if(_waitCount == 0){
+ // all items are already loaded. proceed...
+ onComplete(childItems);
+ }else{
+ // still waiting for some or all of the items to load
+ var onItem = function onItem(item){
+ if(--_waitCount == 0){
+ // all nodes have been loaded, send them to the tree
+ onComplete(childItems);
+ }
+ }
+ dojo.forEach(childItems, function(item){
+ if(!store.isItemLoaded(item)){
+ store.loadItem({
+ item: item,
+ onItem: onItem,
+ onError: onError
+ });
+ }
+ });
+ }
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ getIdentity: function(/* item */ item){
+ return this.store.getIdentity(item); // Object
+ },
+
+ getLabel: function(/*dojo.data.Item*/ item){
+ // summary: get the label for an item
+ return this.store.getLabel(item); // String
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(/* Object? */ args, /*Item*/ parent){
+ // 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.
+ var pInfo = {parent: parent, attribute: this.childrenAttrs[0]};
+ return this.store.newItem(args, pInfo);
+ },
+
+ 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
+ var store = this.store,
+ parentAttr = this.childrenAttrs[0]; // name of "children" attr in parent item
+
+ // remove child from source item, and record the attributee 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){
+ 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.
+ },
+
+ onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
+ // summary
+ // Callback to do notifications about new, updated, or deleted items.
+ },
+
+ // =======================================================================
+ ///Events from data store
+
+ _onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+ // summary: handler for when new items appear in the store.
+
+ // In this case there's no correspond onSet() call on the parent of this
+ // item, so need to get the new children list of the parent manually somehow.
+ if(!parentInfo){
+ return;
+ }
+ this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
+ // NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+ this.onChildrenChange(parentInfo.item, children);
+ }));
+ },
+
+ _onDeleteItem: function(/*Object*/ item){
+ // summary: handler for delete notifications from underlying store
+ },
+
+ _onSetItem: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* object | array */ oldValue,
+ /* object | array */ newValue){
+ //summary: set data event on an item in the store
+
+ if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
+ // item's children list changed
+ this.getChildren(item, dojo.hitch(this, function(children){
+ // NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+ this.onChildrenChange(item, children);
+ }));
+ }else{
+ // item's label/icon/etc. changed.
+ this.onChange(item);
+ }
+ }
+});
+
+dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
+ // summary
+ // Interface between Tree and a dojo.store that doesn't have a root item, ie,
+ // 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){
+ // 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)
+ 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
+
+ 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(/* Object? */ args, /*Item*/ parent){
+ // 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){
+ // 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
+ );
+ 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);
+ }
+ },
+
+ // =======================================================================
+ // Callbacks
+
+ onAddToRoot: function(/* item */ item){
+ // summary
+ // Called when item added to root of tree; user must override
+ // to modify the item so that it matches the query for top level items
+ // example
+ // | store.setValue(item, "root", true);
+ console.log(this, ": item ", item, " added to root");
+ },
+
+ onLeaveRoot: function(/* item */ item){
+ // summary
+ // Called when item removed from root of tree; user must override
+ // to modify the item so it doesn't match the query for top level items
+ // example
+ // | store.unsetAttribute(item, "root");
+ 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 _this = this,
+ oldChildren = this.root.children;
+ this.store.fetch({
+ query: this.query,
+ onComplete: 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.
+
+ // In theory, any new item could be a top level item.
+ // Do the safe but inefficient thing by requerying the top
+ // level items. User can override this function to do something
+ // more efficient.
+ 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.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: "",
+
+ templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",
+ baseClass: "dijitTextBox",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+ {maxLength:"focusNode"}),
+
+ getDisplayedValue: function(){
+ // summary:
+ // Returns the formatted value that the user sees in the textbox, which may be different
+ // from the serialized value that's actually sent to the server (see dijit.form.ValidationTextBox.serialize)
+ return this.filter(this.textbox.value);
+ },
+
+ getValue: function(){
+ return this.parse(this.getDisplayedValue(), this.constraints);
+ },
+
+ setValue: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // 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 = this.filter(value);
+ if((((typeof filteredValue == typeof value) && (value !== undefined/*#5317*/)) || (value === null/*#5329*/)) && (formattedValue == null || formattedValue == undefined)){
+ formattedValue = this.format(filteredValue, this.constraints);
+ }
+ if(formattedValue != null && formattedValue != undefined){
+ this.textbox.value = formattedValue;
+ }
+ dijit.form.TextBox.superclass.setValue.call(this, filteredValue, priorityChange);
+ },
+
+ setDisplayedValue: function(/*String*/value, /*Boolean?*/ priorityChange){
+ // summary:
+ // 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.
+ //
+ // priorityChange:
+ // If true, an onChange event is fired immediately instead of
+ // waiting for the next blur event.
+
+ this.textbox.value = value;
+ this.setValue(this.getValue(), priorityChange);
+ },
+
+ format: function(/* String */ value, /* Object */ constraints){
+ // summary:
+ // Replacable function to convert a value to a properly formatted string
+ 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
+ return value;
+ },
+
+ postCreate: function(){
+ // setting the value here is needed since value="" in the template causes "undefined"
+ // and setting in the DOM (instead of the JS object) helps with form reset actions
+ this.textbox.setAttribute("value", this.getDisplayedValue());
+ this.inherited(arguments);
+
+ /*#5297:if(this.srcNodeRef){
+ dojo.style(this.textbox, "cssText", this.style);
+ this.textbox.className += " " + this["class"];
+ }*/
+ this._layoutHack();
+ },
+
+ filter: function(val){
+ // summary:
+ // Apply specified filters to textbox value
+ if(val === null || val === undefined){ return ""; }
+ else 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.setValue(this.getValue(), (this.isValid ? this.isValid() : true));
+ },
+
+ _onBlur: function(){
+ this._setBlurValue();
+ this.inherited(arguments);
+ },
+
+ onkeyup: function(){
+ // summary:
+ // User replaceable keyup event handler
+ }
+ }
+);
+
+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; }
+ element.focus();
+ if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
+ if(element.createTextRange){
+ var range = element.createTextRange();
+ with(range){
+ collapse(true);
+ moveStart("character", start);
+ moveEnd("character", stop);
+ select();
+ }
+ }
+ }else if(_window["getSelection"]){
+ var selection = _window.getSelection();
+ // FIXME: does this work on Safari?
+ if(element.setSelectionRange){
+ element.setSelectionRange(start, stop);
+ }
+ }
+}
+
+}
+
+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 capabilitites
+ //
+ // 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:
+ // String getDisplayedValue() OR String getValue()
+ // void setDisplayedValue(String) OR void setValue(String)
+ // void focus()
+ //
+ // editing: 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 (ie, dijit.Editor)
+ renderAsHtml: false,
+
+ // editor: String
+ // Class name for Editor widget
+ editor: "dijit.form.TextBox",
+
+ // editorParams: Object
+ // Set of parameters for editor, like {required: true}
+ editorParams: {},
+
+ onChange: function(value){
+ // summary: User should set this handler to be notified of changes to value
+ },
+
+ // 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: String
+ // The text that gets displayed when there is no value (so that the user has a place to click to edit)
+ noValueIndicator: "<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",
+
+ postMixInProperties: function(){
+ this.inherited('postMixInProperties', 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);
+ }
+
+ this.setValue(this.value || this.displayNode.innerHTML);
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Set disabled state of widget.
+
+ this.disabled = disabled;
+ dijit.setWaiState(this.focusNode || this.domNode, "disabled", disabled);
+ },
+
+ _onMouseOver: function(){
+ dojo.addClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+ },
+
+ _onMouseOut: function(){
+ dojo.removeClass(this.displayNode, this.disabled ? "dijitDisabledClickableRegion" : "dijitClickableRegion");
+ },
+
+ _onClick: function(/*Event*/ e){
+ 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
+
+ this.editing = true;
+
+ var editValue =
+ (this.renderAsHtml ?
+ this.value :
+ this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi, "\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&"));
+
+ // 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.doc.createElement("span");
+ dojo.place(placeholder, this.domNode, "before");
+
+ var ew = this.editWidget = new dijit._InlineEditor({
+ value: dojo.trim(editValue),
+ autoSave: this.autoSave,
+ buttonSave: this.buttonSave,
+ buttonCancel: this.buttonCancel,
+ renderAsHtml: this.renderAsHtml,
+ editor: this.editor,
+ editorParams: this.editorParams,
+ style: dojo.getComputedStyle(this.displayNode),
+ save: dojo.hitch(this, "save"),
+ cancel: dojo.hitch(this, "cancel"),
+ width: this.width
+ }, placeholder);
+
+ // 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
+ var ews = ew.domNode.style;
+ this.displayNode.style.display="none";
+ ews.position = "static";
+ ews.visibility = "visible";
+
+ // 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.)
+ this.domNode = ew.domNode;
+ setTimeout(function(){
+ ew.focus();
+ }, 100);
+ },
+
+ _showText: function(/*Boolean*/ focus){
+ // summary: revert to display mode, and optionally focus on display node
+
+ // display the read-only text and then quickly hide the editor (to avoid screen jitter)
+ this.displayNode.style.display="";
+ var ew = this.editWidget;
+ var ews = ew.domNode.style;
+ ews.position="absolute";
+ ews.visibility="hidden";
+
+ this.domNode = this.displayNode;
+
+ if(focus){
+ dijit.focus(this.displayNode);
+ }
+ ews.display = "none";
+ // give the browser some time to render the display node and then shift focus to it
+ // and hide the edit widget before garbage collecting the edit widget
+ setTimeout(function(){
+ ew.destroy();
+ delete ew;
+ if(dojo.isIE){
+ // messing with the DOM tab order can cause IE to focus the body - so restore
+ dijit.focus(dijit.getFocus());
+ }
+ }, 1000); // no hurry - wait for things to quiesce
+ },
+
+ save: function(/*Boolean*/ focus){
+ // summary:
+ // Save the contents of the editor and revert to display mode.
+ // focus: Boolean
+ // Focus on the display mode text
+ this.editing = false;
+
+ var value = this.editWidget.getValue() + "";
+ if(!this.renderAsHtml){
+ value = value.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;")
+ .replace(/\n/g, "<br>");
+ }
+ this.setValue(value);
+
+ // tell the world that we have changed
+ this.onChange(value);
+
+ this._showText(focus);
+ },
+
+ setValue: function(/*String*/ val){
+ // summary: inserts specified HTML value into this node, or an "input needed" character if node is blank
+ this.value = val;
+ this.displayNode.innerHTML = dojo.trim(val) || this.noValueIndicator;
+ },
+
+ getValue: function(){
+ return this.value;
+ },
+
+ cancel: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, discarding any changes made in the editor
+ this.editing = false;
+ 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:"<fieldset dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><input dojoAttachPoint=\"editorPlaceholder\"\n\t/><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\">${buttonSave}</button\n\t\t><button class='cancelButton' dojoAttachPoint=\"cancelButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:cancel\">${buttonCancel}</button\n\t></span\n></fieldset>\n",
+ widgetsInTemplate: true,
+
+ postMixInProperties: function(){
+ this.inherited('postMixInProperties', 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);
+ var ew = this.editWidget = new cls(this.editorParams, this.editorPlaceholder);
+
+ // Copy the style from the source
+ // Don't copy ALL properties though, just the necessary/applicable ones
+ var srcStyle = this.style;
+ dojo.forEach(["fontWeight","fontFamily","fontSize","fontStyle"], function(prop){
+ ew.focusNode.style[prop]=srcStyle[prop];
+ }, this);
+ dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], function(prop){
+ this.domNode.style[prop]=srcStyle[prop];
+ }, this);
+ if(this.width=="100%"){
+ // block mode
+ ew.domNode.style.width = "100%"; // because display: block doesn't work for table widgets
+ this.domNode.style.display="block";
+ }else{
+ // inline-block mode
+ ew.domNode.style.width = this.width + (Number(this.width)==this.width ? "px" : "");
+ }
+
+ this.connect(ew, "onChange", "_onChange");
+
+ // Monitor keypress on the edit widget. 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.focusNode || ew.domNode, "onkeypress", "_onKeyPress");
+
+ // priorityChange=false will prevent bogus onChange event
+ (this.editWidget.setDisplayedValue||this.editWidget.setValue).call(this.editWidget, this.value, false);
+
+ this._initialText = this.getValue();
+
+ if(this.autoSave){
+ this.buttonContainer.style.display="none";
+ }
+ },
+
+ destroy: function(){
+ this.editWidget.destroy();
+ this.inherited(arguments);
+ },
+
+ getValue: function(){
+ var ew = this.editWidget;
+ return ew.getDisplayedValue ? ew.getDisplayedValue() : ew.getValue();
+ },
+
+ _onKeyPress: function(e){
+ // summary: Callback when keypress in the edit box (see template).
+ // description:
+ // For autoSave widgets, if Esc/Enter, call cancel/save.
+ // For non-autoSave widgets, enable save button if the text value is
+ // different than the original value.
+ if(this._exitInProgress){
+ return;
+ }
+ if(this.autoSave){
+ if(e.altKey || e.ctrlKey){ return; }
+ // If Enter/Esc pressed, treat as save/cancel.
+ if(e.keyCode == dojo.keys.ESCAPE){
+ dojo.stopEvent(e);
+ this._exitInProgress = true;
+ this.cancel(true);
+ }else if(e.keyCode == dojo.keys.ENTER){
+ dojo.stopEvent(e);
+ this._exitInProgress = true;
+ this.save(true);
+ }else if(e.keyCode == dojo.keys.TAB){
+ this._exitInProgress = true;
+ // allow 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.
+ setTimeout(dojo.hitch(this, "save", false), 0);
+ }
+ }else{
+ var _this = this;
+ // Delay before calling getValue().
+ // The delay gives the browser a chance to update the Textarea.
+ setTimeout(
+ function(){
+ _this.saveButton.setAttribute("disabled", _this.getValue() == _this._initialText);
+ }, 100);
+ }
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the editor
+ this.inherited(arguments);
+ if(this._exitInProgress){
+ // when user clicks the "save" button, focus is shifted back to display text, causing this
+ // function to be called, but in that case don't do anything
+ return;
+ }
+ if(this.autoSave){
+ this._exitInProgress = true;
+ if(this.getValue() == this._initialText){
+ this.cancel(false);
+ }else{
+ this.save(false);
+ }
+ }
+ },
+
+ enableSave: function(){
+ // summary: User replacable function returning a Boolean to indicate
+ // if the Save button should be enabled or not - usually due to invalid conditions
+ return this.editWidget.isValid ? this.editWidget.isValid() : true; // Boolean
+ },
+
+ _onChange: function(){
+ // summary:
+ // Called when the underlying widget fires an onChange event,
+ // which means that the user has finished entering the value
+ if(this._exitInProgress){
+ // TODO: the onChange event might happen after the return key for an async widget
+ // like FilteringSelect. Shouldn't be deleting the edit widget on end-of-edit
+ return;
+ }
+ if(this.autoSave){
+ this._exitInProgress = true;
+ this.save(true);
+ }else{
+ // in case the keypress event didn't get through (old problem with Textarea that has been fixed
+ // in theory) or if the keypress event comes too quickly and the value inside the Textarea hasn't
+ // been updated yet)
+ this.saveButton.setAttribute("disabled", (this.getValue() == this._initialText) || !this.enableSave());
+ }
+ },
+
+ enableSave: function(){
+ // summary: User replacable function returning a Boolean to indicate
+ // if the Save button should be enabled or not - usually due to invalid conditions
+ return this.editWidget.isValid ? this.editWidget.isValid() : true;
+ },
+
+ focus: function(){
+ this.editWidget.focus();
+ dijit.selectInputText(this.editWidget.focusNode);
+ }
+});
+
+}
+
+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:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",
+
+ baseClass: "dijitCheckBox",
+
+ // Value of "type" attribute for <input>
+ type: "checkbox",
+
+ // value: Value
+ // equivalent to value field on normal checkbox (if checked, the value is passed as
+ // the value when form is submitted)
+ value: "on",
+
+ setValue: function(/*String or Boolean*/ newValue){
+ // summary:
+ // 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.setAttribute('value', newValue);
+ newValue = true;
+ }
+ this.setAttribute('checked', newValue);
+ },
+
+ _getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed
+ getValue: function(){
+ // summary:
+ // If the CheckBox is checked, returns the value attribute.
+ // Otherwise returns false.
+ return (this.checked ? this.value : false);
+ },
+
+ reset: function(){
+ this.inherited(arguments);
+ this.setAttribute('value', this._resetValueAttr);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this._resetValueAttr = this.value;
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.form.RadioButton",
+ dijit.form.CheckBox,
+ {
+ // summary:
+ // Same as an HTML radio, but with fancy styling.
+ //
+ // description:
+ // Implementation details
+ //
+ // Specialization:
+ // We keep track of dijit radio groups so that we can update the state
+ // of all the siblings (the "context") in a group based on input
+ // events. We don't rely on browser radio grouping.
+
+ type: "radio",
+ baseClass: "dijitRadio",
+
+ // This shared object keeps track of all widgets, grouped by name
+ _groups: {},
+
+ postCreate: function(){
+ // add this widget to _groups
+ (this._groups[this.name] = this._groups[this.name] || []).push(this);
+
+ this.inherited(arguments);
+ },
+
+ uninitialize: function(){
+ // remove this widget from _groups
+ dojo.forEach(this._groups[this.name], function(widget, i, arr){
+ if(widget === this){
+ arr.splice(i, 1);
+ return;
+ }
+ }, this);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // If I am being checked then have to deselect currently checked radio button
+ this.inherited(arguments);
+ switch(attr){
+ case "checked":
+ if(this.checked){
+ dojo.forEach(this._groups[this.name], function(widget){
+ if(widget != this && widget.checked){
+ widget.setAttribute('checked', false);
+ }
+ }, this);
+ }
+ }
+ },
+
+ _clicked: function(/*Event*/ e){
+ if(!this.checked){
+ this.setAttribute('checked', 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");
+
+
+
+
+
+
+
+
+/*=====
+ 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:
+ // A TextBox subclass with the ability to validate content of various types and provide user feedback.
+
+ templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",
+ baseClass: "dijitTextBox",
+
+ // default values for new subclass properties
+ // required: Boolean
+ // Can be true or false, default is false.
+ required: false,
+
+ // promptMessage: String
+ // Hint string
+ promptMessage: "",
+
+ // invalidMessage: String
+ // The message to display if value is invalid.
+ invalidMessage: "$_unset_$", // read from the message file if not overridden
+
+ // constraints: dijit.form.ValidationTextBox.__Constraints
+ // user-defined object needed to pass parameters to the validator functions
+ constraints: {},
+
+ // regExp: String
+ // regular expression string used to validate the input
+ // Do not specify both regExp and regExpGen
+ regExp: ".*",
+
+ // regExpGen: Function
+ // user replaceable function used to generate regExp when dependent on constraints
+ // Do not specify both regExp and regExpGen
+ regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/constraints){ return this.regExp; },
+
+ // 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: [],
+
+ setValue: function(){
+ this.inherited(arguments);
+ this.validate(this._focused);
+ },
+
+ validator: function(/*anything*/value, /*dijit.form.ValidationTextBox.__Constraints*/constraints){
+ // summary: user replaceable function used to validate the text input against the regular expression.
+ return (new RegExp("^(" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
+ (!this.required || !this._isEmpty(value)) &&
+ (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ // summary: Need to over-ride with your own validation code in subclasses
+ 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
+ return this.invalidMessage; // String
+ },
+
+ getPromptMessage: function(/*Boolean*/ isFocused){
+ // summary: return a hint to show if appropriate
+ return this.promptMessage; // String
+ },
+
+ validate: function(/*Boolean*/ isFocused){
+ // summary:
+ // Called by oninit, onblur, and onkeypress.
+ // description:
+ // Show missing or invalid messages if appropriate, and highlight textbox field.
+ var message = "";
+ var isValid = this.isValid(isFocused);
+ var isEmpty = this._isEmpty(this.textbox.value);
+ this.state = (isValid || (!this._hasBeenBlurred && isEmpty)) ? "" : "Error";
+ this._setStateClass();
+ dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
+ if(isFocused){
+ if(isEmpty){
+ message = this.getPromptMessage(true);
+ }
+ if(!message && this.state == "Error"){
+ message = this.getErrorMessage(true);
+ }
+ }
+ this.displayMessage(message);
+ return isValid;
+ },
+
+ // currently displayed message
+ _message: "",
+
+ displayMessage: function(/*String*/ message){
+ // summary:
+ // User overridable method to display validation errors/hints.
+ // By default uses a tooltip.
+ if(this._message == message){ return; }
+ this._message = message;
+ dijit.hideTooltip(this.domNode);
+ if(message){
+ dijit.showTooltip(message, this.domNode, this.tooltipPosition);
+ }
+ },
+
+ _refreshState: function(){
+ this.validate(this._focused);
+ },
+
+ _update: function(/*Event*/e){
+ this._refreshState();
+ this._onMouse(e); // update CSS classes
+ },
+
+ _onkeyup: function(/*Event*/e){
+ this._update(e);
+ this.onkeyup(e);
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.constraints = {};
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.constraints.locale = this.lang;
+ this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+ if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; }
+ var p = this.regExpGen(this.constraints);
+ this.regExp = p;
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.form.MappedTextBox",
+ dijit.form.ValidationTextBox,
+ {
+ // summary:
+ // A dijit.form.ValidationTextBox subclass which provides a visible formatted display and a serializable
+ // value in a hidden input field which is actually sent to the server. 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 serveris defined by the dijit.form.MappedTextBox.serialize method and is typically
+ // locale-neutral.
+
+ serialize: function(/*anything*/val, /*Object?*/options){
+ // summary: user replaceable function used to convert the getValue() result to a String
+ return val.toString ? val.toString() : ""; // String
+ },
+
+ toString: function(){
+ // summary: display the widget as a printable string using the widget's value
+ var val = this.filter(this.getValue());
+ return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
+ },
+
+ validate: function(){
+ this.valueNode.value = this.toString();
+ return this.inherited(arguments);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ if(this.valueNode){
+ this.valueNode.disabled = this.disabled;
+ }
+ }
+ },
+
+ postCreate: function(){
+ var textbox = this.textbox;
+ var valueNode = (this.valueNode = dojo.doc.createElement("input"));
+ valueNode.setAttribute("type", textbox.type);
+ valueNode.setAttribute("value", this.toString());
+ dojo.style(valueNode, "display", "none");
+ valueNode.name = this.textbox.name;
+ valueNode.disabled = this.textbox.disabled;
+ this.textbox.name = this.textbox.name + "_displayed_";
+ this.textbox.removeAttribute("name");
+ dojo.place(valueNode, textbox, "after");
+
+ 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:
+ // A dijit.form.MappedTextBox subclass which defines a range of valid values
+ //
+ // constraints: dijit.form.RangeBoundTextBox.__Constraints
+ //
+ // rangeMessage: String
+ // The message to display if value is out-of-range
+
+ /*=====
+ constraints: {},
+ ======*/
+ rangeMessage: "",
+
+ compare: function(/*anything*/val1, /*anything*/val2){
+ // summary: compare 2 values
+ return val1 - val2; // anything
+ },
+
+ rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){
+ // summary: user replaceable function used to validate the range of the numeric input value
+ var isMin = "min" in constraints;
+ var isMax = "max" in constraints;
+ if(isMin || isMax){
+ return (!isMin || this.compare(primitive,constraints.min) >= 0) &&
+ (!isMax || this.compare(primitive,constraints.max) <= 0);
+ }
+ return true; // Boolean
+ },
+
+ isInRange: function(/*Boolean*/ isFocused){
+ // summary: Need to over-ride with your own validation code in subclasses
+ return this.rangeCheck(this.getValue(), this.constraints);
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ return this.inherited(arguments) &&
+ ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
+ },
+
+ getErrorMessage: function(/*Boolean*/ isFocused){
+ if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ 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;
+ }
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ if(this.constraints.min !== undefined){
+ dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min);
+ }
+ if(this.constraints.max !== undefined){
+ dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
+ }
+ },
+
+ setValue: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+ dijit.setWaiState(this.focusNode, "valuenow", value);
+ this.inherited('setValue', 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,
+ {
+ // item: Object
+ // This is the item returned by the dojo.data.store implementation that
+ // provides the data for this cobobox, 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,
+
+ // 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 you type 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,
+
+ // searchDelay: Integer
+ // Delay in milliseconds between when user types something and we start
+ // searching based on that value
+ searchDelay: 100,
+
+ // searchAttr: String
+ // Searches pattern match against this field
+ searchAttr: "name",
+
+ // queryExpr: String
+ // 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 should ignore case when matching possible items
+ ignoreCase: true,
+
+ // hasDownArrow: Boolean
+ // Set this textbox to have a down arrow button.
+ // Defaults to true.
+ hasDownArrow:true,
+
+ templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",
+
+ baseClass:"dijitComboBox",
+
+ _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);
+ },
+
+ _setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // summary: additional code to set disablbed state of combobox node
+ if (attr == "disabled"){
+ dijit.setWaiState(this.comboNode, "disabled", value);
+ }
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary: handles keyboard events
+
+ //except for pasting case - ctrl + v(118)
+ if(evt.altKey || (evt.ctrlKey && evt.charCode != 118)){
+ return;
+ }
+ var doSearch = false;
+ var pw = this._popupWidget;
+ var dk = dojo.keys;
+ if(this._isShowingNow){
+ pw.handleKey(evt);
+ }
+ switch(evt.keyCode){
+ case dk.PAGE_DOWN:
+ case dk.DOWN_ARROW:
+ if(!this._isShowingNow||this._prev_key_esc){
+ this._arrowPressed();
+ doSearch=true;
+ }else{
+ this._announceOption(pw.getHighlightedOption());
+ }
+ dojo.stopEvent(evt);
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ case dk.PAGE_UP:
+ case dk.UP_ARROW:
+ if(this._isShowingNow){
+ this._announceOption(pw.getHighlightedOption());
+ }
+ dojo.stopEvent(evt);
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ case dk.ENTER:
+ // prevent submitting form if user presses enter. Also
+ // prevent accepting the value if either Next or Previous
+ // are selected
+ var highlighted;
+ if( this._isShowingNow &&
+ (highlighted = pw.getHighlightedOption())
+ ){
+ // 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{
+ this.setDisplayedValue(this.getDisplayedValue());
+ }
+ // default case:
+ // prevent submit, but allow event to bubble
+ evt.preventDefault();
+ // fall through
+
+ case dk.TAB:
+ var newvalue = this.getDisplayedValue();
+ // #4617:
+ // if the user had More Choices selected fall into the
+ // _onBlur handler
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"])
+ ){
+ break;
+ }
+ if(this._isShowingNow){
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(pw.getHighlightedOption()){
+ pw.setValue({ target: pw.getHighlightedOption() }, true);
+ }
+ this._hideResultList();
+ }
+ break;
+
+ case dk.SPACE:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(this._isShowingNow && pw.getHighlightedOption()){
+ dojo.stopEvent(evt);
+ this._selectOption();
+ this._hideResultList();
+ }else{
+ doSearch = true;
+ }
+ break;
+
+ case dk.ESCAPE:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = true;
+ if(this._isShowingNow){
+ dojo.stopEvent(evt);
+ this._hideResultList();
+ }
+ this.inherited(arguments);
+ break;
+
+ case dk.DELETE:
+ case dk.BACKSPACE:
+ this._prev_key_esc = false;
+ this._prev_key_backspace = true;
+ doSearch = true;
+ break;
+
+ case dk.RIGHT_ARROW: // fall through
+ case dk.LEFT_ARROW:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ default: // non char keys (F1-F12 etc..) shouldn't open list
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(dojo.isIE || evt.charCode != 0){
+ doSearch = true;
+ }
+ }
+ if(this.searchTimer){
+ clearTimeout(this.searchTimer);
+ }
+ if(doSearch){
+ // need to wait a tad before start search so that the event
+ // bubbles through DOM and we have value visible
+ 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){
+ if( this.disabled ||
+ this.readOnly ||
+ (dataObject.query[this.searchAttr] != this._lastQuery)
+ ){
+ return;
+ }
+ this._popupWidget.clearResultList();
+ if(!results.length){
+ 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.
+
+ var zerothvalue = new String(this.store.getValue(results[0], this.searchAttr));
+ if(zerothvalue && this.autoComplete && !this._prev_key_backspace &&
+ (dataObject.query[this.searchAttr] != "*")){
+ // 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.
+ this._autoCompleteText(zerothvalue);
+ }
+ 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());
+ }
+ },
+
+ _showResultList: function(){
+ this._hideResultList();
+ var items = this._popupWidget.getItems(),
+ visibleCount = Math.min(items.length,this.maxListLength);
+ this._arrowPressed();
+ // 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
+
+ with(this._popupWidget.domNode.style){
+ // 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)
+ 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)
+ });
+ dijit.setWaiState(this.comboNode, "expanded", "true");
+ },
+
+ _hideResultList: function(){
+ if(this._isShowingNow){
+ dijit.popup.close(this._popupWidget);
+ this._arrowIdle();
+ 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.getDisplayedValue();
+ var pw = this._popupWidget;
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"]
+ )
+ ){
+ this.setValue(this._lastValueReported, true);
+ }else{
+ this.setDisplayedValue(newvalue);
+ }
+ },
+
+ _onBlur: function(){
+ // summary: called magically when focus has shifted away from this widget and it's dropdown
+ this._hideResultList();
+ this._arrowIdle();
+ this.inherited(arguments);
+ },
+
+ _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 == null){
+ 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;
+ }else{
+ newValue = this.store.getValue(node.item, this.searchAttr);
+ }
+ // get the text that the user manually entered (cut off autocompleted text)
+ this.focusNode.value = this.focusNode.value.substring(0, this._getCaretPos(this.focusNode));
+ //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){
+ var tgt = null;
+ if(!evt){
+ evt ={ target: this._popupWidget.getHighlightedOption()};
+ }
+ // what if nothing is highlighted yet?
+ if(!evt.target){
+ // handle autocompletion where the the user has hit ENTER or TAB
+ this.setDisplayedValue(this.getDisplayedValue());
+ return;
+ // otherwise the user has accepted the autocompleted value
+ }else{
+ tgt = evt.target;
+ }
+ if(!evt.noHide){
+ this._hideResultList();
+ this._setCaretPos(this.focusNode, this.store.getValue(tgt.item, this.searchAttr).length);
+ }
+ this._doSelect(tgt);
+ },
+
+ _doSelect: function(tgt){
+ this.item = tgt.item;
+ this.setValue(this.store.getValue(tgt.item, this.searchAttr), true);
+ },
+
+ _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._startSearch("");
+ }
+ },
+
+ _startSearchFromInput: function(){
+ this._startSearch(this.focusNode.value);
+ },
+
+ _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
+ });
+ 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
+ this.item = null; // #4872
+ var query = dojo.clone(this.query); // #5970
+ 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){
+ var dataObject = this.store.fetch({
+ queryOptions: {
+ ignoreCase: this.ignoreCase,
+ deep: true
+ },
+ query: query,
+ onComplete: dojo.hitch(this, "_openResultList"),
+ onError: function(errText){
+ console.error('dijit.form.ComboBox: ' + errText);
+ dojo.hitch(_this, "_hideResultList")();
+ },
+ start:0,
+ count:this.pageSize
+ });
+
+ 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.store.fetch(dataObject);
+ }
+ this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, dataObject);
+ }, query, this), this.searchDelay);
+ },
+
+ _getValueField:function(){
+ return this.searchAttr;
+ },
+
+ /////////////// Event handlers /////////////////////
+
+ _arrowPressed: function(){
+ if(!this.disabled && !this.readOnly && this.hasDownArrow){
+ dojo.addClass(this.downArrowNode, "dijitArrowButtonActive");
+ }
+ },
+
+ _arrowIdle: function(){
+ if(!this.disabled && !this.readOnly && this.hasDownArrow){
+ dojo.removeClass(this.downArrowNode, "dojoArrowButtonPushed");
+ }
+ },
+
+ // FIXME:
+ // this is public so we can't remove until 2.0, but the name
+ // SHOULD be "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)
+ this.onkeypress({charCode:-1});
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.query={};
+ },
+
+ postMixInProperties: function(){
+ if(!this.hasDownArrow){
+ this.baseClass = "dijitTextBox";
+ }
+ 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( !this.value || (
+ (typeof srcNodeRef.selectedIndex == "number") &&
+ srcNodeRef.selectedIndex.toString() === this.value)
+ ){
+ var item = this.store.fetchSelectedItem();
+ if(item){
+ this.value = this.store.getValue(item, this._getValueField());
+ }
+ }
+ }
+ },
+
+ _postCreate:function(){
+ //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(cn, "disabled", this.disabled);
+
+ }
+ },
+
+ uninitialize:function(){
+ if(this._popupWidget){
+ this._hideResultList();
+ this._popupWidget.destroy()
+ }
+ },
+
+ _getMenuLabelFromItem:function(/*Item*/ item){
+ return {
+ html: false,
+ label: this.store.getValue(item, this.searchAttr)
+ };
+ },
+
+ open:function(){
+ this._isShowingNow=true;
+ return dijit.popup.open({
+ popup: this._popupWidget,
+ around: this.domNode,
+ parent: this
+ });
+ },
+
+ reset:function(){
+ // summary:
+ // Additionally reset the .item (to clean up).
+ this.item = null;
+ this.inherited(arguments);
+ }
+
+ }
+);
+
+dojo.declare(
+ "dijit.form._ComboBoxMenu",
+ [dijit._Widget, dijit._Templated],
+
+ {
+ // summary:
+ // Focus-less div based menu for internal use in ComboBox
+
+ templateString: "<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"
+ +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"
+ +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"
+ +"</ul>",
+ _messages: null,
+
+ postMixInProperties: function(){
+ this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+ this.inherited("postMixInProperties", arguments);
+ },
+
+ setValue: function(/*Object*/ value){
+ this.value = value;
+ this.onChange(value);
+ },
+
+ // stubs
+ onChange: function(/*Object*/ value){},
+ onPage: function(/*Number*/ direction){},
+
+ postCreate:function(){
+ // fill in template with i18n messages
+ this.previousButton.innerHTML = this._messages["previousMessage"];
+ this.nextButton.innerHTML = this._messages["nextMessage"];
+ this.inherited("postCreate", arguments);
+ },
+
+ onClose:function(){
+ this._blurOptionNode();
+ },
+
+ _createOption:function(/*Object*/ item, labelFunc){
+ // summary:
+ // creates an option to appear on the popup menu subclassed by
+ // 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){
+ //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 = "dijitMenuItem";
+ dojo.attr(menuitem, "id", this.id + i);
+ this.domNode.insertBefore(menuitem, this.nextButton);
+ }, this);
+ // display "Next . . ." button
+ this.nextButton.style.display = (dataObject.count == results.length) ? "" : "none";
+ dojo.attr(this.nextButton,"id", this.id + "_next")
+ },
+
+ clearResultList: function(){
+ // keep the previous and next buttons of course
+ while(this.domNode.childNodes.length>2){
+ this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
+ }
+ },
+
+ // these functions are called in showResultList
+ getItems: function(){
+ return this.domNode.childNodes;
+ },
+
+ getListLength: function(){
+ return this.domNode.childNodes.length-2;
+ },
+
+ _onMouseDown: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ },
+
+ _onMouseUp: function(/*Event*/ evt){
+ if(evt.target === this.domNode){
+ 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.setValue({ 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, "dijitMenuItemHover");
+ }
+ },
+
+ _blurOptionNode:function(){
+ // summary:
+ // removes highlight on highlighted option
+ if(this._highlighted_option){
+ dojo.removeClass(this._highlighted_option, "dijitMenuItemHover");
+ 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.
+ var fc = this.domNode.firstChild;
+ if(!this.getHighlightedOption()){
+ 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);
+ }
+ }
+ // scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ highlightFirstOption:function(){
+ // summary:
+ // Highlight the first real item in the list (not Previous Choices).
+ this._focusOptionNode(this.domNode.firstChild.nextSibling);
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ highlightLastOption:function(){
+ // summary:
+ // Highlight the last real item in the list (not More Choices).
+ this._focusOptionNode(this.domNode.lastChild.previousSibling);
+ dijit.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)
+ var lc = this.domNode.lastChild;
+ if(!this.getHighlightedOption()){
+ 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);
+ }
+ }
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ _page:function(/*Boolean*/ up){
+ 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(){ this._page(true); },
+
+ pageDown: function(){ this._page(false); },
+
+ getHighlightedOption: function(){
+ // summary:
+ // Returns the highlighted option.
+ var ho = this._highlighted_option;
+ return (ho && ho.parentNode) ? ho : null;
+ },
+
+ handleKey: function(evt){
+ switch(evt.keyCode){
+ 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.
+ //
+ // Some of the options to the ComboBox are actually arguments to the data
+ // provider.
+ //
+ // You can assume that all the form widgets (and thus anything that mixes
+ // in dijit.formComboBoxMixin) will inherit from dijit.form._FormWidget and thus the `this`
+ // reference will also "be a" _FormWidget.
+
+ postMixInProperties: function(){
+ // this.inherited(arguments); // ??
+ dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+ dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this, arguments);
+ },
+
+ postCreate: function(){
+ dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+ dijit.form.ValidationTextBox.prototype.postCreate.apply(this, arguments);
+ },
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ dijit.form.ValidationTextBox.prototype.setAttribute.apply(this, arguments);
+ dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+ }
+
+ }
+);
+
+dojo.declare("dijit.form._ComboBoxDataStore", null, {
+ // summary:
+ // Inefficient but small data store specialized for inlined 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;
+/*
+ // 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?
+ dojo.query("> option", root).forEach(function(node){
+ node.style.display="none";
+ });
+*/
+ },
+
+ 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;
+ },
+
+ fetch: function(/* Object */ args){
+ // 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.
+ // Refer to dojo.data.api.Read.fetch() more details.
+ //
+ // description:
+ // Given a query like
+ //
+ // | {
+ // | query: {name: "Cal*"},
+ // | start: 30,
+ // | count: 20,
+ // | ignoreCase: true,
+ // | onComplete: function(/* item[] */ items, /* Object */ args){...}
+ // | }
+ //
+ // will call `onComplete()` with the results of the query (and the argument to this method)
+
+ // convert query to regex (ex: convert "first\last*" to /^first\\last.*$/i) and get matching vals
+ var query = "^" + args.query.name
+ .replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g, "\\$1")
+ .replace("*", ".*") + "$",
+ matcher = new RegExp(query, args.queryOptions.ignoreCase ? "i" : ""),
+ items = dojo.query("> option", this.root).filter(function(option){
+ return (option.innerText || option.textContent || '').match(matcher);
+ } );
+
+ var start = args.start || 0,
+ end = ("count" in args && args.count != Infinity) ? (start + args.count) : items.length ;
+ args.onComplete(items.slice(start, end), args);
+ return args; // Object
+ // TODO: I don't need to return the length?
+ },
+
+ 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 dojo.query("> option:nth-child(" +
+ (si != -1 ? si+1 : 1) + ")",
+ root)[0]; // dojo.data.Item
+ }
+});
+
+}
+
+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,BHD:3,BIF:0,BYR:0,CLF:0,CLP:0,DJF:0,ESP:0,GNF:0,
+ IQD:3,ITL:0,JOD:3,JPY:0,KMF:0,KRW:0,KWD:3,LUF:0,LYD:3,
+ MGA:0,MGF:0,OMR:3,PYG:0,RWF:0,TND:3,TRL:0,VUV:0,XAF:0,
+ XOF:0,XPF: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
+}
+=====*/
+
+dojo.currency._mixInDefaults = function(options){
+ options = options || {};
+ options.type = "currency";
+
+ // Get locale-depenent 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.currency.format = function(/*Number*/value, /*dojo.number.__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.
+//
+// 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?
+ // currency, set by default.
+ // symbol: String?
+ // override currency symbol. Normally, will be looked up in table of supported currencies,
+ // and ISO currency code will be used if not found. See dojo.i18n.cldr.nls->currency.js
+ // places: Number?
+ // number of decimal places to accept. Default is defined by currency.
+ // fractional: Boolean?|Array?
+ // where places are implied by pattern or explicit 'places' parameter, whether to include the fractional portion.
+ // By default for currencies, it the fractional portion is optional.
+ type: "",
+ 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.
+ //
+ // expression: A string representation of a Number
+
+ 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]
+);
+=====*/
+
+dojo.declare(
+ "dijit.form.NumberTextBoxMixin",
+ null,
+ {
+ // summary:
+ // A mixin for all number textboxes
+
+ regExpGen: dojo.number.regexp,
+
+ /*=====
+ // constraints: dijit.form.NumberTextBox.__Constraints
+ constraints: {},
+ ======*/
+
+ // editOptions: Object
+ // properties to mix into constraints when the value is being edited
+ editOptions: { pattern: '#.######' },
+
+ _onFocus: function(){
+ this.setValue(this.getValue(), false);
+ this.inherited(arguments);
+ },
+
+ _formatter: dojo.number.format,
+
+ format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+ // summary: formats the value as a Number, according to constraints
+
+ if(typeof value == "string") { return value; }
+ if(isNaN(value)){ return ""; }
+ if(this.editOptions && this._focused){
+ constraints = dojo.mixin(dojo.mixin({}, this.editOptions), this.constraints);
+ }
+ return this._formatter(value, constraints);
+ },
+
+ parse: dojo.number.parse,
+ /*=====
+ parse: function(value, constraints){
+ // summary: parses the value as a Number, according to constraints
+ // value: String
+ //
+ // constraints: dojo.number.__ParseOptions
+ },
+ =====*/
+
+ filter: function(/*Number*/ value){
+ if(typeof value == "string"){ return this.inherited('filter', arguments); }
+ return isNaN(value) ? '' : value;
+ },
+
+ value: NaN
+ }
+);
+
+dojo.declare(
+ "dijit.form.NumberTextBox",
+ [dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
+ {
+ // summary:
+ // A validating, serializable, range-bound text box.
+ }
+);
+
+}
+
+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");
+
+//FIXME: dojo.experimental throws an unreadable exception?
+//dojo.experimental("dijit.form.CurrencyTextBox");
+
+
+
+
+dojo.declare(
+ "dijit.form.CurrencyTextBox",
+ dijit.form.NumberTextBox,
+ {
+ // summary:
+ // A validating currency textbox
+ //
+ // constraints: dijit.form._DateTimeTextBox.__Constraints
+ //
+ // currency: String
+ // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+ currency: "",
+
+ /*=====
+ constraints: {},
+ ======*/
+
+ regExpGen: dojo.currency.regexp,
+ _formatter: dojo.currency.format,
+/*=====
+ parse: function(value, constraints){
+ // summary: parses the value as a Currency, according to constraints
+ // value: String
+ //
+ // constraints: dojo.currency.__ParseOptions
+ },
+=====*/
+ parse: dojo.currency.parse,
+
+ postMixInProperties: function(){
+ if(this.constraints === dijit.form.ValidationTextBox.prototype.constraints){
+ // declare a constraints property on 'this' so we don't overwrite the shared default object in 'prototype'
+ this.constraints = {};
+ }
+ this.constraints.currency = this.currency;
+ dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this, arguments);
+ }
+ }
+);
+
+}
+
+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,
+ 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,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,
+ sd:6,so:6,tn:6,ye:6,
+ as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,
+ mh: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,za:0,zw:0,
+ et:0,mw:0,ng:0,tj:0,
+// variant. do not use? gb:0,
+ sy:4
+ };
+
+ 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", 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*/
+ eg:5,il:5,sy:5,
+ 'in':0,
+ ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4
+ };
+
+ var weekendEnd = {/*default is 0=Sunday*/
+ ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,
+ eg:6,il:6,sy: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(Number(date1));
+ date2 = new Date(Number(date2 || new Date()));
+
+ if(portion !== "undefined"){
+ 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(Number(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":
+ 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, fullYear, pattern){
+ return pattern.replace(/([a-z])\1*/ig, function(match){
+ var s, pad;
+ var c = match.charAt(0);
+ var l = match.length;
+ var 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(!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':
+ case 'L':
+ var m = dateObject.getMonth();
+ var widthM;
+ switch(l){
+ case 1: case 2:
+ s = m+1; pad = true;
+ break;
+ case 3: case 4: case 5:
+ widthM = widthList[l-3];
+ break;
+ }
+ if(widthM){
+ var typeM = (c == "L") ? "standalone" : "format";
+ var propM = ["months", typeM, widthM].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':
+ case 'e':
+ case 'c': // REVIEW: don't see this in the spec?
+ var d = dateObject.getDay();
+ var widthD;
+ switch(l){
+ case 1: case 2:
+ if(c == 'e'){
+ var first = dojo.cldr.supplemental.getFirstDayOfWeek(options.locale);
+ d = (d-first+7)%7;
+ }
+ if(c != 'c'){
+ s = d+1; pad = true;
+ break;
+ }
+ // else fallthrough...
+ case 3: case 4: case 5:
+ widthD = widthList[l-3];
+ break;
+ }
+ if(widthD){
+ var typeD = (c == "c") ? "standalone" : "format";
+ var propD = ["days", typeD, widthD].join("-");
+ s = bundle[propD][d];
+ }
+ break;
+ case 'a':
+ var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
+ s = bundle[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.getTimezoneName(dateObject);
+ if(s){break;}
+ l=4;
+ // fallthrough... use GMT if tz not available
+ case 'Z':
+ var offset = dateObject.getTimezoneOffset();
+ 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':
+// console.debug(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.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);
+ var formatLength = options.formatLength || 'short';
+ var bundle = dojo.date.locale._getGregorianBundle(locale);
+ var str = [];
+ var sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options.fullYear);
+ if(options.selector == "year"){
+ // Special case as this is not yet driven by CLDR data
+ var year = dateObject.getFullYear();
+ if(locale.match(/^zh|^ja/)){
+ year += "\u5E74";
+ }
+ return year;
+ }
+ if(options.selector != "time"){
+ var datePattern = options.datePattern || bundle["dateFormat-"+formatLength];
+ if(datePattern){str.push(_processPattern(datePattern, sauce));}
+ }
+ if(options.selector != "date"){
+ var timePattern = options.timePattern || bundle["timeFormat-"+formatLength];
+ if(timePattern){str.push(_processPattern(timePattern, sauce));}
+ }
+ var result = str.join(" "); //TODO: use locale-specific pattern to assemble date + time
+ return result; // 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);
+ var bundle = dojo.date.locale._getGregorianBundle(locale);
+ var formatLength = options.formatLength || 'short';
+ var datePattern = options.datePattern || bundle["dateFormat-" + formatLength];
+ var timePattern = options.timePattern || bundle["timeFormat-" + formatLength];
+ var pattern;
+ if(options.selector == 'date'){
+ pattern = datePattern;
+ }else if(options.selector == 'time'){
+ pattern = timePattern;
+ }else{
+ pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time
+ }
+
+ var tokens = [];
+ var 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);
+ var tokens = info.tokens, bundle = info.bundle;
+ var re = new RegExp("^" + info.regexp + "$");
+ var match = re.exec(value);
+ if(!match){ return null; } // null
+
+ var widthList = ['abbr', 'wide', 'narrow'];
+ var result = [1970,0,1,0,0,0,0]; // will get converted to a Date at the end
+ var amPm = "";
+ var 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();
+ var century = year.substring(0, 2) * 100;
+ var cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99);
+ var 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.debug("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.debug("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.am;
+ var pm = options.pm || bundle.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.debug("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.debug("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.debug("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("");
+ if(!valid ||
+ (allTokens.indexOf('M') != -1 && dateObject.getMonth() != result[1]) ||
+ (allTokens.indexOf('d') != -1 && dateObject.getDate() != result[2])){
+ return null;
+ }
+
+ 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);
+ var literal = false;
+
+ dojo.forEach(chunks, function(chunk, i){
+ if(!chunk){
+ chunks[i]='';
+ }else{
+ chunks[i]=(literal ? applyLiteral : applyPattern)(chunk);
+ 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;
+ var c = match.charAt(0);
+ var l = match.length;
+ var 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 = p2+'[1-9]|[12]\\d|3[01]';
+ 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.am || 'AM';
+ var pm = options.pm || bundle.pm || '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(); }
+ }
+ break;
+ default:
+ // case 'v':
+ // case 'z':
+ // case 'Z':
+ s = ".*";
+// console.debug("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?*/use, /*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)
+ // use:
+ // 'standAlone' || 'format' (default)
+ // locale:
+ // override locale used to find the names
+
+ var label;
+ var lookup = dojo.date.locale._getGregorianBundle(locale);
+ var props = [item, use, type];
+ if(use == 'standAlone'){
+ label = lookup[props.join('-')];
+ }
+ 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);
+ var 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) + 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();
+ var adj = (firstDayOfYear - firstDayOfWeek + 7) % 7;
+ var 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],
+ {
+ //
+ // 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 is used internally by other widgets and is not accessible
+ // as a standalone widget.
+ // 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:"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarDecrease\"><span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner\">-</span></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\" class=\"dijitCalendarMonthLabelSpacer\"></div>\n\t\t\t\t<div dojoAttachPoint=\"monthLabelNode\" class=\"dijitCalendarMonthLabel\"></div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<div class=\"dijitInline dijitCalendarIncrementControl dijitCalendarIncrease\"><span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner\">+</span></div>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\"><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>\t\n",
+
+ // value: Date
+ // the currently selected Date
+ value: new Date(),
+
+ // dayWidth: String
+ // How to represent the days of the week in the calendar header. See dojo.date.locale
+ dayWidth: "narrow",
+
+ setValue: function(/*Date*/ value){
+ // summary: set the current date and update the UI. If the date is disabled, the selection will
+ // not change, but the display will change to the corresponding month.
+ if(!this.value || dojo.date.compare(value, this.value)){
+ value = new Date(value);
+ this.displayMonth = new Date(value);
+ if(!this.isDisabledDate(value, this.lang)){
+ this.value = value;
+ this.value.setHours(0,0,0,0);
+ this.onChange(this.value);
+ }
+ this._populateGrid();
+ }
+ },
+
+ _setText: function(node, text){
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+ node.appendChild(dojo.doc.createTextNode(text));
+ },
+
+ _populateGrid: function(){
+ var month = this.displayMonth;
+ month.setDate(1);
+ var firstDay = month.getDay();
+ var daysInMonth = dojo.date.getDaysInMonth(month);
+ var daysInPreviousMonth = dojo.date.getDaysInMonth(dojo.date.add(month, "month", -1));
+ var today = new Date();
+ var selected = this.value;
+
+ var 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 Date(month);
+ var 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 = dojo.date.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!dojo.date.compare(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ if(!dojo.date.compare(date, selected, "date")){
+ 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];
+ this._setText(label, date.getDate());
+ }, this);
+
+ // Fill in localized month name
+ var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+ this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
+
+ // Fill in localized prev/current/next years
+ var y = month.getFullYear() - 1;
+ var d = new Date();
+ dojo.forEach(["previous", "current", "next"], function(name){
+ d.setFullYear(y++);
+ this._setText(this[name+"YearLabelNode"],
+ dojo.date.locale.format(d, {selector:'year', locale:this.lang}));
+ }, this);
+
+ // Set up repeating mouse behavior
+ var _this = this;
+ var typematic = function(nodeProp, dateProp, adj){
+ 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(){
+ this.setValue(new Date());
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ 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 = dojo.date.locale.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);
+
+ // Fill in spacer element with all the month names (invisible) so that the maximum width will affect layout
+ var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
+ dojo.forEach(monthNames, function(name){
+ var monthSpacer = dojo.doc.createElement("div");
+ this._setText(monthSpacer, name);
+ this.monthLabelSpacer.appendChild(monthSpacer);
+ }, this);
+
+ this.value = null;
+ this.setValue(new Date());
+ },
+
+ _adjustDisplay: function(/*String*/part, /*int*/amount){
+ this.displayMonth = dojo.date.add(this.displayMonth, part, amount);
+ this._populateGrid();
+ },
+
+ _onDayClick: function(/*Event*/evt){
+ var node = evt.target;
+ dojo.stopEvent(evt);
+ while(!node.dijitDateValue){
+ node = node.parentNode;
+ }
+ if(!dojo.hasClass(node, "dijitCalendarDisabledDate")){
+ this.setValue(node.dijitDateValue);
+ this.onValueSelected(this.value);
+ }
+ },
+
+ onValueSelected: function(/*Date*/date){
+ // summary: a date cell was selected. It may be the same as the previous value.
+ },
+
+ onChange: function(/*Date*/date){
+ // summary: called only when the selected date has changed
+ },
+
+ isDisabledDate: function(/*Date*/dateObject, /*String?*/locale){
+ // summary:
+ // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+/*=====
+ 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.
+
+/*=====
+ 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");
+
+
+
+
+
+
+/*=====
+dojo.declare(
+ "dijit.form._DateTimeTextBox.__Constraints",
+ [dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions]
+);
+=====*/
+
+dojo.declare(
+ "dijit.form._DateTimeTextBox",
+ dijit.form.RangeBoundTextBox,
+ {
+ // summary:
+ // A validating, serializable, range-bound date or time text box.
+ //
+ // constraints: dijit.form._DateTimeTextBox.__Constraints
+
+ /*=====
+ constraints: {},
+ ======*/
+ regExpGen: dojo.date.locale.regexp,
+ compare: dojo.date.compare,
+ format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+ // summary: formats the value as a Date, according to constraints
+ if(!value){ return ''; }
+ return dojo.date.locale.format(value, constraints);
+ },
+ parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+ // summary: parses the value as a Date, according to constraints
+ return dojo.date.locale.parse(value, constraints) || undefined; /* can't return null to getValue since that's special */
+ },
+
+ serialize: dojo.date.stamp.toISOString,
+
+ // value: Date
+ // The value of this widget as a JavaScript Date object. Use `getValue`/`setValue` to manipulate.
+ // When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
+ value: new Date(""), // value.toString()="NaN"
+
+ // popupClass: String
+ // Name of the popup widget class used to select a date/time
+ popupClass: "", // default is no popup = text only
+ _selector: "",
+
+ postMixInProperties: function(){
+ //dijit.form.RangeBoundTextBox.prototype.postMixInProperties.apply(this, arguments);
+ this.inherited(arguments);
+ if(!this.value || this.value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
+ this.value = undefined;
+ }
+ var constraints = this.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); }
+ },
+
+ _onFocus: function(/*Event*/ evt){
+ // summary: open the TimePicker popup
+ this._open();
+ },
+
+ setValue: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // Sets the date on this textbox. Note that `value` must be a Javascript Date object.
+ this.inherited(arguments);
+ if(this._picker){
+ // #3948: fix blank date on popup only
+ if(!value){value=new Date();}
+ this._picker.setValue(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){
+
+ 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.setValue.call(textBox, value, true);
+ },
+ lang: textBox.lang,
+ constraints: textBox.constraints,
+ 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, "date") > 0) ||
+ (constraints.max && compare(constraints.max, date, "date") < 0));
+ }
+ });
+ this._picker.setValue(this.getValue() || new Date());
+ }
+ if(!this._opened){
+ dijit.popup.open({
+ parent: this,
+ popup: this._picker,
+ 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.
+ },
+
+ getDisplayedValue:function(){
+ return this.textbox.value;
+ },
+
+ setDisplayedValue:function(/*String*/ value, /*Boolean?*/ priorityChange){
+ this.setValue(this.parse(value, this.constraints), priorityChange, value);
+ },
+
+ destroy: function(){
+ if(this._picker){
+ this._picker.destroy();
+ delete this._picker;
+ }
+ this.inherited(arguments);
+ },
+
+ _onKeyPress: function(/*Event*/e){
+ if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this, arguments)){
+ if(this._opened && e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+ this._close();
+ dojo.stopEvent(e);
+ }
+ }
+ }
+ }
+);
+
+}
+
+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 popup calendar
+
+ popupClass: "dijit._Calendar",
+ _selector: "date"
+ }
+);
+
+}
+
+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.
+ //
+ // 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)
+ //
+ // searchAttr: String
+ // Searches pattern match against this field
+ //
+ // labelAttr: String
+ // Optional. The text that actually appears in the drop down.
+ // If not specified, the searchAttr text is used instead.
+ labelAttr: "",
+
+ // labelType: String
+ // "html" or "text"
+ labelType: "text",
+
+ _isvalid:true,
+
+ _lastDisplayedValue: "",
+
+ isValid:function(){
+ return this._isvalid;
+ },
+
+ _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
+ // dataObject==null means do not test the lastQuery, just continue
+ if(dataObject && dataObject.query[this.searchAttr] != this._lastQuery){
+ return;
+ }
+ if(!result.length){
+ //#3268: do nothing on bad input
+ //this._setValue("", "");
+ //#3285: change CSS to indicate error
+ if(!this._focused){ this.valueNode.value=""; }
+ dijit.form.TextBox.superclass.setValue.call(this, undefined, !this._focused);
+ this._isvalid=false;
+ this.validate(this._focused);
+ }else{
+ this._setValueFromItem(result[0], priorityChange);
+ }
+ },
+
+ _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+ // #3285: tap into search callback to see if user's query resembles a match
+ if(dataObject.query[this.searchAttr] != this._lastQuery){
+ return;
+ }
+ this._isvalid = results.length != 0; // FIXME: should this be greater-than?
+ this.validate(true);
+ dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
+ },
+
+ getValue:function(){
+ // don't get the textbox value but rather the previously set hidden value
+ return this.valueNode.value;
+ },
+
+ _getValueField:function(){
+ // used for option tag selects
+ return "value";
+ },
+
+ _setValue:function( /*String*/ value,
+ /*String*/ displayedValue,
+ /*Boolean?*/ priorityChange){
+ this.valueNode.value = value;
+ dijit.form.FilteringSelect.superclass.setValue.call(this, value, priorityChange, displayedValue);
+ this._lastDisplayedValue = displayedValue;
+ },
+
+ setValue: function(/*String*/ value, /*Boolean?*/ priorityChange){
+ // summary
+ // Sets the value of the select.
+ // Also sets the label to the corresponding value by reverse lookup.
+
+ //#3347: fetchItemByIdentity if no keyAttr specified
+ var self=this;
+ var handleFetchByIdentity = function(item, priorityChange){
+ if(item){
+ if(self.store.isItemLoaded(item)){
+ self._callbackSetLabel([item], undefined, priorityChange);
+ }else{
+ self.store.loadItem({
+ item: item,
+ onItem: function(result, dataObject){
+ self._callbackSetLabel(result, dataObject, priorityChange);
+ }
+ });
+ }
+ }else{
+ self._isvalid=false;
+ // prevent errors from Tooltip not being created yet
+ self.validate(false);
+ }
+ }
+ this.store.fetchItemByIdentity({
+ identity: value,
+ onItem: function(item){
+ handleFetchByIdentity(item, priorityChange);
+ }
+ });
+ },
+
+ _setValueFromItem: function(/*item*/ item, /*Boolean?*/ priorityChange){
+ // summary:
+ // Set the displayed valued in the input box, based on a
+ // selected item.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // setDisplayedValue() instead
+ this._isvalid=true;
+ this._setValue( this.store.getIdentity(item),
+ this.labelFunc(item, this.store),
+ priorityChange);
+ },
+
+ labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
+ // summary: Event handler called when the label changes
+ // return: the label that the ComboBox should display
+ return store.getValue(item, this.searchAttr);
+ },
+
+ _doSelect: function(/*Event*/ tgt){
+ // summary:
+ // ComboBox's menu callback function
+ // description:
+ // FilteringSelect overrides this to set both the visible and
+ // hidden value from the information stored in the menu
+ this.item = tgt.item;
+ this._setValueFromItem(tgt.item, true);
+ },
+
+ setDisplayedValue:function(/*String*/ label, /*Boolean?*/ priorityChange){
+ // summary:
+ // Set textbox to display label. Also performs reverse lookup
+ // to set the hidden value. Used in InlineEditBox
+
+ if(this.store){
+ var query = dojo.clone(this.query); // #6196: populate query with user-specifics
+ this._lastQuery = query[this.searchAttr] = 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;
+ this.store.fetch({
+ query: query,
+ queryOptions: {
+ ignoreCase: this.ignoreCase,
+ deep: true
+ },
+ onComplete: function(result, dataObject){
+ dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
+ },
+ onError: function(errText){
+ console.error('dijit.form.FilteringSelect: ' + errText);
+ dojo.hitch(_this, "_setValue")(undefined, label, false);
+ }
+ });
+ }
+ },
+
+ _getMenuLabelFromItem:function(/*Item*/ item){
+ // internal function to help ComboBoxMenu figure out what to display
+ if(this.labelAttr){
+ return {
+ html: this.labelType=="html",
+ label: this.store.getValue(item, this.labelAttr)
+ };
+ }else{
+ // because this function is called by ComboBoxMenu,
+ // this.inherited tries to find the superclass of ComboBoxMenu
+ return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this, arguments);
+ }
+ },
+
+ postMixInProperties: function(){
+ // FIXME: shouldn't this just be a call to inherited?
+ dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+ dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this, arguments);
+ },
+
+ postCreate: function(){
+ dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+ dijit.form.MappedTextBox.prototype.postCreate.apply(this, arguments);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ dijit.form.MappedTextBox.prototype.setAttribute.apply(this, arguments);
+ dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+ },
+
+ undo: function(){
+ this.setDisplayedValue(this._lastDisplayedValue);
+ },
+
+ _valueChanged: function(){
+ return this.getDisplayedValue()!=this._lastDisplayedValue;
+ }
+ }
+);
+
+}
+
+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 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,
+
+ // 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:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",
+ baseClass: "dijitSpinner",
+
+ adjust: function(/* Object */ val, /*Number*/ delta){
+ // summary: user replaceable 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
+ return val;
+ },
+
+ _arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
+ this._active = pressed;
+ this.stateModifier = node.getAttribute("stateModifier") || "";
+ this._setStateClass();
+ },
+
+ _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction){
+ if(this.disabled || this.readOnly){ return; }
+ this._arrowState(nodePressed, true);
+ this.setValue(this.adjust(this.getValue(), direction*this.smallDelta), false);
+ dijit.selectInputText(this.textbox, this.textbox.value.length);
+ },
+
+ _arrowReleased: function(/*Node*/ node){
+ this._wheelTimer = null;
+ if(this.disabled || this.readOnly){ return; }
+ this._arrowState(node, false);
+ },
+
+ _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+ if(node == this.textbox){ node = (evt.keyCode == dojo.keys.UP_ARROW) ? this.upArrowNode : this.downArrowNode; }
+ if(count == -1){ this._arrowReleased(node); }
+ else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1); }
+ },
+
+ _wheelTimer: null,
+ _mouseWheeled: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ var scrollAmount = 0;
+ if(typeof evt.wheelDelta == 'number'){ // IE
+ scrollAmount = evt.wheelDelta;
+ }else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+ scrollAmount = -evt.detail;
+ }
+ var node, dir;
+ if(scrollAmount > 0){
+ node = this.upArrowNode;
+ dir = +1;
+ }else if(scrollAmount < 0){
+ node = this.downArrowNode;
+ dir = -1;
+ }else{ return; }
+ this._arrowPressed(node, dir);
+ if(this._wheelTimer != null){
+ clearTimeout(this._wheelTimer);
+ }
+ var _this = this;
+ this._wheelTimer = setTimeout(function(){_this._arrowReleased(node);}, 50);
+ },
+
+ postCreate: function(){
+ this.inherited('postCreate', arguments);
+
+ // extra listeners
+ this.connect(this.textbox, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+ this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+ this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+ if(dojo.isIE){
+ // When spinner is moved from hidden to visible, call _setStateClass to remind IE to render it. (#6123)
+ var _this = this;
+ this.connect(this.domNode, "onresize",
+ function(){ setTimeout(dojo.hitch(_this,
+ function(){
+ // cause the IE expressions to rerun
+ this.upArrowNode.style.behavior = '';
+ this.downArrowNode.style.behavior = '';
+ // cause IE to rerender
+ this._setStateClass();
+ }), 0);
+ }
+ );
+ }
+ }
+});
+
+}
+
+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 for incremental change to the value
+
+ required: true,
+
+ adjust: function(/* Object */ val, /*Number*/ delta){
+ // summary: change Number val by the given amount
+ var newval = val+delta;
+ if(isNaN(val) || isNaN(newval)){ return val; }
+ if((typeof this.constraints.max == "number") && (newval > this.constraints.max)){
+ newval = this.constraints.max;
+ }
+ if((typeof this.constraints.min == "number") && (newval < this.constraints.min)){
+ newval = this.constraints.min;
+ }
+ return newval;
+ }
+});
+
+}
+
+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.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, which makes a node moveable
+ // node: Node: a node (or node's id) to be moved
+ // params: Object: an optional object with additional parameters;
+ // following parameters are recognized:
+ // constraints: Function: a function, which calculates a constraint box,
+ // it is called in a context of the moveable object.
+ // within: Boolean: restrict move within boundaries.
+ // 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.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+ // 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: Object: an optional object with additional parameters;
+ // following parameters are recognized:
+ // box: Object: a constraint box
+ // the rest is passed to the base class
+ var box = params && params.box;
+ this.constraints = function(){ return box; };
+ }
+});
+
+dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
+ // 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: Object: an optional object with additional parameters;
+ // following parameters are recognized:
+ // area: String: a parent's area to restrict the move,
+ // can be "margin", "border", "padding", or "content".
+ // the rest is passed to the base class
+ 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 withtin 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["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.declare(
+ "dijit.form.HorizontalSlider",
+ [dijit.form._FormValueWidget, dijit._Container],
+{
+ // summary
+ // A form widget that allows one to select a value with a horizontally draggable image
+
+ templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></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\" dojoAttachEvent=\"onclick: decrement\"><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 dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></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=\"onclick:_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 dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><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\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n",
+ value: 0,
+
+ // showButtons: boolean
+ // Show increment/decrement buttons at the ends of the slider?
+ showButtons: true,
+
+ // minimum:: integer
+ // The minimum value allowed.
+ minimum: 0,
+
+ // maximum: integer
+ // The maximum allowed value.
+ maximum: 100,
+
+ // discreteValues: integer
+ // The maximum allowed values dispersed evenly between minimum and maximum (inclusive).
+ discreteValues: Infinity,
+
+ // pageIncrement: integer
+ // The amount of change with shift+arrow
+ pageIncrement: 2,
+
+ // clickSelect: boolean
+ // If clicking the progress 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%
+ slideDuration: 1000,
+
+ widgetsInTemplate: true,
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+ {id:"", name:"valueNode"}),
+
+ baseClass: "dijitSlider",
+
+ _mousePixelCoord: "pageX",
+ _pixelCount: "w",
+ _startingPixelCoord: "x",
+ _startingPixelCount: "l",
+ _handleOffsetCoord: "left",
+ _progressPixelSize: "width",
+
+ _onKeyPress: function(/*Event*/ e){
+ if(this.disabled || this.readOnly || e.altKey || e.ctrlKey){ return; }
+ switch(e.keyCode){
+ case dojo.keys.HOME:
+ this.setValue(this.minimum, true);
+ break;
+ case dojo.keys.END:
+ this.setValue(this.maximum, true);
+ 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:
+ this.inherited(arguments);
+ 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(){
+ return !this.isLeftToRight();
+ },
+
+ _onBarClick: function(e){
+ if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+ dijit.focus(this.sliderHandle);
+ dojo.stopEvent(e);
+ var abspos = dojo.coords(this.sliderBarContainer, true);
+ var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
+ this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
+ },
+
+ _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.setValue((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange);
+ },
+
+ setValue: function(/*Number*/ value, /*Boolean, optional*/ priorityChange){
+ 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(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:"%" };
+ dojo.animateProperty({ node: progressBar, duration: duration,
+ onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; },
+ properties: props
+ }).play();
+ }
+ else{
+ progressBar.style[this._progressPixelSize] = (percent*100) + "%";
+ remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%";
+ }
+ },
+
+ _bumpValue: function(signedChange){
+ 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.setValue(value, true);
+ },
+
+ _onClkIncBumper: function(){
+ this.setValue(this._descending === false ? this.minimum : this.maximum, true);
+ },
+
+ _onClkDecBumper: function(){
+ this.setValue(this._descending === false ? this.maximum : this.minimum, true);
+ },
+
+ decrement: function(e){
+ // summary
+ // decrement slider by 1 unit
+ this._bumpValue(e.keyCode == dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
+ },
+
+ increment: function(e){
+ // summary
+ // increment slider by 1 unit
+ this._bumpValue(e.keyCode == dojo.keys.PAGE_UP?this.pageIncrement:1);
+ },
+
+ _mouseWheeled: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ var scrollAmount = 0;
+ if(typeof evt.wheelDelta == 'number'){ // IE
+ scrollAmount = evt.wheelDelta;
+ }else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+ scrollAmount = -evt.detail;
+ }
+ if(scrollAmount > 0){
+ this.increment(evt);
+ }else if(scrollAmount < 0){
+ this.decrement(evt);
+ }
+ },
+
+ startup: function(){
+ dojo.forEach(this.getChildren(), function(child){
+ if(this[child.container] != this.containerNode){
+ this[child.container].appendChild(child.domNode);
+ }
+ }, this);
+ },
+
+ postCreate: function(){
+ if(this.showButtons){
+ this.incrementButton.style.display="";
+ this.decrementButton.style.display="";
+ }
+ this.connect(this.domNode, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+
+ // define a custom constructor for a SliderMover that points back to me
+ var _self = this;
+ var mover = function(){
+ dijit.form._SliderMover.apply(this, arguments);
+ this.widget = _self;
+ };
+ dojo.extend(mover, dijit.form._SliderMover.prototype);
+
+ this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
+ dijit.setWaiState(this.focusNode, "valuemin", this.minimum);
+ dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
+
+ this.inherited(arguments);
+ },
+
+ destroy: function(){
+ this._movable.destroy();
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare(
+ "dijit.form.VerticalSlider",
+ dijit.form.HorizontalSlider,
+{
+ // summary
+ // A form widget that allows one to select a value with a vertically draggable image
+
+ templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\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=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><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 dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_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\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></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\" style=\"text-align:center;height:100%;\"></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 dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_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=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></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,
+
+ startup: function(){
+ if(this._started){ return; }
+
+ if(!this.isLeftToRight() && dojo.isMoz){
+ if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}
+ if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}
+ }
+
+ this.inherited(arguments);
+ },
+
+ _isReversed: function(){
+ return this._descending;
+ },
+
+ _topButtonClicked: function(e){
+ if(this._descending){
+ this.increment(e);
+ }else{
+ this.decrement(e);
+ }
+ },
+
+ _bottomButtonClicked: function(e){
+ if(this._descending){
+ this.decrement(e);
+ }else{
+ this.increment(e);
+ }
+ },
+
+ _rtlRectify: function(decorationNode/*NodeList*/){
+ // summary:
+ // Rectify children nodes for left/right decoration in rtl case.
+ // Simply switch the rule and label child for each decoration node.
+ var childNodes = [];
+ while(decorationNode.firstChild){
+ childNodes.push(decorationNode.firstChild);
+ decorationNode.removeChild(decorationNode.firstChild);
+ }
+ for(var i = childNodes.length-1; i >=0; i--){
+ if(childNodes[i]){
+ decorationNode.appendChild(childNodes[i]);
+ }
+ }
+ }
+});
+
+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.coords(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.setValue(widget.value, true);
+ }
+});
+
+
+dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
+{
+ // Summary:
+ // Create hash marks for the Horizontal slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+ // count: Integer
+ // Number of hash marks to generate
+ count: 3,
+
+ // container: Node
+ // If this is a child widget, connect it to this parent node
+ 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: 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;
+ }
+});
+
+dojo.declare("dijit.form.VerticalRule", dijit.form.HorizontalRule,
+{
+ // Summary:
+ // Create hash marks for the Vertical slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+ _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:',
+
+ _isHorizontal: false
+});
+
+dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule,
+{
+ // Summary:
+ // Create labels for the Horizontal slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+ // labelStyle: String
+ // CSS style to apply to individual text labels
+ labelStyle: "",
+
+ // labels: Array
+ // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top
+ 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: '"><span class="dijitRuleLabel dijitRuleLabelH">',
+ _suffix: '</span></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(){
+ // summary: user replaceable function to return the labels array
+
+ // 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;
+ }
+});
+
+dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels,
+{
+ // Summary:
+ // Create labels for the Vertical slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></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.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._FormValueWidget,
+ {
+ // summary: A resizing textarea widget
+ //
+ // description:
+ // A textarea that resizes vertically to contain the data.
+ // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes.
+ // Cols is not supported and the width should be specified with style width.
+ // Rows is not supported since this widget adjusts the height.
+ //
+ // example:
+ // | <textarea dojoType="dijit.form.TextArea">...</textarea>
+ //
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+ {style:"styleNode", 'class':"styleNode"}),
+
+ templateString: (dojo.isIE || dojo.isSafari || dojo.isFF) ?
+ ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '<fieldset id="${id}" class="dijitInline dijitInputField dijitTextArea" dojoAttachPoint="styleNode" waiRole="presentation"><div dojoAttachPoint="editNode,focusNode,eventNode" dojoAttachEvent="onpaste:_changing,oncut:_changing" waiRole="textarea" style="text-decoration:none;display:block;overflow:auto;" contentEditable="true"></div>'
+ : '<span id="${id}" class="dijitReset">'+
+ '<iframe src="javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>"'+
+ ' dojoAttachPoint="iframe,styleNode" dojoAttachEvent="onblur:_onIframeBlur" class="dijitInline dijitInputField dijitTextArea"></iframe>')
+ + '<textarea name="${name}" value="${value}" dojoAttachPoint="formValueNode" style="display:none;"></textarea>'
+ + ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '</fieldset>':'</span>')
+ : '<textarea id="${id}" name="${name}" value="${value}" dojoAttachPoint="formValueNode,editNode,focusNode,styleNode" class="dijitInputField dijitTextArea">'+dojo.isFF+'</textarea>',
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ this.formValueNode.disabled = this.disabled;
+ case "readOnly":
+ if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+ this.editNode.contentEditable = (!this.disabled && !this.readOnly);
+ }else if(dojo.isFF){
+ this.iframe.contentDocument.designMode = (this.disabled || this.readOnly)? "off" : "on";
+ }
+ }
+ },
+
+ focus: function(){
+ // summary: Received focus, needed for the InlineEditBox widget
+ if(!this.disabled && !this.readOnly){
+ this._changing(); // set initial height
+ }
+ dijit.focus(this.iframe || this.focusNode);
+ },
+
+ setValue: function(/*String*/ value, /*Boolean, optional*/ priorityChange){
+ var editNode = this.editNode;
+ if(typeof value == "string"){
+ editNode.innerHTML = ""; // wipe out old nodes
+ if(value.split){
+ var _this=this;
+ var isFirst = true;
+ dojo.forEach(value.split("\n"), function(line){
+ if(isFirst){ isFirst = false; }
+ else{
+ editNode.appendChild(dojo.doc.createElement("BR")); // preserve line breaks
+ }
+ if(line){
+ editNode.appendChild(dojo.doc.createTextNode(line)); // use text nodes so that imbedded tags can be edited
+ }
+ });
+ }else if(value){
+ editNode.appendChild(dojo.doc.createTextNode(value));
+ }
+ if(!dojo.isIE){
+ editNode.appendChild(dojo.doc.createElement("BR")); // so that you see a cursor
+ }
+ }else{
+ // blah<BR>blah --> blah\nblah
+ // <P>blah</P><P>blah</P> --> blah\nblah
+ // <DIV>blah</DIV><DIV>blah</DIV> --> blah\nblah
+ // &amp;&lt;&gt; -->&< >
+ value = editNode.innerHTML;
+ if(this.iframe){ // strip sizeNode
+ value = value.replace(/<div><\/div>\r?\n?$/i,"");
+ }
+ value = value.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"\&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");
+ if(!dojo.isIE){
+ value = value.replace(/\n$/,""); // remove added <br>
+ }
+ }
+ this.value = this.formValueNode.value = value;
+ if(this.iframe){
+ var sizeNode = dojo.doc.createElement('div');
+ editNode.appendChild(sizeNode);
+ var newHeight = sizeNode.offsetTop;
+ if(editNode.scrollWidth > editNode.clientWidth){ newHeight+=16; } // scrollbar space needed?
+ if(this.lastHeight != newHeight){ // cache size so that we don't get a resize event because of a resize event
+ if(newHeight == 0){ newHeight = 16; } // height = 0 causes the browser to not set scrollHeight
+ dojo.contentBox(this.iframe, {h: newHeight});
+ this.lastHeight = newHeight;
+ }
+ editNode.removeChild(sizeNode);
+ }
+ dijit.form.Textarea.superclass.setValue.call(this, this.getValue(), priorityChange);
+ },
+
+ getValue: function(){
+ return this.value.replace(/\r/g,"");
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ // don't let the source text be converted to a DOM structure since we just want raw text
+ if(this.srcNodeRef && this.srcNodeRef.innerHTML != ""){
+ this.value = this.srcNodeRef.innerHTML;
+ this.srcNodeRef.innerHTML = "";
+ }
+ if((!this.value || this.value == "") && this.srcNodeRef && this.srcNodeRef.value){
+ this.value = this.srcNodeRef.value;
+ }
+ if(!this.value){ this.value = ""; }
+ this.value = this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");
+ if(dojo.isFF == 2){
+ // In the case of Firefox an iframe is used and when the text gets focus,
+ // focus is fired from the document object. There isn't a way to put a
+ // waiRole on the document object and as a result screen readers don't
+ // announce the role. As a result screen reader users are lost.
+ //
+ // An additional problem is that the browser gives the document object a
+ // very cryptic accessible name, e.g.
+ // wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html
+ // When focus is fired from the document object, the screen reader speaks
+ // the accessible name. The cyptic accessile name is confusing.
+ //
+ // A workaround for both of these problems is to give the iframe's
+ // document a title, the name of which is similar to a role name, i.e.
+ // "edit area". This will be used as the accessible name which will replace
+ // the cryptic name and will also convey the role information to the user.
+ // Because it is read directly to the user, the string must be localized.
+ // In addition, since a <label> element can not be associated with an iframe, if
+ // this control has a label, insert the label text into the title as well.
+ var _nlsResources = dojo.i18n.getLocalization("dijit.form", "Textarea");
+ this._iframeEditTitle = _nlsResources.iframeEditTitle;
+ this._iframeFocusTitle = _nlsResources.iframeFocusTitle;
+ var label=dojo.query('label[for="'+this.id+'"]');
+ if(label.length){
+ this._iframeEditTitle = label[0].innerHTML + " " + this._iframeEditTitle;
+ }
+ var body = this.focusNode = this.editNode = dojo.doc.createElement('BODY');
+ body.style.margin="0px";
+ body.style.padding="0px";
+ body.style.border="0px";
+ }
+ },
+
+ postCreate: function(){
+ if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+ this.domNode.style.overflowY = 'hidden';
+ }else if(dojo.isFF){
+ var w = this.iframe.contentWindow;
+ var title = '';
+ try { // #4715: peeking at the title can throw a security exception during iframe setup
+ title = this.iframe.contentDocument.title;
+ } catch(e) {}
+ if(!w || !title){
+ this.iframe.postCreate = dojo.hitch(this, this.postCreate);
+ return;
+ }
+ var d = w.document;
+ d.getElementsByTagName('HTML')[0].replaceChild(this.editNode, d.getElementsByTagName('BODY')[0]);
+ if(!this.isLeftToRight()){
+ d.getElementsByTagName('HTML')[0].dir = "rtl";
+ }
+ this.iframe.style.overflowY = 'hidden';
+ this.eventNode = d;
+ // this.connect won't destroy this handler cleanly since its on the iframe's window object
+ // resize is a method of window, not document
+ w.addEventListener("resize", dojo.hitch(this, this._changed), false); // resize is only on the window object
+ }else{
+ this.focusNode = this.domNode;
+ }
+ if(this.eventNode){
+ this.connect(this.eventNode, "keypress", this._onKeyPress);
+ this.connect(this.eventNode, "mousemove", this._changed);
+ this.connect(this.eventNode, "focus", this._focused);
+ this.connect(this.eventNode, "blur", this._blurred);
+ }
+ if(this.editNode){
+ this.connect(this.editNode, "change", this._changed); // needed for mouse paste events per #3479
+ }
+ this.inherited('postCreate', arguments);
+ },
+
+ // event handlers, you can over-ride these in your own subclasses
+ _focused: function(e){
+ dojo.addClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+ this._changed(e);
+ },
+
+ _blurred: function(e){
+ dojo.removeClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+ this._changed(e, true);
+ },
+
+ _onIframeBlur: function(){
+ // Reset the title back to "edit area".
+ this.iframe.contentDocument.title = this._iframeEditTitle;
+ },
+
+ _onKeyPress: function(e){
+ if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+ // Pressing the tab key in the iframe (with designMode on) will cause the
+ // entry of a tab character so we have to trap that here. Since we don't
+ // know the next focusable object we put focus on the iframe and then the
+ // user has to press tab again (which then does the expected thing).
+ // A problem with that is that the screen reader user hears "edit area"
+ // announced twice which causes confusion. By setting the
+ // contentDocument's title to "edit area frame" the confusion should be
+ // eliminated.
+ this.iframe.contentDocument.title = this._iframeFocusTitle;
+ // Place focus on the iframe. A subsequent tab or shift tab will put focus
+ // on the correct control.
+ // Note: Can't use this.focus() because that results in a call to
+ // dijit.focus and if that receives an iframe target it will set focus
+ // on the iframe's contentWindow.
+ this.iframe.focus(); // this.focus(); won't work
+ dojo.stopEvent(e);
+ }else if(e.keyCode == dojo.keys.ENTER){
+ e.stopPropagation();
+ }else if(this.inherited("_onKeyPress", arguments) && this.iframe){
+ // #3752:
+ // The key press will not make it past the iframe.
+ // If a widget is listening outside of the iframe, (like InlineEditBox)
+ // it will not hear anything.
+ // Create an equivalent event so everyone else knows what is going on.
+ var te = dojo.doc.createEvent("KeyEvents");
+ te.initKeyEvent("keypress", true, true, null, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode);
+ this.iframe.dispatchEvent(te);
+ }
+ this._changing();
+ },
+
+ _changing: function(e){
+ // summary: event handler for when a change is imminent
+ setTimeout(dojo.hitch(this, "_changed", e, false), 1);
+ },
+
+ _changed: function(e, priorityChange){
+ // summary: event handler for when a change has already happened
+ if(this.iframe && this.iframe.contentDocument.designMode != "on" && !this.disabled && !this.readOnly){
+ this.iframe.contentDocument.designMode="on"; // in case this failed on init due to being hidden
+ }
+ this.setValue(null, priorityChange || false);
+ }
+});
+
+}
+
+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,
+
+ _started: false,
+/*=====
+ // selectedChildWidget: Widget
+ // References the currently selected child widget, if any
+ //
+ selectedChildWidget: null,
+=====*/
+ postCreate: function(){
+ dijit.setWaiRole((this.containerNode || this.domNode), "tabpanel");
+ this.connect(this.domNode, "onkeypress", this._onKeyPress);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ var children = this.getChildren();
+
+ // Setup each page panel
+ dojo.forEach(children, this._setupChild, this);
+
+ // Figure out which child to initially display
+ dojo.some(children, function(child){
+ if(child.selected){
+ this.selectedChildWidget = child;
+ }
+ return child.selected;
+ }, this);
+
+ var selected = this.selectedChildWidget;
+
+ // Default to the first child
+ if(!selected && children[0]){
+ selected = this.selectedChildWidget = children[0];
+ selected.selected = true;
+ }
+ if(selected){
+ this._showChild(selected);
+ }
+
+ // Now publish information about myself so any StackControllers can initialize..
+ dojo.publish(this.id+"-startup", [{children: children, selected: selected}]);
+
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*Widget*/ page){
+ // Summary: prepare the given child
+
+ page.domNode.style.display = "none";
+
+ // since we are setting the width/height of the child elements, they need
+ // to be position:relative, or IE has problems (See bug #2033)
+ page.domNode.style.position = "relative";
+
+ return page; // dijit._Widget
+ },
+
+ addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+ // summary: Adds a widget to the stack
+
+ dijit._Container.prototype.addChild.apply(this, arguments);
+ child = this._setupChild(child);
+
+ if(this._started){
+ // in case the tab titles have overflowed from one line to two lines
+ this.layout();
+
+ dojo.publish(this.id+"-addChild", [child, insertIndex]);
+
+ // if this is the first child, then select it
+ if(!this.selectedChildWidget){
+ this.selectChild(child);
+ }
+ }
+ },
+
+ removeChild: function(/*Widget*/ page){
+ // summary: Removes the pane from the stack
+
+ dijit._Container.prototype.removeChild.apply(this, arguments);
+
+ // 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; }
+
+ 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]);
+
+ // in case the tab titles now take up one line instead of two lines
+ this.layout();
+ }
+
+ if(this.selectedChildWidget === page){
+ this.selectedChildWidget = undefined;
+ if(this._started){
+ var children = this.getChildren();
+ if(children.length){
+ this.selectChild(children[0]);
+ }
+ }
+ }
+ },
+
+ selectChild: function(/*Widget*/ page){
+ // summary:
+ // Show the given widget (which must be one of my children)
+
+ page = dijit.byId(page);
+
+ if(this.selectedChildWidget != page){
+ // Deselect old page and select new one
+ this._transition(page, this.selectedChildWidget);
+ this.selectedChildWidget = page;
+ dojo.publish(this.id+"-selectChild", [page]);
+ }
+ },
+
+ _transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+ 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.
+ // page must be visible for resizing to work
+ if(this.doLayout && newWidget.resize){
+ newWidget.resize(this._containerContentBox || this._contentBox);
+ }
+ },
+
+ _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));
+ },
+
+ back: function(){
+ // Summary: go back to previous page
+ this.selectChild(this._adjacent(false));
+ },
+
+ _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._contentBox);
+ }
+ },
+
+ _showChild: function(/*Widget*/ page){
+ var children = this.getChildren();
+ page.isFirstChild = (page == children[0]);
+ page.isLastChild = (page == children[children.length-1]);
+ page.selected = true;
+
+ page.domNode.style.display="";
+ if(page._loadCheck){
+ page._loadCheck(); // trigger load in ContentPane
+ }
+ if(page.onShow){
+ page.onShow();
+ }
+ },
+
+ _hideChild: function(/*Widget*/ page){
+ page.selected=false;
+ page.domNode.style.display="none";
+ if(page.onHide){
+ page.onHide();
+ }
+ },
+
+ closeChild: function(/*Widget*/ page){
+ // summary:
+ // callback when user clicks the [X] to remove a page
+ // if onClose() returns true then remove and destroy the child
+ var remove = page.onClose(this, page);
+ if(remove){
+ this.removeChild(page);
+ // makes sure we can clean up executeScripts in ContentPane onUnLoad
+ page.destroyRecursive();
+ }
+ },
+
+ destroy: function(){
+ this._beingDestroyed = true;
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare(
+ "dijit.layout.StackController",
+ [dijit._Widget, dijit._Templated, dijit._Container],
+ {
+ // summary:
+ // Set of buttons to select a page in a page list.
+ // 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: String
+ // the id of the page container that I point to
+ containerId: "",
+
+ // buttonWidget: 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");
+
+ // TODO: change key from object to id, to get more separation from StackContainer
+ this.pane2button = {}; // mapping from panes to buttons
+ this.pane2menu = {}; // mapping from panes to close menu
+
+ this._subscriptions=[
+ dojo.subscribe(this.containerId+"-startup", this, "onStartup"),
+ dojo.subscribe(this.containerId+"-addChild", this, "onAddChild"),
+ dojo.subscribe(this.containerId+"-removeChild", this, "onRemoveChild"),
+ dojo.subscribe(this.containerId+"-selectChild", this, "onSelectChild"),
+ dojo.subscribe(this.containerId+"-containerKeyPress", this, "onContainerKeyPress")
+ ];
+ },
+
+ onStartup: function(/*Object*/ info){
+ // summary: called after StackContainer has finished initializing
+ dojo.forEach(info.children, this.onAddChild, this);
+ this.onSelectChild(info.selected);
+ },
+
+ destroy: function(){
+ for(var pane in this.pane2button){
+ this.onRemoveChild(pane);
+ }
+ dojo.forEach(this._subscriptions, dojo.unsubscribe);
+ this.inherited(arguments);
+ },
+
+ onAddChild: function(/*Widget*/ page, /*Integer?*/ insertIndex){
+ // summary:
+ // Called whenever a page is added to the container.
+ // Create button corresponding to the page.
+
+ // add a node that will be promoted to the button widget
+ var refNode = dojo.doc.createElement("span");
+ this.domNode.appendChild(refNode);
+ // create an instance of the button widget
+ var cls = dojo.getObject(this.buttonWidget);
+ var button = new cls({label: page.title, closeButton: page.closable}, refNode);
+ this.addChild(button, insertIndex);
+ this.pane2button[page] = button;
+ page.controlButton = button; // this value might be overwritten if two tabs point to same container
+
+ dojo.connect(button, "onClick", dojo.hitch(this,"onButtonClick",page));
+ if(page.closable){
+ dojo.connect(button, "onClickCloseButton", dojo.hitch(this,"onCloseButtonClick",page));
+ // add context menu onto title button
+ var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+ var closeMenu = new dijit.Menu({targetNodeIds:[button.id], id:button.id+"_Menu"});
+ var mItem = new dijit.MenuItem({label:_nlsResources.itemClose});
+ dojo.connect(mItem, "onClick", dojo.hitch(this, "onCloseButtonClick", page));
+ closeMenu.addChild(mItem);
+ this.pane2menu[page] = closeMenu;
+ }
+ if(!this._currentChild){ // put the first child into the tab order
+ button.focusNode.setAttribute("tabIndex", "0");
+ this._currentChild = page;
+ }
+ //make sure all tabs have the same length
+ if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
+ this._rectifyRtlTabList();
+ }
+ },
+
+ onRemoveChild: function(/*Widget*/ page){
+ // summary:
+ // Called whenever a page is removed from the container.
+ // Remove the button corresponding to the page.
+ if(this._currentChild === page){ this._currentChild = null; }
+ var button = this.pane2button[page];
+ var menu = this.pane2menu[page];
+ if (menu){
+ menu.destroy();
+ }
+ if(button){
+ // TODO? if current child { reassign }
+ button.destroy();
+ }
+ this.pane2button[page] = null;
+ },
+
+ onSelectChild: function(/*Widget*/ page){
+ // summary:
+ // Called when a page has been selected in the StackContainer, either by me or by another StackController
+
+ if(!page){ return; }
+
+ if(this._currentChild){
+ var oldButton=this.pane2button[this._currentChild];
+ oldButton.setAttribute('checked', false);
+ oldButton.focusNode.setAttribute("tabIndex", "-1");
+ }
+
+ var newButton=this.pane2button[page];
+ newButton.setAttribute('checked', true);
+ this._currentChild = page;
+ newButton.focusNode.setAttribute("tabIndex", "0");
+ var container = dijit.byId(this.containerId);
+ dijit.setWaiState(container.containerNode || container.domNode, "labelledby", newButton.id);
+ },
+
+ onButtonClick: function(/*Widget*/ page){
+ // summary:
+ // Called whenever one of my child buttons is pressed in an attempt to select a page
+ var container = dijit.byId(this.containerId); // TODO: do this via topics?
+ container.selectChild(page);
+ },
+
+ onCloseButtonClick: function(/*Widget*/ page){
+ // summary:
+ // Called whenever one of my child buttons [X] is pressed in an attempt to close a page
+ var container = dijit.byId(this.containerId);
+ container.closeChild(page);
+ var b = this.pane2button[this._currentChild];
+ if(b){
+ dijit.focus(b.focusNode || b.domNode);
+ }
+ },
+
+ // TODO: this is a bit redundant with forward, back api in StackContainer
+ adjacent: function(/*Boolean*/ forward){
+ 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]);
+ // 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.
+
+ if(this.disabled || e.altKey ){ return; }
+ var forward = null;
+ if(e.ctrlKey || !e._djpage){
+ var k = dojo.keys;
+ switch(e.keyCode){
+ 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.keyCode == k.TAB){
+ this.adjacent(!e.shiftKey).onClick();
+ dojo.stopEvent(e);
+ }else if(e.keyChar == "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){
+ info.e._djpage = info.page;
+ this.onkeypress(info.e);
+ }
+});
+
+dojo.declare("dijit.layout._StackButton",
+ dijit.form.ToggleButton,
+ {
+ // summary
+ // Internal widget used by StackContainer.
+ // The button-like or tab-like object you click to select or delete a page
+
+ tabIndex: "-1", // StackContainer buttons are not in the tab order by default
+
+ 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)
+ 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.
+ evt.stopPropagation();
+ }
+});
+
+// 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, {
+ // title: String
+ // Title of this widget. Used by TabContainer to the name the tab, etc.
+ title: "",
+
+ // selected: Boolean
+ // Is this child currently selected?
+ selected: false,
+
+ // closable: Boolean
+ // True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+ closable: false, // true if user can close this tab pane
+
+ onClose: function(){
+ // summary: Callback if someone tries to close the child, child will be closed if func returns true
+ return 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.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.AccordionPane" title="pane 1">
+ // | <div dojoType="dijit.layout.ContentPane">...</div>
+ // | </div>
+ // | <div dojoType="dijit.layout.AccordionPane" title="pane 2">
+ // | <p>This is some text</p>
+ // || ...
+ // | </div>
+ //
+ // duration: Integer
+ // Amount of time (in ms) it takes to slide panes
+ duration: 250,
+
+ _verticalSpace: 0,
+
+ postCreate: function(){
+ this.domNode.style.overflow="hidden";
+ this.inherited("postCreate",arguments);
+ dijit.setWaiRole(this.domNode, "tablist");
+ dojo.addClass(this.domNode,"dijitAccordionContainer");
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ this.inherited("startup",arguments);
+ if(this.selectedChildWidget){
+ var style = this.selectedChildWidget.containerNode.style;
+ style.display = "";
+ style.overflow = "auto";
+ this.selectedChildWidget._setSelectedState(true);
+ }
+ },
+
+ layout: function(){
+ // summary:
+ // Set the height of the open pane based on what room remains
+
+ // get cumulative height of all the title bars, and figure out which pane is open
+ var totalCollapsedHeight = 0;
+ var openPane = this.selectedChildWidget;
+ dojo.forEach(this.getChildren(), function(child){
+ totalCollapsedHeight += child.getTitleHeight();
+ });
+ var mySize = this._contentBox;
+ this._verticalSpace = (mySize.h - totalCollapsedHeight);
+ if(openPane){
+ openPane.containerNode.style.height = this._verticalSpace + "px";
+/***
+TODO: this is wrong. probably you wanted to call resize on the SplitContainer
+inside the AccordionPane??
+ if(openPane.resize){
+ openPane.resize({h: this._verticalSpace});
+ }
+***/
+ }
+ },
+
+ _setupChild: function(/*Widget*/ page){
+ // Summary: prepare the given child
+ return page;
+ },
+
+ _transition: function(/*Widget?*/newWidget, /*Widget?*/oldWidget){
+//TODO: should be able to replace this with calls to slideIn/slideOut
+ if(this._inTransition){ return; }
+ this._inTransition = true;
+ var animations = [];
+ var paneHeight = this._verticalSpace;
+ if(newWidget){
+ newWidget.setSelected(true);
+ var newContents = newWidget.containerNode;
+ newContents.style.display = "";
+
+ animations.push(dojo.animateProperty({
+ node: newContents,
+ duration: this.duration,
+ properties: {
+ height: { start: "1", end: paneHeight }
+ },
+ onEnd: function(){
+ newContents.style.overflow = "auto";
+ }
+ }));
+ }
+ if(oldWidget){
+ oldWidget.setSelected(false);
+ var oldContents = oldWidget.containerNode;
+ oldContents.style.overflow = "hidden";
+ animations.push(dojo.animateProperty({
+ node: oldContents,
+ duration: this.duration,
+ properties: {
+ height: { start: paneHeight, end: "1" }
+ },
+ onEnd: function(){
+ oldContents.style.display = "none";
+ }
+ }));
+ }
+
+ this._inTransition = false;
+
+ dojo.fx.combine(animations).play();
+ },
+
+ // note: we are treating the container as controller here
+ _onKeyPress: function(/*Event*/ e){
+ if(this.disabled || e.altKey || !(e._dijitWidget || e.ctrlKey)){ return; }
+ var k = dojo.keys;
+ var fromTitle = e._dijitWidget;
+ switch(e.keyCode){
+ case k.LEFT_ARROW:
+ case k.UP_ARROW:
+ if (fromTitle){
+ this._adjacent(false)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.PAGE_UP:
+ if (e.ctrlKey){
+ this._adjacent(false)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.RIGHT_ARROW:
+ case k.DOWN_ARROW:
+ if (fromTitle){
+ this._adjacent(true)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.PAGE_DOWN:
+ if (e.ctrlKey){
+ this._adjacent(true)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ default:
+ if(e.ctrlKey && e.keyCode == k.TAB){
+ this._adjacent(e._dijitWidget, !e.shiftKey)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+
+ }
+ }
+ }
+);
+
+dojo.declare("dijit.layout.AccordionPane",
+ [dijit.layout.ContentPane, dijit._Templated, dijit._Contained],
+ {
+ // summary:
+ // AccordionPane is a ContentPane with a title that may contain another widget.
+ // Nested layout widgets, such as SplitContainer, are not supported at this time.
+ // example:
+ // | see dijit.layout.AccordionContainer
+
+ templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",
+
+ postCreate: function(){
+ this.inherited("postCreate",arguments)
+ dojo.setSelectable(this.titleNode, false);
+ this.setSelected(this.selected);
+ },
+
+ getTitleHeight: function(){
+ // summary: returns the height of the title dom node
+ return dojo.marginBox(this.titleNode).h; // Integer
+ },
+
+ _onTitleClick: function(){
+ // summary: callback when someone clicks my title
+ var parent = this.getParent();
+ if(!parent._inTransition){
+ parent.selectChild(this);
+ dijit.focus(this.focusNode);
+ }
+ },
+
+ _onTitleKeyPress: function(/*Event*/ evt){
+ evt._dijitWidget = this;
+ return this.getParent()._onKeyPress(evt);
+ },
+
+ _setSelectedState: function(/*Boolean*/ isSelected){
+ this.selected = isSelected;
+ dojo[(isSelected ? "addClass" : "removeClass")](this.titleNode,"dijitAccordionTitle-selected");
+ this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
+ },
+
+ _handleFocus: function(/*Event*/e){
+ // summary: handle the blur and focus state of this widget
+ dojo[(e.type=="focus" ? "addClass" : "removeClass")](this.focusNode,"dijitAccordionFocused");
+ },
+
+ setSelected: function(/*Boolean*/ isSelected){
+ // summary: change the selected state on this pane
+ this._setSelectedState(isSelected);
+ if(isSelected){
+ this.onSelected();
+ this._loadCheck(true); // if href specified, trigger load
+ }
+ },
+
+ onSelected: function(){
+ // summary: called when this pane is selected
+ }
+});
+
+}
+
+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._Widget, dijit._Container, dijit._Contained],
+ dijit.layout._LayoutWidget,
+{
+ // summary:
+ // Provides layout in 5 regions, a center and borders along its 4 sides.
+ //
+ // description:
+ // A BorderContainer is a box with a specified size (like 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. 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.
+ // Optional splitters may be specified on the edge widgets only to make them resizable by the user.
+ //
+ // example:
+ // | <style>
+ // | html, body { height: 100%; width: 100%; }
+ // | </style>
+ // | <div dojoType="BorderContainer" design="sidebar" style="width: 100%; height: 100%">
+ // | <div dojoType="ContentPane" region="top">header text</div>
+ // | <div dojoType="ContentPane" region="right" style="width: 200px;">table of contents</div>
+ // | <div dojoType="ContentPane" region="center">client area</div>
+ // | </div>
+ //
+ // design: String
+ // choose which design is used for the layout: "headline" (default) where the top and bottom extend
+ // the full width of the container, or "sidebar" where the left and right sides extend from top to bottom.
+ design: "headline",
+
+ // 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, // Boolean
+
+ // _splitterClass: String
+ // Optional hook to override the default Splitter widget used by BorderContainer
+ _splitterClass: "dijit.layout._Splitter",
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ this._splitters = {};
+ this._splitterThickness = {};
+ dojo.addClass(this.domNode, "dijitBorderContainer");
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ dojo.forEach(this.getChildren(), this._setupChild, this);
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*Widget*/child){
+ var region = child.region;
+ if(region){
+// dojo.addClass(child.domNode, "dijitBorderContainerPane");
+ child.domNode.style.position = "absolute"; // bill says not to set this in CSS, since we can't keep others
+ // from destroying the class list
+
+ var ltr = this.isLeftToRight();
+ if(region == "leading"){ region = ltr ? "left" : "right"; }
+ if(region == "trailing"){ region = ltr ? "right" : "left"; }
+
+ this["_"+region] = child.domNode;
+ this["_"+region+"Widget"] = child;
+
+ if(child.splitter){
+ var _Splitter = dojo.getObject(this._splitterClass);
+ var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'};
+ var oppNodeList = dojo.query('[region=' + flip[child.region] + ']', this.domNode);
+ var splitter = new _Splitter({ container: this, child: child, region: region,
+ oppNode: oppNodeList[0], live: this.liveSplitters });
+ this._splitters[region] = splitter.domNode;
+ dojo.place(splitter.domNode, child.domNode, "after");
+ this._computeSplitterThickness(region);
+ }
+ child.region = region;
+ }
+ },
+
+ _computeSplitterThickness: function(region){
+ var re = new RegExp("top|bottom");
+ this._splitterThickness[region] =
+ dojo.marginBox(this._splitters[region])[(re.test(region) ? 'h' : 'w')];
+ },
+
+ layout: function(){
+ this._layoutChildren();
+ },
+
+ addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+ this.inherited(arguments);
+ this._setupChild(child);
+ if(this._started){
+ this._layoutChildren(); //OPT
+ }
+ },
+
+ removeChild: function(/*Widget*/ child){
+ 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(child.region);
+ }
+ },
+
+ _layoutChildren: function(/*String?*/changedRegion){
+ 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);
+ if(this._top){
+ topStyle = layoutTopBottom && this._top.style;
+ topHeight = dojo.marginBox(this._top).h;
+ }
+ if(this._left){
+ leftStyle = layoutSides && this._left.style;
+ leftWidth = dojo.marginBox(this._left).w;
+ }
+ if(this._right){
+ rightStyle = layoutSides && this._right.style;
+ rightWidth = dojo.marginBox(this._right).w;
+ }
+ if(this._bottom){
+ bottomStyle = layoutTopBottom && this._bottom.style;
+ bottomHeight = dojo.marginBox(this._bottom).h;
+ }
+
+ var splitters = this._splitters;
+ var topSplitter = splitters.top;
+ var bottomSplitter = splitters.bottom;
+ var leftSplitter = splitters.left;
+ var rightSplitter = splitters.right;
+ var splitterThickness = this._splitterThickness;
+ var topSplitterThickness = splitterThickness.top || 0;
+ var leftSplitterThickness = splitterThickness.left || 0;
+ var rightSplitterThickness = splitterThickness.right || 0;
+ var 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(){
+ for(var region in this._splitters){
+ this._computeSplitterThickness(region);
+ }
+ this._layoutChildren();
+ }), 50);
+ return false;
+ }
+
+ var splitterBounds = {
+ left: (sidebarLayout ? leftWidth + leftSplitterThickness: "0") + "px",
+ right: (sidebarLayout ? rightWidth + rightSplitterThickness: "0") + "px"
+ };
+
+ if(topSplitter){
+ dojo.mixin(topSplitter.style, splitterBounds);
+ topSplitter.style.top = topHeight + "px";
+ }
+
+ if(bottomSplitter){
+ dojo.mixin(bottomSplitter.style, splitterBounds);
+ bottomSplitter.style.bottom = bottomHeight + "px";
+ }
+
+ splitterBounds = {
+ top: (sidebarLayout ? "0" : topHeight + topSplitterThickness) + "px",
+ bottom: (sidebarLayout ? "0" : bottomHeight + bottomSplitterThickness) + "px"
+ };
+
+ if(leftSplitter){
+ dojo.mixin(leftSplitter.style, splitterBounds);
+ leftSplitter.style.left = leftWidth + "px";
+ }
+
+ if(rightSplitter){
+ dojo.mixin(rightSplitter.style, splitterBounds);
+ rightSplitter.style.right = rightWidth + "px";
+ }
+
+ dojo.mixin(centerStyle, {
+ top: topHeight + topSplitterThickness + "px",
+ left: leftWidth + leftSplitterThickness + "px",
+ right: rightWidth + rightSplitterThickness + "px",
+ bottom: bottomHeight + bottomSplitterThickness + "px"
+ });
+
+ var bounds = {
+ top: sidebarLayout ? "0" : centerStyle.top,
+ bottom: sidebarLayout ? "0" : centerStyle.bottom
+ };
+ dojo.mixin(leftStyle, bounds);
+ dojo.mixin(rightStyle, bounds);
+ leftStyle.left = rightStyle.right = topStyle.top = bottomStyle.bottom = "0";
+ if(sidebarLayout){
+ topStyle.left = bottomStyle.left = leftWidth + (this.isLeftToRight() ? leftSplitterThickness : 0) + "px";
+ topStyle.right = bottomStyle.right = rightWidth + (this.isLeftToRight() ? 0 : rightSplitterThickness) + "px";
+ }else{
+ topStyle.left = topStyle.right = bottomStyle.left = bottomStyle.right = "0";
+ }
+
+ // Nodes in IE respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
+ var janky = dojo.isIE || dojo.some(this.getChildren(), function(child){
+ return child.domNode.tagName == "TEXTAREA";
+ });
+ if(janky){
+ // Set the size of the children the old fashioned way, by calling
+ // childNode.resize({h: int, w: int}) for each child node)
+
+ var borderBox = function(n, b){
+ n=dojo.byId(n);
+ var s = dojo.getComputedStyle(n);
+ if(!b){ return dojo._getBorderBox(n, s); }
+ var me = dojo._getMarginExtents(n, s);
+ dojo._setMarginBox(n, b.l, b.t, b.w + me.w, b.h + me.h, s);
+ return null;
+ };
+
+ var resizeWidget = function(widget, dim){
+ if(widget){
+ widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+ }
+ };
+
+ // TODO: use dim passed in to resize() (see _LayoutWidget.js resize())
+ // Then can make borderBox setBorderBox(), since no longer need to ever get the borderBox() size
+ var thisBorderBox = borderBox(this.domNode);
+
+ var containerHeight = thisBorderBox.h;
+ var middleHeight = containerHeight;
+ if(this._top){ middleHeight -= topHeight; }
+ if(this._bottom){ middleHeight -= bottomHeight; }
+ if(topSplitter){ middleHeight -= topSplitterThickness; }
+ if(bottomSplitter){ middleHeight -= bottomSplitterThickness; }
+ var centerDim = { h: middleHeight };
+
+ var sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
+ if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
+ if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
+ resizeWidget(this._leftWidget, {h: sidebarHeight});
+ resizeWidget(this._rightWidget, {h: sidebarHeight});
+
+ var containerWidth = thisBorderBox.w;
+ var middleWidth = containerWidth;
+ if(this._left){ middleWidth -= leftWidth; }
+ if(this._right){ middleWidth -= rightWidth; }
+ if(leftSplitter){ middleWidth -= leftSplitterThickness; }
+ if(rightSplitter){ middleWidth -= rightSplitterThickness; }
+ centerDim.w = middleWidth;
+
+ var sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
+ if(topSplitter){ topSplitter.style.width = sidebarWidth; }
+ if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
+ resizeWidget(this._topWidget, {w: sidebarWidth});
+ resizeWidget(this._bottomWidget, {w: sidebarWidth});
+
+ resizeWidget(this._centerWidget, centerDim);
+ }else{
+
+ // We've already sized the children by setting style.top/bottom/left/right...
+ // Now just need to call resize() on those children so they can re-layout themselves
+
+ // TODO: calling child.resize() without an argument is bad, because it forces
+ // the child to query it's own size (even though this function already knows
+ // the size), plus which querying the size of a node right after setting it
+ // is known to cause problems (incorrect answer or an exception).
+ // This is a setback from older layout widgets, which
+ // don't do that. See #3399, #2678, #3624 and #2955, #1988
+
+ var resizeList = {};
+ if(changedRegion){
+ resizeList[changedRegion] = resizeList.center = true;
+ if(/top|bottom/.test(changedRegion) && this.design != "sidebar"){
+ resizeList.left = resizeList.right = true;
+ }else if(/left|right/.test(changedRegion) && this.design == "sidebar"){
+ resizeList.top = resizeList.bottom = true;
+ }
+ }
+
+ dojo.forEach(this.getChildren(), function(child){
+ if(child.resize && (!changedRegion || child.region in resizeList)){
+ // console.log(this.id, ": resizing child id=" + child.id + " (region=" + child.region + "), style before resize is " +
+ // "{ t: " + child.domNode.style.top +
+ // ", b: " + child.domNode.style.bottom +
+ // ", l: " + child.domNode.style.left +
+ // ", r: " + child.domNode.style.right +
+ // ", w: " + child.domNode.style.width +
+ // ", h: " + child.domNode.style.height +
+ // "}"
+ // );
+ child.resize();
+ // console.log(this.id, ": after resize of child id=" + child.id + " (region=" + child.region + ") " +
+ // "{ t: " + child.domNode.style.top +
+ // ", b: " + child.domNode.style.bottom +
+ // ", l: " + child.domNode.style.left +
+ // ", r: " + child.domNode.style.right +
+ // ", w: " + child.domNode.style.width +
+ // ", h: " + child.domNode.style.height +
+ // "}"
+ // );
+ }
+ }, this);
+ }
+ }
+});
+
+// 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: String
+ // "top", "bottom", "leading", "trailing", "left", "right", "center".
+ // See the BorderContainer description for details on this parameter.
+ region: '',
+
+ // splitter: Boolean
+ splitter: false,
+
+ // minSize: Number
+ minSize: 0,
+
+ // maxSize: Number
+ maxSize: Infinity
+});
+
+
+
+dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
+{
+/*=====
+ container: null,
+ child: null,
+ region: null,
+=====*/
+
+ // live: 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,
+
+ // summary: A draggable spacer between two items in a BorderContainer
+ templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag" 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._minSize = this.child.minSize;
+
+ this._computeMaxSize();
+ //TODO: might be more accurate to recompute constraints on resize?
+ this.connect(this.container, "layout", dojo.hitch(this, this._computeMaxSize));
+
+ 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(){
+ var dim = this.horizontal ? 'h' : 'w';
+ var available = dojo.contentBox(this.container.domNode)[dim] - (this.oppNode ? dojo.marginBox(this.oppNode)[dim] : 0);
+ this._maxSize = 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");
+ }else{
+ this.cover.style.zIndex = 1;
+ }
+
+ // Safeguard in case the stop event was missed. Shouldn't be necessary if we always get the mouse up.
+ if(this.fake){ dojo._destroyElement(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");
+
+ //Performance: load data info local vars for onmousevent function closure
+ var factor = this._factor,
+ max = this._maxSize,
+ min = this._minSize || 10;
+ var axis = this.horizontal ? "pageY" : "pageX";
+ var pageStart = e[axis];
+ var splitterStyle = this.domNode.style;
+ var dim = this.horizontal ? 'h' : 'w';
+ var childStart = dojo.marginBox(this.child.domNode)[dim];
+ var splitterStart = parseInt(this.domNode.style[this.region]);
+ var resize = this._resize;
+ var region = this.region;
+ var mb = {};
+ var childNode = this.child.domNode;
+ var layoutFunc = dojo.hitch(this.container, this.container._layoutChildren);
+
+ var de = dojo.doc.body;
+ 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){
+ mb[dim] = boundChildSize;
+ // TODO: inefficient; we set the marginBox here and then immediately layoutFunc() needs to query it
+ dojo.marginBox(childNode, mb);
+ layoutFunc(region);
+ }
+ splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
+ }),
+ dojo.connect(de, "onmouseup", this, "_stopDrag")
+ ]);
+ dojo.stopEvent(e);
+ },
+
+ _stopDrag: function(e){
+ try{
+ if(this.cover){ this.cover.style.zIndex = -1; }
+ if(this.fake){ dojo._destroyElement(this.fake); }
+ dojo.removeClass(this.domNode, "dijitSplitterActive");
+ 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"]);
+ }
+ },
+
+ _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.keyCode){
+ 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;
+ var mb = {};
+ mb[ this.horizontal ? "h" : "w"] = Math.max(Math.min(childSize, this._maxSize), this._minSize);
+ dojo.marginBox(this.child.domNode, mb);
+ this.container._layoutChildren(this.region);
+ dojo.stopEvent(e);
+ },
+
+ destroy: function(){
+ this._cleanupHandlers();
+ delete this.child;
+ delete this.container;
+ delete this.fake;
+ this.inherited(arguments);
+ }
+});
+
+}
+
+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:
+ // Provides Delphi-style panel layout semantics.
+ //
+ // description:
+ // 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.
+ //
+
+ 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(/*Widget*/ child, /*Integer?*/ insertIndex){
+ dijit._Container.prototype.addChild.apply(this, arguments);
+ if(this._started){
+ dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ },
+
+ removeChild: function(/*Widget*/ widget){
+ dijit._Container.prototype.removeChild.apply(this, 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 that loads data remotely
+ // description:
+ // LinkPane is just a ContentPane that loads data remotely (via the href attribute),
+ // and has markup similar 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"></div>',
+
+ postCreate: 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("postCreate",arguments);
+ }
+});
+
+}
+
+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:
+ // A Container widget with sizing handles in-between each child
+ // description:
+ // 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.
+
+ 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,
+
+ postMixInProperties: function(){
+ this.inherited("postMixInProperties",arguments);
+ this.isHorizontal = (this.orientation == 'horizontal');
+ },
+
+ postCreate: function(){
+ this.inherited("postCreate",arguments);
+ this.sizers = [];
+ dojo.addClass(this.domNode, "dijitSplitContainer");
+ // 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 = this.virtualSizer = dojo.doc.createElement('div');
+ 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._injectChild(child);
+
+ if(i < children.length-1){
+ this._addSizer();
+ }
+ }, this);
+
+ if(this.persist){
+ this._restoreState();
+ }
+
+ this.inherited(arguments);
+ },
+
+ _injectChild: function(child){
+ child.domNode.style.position = "absolute";
+ dojo.addClass(child.domNode, "dijitSplitPane");
+ },
+
+ _addSizer: function(){
+ var i = this.sizers.length;
+
+ // TODO: use a template for this!!!
+ var sizer = this.sizers[i] = dojo.doc.createElement('div');
+ 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?
+ var self = this;
+ var handler = (function(){ var sizer_i = i; return function(e){ self.beginSizing(e, sizer_i); } })();
+ this.connect(sizer, "onmousedown", handler);
+
+ 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._destroyElement(this.sizers[i]);
+ this.sizers.splice(i,1);
+ }
+ }
+
+ // Remove widget and repaint
+ this.inherited(arguments);
+ if(this._started){
+ this.layout();
+ }
+ },
+
+ addChild: function(/*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("addChild",arguments);
+
+ if(this._started){
+ // Do the stuff that startup() does for each widget
+ this._injectChild(child);
+ var children = this.getChildren();
+ if(children.length > 1){
+ this._addSizer();
+ }
+
+ // 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.doc.createElement('div');
+ this.domNode.appendChild(this.cover);
+ var s = this.cover.style;
+ s.position = 'absolute';
+ s.zIndex = 1;
+ s.top = 0;
+ s.left = 0;
+ s.width = "100%";
+ s.height = "100%";
+ }else{
+ this.cover.style.zIndex = 1;
+ }
+ this.sizingSplitter.style.zIndex = 2;
+
+ // 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.coords(children[0].domNode, true);
+ if(this.isHorizontal){
+ var client = (e.layerX ? e.layerX : e.offsetX);
+ var screen = e.pageX;
+ this.originPos = this.originPos.x;
+ }else{
+ var client = (e.layerY ? e.layerY : e.offsetY);
+ 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(){
+ dojo.forEach(this.getChildren(), function(child, i){
+ dojo.cookie(this._getCookieName(i), child.sizeShare);
+ }, 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: Integer
+ // Minimum size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ sizeMin: 10,
+
+ // sizeShare: Integer
+ // Size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ // For example, if there are two children and each has sizeShare=10, then
+ // each takes up 50% of the available space.
+ sizeShare: 10
+});
+
+}
+
+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.StackContainer, dijit._Templated],
+ {
+ // summary:
+ // A Container with Title Tabs, each one pointing at a pane in the container.
+ // 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 title (aka title) of the pane, and optionally a close button.
+ //
+ // Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+ // (where [widgetId] is the id of the TabContainer itself.
+ //
+ // tabPosition: String
+ // Defines where tabs go relative to tab content.
+ // "top", "bottom", "left-h", "right-h"
+ tabPosition: "top",
+
+ templateString: null, // override setting in StackContainer
+ templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",
+
+ // _controllerWidget: String
+ // An optional parameter to overrider the default TabContainer controller used.
+ _controllerWidget: "dijit.layout.TabController",
+
+ postCreate: function(){
+ this.inherited(arguments);
+ // create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+ var TabController = dojo.getObject(this._controllerWidget);
+ this.tablist = new TabController({
+ id: this.id + "_tablist",
+ tabPosition: this.tabPosition,
+ doLayout: this.doLayout,
+ containerId: this.id
+ }, this.tablistNode);
+ },
+
+ _setupChild: function(/* Widget */tab){
+ dojo.addClass(tab.domNode, "dijitTabPane");
+ this.inherited(arguments);
+ return tab; // Widget
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ // wire up the tablist and its tabs
+ this.tablist.startup();
+ this.inherited(arguments);
+
+ if(dojo.isSafari){
+ // sometimes safari 3.0.3 miscalculates the height of the tab labels, see #4058
+ setTimeout(dojo.hitch(this, "layout"), 0);
+ }
+
+ if(dojo.isIE && !this.isLeftToRight() && this.tabPosition == "right-h" &&
+ this.tablist && this.tablist.pane2button){
+ //need rectify non-closable tab in IE, only for "right-h" mode
+ for(var pane in this.tablist.pane2button){
+ var tabButton = this.tablist.pane2button[pane];
+ if(!tabButton.closeButton){ continue; }
+ tabButtonStyle = tabButton.closeButtonNode.style;
+ tabButtonStyle.position ="absolute";
+ if(dojo.isIE < 7){
+ tabButtonStyle.left = tabButton.domNode.offsetWidth + "px";
+ }else{
+ tabButtonStyle.padding = "0px";
+ }
+ }
+ }
+ },
+
+ layout: function(){
+ // Summary: Configure the content pane to take up all the space except for where the tabs are
+ if(!this.doLayout){ return; }
+
+ // position and size the titles and the container node
+ var titleAlign = this.tabPosition.replace(/-h/,"");
+ var children = [
+ { domNode: this.tablist.domNode, layoutAlign: titleAlign },
+ { domNode: this.containerNode, layoutAlign: "client" }
+ ];
+ dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+
+ // Compute size to make each of my children.
+ // children[1] is the margin-box size of this.containerNode, set by layoutChildren() call above
+ this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[1]);
+
+ if(this.selectedChildWidget){
+ this._showChild(this.selectedChildWidget);
+ if(this.doLayout && this.selectedChildWidget.resize){
+ this.selectedChildWidget.resize(this._containerContentBox);
+ }
+ }
+ },
+
+ destroy: function(){
+ if(this.tablist){
+ this.tablist.destroy();
+ }
+ this.inherited(arguments);
+ }
+});
+
+//TODO: make private?
+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).
+ // 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.
+
+ 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",
+
+ // doLayout: Boolean
+ // TODOC: deprecate doLayout? not sure.
+ doLayout: true,
+
+ // buttonWidget: String
+ // The name of the tab widget to create to correspond to each page
+ buttonWidget: "dijit.layout._TabButton",
+
+ postMixInProperties: function(){
+ this["class"] = "dijitTabLabels-" + this.tabPosition + (this.doLayout ? "" : " dijitTabNoLayout");
+ this.inherited(arguments);
+ },
+
+//TODO: can this be accomplished in CSS?
+ _rectifyRtlTabList: function(){
+ //Summary: Rectify the length of all tabs in rtl, otherwise the tab lengths are different in IE
+ if(0 >= this.tabPosition.indexOf('-h')){ return; }
+ if(!this.pane2button){ return; }
+
+ var maxLen = 0;
+ for(var pane in this.pane2button){
+ maxLen = Math.max(maxLen, dojo.marginBox(this.pane2button[pane].innerDiv).w);
+ }
+ //unify the length of all the tabs
+ for(pane in this.pane2button){
+ this.pane2button[pane].innerDiv.style.width = maxLen + '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.
+
+ baseClass: "dijitTab",
+
+ templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t </span>\n </div>\n </div>\n</div>\n",
+
+ postCreate: function(){
+ if(this.closeButton){
+ dojo.addClass(this.innerDiv, "dijitClosable");
+ }else{
+ this.closeButtonNode.style.display="none";
+ }
+ this.inherited(arguments);
+ dojo.setSelectable(this.containerNode, false);
+ }
+});
+
+}
+
+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.
+};
+=====*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ //deprecated
+
+ //deprecated
+
+
+
+
+}
+
+
+dojo.i18n._preloadLocalizations("dijit.nls.dijit-all", ["he","nl","tr","no","ko","el","en","en-gb","ROOT","zh-cn","hu","es","fi-fi","pt-br","fi","he-il","xx","ru","it","fr","cs","de-de","fr-fr","it-it","es-es","ja","da","pl","de","sv","pt","zh-tw","pt-pt","nl-nl","ko-kr","ar","en-us","zh","ja-jp"]);
diff --git a/includes/js/dijit/dijit.js b/includes/js/dijit/dijit.js
new file mode 100644
index 0000000..d64daf7
--- /dev/null
+++ b/includes/js/dijit/dijit.js
@@ -0,0 +1,20 @@
+/*
+ Copyright (c) 2004-2008, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+ This is a compiled version of Dojo, built for deployment and not for
+ development. To get an editable version, please visit:
+
+ http://dojotoolkit.org
+
+ for documentation and information on getting the source.
+*/
+
+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(){var _1=dojo.global;var _2=dojo.doc;if(_2.selection){return !_2.selection.createRange().text;}else{var _3=_1.getSelection();if(dojo.isString(_3)){return !_3;}else{return _3.isCollapsed||!_3.toString();}}},getBookmark:function(){var _4,_5=dojo.doc.selection;if(_5){var _6=_5.createRange();if(_5.type.toUpperCase()=="CONTROL"){if(_6.length){_4=[];var i=0,_8=_6.length;while(i<_8){_4.push(_6.item(i++));}}else{_4=null;}}else{_4=_6.getBookmark();}}else{if(window.getSelection){_5=dojo.global.getSelection();if(_5){_6=_5.getRangeAt(0);_4=_6.cloneRange();}}else{console.warn("No idea how to store the current selection for this browser!");}}return _4;},moveToBookmark:function(_9){var _a=dojo.doc;if(_a.selection){var _b;if(dojo.isArray(_9)){_b=_a.body.createControlRange();dojo.forEach(_9,"range.addElement(item)");}else{_b=_a.selection.createRange();_b.moveToBookmark(_9);}_b.select();}else{var _c=dojo.global.getSelection&&dojo.global.getSelection();if(_c&&_c.removeAllRanges){_c.removeAllRanges();_c.addRange(_9);}else{console.warn("No idea how to restore selection for this browser!");}}},getFocus:function(_d,_e){return {node:_d&&dojo.isDescendant(dijit._curFocus,_d.domNode)?dijit._prevFocus:dijit._curFocus,bookmark:!dojo.withGlobal(_e||dojo.global,dijit.isCollapsed)?dojo.withGlobal(_e||dojo.global,dijit.getBookmark):null,openedForWindow:_e};},focus:function(_f){if(!_f){return;}var _10="node" in _f?_f.node:_f,_11=_f.bookmark,_12=_f.openedForWindow;if(_10){var _13=(_10.tagName.toLowerCase()=="iframe")?_10.contentWindow:_10;if(_13&&_13.focus){try{_13.focus();}catch(e){}}dijit._onFocusNode(_10);}if(_11&&dojo.withGlobal(_12||dojo.global,dijit.isCollapsed)){if(_12){_12.focus();}try{dojo.withGlobal(_12||dojo.global,dijit.moveToBookmark,null,[_11]);}catch(e){}}},_activeStack:[],registerWin:function(_14){if(!_14){_14=window;}dojo.connect(_14.document,"onmousedown",function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);dijit._onTouchNode(evt.target||evt.srcElement);});var _16=_14.document.body||_14.document.getElementsByTagName("body")[0];if(_16){if(dojo.isIE){_16.attachEvent("onactivate",function(evt){if(evt.srcElement.tagName.toLowerCase()!="body"){dijit._onFocusNode(evt.srcElement);}});_16.attachEvent("ondeactivate",function(evt){dijit._onBlurNode(evt.srcElement);});}else{_16.addEventListener("focus",function(evt){dijit._onFocusNode(evt.target);},true);_16.addEventListener("blur",function(evt){dijit._onBlurNode(evt.target);},true);}}_16=null;},_onBlurNode:function(_1b){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(_1c){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _1d=[];try{while(_1c){if(_1c.dijitPopupParent){_1c=dijit.byId(_1c.dijitPopupParent).domNode;}else{if(_1c.tagName&&_1c.tagName.toLowerCase()=="body"){if(_1c===dojo.body()){break;}_1c=dijit.getDocumentWindow(_1c.ownerDocument).frameElement;}else{var id=_1c.getAttribute&&_1c.getAttribute("widgetId");if(id){_1d.unshift(id);}_1c=_1c.parentNode;}}}}catch(e){}dijit._setStack(_1d);},_onFocusNode:function(_1f){if(_1f&&_1f.tagName&&_1f.tagName.toLowerCase()=="body"){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){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;}}for(var i=_21.length-1;i>=_22;i--){var _24=dijit.byId(_21[i]);if(_24){_24._focused=false;_24._hasBeenBlurred=true;if(_24._onBlur){_24._onBlur();}if(_24._setStateClass){_24._setStateClass();}dojo.publish("widgetBlur",[_24]);}}for(i=_22;i<_20.length;i++){_24=dijit.byId(_20[i]);if(_24){_24._focused=true;if(_24._onFocus){_24._onFocus();}if(_24._setStateClass){_24._setStateClass();}dojo.publish("widgetFocus",[_24]);}}}});dojo.addOnLoad(dijit.registerWin);}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={};},add:function(_25){if(this._hash[_25.id]){throw new Error("Tried to register widget with id=="+_25.id+" but that id is already registered");}this._hash[_25.id]=_25;},remove:function(id){delete this._hash[id];},forEach:function(_27){for(var id in this._hash){_27(this._hash[id]);}},filter:function(_29){var res=new dijit.WidgetSet();this.forEach(function(_2b){if(_29(_2b)){res.add(_2b);}});return res;},byId:function(id){return this._hash[id];},byClass:function(cls){return this.filter(function(_2e){return _2e.declaredClass==cls;});}});dijit.registry=new dijit.WidgetSet();dijit._widgetTypeCtr={};dijit.getUniqueId=function(_2f){var id;do{id=_2f+"_"+(_2f in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_2f]:dijit._widgetTypeCtr[_2f]=0);}while(dijit.byId(id));return id;};if(dojo.isIE){dojo.addOnUnload(function(){dijit.registry.forEach(function(_31){_31.destroy();});});}dijit.byId=function(id){return (dojo.isString(id))?dijit.registry.byId(id):id;};dijit.byNode=function(_33){return dijit.registry.byId(_33.getAttribute("widgetId"));};dijit.getEnclosingWidget=function(_34){while(_34){if(_34.getAttribute&&_34.getAttribute("widgetId")){return dijit.registry.byId(_34.getAttribute("widgetId"));}_34=_34.parentNode;}return null;};dijit._tabElements={area:true,button:true,input:true,object:true,select:true,textarea:true};dijit._isElementShown=function(_35){var _36=dojo.style(_35);return (_36.visibility!="hidden")&&(_36.visibility!="collapsed")&&(_36.display!="none");};dijit.isTabNavigable=function(_37){if(dojo.hasAttr(_37,"disabled")){return false;}var _38=dojo.hasAttr(_37,"tabindex");var _39=dojo.attr(_37,"tabindex");if(_38&&_39>=0){return true;}var _3a=_37.nodeName.toLowerCase();if(((_3a=="a"&&dojo.hasAttr(_37,"href"))||dijit._tabElements[_3a])&&(!_38||_39>=0)){return true;}return false;};dijit._getTabNavigable=function(_3b){var _3c,_3d,_3e,_3f,_40,_41;var _42=function(_43){dojo.query("> *",_43).forEach(function(_44){var _45=dijit._isElementShown(_44);if(_45&&dijit.isTabNavigable(_44)){var _46=dojo.attr(_44,"tabindex");if(!dojo.hasAttr(_44,"tabindex")||_46==0){if(!_3c){_3c=_44;}_3d=_44;}else{if(_46>0){if(!_3e||_46<_3f){_3f=_46;_3e=_44;}if(!_40||_46>=_41){_41=_46;_40=_44;}}}}if(_45){_42(_44);}});};if(dijit._isElementShown(_3b)){_42(_3b);}return {first:_3c,last:_3d,lowest:_3e,highest:_40};};dijit.getFirstInTabbingOrder=function(_47){var _48=dijit._getTabNavigable(dojo.byId(_47));return _48.lowest?_48.lowest:_48.first;};dijit.getLastInTabbingOrder=function(_49){var _4a=dijit._getTabNavigable(dojo.byId(_49));return _4a.last?_4a.last:_4a.highest;};}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){var _4b=dojo.global;var _4c=dojo.doc;var w=0,h=0;var de=_4c.documentElement;var dew=de.clientWidth,deh=de.clientHeight;if(dojo.isMozilla){var _52,_53,_54,_55;var dbw=_4c.body.clientWidth;if(dbw>dew){_52=dew;_54=dbw;}else{_54=dew;_52=dbw;}var dbh=_4c.body.clientHeight;if(dbh>deh){_53=deh;_55=dbh;}else{_55=deh;_53=dbh;}w=(_54>_4b.innerWidth)?_52:_54;h=(_55>_4b.innerHeight)?_53:_55;}else{if(!dojo.isOpera&&_4b.innerWidth){w=_4b.innerWidth;h=_4b.innerHeight;}else{if(dojo.isIE&&de&&deh){w=dew;h=deh;}else{if(dojo.body().clientWidth){w=dojo.body().clientWidth;h=dojo.body().clientHeight;}}}}var _58=dojo._docScroll();return {w:w,h:h,l:_58.x,t:_58.y};};dijit.placeOnScreen=function(_59,pos,_5b,_5c){var _5d=dojo.map(_5b,function(_5e){return {corner:_5e,pos:pos};});return dijit._place(_59,_5d);};dijit._place=function(_5f,_60,_61){var _62=dijit.getViewport();if(!_5f.parentNode||String(_5f.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_5f);}var _63=null;dojo.some(_60,function(_64){var _65=_64.corner;var pos=_64.pos;if(_61){_61(_5f,_64.aroundCorner,_65);}var _67=_5f.style;var _68=_67.display;var _69=_67.visibility;_67.visibility="hidden";_67.display="";var mb=dojo.marginBox(_5f);_67.display=_68;_67.visibility=_69;var _6b=(_65.charAt(1)=="L"?pos.x:Math.max(_62.l,pos.x-mb.w)),_6c=(_65.charAt(0)=="T"?pos.y:Math.max(_62.t,pos.y-mb.h)),_6d=(_65.charAt(1)=="L"?Math.min(_62.l+_62.w,_6b+mb.w):pos.x),_6e=(_65.charAt(0)=="T"?Math.min(_62.t+_62.h,_6c+mb.h):pos.y),_6f=_6d-_6b,_70=_6e-_6c,_71=(mb.w-_6f)+(mb.h-_70);if(_63==null||_71<_63.overflow){_63={corner:_65,aroundCorner:_64.aroundCorner,x:_6b,y:_6c,w:_6f,h:_70,overflow:_71};}return !_71;});_5f.style.left=_63.x+"px";_5f.style.top=_63.y+"px";if(_63.overflow&&_61){_61(_5f,_63.aroundCorner,_63.corner);}return _63;};dijit.placeOnScreenAroundElement=function(_72,_73,_74,_75){_73=dojo.byId(_73);var _76=_73.style.display;_73.style.display="";var _77=_73.offsetWidth;var _78=_73.offsetHeight;var _79=dojo.coords(_73,true);_73.style.display=_76;var _7a=[];for(var _7b in _74){_7a.push({aroundCorner:_7b,corner:_74[_7b],pos:{x:_79.x+(_7b.charAt(1)=="L"?0:_77),y:_79.y+(_7b.charAt(0)=="T"?0:_78)}});}return dijit._place(_72,_7a,_75);};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){if(dojo.isSafari&&!doc._parentWindow){var fix=function(win){win.document._parentWindow=win;for(var i=0;i<win.frames.length;i++){fix(win.frames[i]);}};fix(window.top);}if(dojo.isIE&&window!==document.parentWindow&&!doc._parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc._parentWindow||doc.parentWindow||doc.defaultView;};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup=new function(){var _81=[],_82=1000,_83=1;this.prepare=function(_84){dojo.body().appendChild(_84);var s=_84.style;if(s.display=="none"){s.display="";}s.visibility="hidden";s.position="absolute";s.top="-9999px";};this.open=function(_86){var _87=_86.popup,_88=_86.orient||{"BL":"TL","TL":"BL"},_89=_86.around,id=(_86.around&&_86.around.id)?(_86.around.id+"_dropdown"):("popup_"+_83++);var _8b=dojo.doc.createElement("div");dijit.setWaiRole(_8b,"presentation");_8b.id=id;_8b.className="dijitPopup";_8b.style.zIndex=_82+_81.length;_8b.style.visibility="hidden";if(_86.parent){_8b.dijitPopupParent=_86.parent.id;}dojo.body().appendChild(_8b);var s=_87.domNode.style;s.display="";s.visibility="";s.position="";_8b.appendChild(_87.domNode);var _8d=new dijit.BackgroundIframe(_8b);var _8e=_89?dijit.placeOnScreenAroundElement(_8b,_89,_88,_87.orient?dojo.hitch(_87,"orient"):null):dijit.placeOnScreen(_8b,_86,_88=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"]);_8b.style.visibility="visible";var _8f=[];var _90=function(){for(var pi=_81.length-1;pi>0&&_81[pi].parent===_81[pi-1].widget;pi--){}return _81[pi];};_8f.push(dojo.connect(_8b,"onkeypress",this,function(evt){if(evt.keyCode==dojo.keys.ESCAPE&&_86.onCancel){dojo.stopEvent(evt);_86.onCancel();}else{if(evt.keyCode==dojo.keys.TAB){dojo.stopEvent(evt);var _93=_90();if(_93&&_93.onCancel){_93.onCancel();}}}}));if(_87.onCancel){_8f.push(dojo.connect(_87,"onCancel",null,_86.onCancel));}_8f.push(dojo.connect(_87,_87.onExecute?"onExecute":"onChange",null,function(){var _94=_90();if(_94&&_94.onExecute){_94.onExecute();}}));_81.push({wrapper:_8b,iframe:_8d,widget:_87,parent:_86.parent,onExecute:_86.onExecute,onCancel:_86.onCancel,onClose:_86.onClose,handlers:_8f});if(_87.onOpen){_87.onOpen(_8e);}return _8e;};this.close=function(_95){while(dojo.some(_81,function(_96){return _96.widget==_95;})){var top=_81.pop(),_98=top.wrapper,_99=top.iframe,_9a=top.widget,_9b=top.onClose;if(_9a.onClose){_9a.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(!_9a||!_9a.domNode){return;}this.prepare(_9a.domNode);_99.destroy();dojo._destroyElement(_98);if(_9b){_9b();}}};}();dijit._frames=new function(){var _9c=[];this.pop=function(){var _9d;if(_9c.length){_9d=_9c.pop();_9d.style.display="";}else{if(dojo.isIE){var _9e="<iframe src='javascript:\"\"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_9d=dojo.doc.createElement(_9e);}else{_9d=dojo.doc.createElement("iframe");_9d.src="javascript:\"\"";_9d.className="dijitBackgroundIframe";}_9d.tabIndex=-1;dojo.body().appendChild(_9d);}return _9d;};this.push=function(_9f){_9f.style.display="";if(dojo.isIE){_9f.style.removeExpression("width");_9f.style.removeExpression("height");}_9c.push(_9f);};}();if(dojo.isIE&&dojo.isIE<7){dojo.addOnLoad(function(){var f=dijit._frames;dojo.forEach([f.pop()],f.push);});}dijit.BackgroundIframe=function(_a1){if(!_a1.id){throw new Error("no id");}if((dojo.isIE&&dojo.isIE<7)||(dojo.isFF&&dojo.isFF<3&&dojo.hasClass(dojo.body(),"dijit_a11y"))){var _a2=dijit._frames.pop();_a1.appendChild(_a2);if(dojo.isIE){_a2.style.setExpression("width",dojo._scopeName+".doc.getElementById('"+_a1.id+"').offsetWidth");_a2.style.setExpression("height",dojo._scopeName+".doc.getElementById('"+_a1.id+"').offsetHeight");}this.iframe=_a2;}};dojo.extend(dijit.BackgroundIframe,{destroy:function(){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(_a3){var _a4=_a3.parentNode;var _a5=_a4.scrollTop+dojo.marginBox(_a4).h;var _a6=_a3.offsetTop+dojo.marginBox(_a3).h;if(_a5<_a6){_a4.scrollTop+=(_a6-_a5);}else{if(_a4.scrollTop>_a3.offsetTop){_a4.scrollTop-=(_a4.scrollTop-_a3.offsetTop);}}};}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");(function(){var d=dojo;var ie=d.isIE;var _a9=d.isOpera;var maj=Math.floor;var ff=d.isFF;var _ac={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_iequirks:ie&&d.isQuirks,dj_opera:_a9,dj_opera8:maj(_a9)==8,dj_opera9:maj(_a9)==9,dj_khtml:d.isKhtml,dj_safari:d.isSafari,dj_gecko:d.isMozilla,dj_ff2:maj(ff)==2};for(var p in _ac){if(_ac[p]){var _ae=dojo.doc.documentElement;if(_ae.className){_ae.className+=" "+p;}else{_ae.className=p;}}}})();}if(!dojo._hasResource["dijit._base.bidi"]){dojo._hasResource["dijit._base.bidi"]=true;dojo.provide("dijit._base.bidi");dojo.addOnLoad(function(){if(!dojo._isBodyLtr()){dojo.addClass(dojo.body(),"dijitRtl");}});}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=(this._currentTimeout<0)?this._initialDelay:((this._subsequentDelay>1)?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay));this._timer=setTimeout(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_b0,_b1,_b2,obj,_b4,_b5){if(obj!=this._obj){this.stop();this._initialDelay=_b5||500;this._subsequentDelay=_b4||0.9;this._obj=obj;this._evt=evt;this._node=_b1;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_b0,_b2);this._fireEventAndReload();}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_b6,_b7,_b8,_b9,_ba,_bb){return [dojo.connect(_b6,"onkeypress",this,function(evt){if(evt.keyCode==_b7.keyCode&&(!_b7.charCode||_b7.charCode==evt.charCode)&&(_b7.ctrlKey===undefined||_b7.ctrlKey==evt.ctrlKey)&&(_b7.altKey===undefined||_b7.altKey==evt.ctrlKey)&&(_b7.shiftKey===undefined||_b7.shiftKey==evt.ctrlKey)){dojo.stopEvent(evt);dijit.typematic.trigger(_b7,_b8,_b6,_b9,_b7,_ba,_bb);}else{if(dijit.typematic._obj==_b7){dijit.typematic.stop();}}}),dojo.connect(_b6,"onkeyup",this,function(evt){if(dijit.typematic._obj==_b7){dijit.typematic.stop();}})];},addMouseListener:function(_be,_bf,_c0,_c1,_c2){var dc=dojo.connect;return [dc(_be,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_bf,_be,_c0,_be,_c1,_c2);}),dc(_be,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_be,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(_be,"mousemove",this,function(evt){dojo.stopEvent(evt);}),dc(_be,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_bf,_be,_c0,_be,_c1,_c2);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_c9,_ca,_cb,_cc,_cd,_ce,_cf){return this.addKeyListener(_ca,_cb,_cc,_cd,_ce,_cf).concat(this.addMouseListener(_c9,_cc,_cd,_ce,_cf));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){var div=dojo.doc.createElement("div");div.id="a11yTestNode";div.style.cssText="border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+dojo.moduleUrl("dojo","resources/blank.gif")+"\");";dojo.body().appendChild(div);var cs=dojo.getComputedStyle(div);if(cs){var _d2=cs.backgroundImage;var _d3=(cs.borderTopColor==cs.borderRightColor)||(_d2!=null&&(_d2=="none"||_d2=="url(invalid-url:)"));dojo[_d3?"addClass":"removeClass"](dojo.body(),"dijit_a11y");dojo.body().removeChild(div);}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{hasWaiRole:function(_d4){return _d4.hasAttribute?_d4.hasAttribute("role"):!!_d4.getAttribute("role");},getWaiRole:function(_d5){var _d6=_d5.getAttribute("role");if(_d6){var _d7=_d6.indexOf(":");return _d7==-1?_d6:_d6.substring(_d7+1);}else{return "";}},setWaiRole:function(_d8,_d9){_d8.setAttribute("role",(dojo.isFF&&dojo.isFF<3)?"wairole:"+_d9:_d9);},removeWaiRole:function(_da){_da.removeAttribute("role");},hasWaiState:function(_db,_dc){if(dojo.isFF&&dojo.isFF<3){return _db.hasAttributeNS("http://www.w3.org/2005/07/aaa",_dc);}else{return _db.hasAttribute?_db.hasAttribute("aria-"+_dc):!!_db.getAttribute("aria-"+_dc);}},getWaiState:function(_dd,_de){if(dojo.isFF&&dojo.isFF<3){return _dd.getAttributeNS("http://www.w3.org/2005/07/aaa",_de);}else{var _df=_dd.getAttribute("aria-"+_de);return _df?_df:"";}},setWaiState:function(_e0,_e1,_e2){if(dojo.isFF&&dojo.isFF<3){_e0.setAttributeNS("http://www.w3.org/2005/07/aaa","aaa:"+_e1,_e2);}else{_e0.setAttribute("aria-"+_e1,_e2);}},removeWaiState:function(_e3,_e4){if(dojo.isFF&&dojo.isFF<3){_e3.removeAttributeNS("http://www.w3.org/2005/07/aaa",_e4);}else{_e3.removeAttribute("aria-"+_e4);}}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");if(dojo.isSafari){dojo.connect(window,"load",function(){window.resizeBy(1,0);setTimeout(function(){window.resizeBy(-1,0);},10);});}}if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.date.stamp.fromISOString=function(_e5,_e6){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 _e7=dojo.date.stamp._isoRegExp.exec(_e5);var _e8=null;if(_e7){_e7.shift();if(_e7[1]){_e7[1]--;}if(_e7[6]){_e7[6]*=1000;}if(_e6){_e6=new Date(_e6);dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_e9){return _e6["get"+_e9]();}).forEach(function(_ea,_eb){if(_e7[_eb]===undefined){_e7[_eb]=_ea;}});}_e8=new Date(_e7[0]||1970,_e7[1]||0,_e7[2]||1,_e7[3]||0,_e7[4]||0,_e7[5]||0,_e7[6]||0);var _ec=0;var _ed=_e7[7]&&_e7[7].charAt(0);if(_ed!="Z"){_ec=((_e7[8]||0)*60)+(Number(_e7[9])||0);if(_ed!="-"){_ec*=-1;}}if(_ed){_ec-=_e8.getTimezoneOffset();}if(_ec){_e8.setTime(_e8.getTime()+_ec*60000);}}return _e8;};dojo.date.stamp.toISOString=function(_ee,_ef){var _=function(n){return (n<10)?"0"+n:n;};_ef=_ef||{};var _f2=[];var _f3=_ef.zulu?"getUTC":"get";var _f4="";if(_ef.selector!="time"){var _f5=_ee[_f3+"FullYear"]();_f4=["0000".substr((_f5+"").length)+_f5,_(_ee[_f3+"Month"]()+1),_(_ee[_f3+"Date"]())].join("-");}_f2.push(_f4);if(_ef.selector!="date"){var _f6=[_(_ee[_f3+"Hours"]()),_(_ee[_f3+"Minutes"]()),_(_ee[_f3+"Seconds"]())].join(":");var _f7=_ee[_f3+"Milliseconds"]();if(_ef.milliseconds){_f6+="."+(_f7<100?"0":"")+_(_f7);}if(_ef.zulu){_f6+="Z";}else{if(_ef.selector!="time"){var _f8=_ee.getTimezoneOffset();var _f9=Math.abs(_f8);_f6+=(_f8>0?"-":"+")+_(Math.floor(_f9/60))+":"+_(_f9%60);}}_f2.push(_f6);}return _f2.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");dojo.parser=new function(){var d=dojo;var _fb=d._scopeName+"Type";var qry="["+_fb+"]";function val2type(_fd){if(d.isString(_fd)){return "string";}if(typeof _fd=="number"){return "number";}if(typeof _fd=="boolean"){return "boolean";}if(d.isFunction(_fd)){return "function";}if(d.isArray(_fd)){return "array";}if(_fd instanceof Date){return "date";}if(_fd instanceof d._Url){return "url";}return "object";};function str2obj(_fe,_ff){switch(_ff){case "string":return _fe;case "number":return _fe.length?Number(_fe):NaN;case "boolean":return typeof _fe=="boolean"?_fe:!(_fe.toLowerCase()=="false");case "function":if(d.isFunction(_fe)){_fe=_fe.toString();_fe=d.trim(_fe.substring(_fe.indexOf("{")+1,_fe.length-1));}try{if(_fe.search(/[^\w\.]+/i)!=-1){_fe=d.parser._nameAnonFunc(new Function(_fe),this);}return d.getObject(_fe,false);}catch(e){return new Function();}case "array":return _fe.split(/\s*,\s*/);case "date":switch(_fe){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_fe);}case "url":return d.baseUrl+_fe;default:return d.fromJson(_fe);}};var _100={};function getClassInfo(_101){if(!_100[_101]){var cls=d.getObject(_101);if(!d.isFunction(cls)){throw new Error("Could not load class '"+_101+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");}var _103=cls.prototype;var _104={};for(var name in _103){if(name.charAt(0)=="_"){continue;}var _106=_103[name];_104[name]=val2type(_106);}_100[_101]={cls:cls,params:_104};}return _100[_101];};this._functionFromScript=function(_107){var _108="";var _109="";var _10a=_107.getAttribute("args");if(_10a){d.forEach(_10a.split(/\s*,\s*/),function(part,idx){_108+="var "+part+" = arguments["+idx+"]; ";});}var _10d=_107.getAttribute("with");if(_10d&&_10d.length){d.forEach(_10d.split(/\s*,\s*/),function(part){_108+="with("+part+"){";_109+="}";});}return new Function(_108+_107.innerHTML+_109);};this.instantiate=function(_10f){var _110=[];d.forEach(_10f,function(node){if(!node){return;}var type=node.getAttribute(_fb);if((!type)||(!type.length)){return;}var _113=getClassInfo(type);var _114=_113.cls;var ps=_114._noScript||_114.prototype._noScript;var _116={};var _117=node.attributes;for(var name in _113.params){var item=_117.getNamedItem(name);if(!item||(!item.specified&&(!dojo.isIE||name.toLowerCase()!="value"))){continue;}var _11a=item.value;switch(name){case "class":_11a=node.className;break;case "style":_11a=node.style&&node.style.cssText;}var _11b=_113.params[name];_116[name]=str2obj(_11a,_11b);}if(!ps){var _11c=[],_11d=[];d.query("> script[type^='dojo/']",node).orphan().forEach(function(_11e){var _11f=_11e.getAttribute("event"),type=_11e.getAttribute("type"),nf=d.parser._functionFromScript(_11e);if(_11f){if(type=="dojo/connect"){_11c.push({event:_11f,func:nf});}else{_116[_11f]=nf;}}else{_11d.push(nf);}});}var _121=_114["markupFactory"];if(!_121&&_114["prototype"]){_121=_114.prototype["markupFactory"];}var _122=_121?_121(_116,node,_114):new _114(_116,node);_110.push(_122);var _123=node.getAttribute("jsId");if(_123){d.setObject(_123,_122);}if(!ps){d.forEach(_11c,function(_124){d.connect(_122,_124.event,null,_124.func);});d.forEach(_11d,function(func){func.call(_122);});}});d.forEach(_110,function(_126){if(_126&&_126.startup&&!_126._started&&(!_126.getParent||!_126.getParent())){_126.startup();}});return _110;};this.parse=function(_127){var list=d.query(qry,_127);var _129=this.instantiate(list);return _129;};}();(function(){var _12a=function(){if(dojo.config["parseOnLoad"]==true){dojo.parser.parse();}};if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){dojo._loaders.splice(1,0,_12a);}else{dojo._loaders.unshift(_12a);}})();dojo.parser._anonCtr=0;dojo.parser._anon={};dojo.parser._nameAnonFunc=function(_12b,_12c){var jpn="$joinpoint";var nso=(_12c||dojo.parser._anon);if(dojo.isIE){var cn=_12b["__dojoNameCache"];if(cn&&nso[cn]===_12b){return _12b["__dojoNameCache"];}}var ret="__"+dojo.parser._anonCtr++;while(typeof nso[ret]!="undefined"){ret="__"+dojo.parser._anonCtr++;}nso[ret]=_12b;return ret;};}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.require("dijit._base");dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",srcNodeRef:null,domNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},postscript:function(_131,_132){this.create(_131,_132);},create:function(_133,_134){this.srcNodeRef=dojo.byId(_134);this._connects=[];this._attaches=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_133){this.params=_133;dojo.mixin(this,_133);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){for(var attr in this.attributeMap){var _136=this[attr];if(typeof _136!="object"&&((_136!==""&&_136!==false)||(_133&&_133[attr]))){this.setAttribute(attr,_136);}}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}},postMixInProperties:function(){},buildRendering:function(){this.domNode=this.srcNodeRef||dojo.doc.createElement("div");},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_137){this.destroyDescendants();this.destroy();},destroy:function(_138){this.uninitialize();dojo.forEach(this._connects,function(_139){dojo.forEach(_139,dojo.disconnect);});dojo.forEach(this._supportingWidgets||[],function(w){w.destroy();});this.destroyRendering(_138);dijit.registry.remove(this.id);},destroyRendering:function(_13b){if(this.bgIframe){this.bgIframe.destroy();delete this.bgIframe;}if(this.domNode){dojo._destroyElement(this.domNode);delete this.domNode;}if(this.srcNodeRef){dojo._destroyElement(this.srcNodeRef);delete this.srcNodeRef;}},destroyDescendants:function(){dojo.forEach(this.getDescendants(),function(_13c){_13c.destroy();});},uninitialize:function(){return false;},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},setAttribute:function(attr,_13f){var _140=this[this.attributeMap[attr]||"domNode"];this[attr]=_13f;switch(attr){case "class":dojo.addClass(_140,_13f);break;case "style":if(_140.style.cssText){_140.style.cssText+="; "+_13f;}else{_140.style.cssText=_13f;}break;default:if(/^on[A-Z]/.test(attr)){attr=attr.toLowerCase();}if(typeof _13f=="function"){_13f=dojo.hitch(this,_13f);}dojo.attr(_140,attr,_13f);}},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){if(this.containerNode){var list=dojo.query("[widgetId]",this.containerNode);return list.map(dijit.byNode);}else{return [];}},nodesWithKeyClick:["input","button"],connect:function(obj,_143,_144){var _145=[];if(_143=="ondijitclick"){if(!this.nodesWithKeyClick[obj.nodeName]){_145.push(dojo.connect(obj,"onkeydown",this,function(e){if(e.keyCode==dojo.keys.ENTER){return (dojo.isString(_144))?this[_144](e):_144.call(this,e);}else{if(e.keyCode==dojo.keys.SPACE){dojo.stopEvent(e);}}}));_145.push(dojo.connect(obj,"onkeyup",this,function(e){if(e.keyCode==dojo.keys.SPACE){return dojo.isString(_144)?this[_144](e):_144.call(this,e);}}));}_143="onclick";}_145.push(dojo.connect(obj,_143,this,_144));this._connects.push(_145);return _145;},disconnect:function(_148){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_148){dojo.forEach(_148,dojo.disconnect);this._connects.splice(i,1);return;}}},isLeftToRight:function(){if(!("_ltr" in this)){this._ltr=dojo.getComputedStyle(this.domNode).direction!="rtl";}return this._ltr;},isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");}});}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.string.pad=function(text,size,ch,end){var out=String(text);if(!ch){ch="0";}while(out.length<size){if(end){out+=ch;}else{out=ch+out;}}return out;};dojo.string.substitute=function(_14f,map,_151,_152){return _14f.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_153,key,_155){var _156=dojo.getObject(key,false,map);if(_155){_156=dojo.getObject(_155,false,_152)(_156);}if(_151){_156=_151(_156,key);}return _156.toString();});};dojo.string.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["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateNode:null,templateString:null,templatePath:null,widgetsInTemplate:false,containerNode:null,_skipNodeCache:false,_stringRepl:function(tmpl){var _15a=this.declaredClass,_15b=this;return dojo.string.substitute(tmpl,this,function(_15c,key){if(key.charAt(0)=="!"){_15c=_15b[key.substr(1)];}if(typeof _15c=="undefined"){throw new Error(_15a+" template:"+key);}if(!_15c){return "";}return key.charAt(0)=="!"?_15c:_15c.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){var _15e=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_15e)){node=dijit._Templated._createNodesFromText(this._stringRepl(_15e))[0];}else{node=_15e.cloneNode(true);}this._attachTemplateNodes(node);var _160=this.srcNodeRef;if(_160&&_160.parentNode){_160.parentNode.replaceChild(node,_160);}this.domNode=node;if(this.widgetsInTemplate){var cw=this._supportingWidgets=dojo.parser.parse(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(_160);},_fillContent:function(_164){var dest=this.containerNode;if(_164&&dest){while(_164.hasChildNodes()){dest.appendChild(_164.firstChild);}}},_attachTemplateNodes:function(_166,_167){_167=_167||function(n,p){return n.getAttribute(p);};var _16a=dojo.isArray(_166)?_166:(_166.all||_166.getElementsByTagName("*"));var x=dojo.isArray(_166)?0:-1;for(;x<_16a.length;x++){var _16c=(x==-1)?_166:_16a[x];if(this.widgetsInTemplate&&_167(_16c,"dojoType")){continue;}var _16d=_167(_16c,"dojoAttachPoint");if(_16d){var _16e,_16f=_16d.split(/\s*,\s*/);while((_16e=_16f.shift())){if(dojo.isArray(this[_16e])){this[_16e].push(_16c);}else{this[_16e]=_16c;}}}var _170=_167(_16c,"dojoAttachEvent");if(_170){var _171,_172=_170.split(/\s*,\s*/);var trim=dojo.trim;while((_171=_172.shift())){if(_171){var _174=null;if(_171.indexOf(":")!=-1){var _175=_171.split(":");_171=trim(_175[0]);_174=trim(_175[1]);}else{_171=trim(_171);}if(!_174){_174=_171;}this.connect(_16c,_171,_174);}}}var role=_167(_16c,"waiRole");if(role){dijit.setWaiRole(_16c,role);}var _177=_167(_16c,"waiState");if(_177){dojo.forEach(_177.split(/\s*,\s*/),function(_178){if(_178.indexOf("-")!=-1){var pair=_178.split("-");dijit.setWaiState(_16c,pair[0],pair[1]);}});}}}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_17a,_17b,_17c){var _17d=dijit._Templated._templateCache;var key=_17b||_17a;var _17f=_17d[key];if(_17f){return _17f;}if(!_17b){_17b=dijit._Templated._sanitizeTemplateString(dojo._getText(_17a));}_17b=dojo.string.trim(_17b);if(_17c||_17b.match(/\$\{([^\}]+)\}/g)){return (_17d[key]=_17b);}else{return (_17d[key]=dijit._Templated._createNodesFromText(_17b)[0]);}};dijit._Templated._sanitizeTemplateString=function(_180){if(_180){_180=_180.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _181=_180.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_181){_180=_181[1];}}else{_180="";}return _180;};if(dojo.isIE){dojo.addOnUnload(function(){var _182=dijit._Templated._templateCache;for(var key in _182){var _184=_182[key];if(!isNaN(_184.nodeType)){dojo._destroyElement(_184);}delete _182[key];}});}(function(){var _185={cell:{re:/^<t[dh][\s\r\n>]/i,pre:"<table><tbody><tr>",post:"</tr></tbody></table>"},row:{re:/^<tr[\s\r\n>]/i,pre:"<table><tbody>",post:"</tbody></table>"},section:{re:/^<(thead|tbody|tfoot)[\s\r\n>]/i,pre:"<table>",post:"</table>"}};var tn;dijit._Templated._createNodesFromText=function(text){if(!tn){tn=dojo.doc.createElement("div");tn.style.display="none";dojo.body().appendChild(tn);}var _188="none";var _189=text.replace(/^\s+/,"");for(var type in _185){var map=_185[type];if(map.re.test(_189)){_188=type;text=map.pre+text+map.post;break;}}tn.innerHTML=text;if(tn.normalize){tn.normalize();}var tag={cell:"tr",row:"tbody",section:"table"}[_188];var _18d=(typeof tag!="undefined")?tn.getElementsByTagName(tag)[0]:tn;var _18e=[];while(_18d.firstChild){_18e.push(_18d.removeChild(_18d.firstChild));}tn.innerHTML="";return _18e;};})();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._Contained",null,{getParent:function(){for(var p=this.domNode.parentNode;p;p=p.parentNode){var id=p.getAttribute&&p.getAttribute("widgetId");if(id){var _191=dijit.byId(id);return _191.isContainer?_191:null;}}return null;},_getSibling:function(_192){var node=this.domNode;do{node=node[_192+"Sibling"];}while(node&&node.nodeType!=1);if(!node){return null;}var id=node.getAttribute("widgetId");return dijit.byId(id);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");}});dojo.declare("dijit._Container",null,{isContainer:true,addChild:function(_195,_196){if(_196===undefined){_196="last";}var _197=this.containerNode||this.domNode;if(_196&&typeof _196=="number"){var _198=dojo.query("> [widgetid]",_197);if(_198&&_198.length>=_196){_197=_198[_196-1];_196="after";}}dojo.place(_195.domNode,_197,_196);if(this._started&&!_195._started){_195.startup();}},removeChild:function(_199){var node=_199.domNode;node.parentNode.removeChild(node);},_nextElement:function(node){do{node=node.nextSibling;}while(node&&node.nodeType!=1);return node;},_firstElement:function(node){node=node.firstChild;if(node&&node.nodeType!=1){node=this._nextElement(node);}return node;},getChildren:function(){return dojo.query("> [widgetId]",this.containerNode||this.domNode).map(dijit.byNode);},hasChildren:function(){var cn=this.containerNode||this.domNode;return !!this._firstElement(cn);},_getSiblingOfChild:function(_19e,dir){var node=_19e.domNode;var _1a1=(dir>0?"nextSibling":"previousSibling");do{node=node[_1a1];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node?dijit.byNode(node):null;}});dojo.declare("dijit._KeyNavContainer",[dijit._Container],{_keyNavCodes:{},connectKeyNavHandlers:function(_1a2,_1a3){var _1a4=this._keyNavCodes={};var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_1a2,function(code){_1a4[code]=prev;});dojo.forEach(_1a3,function(code){_1a4[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(_1a9,_1aa){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_1a9);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){this.focusChild(this._getFirstFocusableChild());},focusNext:function(){if(this.focusedChild&&this.focusedChild.hasNextFocalNode&&this.focusedChild.hasNextFocalNode()){this.focusedChild.focusNext();return;}var _1ab=this._getNextFocusableChild(this.focusedChild,1);if(_1ab.getFocalNodes){this.focusChild(_1ab,_1ab.getFocalNodes()[0]);}else{this.focusChild(_1ab);}},focusPrev:function(){if(this.focusedChild&&this.focusedChild.hasPrevFocalNode&&this.focusedChild.hasPrevFocalNode()){this.focusedChild.focusPrev();return;}var _1ac=this._getNextFocusableChild(this.focusedChild,-1);if(_1ac.getFocalNodes){var _1ad=_1ac.getFocalNodes();this.focusChild(_1ac,_1ad[_1ad.length-1]);}else{this.focusChild(_1ac);}},focusChild:function(_1ae,node){if(_1ae){if(this.focusedChild&&_1ae!==this.focusedChild){this._onChildBlur(this.focusedChild);}this.focusedChild=_1ae;if(node&&_1ae.focusFocalNode){_1ae.focusFocalNode(node);}else{_1ae.focus();}}},_startupChild:function(_1b0){if(_1b0.getFocalNodes){dojo.forEach(_1b0.getFocalNodes(),function(node){dojo.attr(node,"tabindex",-1);this._connectNode(node);},this);}else{var node=_1b0.focusNode||_1b0.domNode;if(_1b0.isFocusable()){dojo.attr(node,"tabindex",-1);}this._connectNode(node);}},_connectNode:function(node){this.connect(node,"onfocus","_onNodeFocus");this.connect(node,"onblur","_onNodeBlur");},_onContainerFocus:function(evt){if(evt.target===this.domNode){this.focusFirstChild();}},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.keyCode];if(func){func();dojo.stopEvent(evt);}},_onNodeFocus:function(evt){dojo.attr(this.domNode,"tabindex",-1);var _1b8=dijit.getEnclosingWidget(evt.target);if(_1b8&&_1b8.isFocusable()){this.focusedChild=_1b8;}dojo.stopEvent(evt);},_onNodeBlur:function(evt){if(this.tabIndex){dojo.attr(this.domNode,"tabindex",this.tabIndex);}dojo.stopEvent(evt);},_onChildBlur:function(_1ba){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getNextFocusableChild:function(_1bb,dir){if(_1bb){_1bb=this._getSiblingOfChild(_1bb,dir);}var _1bd=this.getChildren();for(var i=0;i<_1bd.length;i++){if(!_1bb){_1bb=_1bd[(dir>0)?0:(_1bd.length-1)];}if(_1bb.isFocusable()){return _1bb;}_1bb=this._getSiblingOfChild(_1bb,dir);}return null;}});}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],{isLayoutContainer:true,postCreate:function(){dojo.addClass(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_1bf){_1bf.startup();});if(!this.getParent||!this.getParent()){this.resize();this.connect(window,"onresize",function(){this.resize();});}this.inherited(arguments);},resize:function(args){var node=this.domNode;if(args){dojo.marginBox(node,args);if(args.t){node.style.top=args.t+"px";}if(args.l){node.style.left=args.l+"px";}}var mb=dojo.mixin(dojo.marginBox(node),args||{});this._contentBox=dijit.layout.marginBox2contentBox(node,mb);this.layout();},layout:function(){}});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 _1c8=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1cb,dim){_1cb.resize?_1cb.resize(dim):dojo.marginBox(_1cb.domNode,dim);dojo.mixin(_1cb,dojo.marginBox(_1cb.domNode));dojo.mixin(_1cb,dim);};dijit.layout.layoutChildren=function(_1cd,dim,_1cf){dim=dojo.mixin({},dim);dojo.addClass(_1cd,"dijitLayoutContainer");_1cf=dojo.filter(_1cf,function(item){return item.layoutAlign!="client";}).concat(dojo.filter(_1cf,function(item){return item.layoutAlign=="client";}));dojo.forEach(_1cf,function(_1d2){var elm=_1d2.domNode,pos=_1d2.layoutAlign;var _1d5=elm.style;_1d5.left=dim.l+"px";_1d5.top=dim.t+"px";_1d5.bottom=_1d5.right="auto";dojo.addClass(elm,"dijitAlign"+_1c8(pos));if(pos=="top"||pos=="bottom"){size(_1d2,{w:dim.w});dim.h-=_1d2.h;if(pos=="top"){dim.t+=_1d2.h;}else{_1d5.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){size(_1d2,{h:dim.h});dim.w-=_1d2.w;if(pos=="left"){dim.l+=_1d2.w;}else{_1d5.left=dim.l+dim.w+"px";}}else{if(pos=="client"){size(_1d2,dim);}}}});};})();}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],{baseClass:"",name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,readOnly:false,intermediateChanges:false,attributeMap:dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),{value:"focusNode",disabled:"focusNode",readOnly:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode"}),setAttribute:function(attr,_1d7){this.inherited(arguments);switch(attr){case "disabled":var _1d8=this[this.attributeMap["tabIndex"]||"domNode"];if(_1d7){this._hovering=false;this._active=false;_1d8.removeAttribute("tabIndex");}else{_1d8.setAttribute("tabIndex",this.tabIndex);}dijit.setWaiState(this[this.attributeMap["disabled"]||"domNode"],"disabled",_1d7);this._setStateClass();}},setDisabled:function(_1d9){dojo.deprecated("setDisabled("+_1d9+") is deprecated. Use setAttribute('disabled',"+_1d9+") instead.","","2.0");this.setAttribute("disabled",_1d9);},_onMouse:function(_1da){var _1db=_1da.currentTarget;if(_1db&&_1db.getAttribute){this.stateModifier=_1db.getAttribute("stateModifier")||"";}if(!this.disabled){switch(_1da.type){case "mouseenter":case "mouseover":this._hovering=true;this._active=this._mouseDown;break;case "mouseout":case "mouseleave":this._hovering=false;this._active=false;break;case "mousedown":this._active=true;this._mouseDown=true;var _1dc=this.connect(dojo.body(),"onmouseup",function(){this._active=false;this._mouseDown=false;this._setStateClass();this.disconnect(_1dc);});if(this.isFocusable()){this.focus();}break;}this._setStateClass();}},isFocusable:function(){return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){setTimeout(dojo.hitch(this,dijit.focus,this.focusNode),0);},_setStateClass:function(){if(!("staticClass" in this)){this.staticClass=(this.stateNode||this.domNode).className;}var _1dd=[this.baseClass];function multiply(_1de){_1dd=_1dd.concat(dojo.map(_1dd,function(c){return c+_1de;}),"dijit"+_1de);};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(this.stateModifier+"Active");}else{if(this._focused){multiply("Focused");}if(this._hovering){multiply(this.stateModifier+"Hover");}}}}(this.stateNode||this.domNode).className=this.staticClass+" "+_1dd.join(" ");},onChange:function(_1e0){},_onChangeMonitor:"value",_onChangeActive:false,_handleOnChange:function(_1e1,_1e2){this._lastValue=_1e1;if(this._lastValueReported==undefined&&(_1e2===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1e1;}if((this.intermediateChanges||_1e2||_1e2===undefined)&&((_1e1&&_1e1.toString)?_1e1.toString():_1e1)!==((this._lastValueReported&&this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){this._lastValueReported=_1e1;if(this._onChangeActive){this.onChange(_1e1);}}},reset:function(){this._hasBeenBlurred=false;if(this.setValue&&!this._getValueDeprecated){this.setValue(this._resetValue,true);}else{if(this._onChangeMonitor){this.setAttribute(this._onChangeMonitor,(this._resetValue!==undefined&&this._resetValue!==null)?this._resetValue:"");}}},create:function(){this.inherited(arguments);this._onChangeActive=true;this._setStateClass();},destroy:function(){if(this._layoutHackHandle){clearTimeout(this._layoutHackHandle);}this.inherited(arguments);},setValue:function(_1e3){dojo.deprecated("dijit.form._FormWidget:setValue("+_1e3+") is deprecated. Use setAttribute('value',"+_1e3+") instead.","","2.0");this.setAttribute("value",_1e3);},_getValueDeprecated:true,getValue:function(){dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated. Use widget.value instead.","","2.0");return this.value;},_layoutHack:function(){if(dojo.isFF==2){var node=this.domNode;var old=node.style.opacity;node.style.opacity="0.999";this._layoutHackHandle=setTimeout(dojo.hitch(this,function(){this._layoutHackHandle=null;node.style.opacity=old;}),0);}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{attributeMap:dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),{value:""}),postCreate:function(){this.setValue(this.value,null);},setValue:function(_1e6,_1e7){this.value=_1e6;this._handleOnChange(_1e6,_1e7);},_getValueDeprecated:false,getValue:function(){return this._lastValue;},undo:function(){this.setValue(this._lastValueReported,false);},_valueChanged:function(){var v=this.getValue();var lv=this._lastValueReported;return ((v!==null&&(v!==undefined)&&v.toString)?v.toString():"")!==((lv!==null&&(lv!==undefined)&&lv.toString)?lv.toString():"");},_onKeyPress:function(e){if(e.keyCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){if(this._valueChanged()){this.undo();dojo.stopEvent(e);return false;}}return true;}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}
diff --git a/includes/js/dijit/dijit.js.uncompressed.js b/includes/js/dijit/dijit.js.uncompressed.js
new file mode 100644
index 0000000..0d91587
--- /dev/null
+++ b/includes/js/dijit/dijit.js.uncompressed.js
@@ -0,0 +1,3641 @@
+/*
+ Copyright (c) 2004-2008, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing
+*/
+
+/*
+ This is a compiled version of Dojo, built for deployment and not for
+ development. To get an editable version, please visit:
+
+ http://dojotoolkit.org
+
+ for documentation and information on getting the source.
+*/
+
+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");
+
+// summary:
+// These functions are used to query or set the focus and selection.
+//
+// Also, they trace when widgets become actived/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: tests whether the current selection is empty
+ var _window = dojo.global;
+ var _document = dojo.doc;
+ if(_document.selection){ // IE
+ return !_document.selection.createRange().text; // Boolean
+ }else{
+ var selection = _window.getSelection();
+ if(dojo.isString(selection)){ // Safari
+ return !selection; // Boolean
+ }else{ // Mozilla/W3
+ return selection.isCollapsed || !selection.toString(); // Boolean
+ }
+ }
+ },
+
+ getBookmark: function(){
+ // summary: Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+ var bookmark, selection = dojo.doc.selection;
+ if(selection){ // IE
+ var range = selection.createRange();
+ if(selection.type.toUpperCase()=='CONTROL'){
+ if(range.length){
+ bookmark=[];
+ var i=0,len=range.length;
+ while(i<len){
+ bookmark.push(range.item(i++));
+ }
+ }else{
+ bookmark=null;
+ }
+ }else{
+ bookmark = range.getBookmark();
+ }
+ }else{
+ if(window.getSelection){
+ selection = dojo.global.getSelection();
+ if(selection){
+ range = selection.getRangeAt(0);
+ bookmark = range.cloneRange();
+ }
+ }else{
+ console.warn("No idea how to store the current selection for this browser!");
+ }
+ }
+ return bookmark; // Array
+ },
+
+ moveToBookmark: function(/*Object*/bookmark){
+ // summary: Moves current selection to a bookmark
+ // bookmark: This should be a returned object from dojo.html.selection.getBookmark()
+ var _document = dojo.doc;
+ if(_document.selection){ // IE
+ var range;
+ if(dojo.isArray(bookmark)){
+ range = _document.body.createControlRange();
+ dojo.forEach(bookmark, "range.addElement(item)"); //range.addElement does not have call/apply method, so can not call it directly
+ }else{
+ range = _document.selection.createRange();
+ range.moveToBookmark(bookmark);
+ }
+ range.select();
+ }else{ //Moz/W3C
+ var selection = dojo.global.getSelection && dojo.global.getSelection();
+ if(selection && selection.removeAllRanges){
+ selection.removeAllRanges();
+ selection.addRange(bookmark);
+ }else{
+ console.warn("No idea how to restore selection for this browser!");
+ }
+ }
+ },
+
+ getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+ // summary:
+ // Returns the current focus and selection.
+ // Called when a popup appears (either a top level menu or a dialog),
+ // or when a toolbar/menubar receives focus
+ //
+ // menu:
+ // The menu that's being opened
+ //
+ // openedForWindow:
+ // iframe in which menu was opened
+ //
+ // returns:
+ // A handle to restore focus/selection
+
+ return {
+ // Node to return focus to
+ node: menu && dojo.isDescendant(dijit._curFocus, menu.domNode) ? dijit._prevFocus : dijit._curFocus,
+
+ // Previously selected text
+ bookmark:
+ !dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed) ?
+ dojo.withGlobal(openedForWindow||dojo.global, dijit.getBookmark) :
+ null,
+
+ 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;
+
+ // 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)
+ if(bookmark && dojo.withGlobal(openedForWindow||dojo.global, dijit.isCollapsed)){
+ if(openedForWindow){
+ openedForWindow.focus();
+ }
+ try{
+ dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
+ }catch(e){
+ /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+ }
+ }
+ },
+
+ // _activeStack: Array
+ // List of currently active widgets (focused widget and it's ancestors)
+ _activeStack: [],
+
+ registerWin: function(/*Window?*/targetWindow){
+ // summary:
+ // Registers listeners on the specified window (either the main
+ // window or an iframe) to detect when the user has clicked somewhere.
+ // Anyone that creates an iframe should call this function.
+
+ if(!targetWindow){
+ targetWindow = window;
+ }
+
+ dojo.connect(targetWindow.document, "onmousedown", function(evt){
+ dijit._justMouseDowned = true;
+ setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
+ dijit._onTouchNode(evt.target||evt.srcElement);
+ });
+ //dojo.connect(targetWindow, "onscroll", ???);
+
+ // Listen for blur and focus events on targetWindow's body
+ var body = targetWindow.document.body || targetWindow.document.getElementsByTagName("body")[0];
+ if(body){
+ if(dojo.isIE){
+ body.attachEvent('onactivate', function(evt){
+ if(evt.srcElement.tagName.toLowerCase() != "body"){
+ dijit._onFocusNode(evt.srcElement);
+ }
+ });
+ body.attachEvent('ondeactivate', function(evt){ dijit._onBlurNode(evt.srcElement); });
+ }else{
+ body.addEventListener('focus', function(evt){ dijit._onFocusNode(evt.target); }, true);
+ body.addEventListener('blur', function(evt){ dijit._onBlurNode(evt.target); }, true);
+ }
+ }
+ body = null; // prevent memory leak (apparent circular reference via closure)
+ },
+
+ _onBlurNode: function(/*DomNode*/ node){
+ // summary:
+ // Called when focus leaves a node.
+ // Usually ignored, _unless_ it *isn't* 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){
+ // summary:
+ // Callback when node is focused or mouse-downed
+
+ // 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){
+ if(node.dijitPopupParent){
+ node=dijit.byId(node.dijitPopupParent).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=dijit.getDocumentWindow(node.ownerDocument).frameElement;
+ }else{
+ var id = node.getAttribute && node.getAttribute("widgetId");
+ if(id){
+ newStack.unshift(id);
+ }
+ node=node.parentNode;
+ }
+ }
+ }catch(e){ /* squelch */ }
+
+ dijit._setStack(newStack);
+ },
+
+ _onFocusNode: function(/*DomNode*/ node){
+ // summary
+ // Callback when node is focused
+ if(node && node.tagName && node.tagName.toLowerCase() == "body"){
+ 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(newStack){
+ // summary
+ // The stack of active widgets has changed. Send out appropriate events and record new stack
+
+ 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;
+ }
+ }
+
+ // for all elements that have gone out of focus, send blur event
+ for(var i=oldStack.length-1; i>=nCommon; i--){
+ var widget = dijit.byId(oldStack[i]);
+ if(widget){
+ widget._focused = false;
+ widget._hasBeenBlurred = true;
+ if(widget._onBlur){
+ widget._onBlur();
+ }
+ if (widget._setStateClass){
+ widget._setStateClass();
+ }
+ dojo.publish("widgetBlur", [widget]);
+ }
+ }
+
+ // 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();
+ }
+ if (widget._setStateClass){
+ widget._setStateClass();
+ }
+ dojo.publish("widgetFocus", [widget]);
+ }
+ }
+ }
+});
+
+// register top window and all the iframes it contains
+dojo.addOnLoad(dijit.registerWin);
+
+}
+
+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
+
+ constructor: function(){
+ this._hash={};
+ },
+
+ add: function(/*Widget*/ widget){
+ 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;
+ },
+
+ remove: function(/*String*/ id){
+ delete this._hash[id];
+ },
+
+ forEach: function(/*Function*/ func){
+ for(var id in this._hash){
+ func(this._hash[id]);
+ }
+ },
+
+ filter: function(/*Function*/ filter){
+ var res = new dijit.WidgetSet();
+ this.forEach(function(widget){
+ if(filter(widget)){ res.add(widget); }
+ });
+ return res; // dijit.WidgetSet
+ },
+
+ byId: function(/*String*/ id){
+ return this._hash[id];
+ },
+
+ byClass: function(/*String*/ cls){
+ return this.filter(function(widget){ return widget.declaredClass==cls; }); // dijit.WidgetSet
+ }
+ });
+
+/*=====
+dijit.registry = {
+ // summary: A list of widgets on a page.
+ // description: Is an instance of dijit.WidgetSet
+};
+=====*/
+dijit.registry = new dijit.WidgetSet();
+
+dijit._widgetTypeCtr = {};
+
+dijit.getUniqueId = function(/*String*/widgetType){
+ // summary
+ // Generates a unique id for a given widgetType
+
+ var id;
+ do{
+ id = widgetType + "_" +
+ (widgetType in dijit._widgetTypeCtr ?
+ ++dijit._widgetTypeCtr[widgetType] : dijit._widgetTypeCtr[widgetType] = 0);
+ }while(dijit.byId(id));
+ return id; // String
+};
+
+
+if(dojo.isIE){
+ // Only run this 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.addOnUnload(function(){
+ dijit.registry.forEach(function(widget){ widget.destroy(); });
+ });
+}
+
+dijit.byId = function(/*String|Widget*/id){
+ // summary:
+ // Returns a widget by its id, or if passed a widget, no-op (like dojo.byId())
+ return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+ // summary:
+ // Returns the widget as referenced by node
+ return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+ // summary:
+ // Returns the widget whose dom tree contains node or null if
+ // the node is not contained within the dom tree of any widget
+ while(node){
+ if(node.getAttribute && node.getAttribute("widgetId")){
+ return dijit.registry.byId(node.getAttribute("widgetId"));
+ }
+ node = node.parentNode;
+ }
+ return null;
+};
+
+// elements that are tab-navigable if they have no tabindex value set
+// (except for "a", which must have an href attribute)
+dijit._tabElements = {
+ area: true,
+ button: true,
+ input: true,
+ object: true,
+ select: true,
+ textarea: true
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+ var style = dojo.style(elem);
+ return (style.visibility != "hidden")
+ && (style.visibility != "collapsed")
+ && (style.display != "none");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+ // summary:
+ // Tests if an element is tab-navigable
+ if(dojo.hasAttr(elem, "disabled")){ return false; }
+ var hasTabindex = dojo.hasAttr(elem, "tabindex");
+ var tabindex = dojo.attr(elem, "tabindex");
+ if(hasTabindex && tabindex >= 0) {
+ return true; // boolean
+ }
+ var name = elem.nodeName.toLowerCase();
+ if(((name == "a" && dojo.hasAttr(elem, "href"))
+ || dijit._tabElements[name])
+ && (!hasTabindex || tabindex >= 0)){
+ return true; // boolean
+ }
+ return false; // boolean
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+ // summary:
+ // 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){
+ var isShown = dijit._isElementShown(child);
+ if(isShown && dijit.isTabNavigable(child)){
+ var tabindex = dojo.attr(child, "tabindex");
+ if(!dojo.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(isShown){ walkTree(child) }
+ });
+ };
+ if(dijit._isElementShown(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; // Element
+};
+
+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; // Element
+};
+
+}
+
+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");
+
+// ported from dojo.html.util
+
+dijit.getViewport = function(){
+ // summary
+ // Returns the dimensions and scroll position of the viewable area of a browser window
+
+ var _window = dojo.global;
+ var _document = dojo.doc;
+
+ // get viewport size
+ var w = 0, h = 0;
+ var de = _document.documentElement;
+ var dew = de.clientWidth, deh = de.clientHeight;
+ if(dojo.isMozilla){
+ // mozilla
+ // _window.innerHeight includes the height taken by the scroll bar
+ // clientHeight is ideal but has DTD issues:
+ // #4539: FF reverses the roles of body.clientHeight/Width and documentElement.clientHeight/Width based on the DTD!
+ // check DTD to see whether body or documentElement returns the viewport dimensions using this algorithm:
+ var minw, minh, maxw, maxh;
+ var dbw = _document.body.clientWidth;
+ if(dbw > dew){
+ minw = dew;
+ maxw = dbw;
+ }else{
+ maxw = dew;
+ minw = dbw;
+ }
+ var dbh = _document.body.clientHeight;
+ if(dbh > deh){
+ minh = deh;
+ maxh = dbh;
+ }else{
+ maxh = deh;
+ minh = dbh;
+ }
+ w = (maxw > _window.innerWidth) ? minw : maxw;
+ h = (maxh > _window.innerHeight) ? minh : maxh;
+ }else if(!dojo.isOpera && _window.innerWidth){
+ //in opera9, dojo.body().clientWidth should be used, instead
+ //of window.innerWidth/document.documentElement.clientWidth
+ //so we have to check whether it is opera
+ w = _window.innerWidth;
+ h = _window.innerHeight;
+ }else if(dojo.isIE && de && deh){
+ w = dew;
+ h = deh;
+ }else if(dojo.body().clientWidth){
+ // IE5, Opera
+ w = dojo.body().clientWidth;
+ h = dojo.body().clientHeight;
+ }
+
+ // get scroll position
+ var scroll = dojo._docScroll();
+
+ return { w: w, h: h, l: scroll.x, t: scroll.y }; // object
+};
+
+dijit.placeOnScreen = function(
+ /* DomNode */ node,
+ /* Object */ pos,
+ /* Object */ corners,
+ /* boolean? */ tryOnly){
+ // summary:
+ // Keeps 'node' in the visible area of the screen while trying to
+ // place closest to pos.x, pos.y. The input coordinates are
+ // expected to be the desired document position.
+ //
+ // Set which corner(s) you want to bind to, such as
+ //
+ // placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
+ //
+ // The desired x/y will be treated as the topleft(TL)/topright(TR) or
+ // BottomLeft(BL)/BottomRight(BR) corner of the node. Each corner is tested
+ // and if a perfect match is found, it will be used. Otherwise, it goes through
+ // all of the specified corners, and choose the most appropriate one.
+ //
+ // NOTE: node is assumed to be absolutely or relatively positioned.
+
+ var choices = dojo.map(corners, function(corner){ return { corner: corner, pos: pos }; });
+
+ 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 = dijit.getViewport();
+
+ // 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 = (corner.charAt(1) == 'L' ? pos.x : Math.max(view.l, pos.x - mb.w)),
+ startY = (corner.charAt(0) == 'T' ? pos.y : Math.max(view.t, pos.y - mb.h)),
+ endX = (corner.charAt(1) == 'L' ? Math.min(view.l + view.w, startX + mb.w) : pos.x),
+ endY = (corner.charAt(0) == 'T' ? Math.min(view.t + view.h, 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.placeOnScreenAroundElement = function(
+ /* DomNode */ node,
+ /* DomNode */ aroundNode,
+ /* Object */ aroundCorners,
+ /* Function */ layoutNode){
+
+ // summary
+ // Like placeOnScreen, except it accepts aroundNode instead of x,y
+ // and attempts to place node around it. Uses margin box dimensions.
+ //
+ // aroundCorners
+ // specify Which corner of aroundNode should be
+ // used to place the node => which corner(s) of node to use (see the
+ // corners parameter in dijit.placeOnScreen)
+ // e.g. {'TL': 'BL', 'BL': 'TL'}
+ //
+ // 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 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 aroundNodeW = aroundNode.offsetWidth; //mb.w;
+ var aroundNodeH = aroundNode.offsetHeight; //mb.h;
+ var aroundNodePos = dojo.coords(aroundNode, true);
+ aroundNode.style.display=oldDisplay;
+
+ // Generate list of possible positions for node
+ var choices = [];
+ for(var nodeCorner in aroundCorners){
+ choices.push( {
+ aroundCorner: nodeCorner,
+ corner: aroundCorners[nodeCorner],
+ pos: {
+ x: aroundNodePos.x + (nodeCorner.charAt(1) == 'L' ? 0 : aroundNodeW),
+ y: aroundNodePos.y + (nodeCorner.charAt(0) == 'T' ? 0 : aroundNodeH)
+ }
+ });
+ }
+
+ return dijit._place(node, choices, layoutNode);
+}
+
+}
+
+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){
+ // summary
+ // Get window object associated with document doc
+
+ // With Safari, there is not way to retrieve the window from the document, so we must fix it.
+ if(dojo.isSafari && !doc._parentWindow){
+ /*
+ This is a Safari specific function that fix the reference to the parent
+ window from the document object.
+ TODO: #5711: should the use of document below reference dojo.doc instead
+ in case they're not the same?
+ */
+ var fix=function(win){
+ win.document._parentWindow=win;
+ for(var i=0; i<win.frames.length; i++){
+ fix(win.frames[i]);
+ }
+ }
+ fix(window.top);
+ }
+
+ //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
+ //TODO: #5711: should the use of document below reference dojo.doc instead in case they're not the same?
+ if(dojo.isIE && window !== document.parentWindow && !doc._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.parentWindow || doc.defaultView; // Window
+}
+
+}
+
+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 = new function(){
+ // summary:
+ // This class is used to show/hide widgets as popups.
+ //
+
+ var stack = [],
+ beginZIndex=1000,
+ idGen = 1;
+
+ this.prepare = function(/*DomNode*/ node){
+ // summary:
+ // Prepares a node to be used as a popup
+ //
+ // description:
+ // Attaches node to dojo.doc.body, and
+ // positions it 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
+
+ dojo.body().appendChild(node);
+ var s = node.style;
+ if(s.display == "none"){
+ s.display="";
+ }
+ s.visibility = "hidden"; // not needed for hiding, but used as flag that node is off-screen
+ s.position = "absolute";
+ s.top = "-9999px";
+ };
+
+ this.open = function(/*Object*/ args){
+ // summary:
+ // Popup the widget at the specified position
+ //
+ // args: Object
+ // 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
+ // orient: Object
+ // structure specifying possible positions of popup relative to "around" node
+ // 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);
+ // ie: 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)
+ //
+ // examples:
+ // 1. opening at the mouse position
+ // dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
+ // 2. 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 it's own _onBlur callback
+ // (fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
+
+ var widget = args.popup,
+ orient = args.orient || {'BL':'TL', 'TL':'BL'},
+ around = args.around,
+ id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+idGen++);
+
+ // make wrapper div to hold widget and possibly hold iframe behind it.
+ // we can't attach the iframe as a child of the widget.domNode because
+ // widget.domNode might be a <table>, <ul>, etc.
+ var wrapper = dojo.doc.createElement("div");
+ dijit.setWaiRole(wrapper, "presentation");
+ wrapper.id = id;
+ wrapper.className="dijitPopup";
+ wrapper.style.zIndex = beginZIndex + stack.length;
+ wrapper.style.visibility = "hidden";
+ if(args.parent){
+ wrapper.dijitPopupParent=args.parent.id;
+ }
+ dojo.body().appendChild(wrapper);
+
+ var s = widget.domNode.style;
+ s.display = "";
+ s.visibility = "";
+ s.position = "";
+ wrapper.appendChild(widget.domNode);
+
+ var iframe = new dijit.BackgroundIframe(wrapper);
+
+ // position the wrapper node
+ 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']);
+
+ wrapper.style.visibility = "visible";
+ // TODO: use effects to fade in wrapper
+
+ var handlers = [];
+
+ // 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 getTopPopup = function(){
+ 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];
+ }
+
+ // 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.keyCode == dojo.keys.ESCAPE && args.onCancel){
+ dojo.stopEvent(evt);
+ args.onCancel();
+ }else if(evt.keyCode == dojo.keys.TAB){
+ dojo.stopEvent(evt);
+ var topPopup = 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", null, args.onCancel));
+ }
+
+ handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+ var topPopup = 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){
+ widget.onOpen(best);
+ }
+
+ return best;
+ };
+
+ this.close = function(/*Widget*/ popup){
+ // summary:
+ // Close specified popup and any popups that it parented
+ 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){
+ widget.onClose();
+ }
+ dojo.forEach(top.handlers, dojo.disconnect);
+
+ // #2685: check if the widget still has a domNode so ContentPane can change its URL without getting an error
+ if(!widget||!widget.domNode){ return; }
+
+ this.prepare(widget.domNode);
+
+ iframe.destroy();
+ dojo._destroyElement(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 html="<iframe src='javascript:\"\"'"
+ + " style='position: absolute; left: 0px; top: 0px;"
+ + "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+ iframe = dojo.doc.createElement(html);
+ }else{
+ iframe = dojo.doc.createElement("iframe");
+ iframe.src = 'javascript:""';
+ iframe.className = "dijitBackgroundIframe";
+ }
+ iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
+ dojo.body().appendChild(iframe);
+ }
+ return iframe;
+ };
+
+ this.push = function(iframe){
+ iframe.style.display="";
+ if(dojo.isIE){
+ iframe.style.removeExpression("width");
+ iframe.style.removeExpression("height");
+ }
+ queue.push(iframe);
+ }
+}();
+
+// fill the queue
+if(dojo.isIE && dojo.isIE < 7){
+ dojo.addOnLoad(function(){
+ var f = dijit._frames;
+ dojo.forEach([f.pop()], f.push);
+ });
+}
+
+
+dijit.BackgroundIframe = function(/* DomNode */node){
+ // summary:
+ // For IE 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.isIE < 7) || (dojo.isFF && dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+ var iframe = dijit._frames.pop();
+ node.appendChild(iframe);
+ if(dojo.isIE){
+ iframe.style.setExpression("width", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetWidth");
+ iframe.style.setExpression("height", dojo._scopeName + ".doc.getElementById('" + node.id + "').offsetHeight");
+ }
+ this.iframe = iframe;
+ }
+};
+
+dojo.extend(dijit.BackgroundIframe, {
+ destroy: function(){
+ // summary: destroy the iframe
+ 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){
+ // summary
+ // Scroll the passed node into view, if it is not.
+
+ // don't rely on that node.scrollIntoView works just because the function is there
+ // it doesnt work in Konqueror or Opera even though the function is there and probably
+ // not safari either
+ // native scrollIntoView() causes FF3's whole window to scroll if there is no scroll bar
+ // on the immediate parent
+ // dont like browser sniffs implementations but sometimes you have to use it
+ // #6146: IE scrollIntoView is broken
+ // It's not enough just to scroll the menu node into view if
+ // node.scrollIntoView hides part of the parent's scrollbar,
+ // so just manage the parent scrollbar ourselves
+ var parent = node.parentNode;
+ var parentBottom = parent.scrollTop + dojo.marginBox(parent).h; //PORT was getBorderBox
+ var nodeBottom = node.offsetTop + dojo.marginBox(node).h;
+ if(parentBottom < nodeBottom){
+ parent.scrollTop += (nodeBottom - parentBottom);
+ }else if(parent.scrollTop > node.offsetTop){
+ parent.scrollTop -= (parent.scrollTop - node.offsetTop);
+ }
+};
+
+}
+
+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");
+
+// ported from dojo.html.applyBrowserClass (style.js)
+
+// summary:
+// Applies pre-set class names based on browser & version to the
+// top-level HTML node. Simply doing a require on this module will
+// establish this CSS. Modified version of Morris' CSS hack.
+(function(){
+ var d = dojo;
+ var ie = d.isIE;
+ var opera = d.isOpera;
+ var maj = Math.floor;
+ var ff = d.isFF;
+ var classes = {
+ dj_ie: ie,
+// dj_ie55: ie == 5.5,
+ dj_ie6: maj(ie) == 6,
+ dj_ie7: maj(ie) == 7,
+ dj_iequirks: ie && d.isQuirks,
+// NOTE: Opera not supported by dijit
+ dj_opera: opera,
+ dj_opera8: maj(opera) == 8,
+ dj_opera9: maj(opera) == 9,
+ dj_khtml: d.isKhtml,
+ dj_safari: d.isSafari,
+ dj_gecko: d.isMozilla,
+ dj_ff2: maj(ff) == 2
+ }; // no dojo unsupported browsers
+
+ for(var p in classes){
+ if(classes[p]){
+ var html = dojo.doc.documentElement; //TODO browser-specific DOM magic needed?
+ if(html.className){
+ html.className += " " + p;
+ }else{
+ html.className = p;
+ }
+ }
+ }
+})();
+
+}
+
+if(!dojo._hasResource["dijit._base.bidi"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.bidi"] = true;
+dojo.provide("dijit._base.bidi");
+
+// summary: applies a class to the top of the document for right-to-left stylesheet rules
+
+dojo.addOnLoad(function(){
+ if(!dojo._isBodyLtr()){
+ dojo.addClass(dojo.body(), "dijitRtl");
+ }
+});
+
+}
+
+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);
+ this._currentTimeout = (this._currentTimeout < 0) ? this._initialDelay : ((this._subsequentDelay > 1) ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay));
+ 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){
+ // 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.
+ // Parameters:
+ // evt: key or mouse event object to pass to the user callback
+ // _this: pointer to the user's widget space.
+ // node: the DOM node object to pass the the callback function
+ // callback: function to call until the sequence is stopped called with 3 parameters:
+ // count: integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped
+ // node: the DOM node object passed in
+ // evt: key or mouse event object
+ // obj: user space object used to uniquely identify each typematic sequence
+ // subsequentDelay: if > 1, the number of milliseconds until the 3->n events occur
+ // or else the fractional time multiplier for the next event's delay, default=0.9
+ // initialDelay: the number of milliseconds until the 2nd event occurs, default=500ms
+ if(obj != this._obj){
+ this.stop();
+ this._initialDelay = initialDelay || 500;
+ this._subsequentDelay = subsequentDelay || 0.90;
+ this._obj = obj;
+ this._evt = evt;
+ this._node = node;
+ this._currentTimeout = -1;
+ this._count = -1;
+ this._callback = dojo.hitch(_this, callback);
+ this._fireEventAndReload();
+ }
+ },
+
+ stop: function(){
+ // summary:
+ // Stop an ongoing timed, repeating callback sequence.
+ if(this._timer){
+ clearTimeout(this._timer);
+ this._timer = null;
+ }
+ if(this._obj){
+ this._callback(-1, this._node, this._evt);
+ this._obj = null;
+ }
+ },
+
+ addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+ // summary: Start listening for a specific typematic key.
+ // keyObject: an object defining the key to listen for.
+ // key: (mandatory) the keyCode (number) or character (string) to listen for.
+ // ctrlKey: desired ctrl key state to initiate the calback 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
+ // See the trigger method for other parameters.
+ // Returns an array of dojo.connect handles
+ return [
+ dojo.connect(node, "onkeypress", this, function(evt){
+ if(evt.keyCode == keyObject.keyCode && (!keyObject.charCode || keyObject.charCode == evt.charCode) &&
+ (keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
+ (keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
+ (keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+ dojo.stopEvent(evt);
+ dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
+ }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){
+ // 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);
+ }),
+ 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){
+ dojo.stopEvent(evt);
+ }),
+ dc(node, "dblclick", this, function(evt){
+ dojo.stopEvent(evt);
+ if(dojo.isIE){
+ dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay);
+ setTimeout(dojo.hitch(this, dijit.typematic.stop), 50);
+ }
+ })
+ ];
+ },
+
+ addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay){
+ // summary: Start listening for a specific typematic key and mouseclick.
+ // This is a thin wrapper to addKeyListener and addMouseListener.
+ // mouseNode: the DOM node object to listen on for mouse events.
+ // keyNode: the DOM node object to listen on for key events.
+ // See the addMouseListener and addKeyListener methods for other parameters.
+ // Returns an array of dojo.connect handles
+ return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay).concat(
+ this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay));
+ }
+};
+
+}
+
+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.doc.createElement("div");
+ div.id = "a11yTestNode";
+ div.style.cssText = 'border: 1px solid;'
+ + 'border-color:red green;'
+ + 'position: absolute;'
+ + 'height: 5px;'
+ + 'top: -999px;'
+ + 'background-image: url("' + dojo.moduleUrl("dojo", "resources/blank.gif") + '");';
+ dojo.body().appendChild(div);
+
+ // 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");
+ dojo.body().removeChild(div);
+ }
+ }
+};
+
+// Test if computer is in high contrast mode.
+// Make sure the a11y test runs first, before widgets are instantiated.
+if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up
+ dojo._loaders.unshift(dijit.wai.onload);
+}
+
+dojo.mixin(dijit,
+{
+ hasWaiRole: function(/*Element*/ elem){
+ // summary: Determines if an element has a role.
+ // returns: true if elem has a role attribute and false if not.
+ return elem.hasAttribute ? elem.hasAttribute("role") : !!elem.getAttribute("role");
+ },
+
+ getWaiRole: function(/*Element*/ elem){
+ // summary: Gets the role for an element.
+ // returns:
+ // The role of elem or an empty string if elem
+ // does not have a role.
+ var value = elem.getAttribute("role");
+ if(value){
+ var prefixEnd = value.indexOf(":");
+ return prefixEnd == -1 ? value : value.substring(prefixEnd+1);
+ }else{
+ return "";
+ }
+ },
+
+ setWaiRole: function(/*Element*/ elem, /*String*/ role){
+ // summary: Sets the role on an element.
+ // description:
+ // On Firefox 2 and below, "wairole:" is
+ // prepended to the provided role value.
+ elem.setAttribute("role", (dojo.isFF && dojo.isFF < 3) ? "wairole:" + role : role);
+ },
+
+ removeWaiRole: function(/*Element*/ elem){
+ // summary: Removes the role from an element.
+ elem.removeAttribute("role");
+ },
+
+ hasWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary: Determines if an element has a given state.
+ // description:
+ // On Firefox 2 and below, we check for an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we check for an attribute
+ // called "aria-"+state.
+ // returns:
+ // true if elem has a value for the given state and
+ // false if it does not.
+ if(dojo.isFF && dojo.isFF < 3){
+ return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ 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:
+ // On Firefox 2 and below, we check for an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we check 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.
+ if(dojo.isFF && dojo.isFF < 3){
+ return elem.getAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ var value = elem.getAttribute("aria-"+state);
+ return value ? value : "";
+ }
+ },
+
+ setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+ // summary: Sets a state on an element.
+ // description:
+ // On Firefox 2 and below, we set an attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we set an attribute called
+ // "aria-"+state.
+ if(dojo.isFF && dojo.isFF < 3){
+ elem.setAttributeNS("http://www.w3.org/2005/07/aaa",
+ "aaa:"+state, value);
+ }else{
+ elem.setAttribute("aria-"+state, value);
+ }
+ },
+
+ removeWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary: Removes a state from an element.
+ // description:
+ // On Firefox 2 and below, we remove the attribute in namespace
+ // "http://www.w3.org/2005/07/aaa" with a name of the given state.
+ // On all other browsers, we remove the attribute called
+ // "aria-"+state.
+ if(dojo.isFF && dojo.isFF < 3){
+ elem.removeAttributeNS("http://www.w3.org/2005/07/aaa", state);
+ }else{
+ 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");
+
+
+
+
+
+
+
+
+
+
+
+
+// FIXME: Find a better way of solving this bug!
+if(dojo.isSafari){
+ // Ugly-ass hack to solve bug #5626 for 1.1; basically force Safari to re-layout.
+ // Note that we can't reliably use dojo.addOnLoad here because this bug is basically
+ // a timing / race condition; so instead we use window.onload.
+ dojo.connect(window, "load", function(){
+ window.resizeBy(1,0);
+ setTimeout(function(){ window.resizeBy(-1,0); }, 10);
+ });
+}
+
+}
+
+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);
+ var 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.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){
+ return defaultTime["get" + prop]();
+ }).forEach(function(value, index){
+ if(match[index] === undefined){
+ 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);
+// result.setFullYear(match[0]||1970); // for year < 100
+
+ var offset = 0;
+ var 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 = [];
+ var getter = options.zulu ? "getUTC" : "get";
+ var 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");
+
+
+dojo.parser = new function(){
+ // summary: The Dom/Widget parsing package
+
+ var d = dojo;
+ var dtName = d._scopeName + "Type";
+ var qry = "[" + dtName + "]";
+
+ 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.search(/[^\w\.]+/i) != -1){
+ // TODO: "this" here won't work
+ value = d.parser._nameAnonFunc(new Function(value), this);
+ }
+ return d.getObject(value, false);
+ }catch(e){ return new Function(); }
+ case "array":
+ return 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"} }
+ };
+
+ function getClassInfo(/*String*/ className){
+ // className:
+ // fully qualified name (like "dijit.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(!d.isFunction(cls)){
+ throw new Error("Could not load class '" + className +
+ "'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");
+ }
+ var proto = cls.prototype;
+
+ // get table of parameter names & types
+ var params={};
+ for(var name in proto){
+ if(name.charAt(0)=="_"){ continue; } // skip internal properties
+ 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){
+ // summary:
+ // Takes array of nodes, and turns them into class instances and
+ // potentially calls a layout method to allow them to connect with
+ // any children
+ var thelist = [];
+ d.forEach(nodes, function(node){
+ if(!node){ return; }
+ var type = node.getAttribute(dtName);
+ if((!type)||(!type.length)){ return; }
+ var clsInfo = getClassInfo(type);
+ var clazz = clsInfo.cls;
+ var ps = clazz._noScript||clazz.prototype._noScript;
+
+ // read parameters (ie, attributes).
+ // clsInfo.params lists expected params like {"checked": "boolean", "n": "number"}
+ var params = {};
+ var attributes = node.attributes;
+ for(var name in clsInfo.params){
+ var item = 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 = node.className;
+ break;
+ case "style":
+ value = node.style && node.style.cssText; // FIXME: Opera?
+ }
+ var _type = clsInfo.params[name];
+ params[name] = str2obj(value, _type);
+ }
+
+ // 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 />
+ if(!ps){
+ var connects = [], // functions to connect after instantiation
+ calls = []; // functions to call after instantiation
+
+ d.query("> script[type^='dojo/']", node).orphan().forEach(function(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"];
+ if(!markupFactory && clazz["prototype"]){
+ markupFactory = 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
+ if(!ps){
+ 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
+ d.forEach(thelist, function(instance){
+ if( instance &&
+ instance.startup &&
+ !instance._started &&
+ (!instance.getParent || !instance.getParent())
+ ){
+ instance.startup();
+ }
+ });
+ return thelist;
+ };
+
+ this.parse = function(/*DomNode?*/ rootNode){
+ // summary:
+ // Search specified node (or root node) recursively for class instances,
+ // and instantiate them Searches for
+ // dojoType="qualified.class.name"
+ var list = d.query(qry, rootNode);
+ // go build the object instances
+ var instances = this.instantiate(list);
+ return instances;
+ };
+}();
+
+//Register the parser callback. It should be the first callback
+//after the a11y test.
+
+(function(){
+ var parseRunner = function(){
+ if(dojo.config["parseOnLoad"] == true){
+ 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);
+ }
+})();
+
+//TODO: ported from 0.4.x Dojo. Can we reduce this?
+dojo.parser._anonCtr = 0;
+dojo.parser._anon = {}; // why is this property required?
+dojo.parser._nameAnonFunc = function(/*Function*/anonFuncPtr, /*Object*/thisObj){
+ // summary:
+ // Creates a reference to anonFuncPtr in thisObj with a completely
+ // unique name. The new name is returned as a String.
+ var jpn = "$joinpoint";
+ var nso = (thisObj|| dojo.parser._anon);
+ if(dojo.isIE){
+ var cn = anonFuncPtr["__dojoNameCache"];
+ if(cn && nso[cn] === anonFuncPtr){
+ return anonFuncPtr["__dojoNameCache"];
+ }
+ }
+ var ret = "__"+dojo.parser._anonCtr++;
+ while(typeof nso[ret] != "undefined"){
+ ret = "__"+dojo.parser._anonCtr++;
+ }
+ nso[ret] = anonFuncPtr;
+ return ret; // String
+}
+
+}
+
+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" );
+
+dojo.declare("dijit._Widget", null, {
+ // summary:
+ // The foundation of dijit widgets.
+ //
+ // id: 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: 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: String
+ // Unsupported by Dijit, but here for completeness. Dijit only supports setting text direction on the
+ // entire document.
+ // 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".
+ dir: "",
+
+ // class: String
+ // HTML class attribute
+ "class": "",
+
+ // style: String
+ // HTML style attribute
+ style: "",
+
+ // title: String
+ // HTML title attribute
+ title: "",
+
+ // srcNodeRef: DomNode
+ // pointer to original dom node
+ srcNodeRef: null,
+
+ // domNode: DomNode
+ // this is our visible representation of the widget! Other DOM
+ // Nodes may by assigned to other properties, usually through the
+ // template system's dojoAttachPonit syntax, but the domNode
+ // property is the canonical "top level" node in widget UI.
+ domNode: null,
+
+ // attributeMap: Object
+ // A map of attributes and attachpoints -- typically standard HTML attributes -- to set
+ // on the widget's dom, at the "domNode" attach point, by default.
+ // Other node references can be specified as properties of 'this'
+ attributeMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""}, // TODO: add on* handlers?
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+//TODOC: params and srcNodeRef need docs. Is srcNodeRef optional?
+//TODOC: summary needed for postscript
+ postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ this.create(params, srcNodeRef);
+ },
+
+ create: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ // summary:
+ // Kick off the life-cycle of a widget
+ // description:
+ // To understand the process by which widgets are instantiated, it
+ // is critical to understand what other methods create calls and
+ // which of them you'll want to override. Of course, adventurous
+ // developers could override create entirely, but this should
+ // only be done as a last resort.
+ //
+ // Below is a list of the methods that are called, in the order
+ // they are fired, along with notes about what they do and if/when
+ // you should over-ride them in your widget:
+ //
+ // * postMixInProperties:
+ // | * a stub function that you can over-ride to modify
+ // variables that may have been naively assigned by
+ // mixInProperties
+ // * widget is added to manager object here
+ // * buildRendering:
+ // | * Subclasses use this method to handle all UI initialization
+ // Sets this.domNode. Templated widgets do this automatically
+ // and otherwise it just uses the source dom node.
+ // * postCreate:
+ // | * a stub function that you can over-ride to modify take
+ // actions once the widget has been placed in the UI
+
+ // 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=[];
+
+ // _attaches: String[]
+ // names of all our dojoAttachPoint variables
+ this._attaches=[];
+
+ //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();
+
+ // Copy attributes listed in attributeMap into the [newly created] DOM for the widget.
+ // The placement of these attributes is according to the property mapping in attributeMap.
+ // Note special handling for 'style' and 'class' attributes which are lists and can
+ // have elements from both old and new structures, and some attributes like "type"
+ // cannot be processed this way as they are not mutable.
+ if(this.domNode){
+ for(var attr in this.attributeMap){
+ var value = this[attr];
+ if(typeof value != "object" && ((value !== "" && value !== false) || (params && params[attr]))){
+ this.setAttribute(attr, value);
+ }
+ }
+ }
+
+ 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;
+ }
+ },
+
+ 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.
+ },
+
+ buildRendering: function(){
+ // summary:
+ // Construct the UI for this widget, setting this.domNode.
+ // Most widgets will mixin TemplatedWidget, which overrides this method.
+ this.domNode = this.srcNodeRef || dojo.doc.createElement('div');
+ },
+
+ postCreate: function(){
+ // summary:
+ // Called after a widget's dom has been setup
+ },
+
+ startup: function(){
+ // summary:
+ // Called after a widget's children, and other widgets on the page, have been created.
+ // Provides an opportunity to manipulate any children before they are displayed.
+ // 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*/ finalize){
+ // summary:
+ // Destroy this widget and it's descendants. This is the generic
+ // "destructor" function that all widget users should call to
+ // cleanly discard with a widget. Once a widget is destroyed, it's
+ // removed from the manager object.
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ this.destroyDescendants();
+ this.destroy();
+ },
+
+ destroy: function(/*Boolean*/ finalize){
+ // summary:
+ // Destroy this widget, but not its descendants
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ this.uninitialize();
+ dojo.forEach(this._connects, function(array){
+ dojo.forEach(array, dojo.disconnect);
+ });
+
+ // destroy widgets created as part of template, etc.
+ dojo.forEach(this._supportingWidgets || [], function(w){ w.destroy(); });
+
+ this.destroyRendering(finalize);
+ dijit.registry.remove(this.id);
+ },
+
+ destroyRendering: function(/*Boolean*/ finalize){
+ // summary:
+ // Destroys the DOM nodes associated with this widget
+ // finalize: Boolean
+ // is this function being called part of global environment
+ // tear-down?
+
+ if(this.bgIframe){
+ this.bgIframe.destroy();
+ delete this.bgIframe;
+ }
+
+ if(this.domNode){
+ dojo._destroyElement(this.domNode);
+ delete this.domNode;
+ }
+
+ if(this.srcNodeRef){
+ dojo._destroyElement(this.srcNodeRef);
+ delete this.srcNodeRef;
+ }
+ },
+
+ destroyDescendants: function(){
+ // summary:
+ // Recursively destroy the children of this widget and their
+ // descendants.
+
+ // TODO: should I destroy in the reverse order, to go bottom up?
+ dojo.forEach(this.getDescendants(), function(widget){ widget.destroy(); });
+ },
+
+ uninitialize: function(){
+ // summary:
+ // stub function. Override to implement custom widget tear-down
+ // behavior.
+ return false;
+ },
+
+ ////////////////// MISCELLANEOUS METHODS ///////////////////
+
+ onFocus: function(){
+ // summary:
+ // stub function. Override or connect to this method to receive
+ // notifications for when the widget moves into focus.
+ },
+
+ onBlur: function(){
+ // summary:
+ // stub function. Override or connect to this method to receive
+ // notifications for when the widget moves out of focus.
+ },
+
+ _onFocus: function(e){
+ this.onFocus();
+ },
+
+ _onBlur: function(){
+ this.onBlur();
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // summary
+ // Set native HTML attributes reflected in the widget,
+ // such as readOnly, disabled, and maxLength in TextBox widgets.
+ // description
+ // In general, a widget's "value" is controlled via setValue()/getValue(),
+ // rather than this method. The exception is for widgets where the
+ // end user can't adjust the value, such as Button and CheckBox;
+ // in the unusual case that you want to change the value attribute of
+ // those widgets, use setAttribute().
+ var mapNode = this[this.attributeMap[attr]||'domNode'];
+ this[attr] = value;
+ switch(attr){
+ case "class":
+ dojo.addClass(mapNode, value);
+ break;
+ case "style":
+ if(mapNode.style.cssText){
+ mapNode.style.cssText += "; " + value;// FIXME: Opera
+ }else{
+ mapNode.style.cssText = value;
+ }
+ break;
+ default:
+ if(/^on[A-Z]/.test(attr)){ // eg. onSubmit needs to be onsubmit
+ attr = attr.toLowerCase();
+ }
+ if(typeof value == "function"){ // functions execute in the context of the widget
+ value = dojo.hitch(this, value);
+ }
+ dojo.attr(mapNode, attr, value);
+ }
+ },
+
+ toString: function(){
+ // summary:
+ // returns a string that represents the widget. 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 reversable
+ // serialization.
+ return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
+ },
+
+ getDescendants: function(){
+ // summary:
+ // Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+ if(this.containerNode){
+ var list= dojo.query('[widgetId]', this.containerNode);
+ return list.map(dijit.byNode); // Array
+ }else{
+ return [];
+ }
+ },
+
+//TODOC
+ nodesWithKeyClick: ["input", "button"],
+
+ connect: function(
+ /*Object|null*/ obj,
+ /*String*/ event,
+ /*String|Function*/ method){
+ // summary:
+ // Connects specified obj/event to specified method of this object
+ // and registers for disconnect() on widget destroy.
+ // Special event: "ondijitclick" triggers on a click or enter-down or space-up
+ // Similar to dojo.connect() but takes three arguments rather than four.
+ var handles =[];
+ if(event == "ondijitclick"){
+ // add key based click activation for unsupported nodes.
+ if(!this.nodesWithKeyClick[obj.nodeName]){
+ handles.push(dojo.connect(obj, "onkeydown", this,
+ function(e){
+ if(e.keyCode == dojo.keys.ENTER){
+ return (dojo.isString(method))?
+ this[method](e) : method.call(this, e);
+ }else if(e.keyCode == dojo.keys.SPACE){
+ // stop space down as it causes IE to scroll
+ // the browser window
+ dojo.stopEvent(e);
+ }
+ }));
+ handles.push(dojo.connect(obj, "onkeyup", this,
+ function(e){
+ if(e.keyCode == dojo.keys.SPACE){
+ return dojo.isString(method) ?
+ this[method](e) : method.call(this, e);
+ }
+ }));
+ }
+ event = "onclick";
+ }
+ handles.push(dojo.connect(obj, event, this, method));
+
+ // return handles for FormElement and ComboBox
+ this._connects.push(handles);
+ return handles;
+ },
+
+ disconnect: function(/*Object*/ handles){
+ // summary:
+ // Disconnects handle created by this.connect.
+ // Also removes handle from this widget's list of connects
+ 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;
+ }
+ }
+ },
+
+ isLeftToRight: function(){
+ // summary:
+ // Checks the DOM to for the text direction for bi-directional support
+ // description:
+ // This method cannot be used during widget construction because the widget
+ // must first be connected to the DOM tree. Parent nodes are searched for the
+ // 'dir' attribute until one is found, otherwise left to right mode is assumed.
+ // See HTML spec, DIR attribute for more information.
+
+ if(!("_ltr" in this)){
+ this._ltr = dojo.getComputedStyle(this.domNode).direction != "rtl";
+ }
+ return this._ltr; //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");
+ }
+});
+
+}
+
+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.pad = function(/*String*/text, /*int*/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
+
+ var out = String(text);
+ if(!ch){
+ ch = '0';
+ }
+ while(out.length < size){
+ if(end){
+ out += ch;
+ }else{
+ out = ch + out;
+ }
+ }
+ return 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.
+ // description:
+ // For example,
+ // | dojo.string.substitute("File '${0}' is not found in directory '${1}'.",["foo.html","/temp"]);
+ // | dojo.string.substitute("File '${name}' is not found in directory '${info.dir}'.",
+ // | {name: "foo.html", info: {dir: "/temp"}});
+ // both return
+ // | "File 'foo.html' is not found in directory '/temp'."
+ // template:
+ // a string with expressions in the form `${key}` to be replaced or
+ // `${key:format}` which specifies a format function.
+ // map: hash to search for substitutions
+ // transform:
+ // a function to process all parameters before substitution takes
+ // place, e.g. dojo.string.encodeXML
+ // thisObject:
+ // where to look for optional format function; default to the global
+ // namespace
+
+ 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)(value);}
+ if(transform){ value = transform(value, key); }
+ return value.toString();
+ }); // string
+};
+
+dojo.string.trim = function(/*String*/ str){
+ // summary: trims whitespaces from both sides of the 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.
+ 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
+};
+
+}
+
+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
+ //
+ // templateNode: DomNode
+ // a node that represents the widget template. Pre-empts both templateString and templatePath.
+ templateNode: null,
+
+ // templateString: 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.
+ templateString: null,
+
+ // templatePath: String
+ // Path to template (HTML file) for this widget relative to dojo.baseUrl
+ templatePath: null,
+
+ // widgetsInTemplate: Boolean
+ // should we parse the template to find widgets that might be
+ // declared in markup inside it? false by default.
+ widgetsInTemplate: false,
+
+ // containerNode: DomNode
+ // holds child elements. "containerNode" is generally set via a
+ // dojoAttachPoint assignment and it designates where children of
+ // the src dom node will be placed
+ containerNode: null,
+
+ // skipNodeCache: 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,
+
+ _stringRepl: function(tmpl){
+ 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 = _this[key.substr(1)]; }
+ if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide
+ if(!value){ 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.
+
+ // 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 = dijit._Templated._createNodesFromText(this._stringRepl(cached))[0];
+ }else{
+ // if it's a node, all we have to do is clone it
+ node = cached.cloneNode(true);
+ }
+
+ // recurse through the node, looking for, and attaching to, our
+ // attachment points which should be defined on the template node.
+ this._attachTemplateNodes(node);
+
+ var source = this.srcNodeRef;
+ if(source && source.parentNode){
+ source.parentNode.replaceChild(node, source);
+ }
+
+ this.domNode = node;
+ if(this.widgetsInTemplate){
+ var cw = this._supportingWidgets = dojo.parser.parse(node);
+ this._attachTemplateNodes(cw, function(n,p){
+ return n[p];
+ });
+ }
+
+ this._fillContent(source);
+ },
+
+ _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
+ 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
+
+ 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;
+ }
+ }
+ }
+
+ // 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]);
+ }
+ });
+ }
+
+ }
+ }
+ }
+);
+
+// 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
+ // The URL to get the template from. dojo.uri.Uri is often passed as well.
+ // 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){
+ return cached;
+ }
+
+ // If necessary, load template string from template path
+ if(!templateString){
+ templateString = dijit._Templated._sanitizeTemplateString(dojo._getText(templatePath));
+ }
+
+ 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
+ return (tmplts[key] = dijit._Templated._createNodesFromText(templateString)[0]); //Node
+ }
+};
+
+dijit._Templated._sanitizeTemplateString = function(/*String*/tString){
+ // 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.
+ if(tString){
+ tString = tString.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+ var matches = tString.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(matches){
+ tString = matches[1];
+ }
+ }else{
+ tString = "";
+ }
+ return tString; //String
+};
+
+
+if(dojo.isIE){
+ dojo.addOnUnload(function(){
+ var cache = dijit._Templated._templateCache;
+ for(var key in cache){
+ var value = cache[key];
+ if(!isNaN(value.nodeType)){ // isNode equivalent
+ dojo._destroyElement(value);
+ }
+ delete cache[key];
+ }
+ });
+}
+
+(function(){
+ var tagMap = {
+ cell: {re: /^<t[dh][\s\r\n>]/i, pre: "<table><tbody><tr>", post: "</tr></tbody></table>"},
+ row: {re: /^<tr[\s\r\n>]/i, pre: "<table><tbody>", post: "</tbody></table>"},
+ section: {re: /^<(thead|tbody|tfoot)[\s\r\n>]/i, pre: "<table>", post: "</table>"}
+ };
+
+ // dummy container node used temporarily to hold nodes being created
+ var tn;
+
+ dijit._Templated._createNodesFromText = function(/*String*/text){
+ // summary:
+ // Attempts to create a set of nodes based on the structure of the passed text.
+
+ if(!tn){
+ tn = dojo.doc.createElement("div");
+ tn.style.display="none";
+ dojo.body().appendChild(tn);
+ }
+ var tableType = "none";
+ var rtext = text.replace(/^\s+/, "");
+ for(var type in tagMap){
+ var map = tagMap[type];
+ if(map.re.test(rtext)){
+ tableType = type;
+ text = map.pre + text + map.post;
+ break;
+ }
+ }
+
+ tn.innerHTML = text;
+ if(tn.normalize){
+ tn.normalize();
+ }
+
+ var tag = { cell: "tr", row: "tbody", section: "table" }[tableType];
+ var _parent = (typeof tag != "undefined") ?
+ tn.getElementsByTagName(tag)[0] :
+ tn;
+
+ var nodes = [];
+ while(_parent.firstChild){
+ nodes.push(_parent.removeChild(_parent.firstChild));
+ }
+ tn.innerHTML="";
+ return nodes; // Array
+ }
+})();
+
+// 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._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
+ // implements dijit._Container
+ for(var p=this.domNode.parentNode; p; p=p.parentNode){
+ var id = p.getAttribute && p.getAttribute("widgetId");
+ if(id){
+ var parent = dijit.byId(id);
+ return parent.isContainer ? parent : null;
+ }
+ }
+ return null;
+ },
+
+ _getSibling: function(which){
+ var node = this.domNode;
+ do{
+ node = node[which+"Sibling"];
+ }while(node && node.nodeType != 1);
+ if(!node){ return null; } // null
+ var id = node.getAttribute("widgetId");
+ return dijit.byId(id);
+ },
+
+ 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"); // Mixed
+ },
+
+ 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"); // Mixed
+ }
+ }
+);
+
+dojo.declare("dijit._Container",
+ null,
+ {
+ // summary:
+ // Mixin for widgets that contain a list of children.
+ // description:
+ // Use this mixin when the widget needs to know about and
+ // keep track of it's widget children. Widgets like SplitContainer
+ // and TabContainer.
+
+ isContainer: true,
+
+ addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+ // summary:
+ // Process the given child widget, inserting it's dom node as
+ // a child of our dom node
+
+ if(insertIndex === undefined){
+ insertIndex = "last";
+ }
+ var refNode = this.containerNode || this.domNode;
+ if(insertIndex && typeof insertIndex == "number"){
+ var children = dojo.query("> [widgetid]", refNode);
+ if(children && children.length >= insertIndex){
+ refNode = children[insertIndex-1]; 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*/ widget){
+ // summary:
+ // Removes the passed widget instance from this widget but does
+ // not destroy it
+ var node = widget.domNode;
+ node.parentNode.removeChild(node); // detach but don't destroy
+ },
+
+ _nextElement: function(node){
+ do{
+ node = node.nextSibling;
+ }while(node && node.nodeType != 1);
+ return node;
+ },
+
+ _firstElement: function(node){
+ node = node.firstChild;
+ if(node && node.nodeType != 1){
+ node = this._nextElement(node);
+ }
+ return node;
+ },
+
+ getChildren: function(){
+ // summary:
+ // Returns array of children widgets
+ return dojo.query("> [widgetId]", this.containerNode || this.domNode).map(dijit.byNode); // Array
+ },
+
+ hasChildren: function(){
+ // summary:
+ // Returns true if widget has children
+ var cn = this.containerNode || this.domNode;
+ return !!this._firstElement(cn); // Boolean
+ },
+
+ _getSiblingOfChild: function(/*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
+ var node = child.domNode;
+ var which = (dir>0 ? "nextSibling" : "previousSibling");
+ do{
+ node = node[which];
+ }while(node && (node.nodeType != 1 || !dijit.byNode(node)));
+ return node ? dijit.byNode(node) : null;
+ }
+ }
+);
+
+dojo.declare("dijit._KeyNavContainer",
+ [dijit._Container],
+ {
+
+ // summary: A _Container with keyboard navigation of its children.
+ // decscription:
+ // To use this mixin, call connectKeyNavHandlers() in
+ // postCreate() and call startupKeyNavChildren() in startup().
+ // It provides normalized keyboard and focusing code for Container
+ // widgets.
+/*=====
+ // focusedChild: Widget
+ // The currently focused child widget, or null if there isn't one
+ focusedChild: null,
+=====*/
+
+ _keyNavCodes: {},
+
+ connectKeyNavHandlers: function(/*Array*/ prevKeyCodes, /*Array*/ nextKeyCodes){
+ // summary:
+ // Call in postCreate() to attach the keyboard handlers
+ // to the container.
+ // preKeyCodes: Array
+ // Key codes for navigating to the previous child.
+ // nextKeyCodes: Array
+ // Key codes for navigating to the next child.
+
+ 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
+ dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
+ },
+
+ addChild: function(/*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.
+ this.focusChild(this._getFirstFocusableChild());
+ },
+
+ focusNext: function(){
+ // summary: Focus the next widget or focal node (for widgets
+ // with multiple focal nodes) within this container.
+ if(this.focusedChild && this.focusedChild.hasNextFocalNode
+ && this.focusedChild.hasNextFocalNode()){
+ this.focusedChild.focusNext();
+ return;
+ }
+ var child = this._getNextFocusableChild(this.focusedChild, 1);
+ if(child.getFocalNodes){
+ this.focusChild(child, child.getFocalNodes()[0]);
+ }else{
+ this.focusChild(child);
+ }
+ },
+
+ focusPrev: function(){
+ // summary: Focus the previous widget or focal node (for widgets
+ // with multiple focal nodes) within this container.
+ if(this.focusedChild && this.focusedChild.hasPrevFocalNode
+ && this.focusedChild.hasPrevFocalNode()){
+ this.focusedChild.focusPrev();
+ return;
+ }
+ var child = this._getNextFocusableChild(this.focusedChild, -1);
+ if(child.getFocalNodes){
+ var nodes = child.getFocalNodes();
+ this.focusChild(child, nodes[nodes.length-1]);
+ }else{
+ this.focusChild(child);
+ }
+ },
+
+ focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+ // summary: Focus widget. Optionally focus 'node' within widget.
+ if(widget){
+ if(this.focusedChild && widget !== this.focusedChild){
+ this._onChildBlur(this.focusedChild);
+ }
+ this.focusedChild = widget;
+ if(node && widget.focusFocalNode){
+ widget.focusFocalNode(node);
+ }else{
+ widget.focus();
+ }
+ }
+ },
+
+ _startupChild: function(/*Widget*/ widget){
+ // summary:
+ // Set tabindex="-1" on focusable widgets so that we
+ // can focus them programmatically and by clicking.
+ // Connect focus and blur handlers.
+ if(widget.getFocalNodes){
+ dojo.forEach(widget.getFocalNodes(), function(node){
+ dojo.attr(node, "tabindex", -1);
+ this._connectNode(node);
+ }, this);
+ }else{
+ var node = widget.focusNode || widget.domNode;
+ if(widget.isFocusable()){
+ dojo.attr(node, "tabindex", -1);
+ }
+ this._connectNode(node);
+ }
+ },
+
+ _connectNode: function(/*Element*/ node){
+ this.connect(node, "onfocus", "_onNodeFocus");
+ this.connect(node, "onblur", "_onNodeBlur");
+ },
+
+ _onContainerFocus: function(evt){
+ // focus bubbles on Firefox,
+ // so just make sure that focus has really gone to the container
+ if(evt.target === this.domNode){
+ this.focusFirstChild();
+ }
+ },
+
+ _onContainerKeypress: function(evt){
+ if(evt.ctrlKey || evt.altKey){ return; }
+ var func = this._keyNavCodes[evt.keyCode];
+ if(func){
+ func();
+ dojo.stopEvent(evt);
+ }
+ },
+
+ _onNodeFocus: function(evt){
+ // while focus is on a child,
+ // take the container out of the tab order so that
+ // we can shift-tab to the element before the container
+ dojo.attr(this.domNode, "tabindex", -1);
+ // record the child that has been focused
+ var widget = dijit.getEnclosingWidget(evt.target);
+ if(widget && widget.isFocusable()){
+ this.focusedChild = widget;
+ }
+ dojo.stopEvent(evt);
+ },
+
+ _onNodeBlur: function(evt){
+ // when focus leaves a child,
+ // reinstate the container's tabindex
+ if(this.tabIndex){
+ dojo.attr(this.domNode, "tabindex", this.tabIndex);
+ }
+ dojo.stopEvent(evt);
+ },
+
+ _onChildBlur: function(/*Widget*/ widget){
+ // summary:
+ // Called when focus leaves a child widget to go
+ // to a sibling widget.
+ },
+
+ _getFirstFocusableChild: function(){
+ return this._getNextFocusableChild(null, 1);
+ },
+
+ _getNextFocusableChild: function(child, dir){
+ 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;
+ }
+ child = this._getSiblingOfChild(child, dir);
+ }
+ // no focusable child found
+ return null;
+ }
+ }
+);
+
+}
+
+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
+ // Mixin for widgets that contain a list of children like SplitContainer.
+ // Widgets which mixin this code must define layout() to lay out the children
+
+ isLayoutContainer: true,
+
+ postCreate: function(){
+ 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; }
+
+ dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+ // If I am a top level widget
+ if(!this.getParent || !this.getParent()){
+ // 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 is width=height=100% (or something similar),
+ // then I need to watch when the window resizes, and size myself accordingly
+ // (passing in no argument to resize means that it has to glean the size itself)
+ this.connect(window, 'onresize', function(){this.resize();});
+ }
+
+ this.inherited(arguments);
+ },
+
+ resize: function(args){
+ // summary:
+ // Explicitly set this widget's size (in pixels),
+ // and then call layout() to resize contents (and maybe adjust child widgets)
+ //
+ // args: Object?
+ // {w: int, h: int, l: int, t: int}
+
+ var node = this.domNode;
+
+ // set margin box size, unless it wasn't specified, in which case use current size
+ if(args){
+ dojo.marginBox(node, args);
+
+ // set offset of the node
+ if(args.t){ node.style.top = args.t + "px"; }
+ if(args.l){ node.style.left = args.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 = dojo.mixin(dojo.marginBox(node), args||{});
+
+// console.log(this, ": setting size to ", mb);
+
+ // Save the size of my content box.
+ this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+ // Callback for widget to adjust size of it's children
+ this.layout();
+ },
+
+ layout: function(){
+ // summary
+ // Widgets override this method to size & 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.
+ }
+ }
+);
+
+dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
+ // summary:
+ // Given the margin-box size of a node, return it's 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 it's 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.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],
+{
+ /*
+ Summary:
+ _FormWidget's correspond to native HTML elements such as <checkbox> or <button>.
+ Each _FormWidget 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.
+
+ They also share some common methods.
+ */
+
+ // baseClass: String
+ // Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
+ // (ex: "dijitTextBox dijitTextBoxInvalid dijitTextBoxFocused dijitTextBoxInvalidFocused")
+ // See _setStateClass().
+ baseClass: "",
+
+ // 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,
+
+ // 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,
+
+ // intermediateChanges: Boolean
+ // Fires onChange for each value change or only on demand
+ intermediateChanges: false,
+
+ // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
+ // 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.
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {value:"focusNode", disabled:"focusNode", readOnly:"focusNode", id:"focusNode", tabIndex:"focusNode", alt:"focusNode"}),
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ var tabIndexNode = this[this.attributeMap['tabIndex']||'domNode'];
+ if(value){
+ //reset those, because after the domNode is disabled, we can no longer receive
+ //mouse related events, see #4200
+ this._hovering = false;
+ this._active = false;
+ // remove the tabIndex, especially for FF
+ tabIndexNode.removeAttribute('tabIndex');
+ }else{
+ tabIndexNode.setAttribute('tabIndex', this.tabIndex);
+ }
+ dijit.setWaiState(this[this.attributeMap['disabled']||'domNode'], "disabled", value);
+ this._setStateClass();
+ }
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Set disabled state of widget (Deprecated).
+ dojo.deprecated("setDisabled("+disabled+") is deprecated. Use setAttribute('disabled',"+disabled+") instead.", "", "2.0");
+ this.setAttribute('disabled', disabled);
+ },
+
+
+ _onMouse : function(/*Event*/ event){
+ // summary:
+ // Sets _hovering, _active, and stateModifier properties depending on mouse state,
+ // then calls setStateClass() to set appropriate CSS classes for this.domNode.
+ //
+ // To get a different CSS class for hover, send onmouseover and onmouseout events to this method.
+ // To get a different CSS class while mouse button is depressed, send onmousedown to this method.
+
+ var mouseNode = event.currentTarget;
+ if(mouseNode && mouseNode.getAttribute){
+ this.stateModifier = mouseNode.getAttribute("stateModifier") || "";
+ }
+
+ if(!this.disabled){
+ switch(event.type){
+ case "mouseenter":
+ case "mouseover":
+ this._hovering = true;
+ this._active = this._mouseDown;
+ break;
+
+ case "mouseout":
+ case "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 the button
+ var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){
+ this._active = false;
+ this._mouseDown = false;
+ this._setStateClass();
+ this.disconnect(mouseUpConnector);
+ });
+ if(this.isFocusable()){ this.focus(); }
+ break;
+ }
+ this._setStateClass();
+ }
+ },
+
+ isFocusable: function(){
+ return !this.disabled && !this.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
+ },
+
+ focus: function(){
+ setTimeout(dojo.hitch(this, dijit.focus, this.focusNode), 0); // cannot call focus() from an event handler directly
+ },
+
+ _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).
+ //
+ // 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".
+ //
+ // For complex widgets with multiple regions, there can be various hover/active states,
+ // such as "Hover" or "CloseButtonHover" (for tab buttons).
+ // This is controlled by a stateModifier="CloseButton" attribute on the close button node.
+ //
+ // 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
+
+ // Get original (non state related, non baseClass related) class specified in template
+ if(!("staticClass" in this)){
+ this.staticClass = (this.stateNode||this.domNode).className;
+ }
+
+ // Compute new set of classes
+ var classes = [ this.baseClass ];
+
+ function multiply(modifier){
+ classes=classes.concat(dojo.map(classes, function(c){ return c+modifier; }), "dijit"+modifier);
+ }
+
+ 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(this.stateModifier+"Active");
+ }else{
+ if(this._focused){
+ multiply("Focused");
+ }
+ if(this._hovering){
+ multiply(this.stateModifier+"Hover");
+ }
+ }
+
+ (this.stateNode || this.domNode).className = this.staticClass + " " + classes.join(" ");
+ },
+
+ onChange: function(newValue){
+ // summary: callback when value is changed
+ },
+
+ _onChangeMonitor: 'value',
+ _onChangeActive: false,
+
+ _handleOnChange: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ // summary: set the value of the widget.
+ this._lastValue = newValue;
+ if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){
+ this._resetValue = this._lastValueReported = newValue;
+ }
+ if((this.intermediateChanges || priorityChange || priorityChange === undefined) &&
+ ((newValue && newValue.toString)?newValue.toString():newValue) !== ((this._lastValueReported && this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){
+ this._lastValueReported = newValue;
+ if(this._onChangeActive){ this.onChange(newValue); }
+ }
+ },
+
+ reset: function(){
+ this._hasBeenBlurred = false;
+ if(this.setValue && !this._getValueDeprecated){
+ this.setValue(this._resetValue, true);
+ }else if(this._onChangeMonitor){
+ this.setAttribute(this._onChangeMonitor, (this._resetValue !== undefined && this._resetValue !== null)? this._resetValue : '');
+ }
+ },
+
+ create: function(){
+ this.inherited(arguments);
+ this._onChangeActive = true;
+ this._setStateClass();
+ },
+
+ destroy: function(){
+ if(this._layoutHackHandle){
+ clearTimeout(this._layoutHackHandle);
+ }
+ this.inherited(arguments);
+ },
+
+ setValue: function(/*String*/ value){
+ dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use setAttribute('value',"+value+") instead.", "", "2.0");
+ this.setAttribute('value', value);
+ },
+
+ _getValueDeprecated: true, // Form uses this, remove when getValue is removed
+ getValue: function(){
+ dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated. Use widget.value instead.", "", "2.0");
+ return this.value;
+ },
+
+ _layoutHack: function(){
+ // summary: work around table sizing bugs on FF2 by forcing redraw
+ if(dojo.isFF == 2){
+ var node=this.domNode;
+ var old = node.style.opacity;
+ node.style.opacity = "0.999";
+ this._layoutHackHandle = setTimeout(dojo.hitch(this, function(){
+ this._layoutHackHandle = null;
+ node.style.opacity = old;
+ }), 0);
+ }
+ }
+});
+
+dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
+{
+ /*
+ Summary:
+ _FormValueWidget's correspond to native HTML elements such as <input> or <select> that have user changeable values.
+ Each _ValueWidget represents a single input value, and has a (possibly hidden) <input> element,
+ to which it serializes its input value, so that form submission (either normal submission or via FormBind?)
+ works as expected.
+ */
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+ {value:""}),
+
+ postCreate: function(){
+ this.setValue(this.value, null);
+ },
+
+ setValue: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ // summary: set the value of the widget.
+ this.value = newValue;
+ this._handleOnChange(newValue, priorityChange);
+ },
+
+ _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.setValue(this._lastValueReported, false);
+ },
+
+ _valueChanged: function(){
+ var v = this.getValue();
+ var lv = this._lastValueReported;
+ // Equality comparison of objects such as dates are done by reference so
+ // two distinct objects are != even if they have the same data. So use
+ // toStrings in case the values are objects.
+ return ((v !== null && (v !== undefined) && v.toString)?v.toString():'') !== ((lv !== null && (lv !== undefined) && lv.toString)?lv.toString():'');
+ },
+
+ _onKeyPress: function(e){
+ if(e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+ if(this._valueChanged()){
+ this.undo();
+ dojo.stopEvent(e);
+ return false;
+ }
+ }
+ return true;
+ }
+});
+
+}
+
+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/includes/js/dijit/form/Button.js b/includes/js/dijit/form/Button.js
new file mode 100644
index 0000000..f81078f
--- /dev/null
+++ b/includes/js/dijit/form/Button.js
@@ -0,0 +1,425 @@
+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.declare("dijit.form.Button",
+ dijit.form._FormWidget,
+ {
+ // summary:
+ // Basically the same thing as a normal HTML button, but with special styling.
+ //
+ // 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: String
+ // text to display in button
+ label: "",
+
+ // showLabel: Boolean
+ // whether or not to display the text label in button
+ showLabel: true,
+
+ // iconClass: String
+ // class to apply to div in button to make it display an icon
+ iconClass: "",
+
+ type: "button",
+ baseClass: "dijitButton",
+ templateString:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\twaiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" dojoAttachPoint=\"focusNode,titleNode\"\n\t\ttype=\"${type}\" waiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t><span class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" \n \t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#10003;</span \n\t\t></span\n\t\t><div class=\"dijitReset dijitInline\"><center class=\"dijitReset dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\">${label}</center></div\n\t></button\n></div>\n",
+
+ _onChangeMonitor: '',
+ // TODO: set button's title to this.containerNode.innerText
+
+ _onClick: function(/*Event*/ e){
+ // summary: internal function to handle click actions
+ if(this.disabled || this.readOnly){
+ dojo.stopEvent(e); // needed for checkbox
+ return false;
+ }
+ this._clicked(); // widget click actions
+ return this.onClick(e); // user click actions
+ },
+
+ _onButtonClick: function(/*Event*/ e){
+ // summary: callback when the user mouse clicks the button portion
+ if(this._onClick(e) === false){ // returning nothing is same as true
+ dojo.stopEvent(e);
+ }else if(this.type=="submit" && !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;
+ }
+ }
+ }
+ },
+
+ postCreate: function(){
+ // summary:
+ // get label and set as title on button icon if necessary
+ if (this.showLabel == false){
+ var labelText = "";
+ this.label = this.containerNode.innerHTML;
+ labelText = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ // set title attrib on iconNode
+ this.titleNode.title=labelText;
+ dojo.addClass(this.containerNode,"dijitDisplayNone");
+ }
+ dojo.setSelectable(this.focusNode, false);
+ this.inherited(arguments);
+ },
+
+ onClick: function(/*Event*/ e){
+ // summary: user callback for when button is clicked
+ // if type="submit", return true to perform submit
+ return true;
+ },
+
+ _clicked: function(/*Event*/ e){
+ // summary: internal replaceable function for when the button is clicked
+ },
+
+ setLabel: function(/*String*/ content){
+ // summary: reset the label (text) of the button; takes an HTML string
+ this.containerNode.innerHTML = this.label = content;
+ this._layoutHack();
+ if (this.showLabel == false){
+ this.titleNode.title=dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ }
+ }
+});
+
+
+dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container], {
+ // summary: A button with a popup
+ //
+ // 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:"<div class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\twaiRole=\"presentation\"\n\t><div class='dijitReset dijitRight' waiRole=\"presentation\"\n\t><button class=\"dijitReset dijitStretch dijitButtonNode dijitButtonContents\" type=\"${type}\"\n\t\tdojoAttachPoint=\"focusNode,titleNode\" waiRole=\"button\" waiState=\"haspopup-true,labelledby-${id}_label\"\n\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t><div class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,popupStateNode\" waiRole=\"presentation\"\n\t\t\tid=\"${id}_label\">${label}</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</div\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonChar\" waiRole=\"presentation\">&#9660;</div\n\t></button\n></div></div>\n",
+
+ _fillContent: function(){
+ // 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.prepare(this.dropDown.domNode);
+
+ this.inherited(arguments);
+ },
+
+ destroyDescendants: function(){
+ if(this.dropDown){
+ this.dropDown.destroyRecursive();
+ delete this.dropDown;
+ }
+ this.inherited(arguments);
+ },
+
+ _onArrowClick: function(/*Event*/ e){
+ // summary: callback when the user mouse clicks on menu popup node
+ if(this.disabled || this.readOnly){ return; }
+ this._toggleDropDown();
+ },
+
+ _onDropDownClick: function(/*Event*/ e){
+ // on Firefox 2 on the Mac it is possible to fire onclick
+ // by pressing enter down on a second element and transferring
+ // focus to the DropDownButton;
+ // we want to prevent opening our menu in this situation
+ // and only do so if we have seen a keydown on this button;
+ // e.detail != 0 means that we were fired by mouse
+ var isMacFFlessThan3 = dojo.isFF && dojo.isFF < 3
+ && navigator.appVersion.indexOf("Macintosh") != -1;
+ if(!isMacFFlessThan3 || e.detail != 0 || this._seenKeydown){
+ this._onArrowClick(e);
+ }
+ this._seenKeydown = false;
+ },
+
+ _onDropDownKeydown: function(/*Event*/ e){
+ this._seenKeydown = true;
+ },
+
+ _onDropDownBlur: function(/*Event*/ e){
+ this._seenKeydown = false;
+ },
+
+ _onKey: function(/*Event*/ e){
+ // summary: callback when the user presses a key on menu popup node
+ if(this.disabled || this.readOnly){ return; }
+ if(e.keyCode == dojo.keys.DOWN_ARROW){
+ if(!this.dropDown || this.dropDown.domNode.style.visibility=="hidden"){
+ dojo.stopEvent(e);
+ this._toggleDropDown();
+ }
+ }
+ },
+
+ _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);
+ },
+
+ _toggleDropDown: function(){
+ // summary: toggle the drop-down widget; if it is up, close it, if not, open it
+ if(this.disabled || this.readOnly){ return; }
+ dijit.focus(this.popupStateNode);
+ var dropDown = this.dropDown;
+ if(!dropDown){ return; }
+ if(!this._opened){
+ // If there's an href, then load that first, so we don't get a flicker
+ if(dropDown.href && !dropDown.isLoaded){
+ var self = this;
+ var handler = dojo.connect(dropDown, "onLoad", function(){
+ dojo.disconnect(handler);
+ self._openDropDown();
+ });
+ dropDown._loadCheck(true);
+ return;
+ }else{
+ this._openDropDown();
+ }
+ }else{
+ this._closeDropDown();
+ }
+ },
+
+ _openDropDown: function(){
+ var dropDown = this.dropDown;
+ var oldWidth=dropDown.domNode.style.width;
+ var self = this;
+
+ dijit.popup.open({
+ parent: this,
+ popup: dropDown,
+ around: this.domNode,
+ orient:
+ // TODO: add user-defined positioning option, like in Tooltip.js
+ this.isLeftToRight() ? {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'}
+ : {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'},
+ onExecute: function(){
+ self._closeDropDown(true);
+ },
+ onCancel: function(){
+ self._closeDropDown(true);
+ },
+ onClose: function(){
+ dropDown.domNode.style.width = oldWidth;
+ self.popupStateNode.removeAttribute("popupActive");
+ this._opened = false;
+ }
+ });
+ if(this.domNode.offsetWidth > dropDown.domNode.offsetWidth){
+ var adjustNode = null;
+ if(!this.isLeftToRight()){
+ adjustNode = dropDown.domNode.parentNode;
+ var oldRight = adjustNode.offsetLeft + adjustNode.offsetWidth;
+ }
+ // make menu at least as wide as the button
+ dojo.marginBox(dropDown.domNode, {w: this.domNode.offsetWidth});
+ if(adjustNode){
+ adjustNode.style.left = oldRight - this.domNode.offsetWidth + "px";
+ }
+ }
+ this.popupStateNode.setAttribute("popupActive", "true");
+ this._opened=true;
+ if(dropDown.focus){
+ dropDown.focus();
+ }
+ // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+ },
+
+ _closeDropDown: function(/*Boolean*/ focus){
+ if(this._opened){
+ dijit.popup.close(this.dropDown);
+ if(focus){ this.focus(); }
+ this._opened = false;
+ }
+ }
+});
+
+dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
+ // summary: A Normal Button with a DropDown
+ //
+ // 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:"<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\tclass=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\ttabIndex=\"${tabIndex}\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"titleNode\"\n\t\t\twaiRole=\"button\" waiState=\"labelledby-${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline ${iconClass}\" dojoAttachPoint=\"iconNode\" waiRole=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"containerNode\" waiRole=\"presentation\">${label}</div\n\t\t></td\n\t\t><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"popupStateNode,focusNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\tstateModifier=\"DownArrow\"\n\t\t\ttitle=\"${optionsTitle}\" name=\"${name}\"\n\t\t\twaiRole=\"button\" waiState=\"haspopup-true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" waiRole=\"presentation\">&thinsp;</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._FormWidget.prototype.attributeMap),
+ {id:"", name:""}),
+
+ // optionsTitle: String
+ // text that describes the options menu (accessibility)
+ optionsTitle: "",
+
+ baseClass: "dijitComboButton",
+
+ _focusedNode: null,
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this._focalNodes = [this.titleNode, this.popupStateNode];
+ dojo.forEach(this._focalNodes, dojo.hitch(this, function(node){
+ if(dojo.isIE){
+ this.connect(node, "onactivate", this._onNodeFocus);
+ this.connect(node, "ondeactivate", this._onNodeBlur);
+ }else{
+ this.connect(node, "onfocus", this._onNodeFocus);
+ this.connect(node, "onblur", this._onNodeBlur);
+ }
+ }));
+ },
+
+ focusFocalNode: function(node){
+ // summary: Focus the focal node node.
+ this._focusedNode = node;
+ dijit.focus(node);
+ },
+
+ hasNextFocalNode: function(){
+ // summary: Returns true if this widget has no node currently
+ // focused or if there is a node following the focused one.
+ // False is returned if the last node has focus.
+ return this._focusedNode !== this.getFocalNodes()[1];
+ },
+
+ focusNext: function(){
+ // summary: Focus the focal node following the current node with focus
+ // or the first one if no node currently has focus.
+ this._focusedNode = this.getFocalNodes()[this._focusedNode ? 1 : 0];
+ dijit.focus(this._focusedNode);
+ },
+
+ hasPrevFocalNode: function(){
+ // summary: Returns true if this widget has no node currently
+ // focused or if there is a node before the focused one.
+ // False is returned if the first node has focus.
+ return this._focusedNode !== this.getFocalNodes()[0];
+ },
+
+ focusPrev: function(){
+ // summary: Focus the focal node before the current node with focus
+ // or the last one if no node currently has focus.
+ this._focusedNode = this.getFocalNodes()[this._focusedNode ? 0 : 1];
+ dijit.focus(this._focusedNode);
+ },
+
+ getFocalNodes: function(){
+ // summary: Returns an array of focal nodes for this widget.
+ return this._focalNodes;
+ },
+
+ _onNodeFocus: function(evt){
+ this._focusedNode = evt.currentTarget;
+ var fnc = this._focusedNode == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+ dojo.addClass(this._focusedNode, fnc);
+ },
+
+ _onNodeBlur: function(evt){
+ var fnc = evt.currentTarget == this.focusNode ? "dijitDownArrowButtonFocused" : "dijitButtonContentsFocused";
+ dojo.removeClass(evt.currentTarget, fnc);
+ },
+
+ _onBlur: function(){
+ this.inherited(arguments);
+ this._focusedNode = null;
+ }
+});
+
+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,
+
+ _onChangeMonitor: 'checked',
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),
+ {checked:"focusNode"}),
+
+ _clicked: function(/*Event*/ evt){
+ this.setAttribute('checked', !this.checked);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "checked":
+ dijit.setWaiState(this.focusNode || this.domNode, "pressed", this.checked);
+ this._setStateClass();
+ this._handleOnChange(this.checked, true);
+ }
+ },
+
+
+ setChecked: function(/*Boolean*/ checked){
+ // summary:
+ // Programatically deselect the button
+ dojo.deprecated("setChecked("+checked+") is deprecated. Use setAttribute('checked',"+checked+") instead.", "", "2.0");
+ this.setAttribute('checked', checked);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.setAttribute('checked', this.checked); //to initially set wai pressed state
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/CheckBox.js b/includes/js/dijit/form/CheckBox.js
new file mode 100644
index 0000000..295a711
--- /dev/null
+++ b/includes/js/dijit/form/CheckBox.js
@@ -0,0 +1,133 @@
+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.Button");
+
+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:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \ttype=\"${type}\" name=\"${name}\"\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",
+
+ baseClass: "dijitCheckBox",
+
+ // Value of "type" attribute for <input>
+ type: "checkbox",
+
+ // value: Value
+ // equivalent to value field on normal checkbox (if checked, the value is passed as
+ // the value when form is submitted)
+ value: "on",
+
+ setValue: function(/*String or Boolean*/ newValue){
+ // summary:
+ // 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.setAttribute('value', newValue);
+ newValue = true;
+ }
+ this.setAttribute('checked', newValue);
+ },
+
+ _getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed
+ getValue: function(){
+ // summary:
+ // If the CheckBox is checked, returns the value attribute.
+ // Otherwise returns false.
+ return (this.checked ? this.value : false);
+ },
+
+ reset: function(){
+ this.inherited(arguments);
+ this.setAttribute('value', this._resetValueAttr);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this._resetValueAttr = this.value;
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.form.RadioButton",
+ dijit.form.CheckBox,
+ {
+ // summary:
+ // Same as an HTML radio, but with fancy styling.
+ //
+ // description:
+ // Implementation details
+ //
+ // Specialization:
+ // We keep track of dijit radio groups so that we can update the state
+ // of all the siblings (the "context") in a group based on input
+ // events. We don't rely on browser radio grouping.
+
+ type: "radio",
+ baseClass: "dijitRadio",
+
+ // This shared object keeps track of all widgets, grouped by name
+ _groups: {},
+
+ postCreate: function(){
+ // add this widget to _groups
+ (this._groups[this.name] = this._groups[this.name] || []).push(this);
+
+ this.inherited(arguments);
+ },
+
+ uninitialize: function(){
+ // remove this widget from _groups
+ dojo.forEach(this._groups[this.name], function(widget, i, arr){
+ if(widget === this){
+ arr.splice(i, 1);
+ return;
+ }
+ }, this);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // If I am being checked then have to deselect currently checked radio button
+ this.inherited(arguments);
+ switch(attr){
+ case "checked":
+ if(this.checked){
+ dojo.forEach(this._groups[this.name], function(widget){
+ if(widget != this && widget.checked){
+ widget.setAttribute('checked', false);
+ }
+ }, this);
+ }
+ }
+ },
+
+ _clicked: function(/*Event*/ e){
+ if(!this.checked){
+ this.setAttribute('checked', true);
+ }
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/ComboBox.js b/includes/js/dijit/form/ComboBox.js
new file mode 100644
index 0000000..77a75f0
--- /dev/null
+++ b/includes/js/dijit/form/ComboBox.js
@@ -0,0 +1,1060 @@
+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("dijit.form.ValidationTextBox");
+dojo.requireLocalization("dijit.form", "ComboBox", null, "zh,ROOT,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+ "dijit.form.ComboBoxMixin",
+ null,
+ {
+ // item: Object
+ // This is the item returned by the dojo.data.store implementation that
+ // provides the data for this cobobox, 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,
+
+ // 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 you type 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,
+
+ // searchDelay: Integer
+ // Delay in milliseconds between when user types something and we start
+ // searching based on that value
+ searchDelay: 100,
+
+ // searchAttr: String
+ // Searches pattern match against this field
+ searchAttr: "name",
+
+ // queryExpr: String
+ // 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 should ignore case when matching possible items
+ ignoreCase: true,
+
+ // hasDownArrow: Boolean
+ // Set this textbox to have a down arrow button.
+ // Defaults to true.
+ hasDownArrow:true,
+
+ templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t\t\tdojoAttachPoint=\"downArrowNode\" waiRole=\"presentation\"\n\t\t\tdojoAttachEvent=\"onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input type=\"text\" autocomplete=\"off\" name=\"${name}\" class='dijitReset'\n\t\t\tdojoAttachEvent=\"onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup\"\n\t\t\tdojoAttachPoint=\"textbox,focusNode\" waiRole=\"textbox\" waiState=\"haspopup-true,autocomplete-list\"\n\t\t/></div\n\t></div\n></div>\n",
+
+ baseClass:"dijitComboBox",
+
+ _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);
+ },
+
+ _setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // summary: additional code to set disablbed state of combobox node
+ if (attr == "disabled"){
+ dijit.setWaiState(this.comboNode, "disabled", value);
+ }
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary: handles keyboard events
+
+ //except for pasting case - ctrl + v(118)
+ if(evt.altKey || (evt.ctrlKey && evt.charCode != 118)){
+ return;
+ }
+ var doSearch = false;
+ var pw = this._popupWidget;
+ var dk = dojo.keys;
+ if(this._isShowingNow){
+ pw.handleKey(evt);
+ }
+ switch(evt.keyCode){
+ case dk.PAGE_DOWN:
+ case dk.DOWN_ARROW:
+ if(!this._isShowingNow||this._prev_key_esc){
+ this._arrowPressed();
+ doSearch=true;
+ }else{
+ this._announceOption(pw.getHighlightedOption());
+ }
+ dojo.stopEvent(evt);
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ case dk.PAGE_UP:
+ case dk.UP_ARROW:
+ if(this._isShowingNow){
+ this._announceOption(pw.getHighlightedOption());
+ }
+ dojo.stopEvent(evt);
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ case dk.ENTER:
+ // prevent submitting form if user presses enter. Also
+ // prevent accepting the value if either Next or Previous
+ // are selected
+ var highlighted;
+ if( this._isShowingNow &&
+ (highlighted = pw.getHighlightedOption())
+ ){
+ // 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{
+ this.setDisplayedValue(this.getDisplayedValue());
+ }
+ // default case:
+ // prevent submit, but allow event to bubble
+ evt.preventDefault();
+ // fall through
+
+ case dk.TAB:
+ var newvalue = this.getDisplayedValue();
+ // #4617:
+ // if the user had More Choices selected fall into the
+ // _onBlur handler
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"])
+ ){
+ break;
+ }
+ if(this._isShowingNow){
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(pw.getHighlightedOption()){
+ pw.setValue({ target: pw.getHighlightedOption() }, true);
+ }
+ this._hideResultList();
+ }
+ break;
+
+ case dk.SPACE:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(this._isShowingNow && pw.getHighlightedOption()){
+ dojo.stopEvent(evt);
+ this._selectOption();
+ this._hideResultList();
+ }else{
+ doSearch = true;
+ }
+ break;
+
+ case dk.ESCAPE:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = true;
+ if(this._isShowingNow){
+ dojo.stopEvent(evt);
+ this._hideResultList();
+ }
+ this.inherited(arguments);
+ break;
+
+ case dk.DELETE:
+ case dk.BACKSPACE:
+ this._prev_key_esc = false;
+ this._prev_key_backspace = true;
+ doSearch = true;
+ break;
+
+ case dk.RIGHT_ARROW: // fall through
+ case dk.LEFT_ARROW:
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ break;
+
+ default: // non char keys (F1-F12 etc..) shouldn't open list
+ this._prev_key_backspace = false;
+ this._prev_key_esc = false;
+ if(dojo.isIE || evt.charCode != 0){
+ doSearch = true;
+ }
+ }
+ if(this.searchTimer){
+ clearTimeout(this.searchTimer);
+ }
+ if(doSearch){
+ // need to wait a tad before start search so that the event
+ // bubbles through DOM and we have value visible
+ 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){
+ if( this.disabled ||
+ this.readOnly ||
+ (dataObject.query[this.searchAttr] != this._lastQuery)
+ ){
+ return;
+ }
+ this._popupWidget.clearResultList();
+ if(!results.length){
+ 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.
+
+ var zerothvalue = new String(this.store.getValue(results[0], this.searchAttr));
+ if(zerothvalue && this.autoComplete && !this._prev_key_backspace &&
+ (dataObject.query[this.searchAttr] != "*")){
+ // 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.
+ this._autoCompleteText(zerothvalue);
+ }
+ 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());
+ }
+ },
+
+ _showResultList: function(){
+ this._hideResultList();
+ var items = this._popupWidget.getItems(),
+ visibleCount = Math.min(items.length,this.maxListLength);
+ this._arrowPressed();
+ // 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
+
+ with(this._popupWidget.domNode.style){
+ // 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)
+ 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)
+ });
+ dijit.setWaiState(this.comboNode, "expanded", "true");
+ },
+
+ _hideResultList: function(){
+ if(this._isShowingNow){
+ dijit.popup.close(this._popupWidget);
+ this._arrowIdle();
+ 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.getDisplayedValue();
+ var pw = this._popupWidget;
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"]
+ )
+ ){
+ this.setValue(this._lastValueReported, true);
+ }else{
+ this.setDisplayedValue(newvalue);
+ }
+ },
+
+ _onBlur: function(){
+ // summary: called magically when focus has shifted away from this widget and it's dropdown
+ this._hideResultList();
+ this._arrowIdle();
+ this.inherited(arguments);
+ },
+
+ _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 == null){
+ 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;
+ }else{
+ newValue = this.store.getValue(node.item, this.searchAttr);
+ }
+ // get the text that the user manually entered (cut off autocompleted text)
+ this.focusNode.value = this.focusNode.value.substring(0, this._getCaretPos(this.focusNode));
+ //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){
+ var tgt = null;
+ if(!evt){
+ evt ={ target: this._popupWidget.getHighlightedOption()};
+ }
+ // what if nothing is highlighted yet?
+ if(!evt.target){
+ // handle autocompletion where the the user has hit ENTER or TAB
+ this.setDisplayedValue(this.getDisplayedValue());
+ return;
+ // otherwise the user has accepted the autocompleted value
+ }else{
+ tgt = evt.target;
+ }
+ if(!evt.noHide){
+ this._hideResultList();
+ this._setCaretPos(this.focusNode, this.store.getValue(tgt.item, this.searchAttr).length);
+ }
+ this._doSelect(tgt);
+ },
+
+ _doSelect: function(tgt){
+ this.item = tgt.item;
+ this.setValue(this.store.getValue(tgt.item, this.searchAttr), true);
+ },
+
+ _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._startSearch("");
+ }
+ },
+
+ _startSearchFromInput: function(){
+ this._startSearch(this.focusNode.value);
+ },
+
+ _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
+ });
+ 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
+ this.item = null; // #4872
+ var query = dojo.clone(this.query); // #5970
+ 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){
+ var dataObject = this.store.fetch({
+ queryOptions: {
+ ignoreCase: this.ignoreCase,
+ deep: true
+ },
+ query: query,
+ onComplete: dojo.hitch(this, "_openResultList"),
+ onError: function(errText){
+ console.error('dijit.form.ComboBox: ' + errText);
+ dojo.hitch(_this, "_hideResultList")();
+ },
+ start:0,
+ count:this.pageSize
+ });
+
+ 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.store.fetch(dataObject);
+ }
+ this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, dataObject);
+ }, query, this), this.searchDelay);
+ },
+
+ _getValueField:function(){
+ return this.searchAttr;
+ },
+
+ /////////////// Event handlers /////////////////////
+
+ _arrowPressed: function(){
+ if(!this.disabled && !this.readOnly && this.hasDownArrow){
+ dojo.addClass(this.downArrowNode, "dijitArrowButtonActive");
+ }
+ },
+
+ _arrowIdle: function(){
+ if(!this.disabled && !this.readOnly && this.hasDownArrow){
+ dojo.removeClass(this.downArrowNode, "dojoArrowButtonPushed");
+ }
+ },
+
+ // FIXME:
+ // this is public so we can't remove until 2.0, but the name
+ // SHOULD be "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)
+ this.onkeypress({charCode:-1});
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.query={};
+ },
+
+ postMixInProperties: function(){
+ if(!this.hasDownArrow){
+ this.baseClass = "dijitTextBox";
+ }
+ 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( !this.value || (
+ (typeof srcNodeRef.selectedIndex == "number") &&
+ srcNodeRef.selectedIndex.toString() === this.value)
+ ){
+ var item = this.store.fetchSelectedItem();
+ if(item){
+ this.value = this.store.getValue(item, this._getValueField());
+ }
+ }
+ }
+ },
+
+ _postCreate:function(){
+ //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(cn, "disabled", this.disabled);
+
+ }
+ },
+
+ uninitialize:function(){
+ if(this._popupWidget){
+ this._hideResultList();
+ this._popupWidget.destroy()
+ }
+ },
+
+ _getMenuLabelFromItem:function(/*Item*/ item){
+ return {
+ html: false,
+ label: this.store.getValue(item, this.searchAttr)
+ };
+ },
+
+ open:function(){
+ this._isShowingNow=true;
+ return dijit.popup.open({
+ popup: this._popupWidget,
+ around: this.domNode,
+ parent: this
+ });
+ },
+
+ reset:function(){
+ // summary:
+ // Additionally reset the .item (to clean up).
+ this.item = null;
+ this.inherited(arguments);
+ }
+
+ }
+);
+
+dojo.declare(
+ "dijit.form._ComboBoxMenu",
+ [dijit._Widget, dijit._Templated],
+
+ {
+ // summary:
+ // Focus-less div based menu for internal use in ComboBox
+
+ templateString: "<ul class='dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow:\"auto\";'>"
+ +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton'></li>"
+ +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton'></li>"
+ +"</ul>",
+ _messages: null,
+
+ postMixInProperties: function(){
+ this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+ this.inherited("postMixInProperties", arguments);
+ },
+
+ setValue: function(/*Object*/ value){
+ this.value = value;
+ this.onChange(value);
+ },
+
+ // stubs
+ onChange: function(/*Object*/ value){},
+ onPage: function(/*Number*/ direction){},
+
+ postCreate:function(){
+ // fill in template with i18n messages
+ this.previousButton.innerHTML = this._messages["previousMessage"];
+ this.nextButton.innerHTML = this._messages["nextMessage"];
+ this.inherited("postCreate", arguments);
+ },
+
+ onClose:function(){
+ this._blurOptionNode();
+ },
+
+ _createOption:function(/*Object*/ item, labelFunc){
+ // summary:
+ // creates an option to appear on the popup menu subclassed by
+ // 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){
+ //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 = "dijitMenuItem";
+ dojo.attr(menuitem, "id", this.id + i);
+ this.domNode.insertBefore(menuitem, this.nextButton);
+ }, this);
+ // display "Next . . ." button
+ this.nextButton.style.display = (dataObject.count == results.length) ? "" : "none";
+ dojo.attr(this.nextButton,"id", this.id + "_next")
+ },
+
+ clearResultList: function(){
+ // keep the previous and next buttons of course
+ while(this.domNode.childNodes.length>2){
+ this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
+ }
+ },
+
+ // these functions are called in showResultList
+ getItems: function(){
+ return this.domNode.childNodes;
+ },
+
+ getListLength: function(){
+ return this.domNode.childNodes.length-2;
+ },
+
+ _onMouseDown: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ },
+
+ _onMouseUp: function(/*Event*/ evt){
+ if(evt.target === this.domNode){
+ 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.setValue({ 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, "dijitMenuItemHover");
+ }
+ },
+
+ _blurOptionNode:function(){
+ // summary:
+ // removes highlight on highlighted option
+ if(this._highlighted_option){
+ dojo.removeClass(this._highlighted_option, "dijitMenuItemHover");
+ 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.
+ var fc = this.domNode.firstChild;
+ if(!this.getHighlightedOption()){
+ 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);
+ }
+ }
+ // scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ highlightFirstOption:function(){
+ // summary:
+ // Highlight the first real item in the list (not Previous Choices).
+ this._focusOptionNode(this.domNode.firstChild.nextSibling);
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ highlightLastOption:function(){
+ // summary:
+ // Highlight the last real item in the list (not More Choices).
+ this._focusOptionNode(this.domNode.lastChild.previousSibling);
+ dijit.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)
+ var lc = this.domNode.lastChild;
+ if(!this.getHighlightedOption()){
+ 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);
+ }
+ }
+ dijit.scrollIntoView(this._highlighted_option);
+ },
+
+ _page:function(/*Boolean*/ up){
+ 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(){ this._page(true); },
+
+ pageDown: function(){ this._page(false); },
+
+ getHighlightedOption: function(){
+ // summary:
+ // Returns the highlighted option.
+ var ho = this._highlighted_option;
+ return (ho && ho.parentNode) ? ho : null;
+ },
+
+ handleKey: function(evt){
+ switch(evt.keyCode){
+ 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.
+ //
+ // Some of the options to the ComboBox are actually arguments to the data
+ // provider.
+ //
+ // You can assume that all the form widgets (and thus anything that mixes
+ // in dijit.formComboBoxMixin) will inherit from dijit.form._FormWidget and thus the `this`
+ // reference will also "be a" _FormWidget.
+
+ postMixInProperties: function(){
+ // this.inherited(arguments); // ??
+ dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+ dijit.form.ValidationTextBox.prototype.postMixInProperties.apply(this, arguments);
+ },
+
+ postCreate: function(){
+ dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+ dijit.form.ValidationTextBox.prototype.postCreate.apply(this, arguments);
+ },
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ dijit.form.ValidationTextBox.prototype.setAttribute.apply(this, arguments);
+ dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+ }
+
+ }
+);
+
+dojo.declare("dijit.form._ComboBoxDataStore", null, {
+ // summary:
+ // Inefficient but small data store specialized for inlined 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;
+/*
+ // 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?
+ dojo.query("> option", root).forEach(function(node){
+ node.style.display="none";
+ });
+*/
+ },
+
+ 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;
+ },
+
+ fetch: function(/* Object */ args){
+ // 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.
+ // Refer to dojo.data.api.Read.fetch() more details.
+ //
+ // description:
+ // Given a query like
+ //
+ // | {
+ // | query: {name: "Cal*"},
+ // | start: 30,
+ // | count: 20,
+ // | ignoreCase: true,
+ // | onComplete: function(/* item[] */ items, /* Object */ args){...}
+ // | }
+ //
+ // will call `onComplete()` with the results of the query (and the argument to this method)
+
+ // convert query to regex (ex: convert "first\last*" to /^first\\last.*$/i) and get matching vals
+ var query = "^" + args.query.name
+ .replace(/([\\\|\(\)\[\{\^\$\+\?\.\<\>])/g, "\\$1")
+ .replace("*", ".*") + "$",
+ matcher = new RegExp(query, args.queryOptions.ignoreCase ? "i" : ""),
+ items = dojo.query("> option", this.root).filter(function(option){
+ return (option.innerText || option.textContent || '').match(matcher);
+ } );
+
+ var start = args.start || 0,
+ end = ("count" in args && args.count != Infinity) ? (start + args.count) : items.length ;
+ args.onComplete(items.slice(start, end), args);
+ return args; // Object
+ // TODO: I don't need to return the length?
+ },
+
+ 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 dojo.query("> option:nth-child(" +
+ (si != -1 ? si+1 : 1) + ")",
+ root)[0]; // dojo.data.Item
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/CurrencyTextBox.js b/includes/js/dijit/form/CurrencyTextBox.js
new file mode 100644
index 0000000..c04d07e
--- /dev/null
+++ b/includes/js/dijit/form/CurrencyTextBox.js
@@ -0,0 +1,51 @@
+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");
+
+//FIXME: dojo.experimental throws an unreadable exception?
+//dojo.experimental("dijit.form.CurrencyTextBox");
+
+dojo.require("dojo.currency");
+dojo.require("dijit.form.NumberTextBox");
+
+dojo.declare(
+ "dijit.form.CurrencyTextBox",
+ dijit.form.NumberTextBox,
+ {
+ // summary:
+ // A validating currency textbox
+ //
+ // constraints: dijit.form._DateTimeTextBox.__Constraints
+ //
+ // currency: String
+ // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+ currency: "",
+
+ /*=====
+ constraints: {},
+ ======*/
+
+ regExpGen: dojo.currency.regexp,
+ _formatter: dojo.currency.format,
+/*=====
+ parse: function(value, constraints){
+ // summary: parses the value as a Currency, according to constraints
+ // value: String
+ //
+ // constraints: dojo.currency.__ParseOptions
+ },
+=====*/
+ parse: dojo.currency.parse,
+
+ postMixInProperties: function(){
+ if(this.constraints === dijit.form.ValidationTextBox.prototype.constraints){
+ // declare a constraints property on 'this' so we don't overwrite the shared default object in 'prototype'
+ this.constraints = {};
+ }
+ this.constraints.currency = this.currency;
+ dijit.form.CurrencyTextBox.superclass.postMixInProperties.apply(this, arguments);
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/DateTextBox.js b/includes/js/dijit/form/DateTextBox.js
new file mode 100644
index 0000000..c3ce9d8
--- /dev/null
+++ b/includes/js/dijit/form/DateTextBox.js
@@ -0,0 +1,20 @@
+if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.DateTextBox"] = true;
+dojo.provide("dijit.form.DateTextBox");
+
+dojo.require("dijit._Calendar");
+dojo.require("dijit.form._DateTimeTextBox");
+
+dojo.declare(
+ "dijit.form.DateTextBox",
+ dijit.form._DateTimeTextBox,
+ {
+ // summary:
+ // A validating, serializable, range-bound date text box with a popup calendar
+
+ popupClass: "dijit._Calendar",
+ _selector: "date"
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/FilteringSelect.js b/includes/js/dijit/form/FilteringSelect.js
new file mode 100644
index 0000000..d1e25c0
--- /dev/null
+++ b/includes/js/dijit/form/FilteringSelect.js
@@ -0,0 +1,241 @@
+if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.FilteringSelect"] = true;
+dojo.provide("dijit.form.FilteringSelect");
+
+dojo.require("dijit.form.ComboBox");
+
+dojo.declare(
+ "dijit.form.FilteringSelect",
+ [dijit.form.MappedTextBox, dijit.form.ComboBoxMixin],
+ {
+ // summary
+ // An enhanced version of the HTML SELECT tag, populated dynamically
+ //
+ // description
+ // An enhanced version of the HTML SELECT tag, populated dynamically. It works
+ // very nicely with very large data sets because it can load and page data as needed.
+ // It also resembles ComboBox, but does not allow values outside of the provided ones.
+ //
+ // 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)
+ //
+ // searchAttr: String
+ // Searches pattern match against this field
+ //
+ // labelAttr: String
+ // Optional. The text that actually appears in the drop down.
+ // If not specified, the searchAttr text is used instead.
+ labelAttr: "",
+
+ // labelType: String
+ // "html" or "text"
+ labelType: "text",
+
+ _isvalid:true,
+
+ _lastDisplayedValue: "",
+
+ isValid:function(){
+ return this._isvalid;
+ },
+
+ _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
+ // dataObject==null means do not test the lastQuery, just continue
+ if(dataObject && dataObject.query[this.searchAttr] != this._lastQuery){
+ return;
+ }
+ if(!result.length){
+ //#3268: do nothing on bad input
+ //this._setValue("", "");
+ //#3285: change CSS to indicate error
+ if(!this._focused){ this.valueNode.value=""; }
+ dijit.form.TextBox.superclass.setValue.call(this, undefined, !this._focused);
+ this._isvalid=false;
+ this.validate(this._focused);
+ }else{
+ this._setValueFromItem(result[0], priorityChange);
+ }
+ },
+
+ _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+ // #3285: tap into search callback to see if user's query resembles a match
+ if(dataObject.query[this.searchAttr] != this._lastQuery){
+ return;
+ }
+ this._isvalid = results.length != 0; // FIXME: should this be greater-than?
+ this.validate(true);
+ dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments);
+ },
+
+ getValue:function(){
+ // don't get the textbox value but rather the previously set hidden value
+ return this.valueNode.value;
+ },
+
+ _getValueField:function(){
+ // used for option tag selects
+ return "value";
+ },
+
+ _setValue:function( /*String*/ value,
+ /*String*/ displayedValue,
+ /*Boolean?*/ priorityChange){
+ this.valueNode.value = value;
+ dijit.form.FilteringSelect.superclass.setValue.call(this, value, priorityChange, displayedValue);
+ this._lastDisplayedValue = displayedValue;
+ },
+
+ setValue: function(/*String*/ value, /*Boolean?*/ priorityChange){
+ // summary
+ // Sets the value of the select.
+ // Also sets the label to the corresponding value by reverse lookup.
+
+ //#3347: fetchItemByIdentity if no keyAttr specified
+ var self=this;
+ var handleFetchByIdentity = function(item, priorityChange){
+ if(item){
+ if(self.store.isItemLoaded(item)){
+ self._callbackSetLabel([item], undefined, priorityChange);
+ }else{
+ self.store.loadItem({
+ item: item,
+ onItem: function(result, dataObject){
+ self._callbackSetLabel(result, dataObject, priorityChange);
+ }
+ });
+ }
+ }else{
+ self._isvalid=false;
+ // prevent errors from Tooltip not being created yet
+ self.validate(false);
+ }
+ }
+ this.store.fetchItemByIdentity({
+ identity: value,
+ onItem: function(item){
+ handleFetchByIdentity(item, priorityChange);
+ }
+ });
+ },
+
+ _setValueFromItem: function(/*item*/ item, /*Boolean?*/ priorityChange){
+ // summary:
+ // Set the displayed valued in the input box, based on a
+ // selected item.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // setDisplayedValue() instead
+ this._isvalid=true;
+ this._setValue( this.store.getIdentity(item),
+ this.labelFunc(item, this.store),
+ priorityChange);
+ },
+
+ labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
+ // summary: Event handler called when the label changes
+ // return: the label that the ComboBox should display
+ return store.getValue(item, this.searchAttr);
+ },
+
+ _doSelect: function(/*Event*/ tgt){
+ // summary:
+ // ComboBox's menu callback function
+ // description:
+ // FilteringSelect overrides this to set both the visible and
+ // hidden value from the information stored in the menu
+ this.item = tgt.item;
+ this._setValueFromItem(tgt.item, true);
+ },
+
+ setDisplayedValue:function(/*String*/ label, /*Boolean?*/ priorityChange){
+ // summary:
+ // Set textbox to display label. Also performs reverse lookup
+ // to set the hidden value. Used in InlineEditBox
+
+ if(this.store){
+ var query = dojo.clone(this.query); // #6196: populate query with user-specifics
+ this._lastQuery = query[this.searchAttr] = 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;
+ this.store.fetch({
+ query: query,
+ queryOptions: {
+ ignoreCase: this.ignoreCase,
+ deep: true
+ },
+ onComplete: function(result, dataObject){
+ dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
+ },
+ onError: function(errText){
+ console.error('dijit.form.FilteringSelect: ' + errText);
+ dojo.hitch(_this, "_setValue")(undefined, label, false);
+ }
+ });
+ }
+ },
+
+ _getMenuLabelFromItem:function(/*Item*/ item){
+ // internal function to help ComboBoxMenu figure out what to display
+ if(this.labelAttr){
+ return {
+ html: this.labelType=="html",
+ label: this.store.getValue(item, this.labelAttr)
+ };
+ }else{
+ // because this function is called by ComboBoxMenu,
+ // this.inherited tries to find the superclass of ComboBoxMenu
+ return dijit.form.ComboBoxMixin.prototype._getMenuLabelFromItem.apply(this, arguments);
+ }
+ },
+
+ postMixInProperties: function(){
+ // FIXME: shouldn't this just be a call to inherited?
+ dijit.form.ComboBoxMixin.prototype.postMixInProperties.apply(this, arguments);
+ dijit.form.MappedTextBox.prototype.postMixInProperties.apply(this, arguments);
+ },
+
+ postCreate: function(){
+ dijit.form.ComboBoxMixin.prototype._postCreate.apply(this, arguments);
+ dijit.form.MappedTextBox.prototype.postCreate.apply(this, arguments);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ dijit.form.MappedTextBox.prototype.setAttribute.apply(this, arguments);
+ dijit.form.ComboBoxMixin.prototype._setAttribute.apply(this, arguments);
+ },
+
+ undo: function(){
+ this.setDisplayedValue(this._lastDisplayedValue);
+ },
+
+ _valueChanged: function(){
+ return this.getDisplayedValue()!=this._lastDisplayedValue;
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/Form.js b/includes/js/dijit/form/Form.js
new file mode 100644
index 0000000..4ad29f9
--- /dev/null
+++ b/includes/js/dijit/form/Form.js
@@ -0,0 +1,384 @@
+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.declare("dijit.form._FormMixin", null,
+ {
+ //
+ // 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').setValues(myObj);
+ // |
+ // | myObj=dijit.byId('myForm').getValues();
+
+ // 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.validate || widget.validate();
+ if (!valid && !didFocus) {
+ // Set focus of the first non-valid widget
+ dijit.scrollIntoView(widget.containerNode||widget.domNode);
+ widget.focus();
+ didFocus = true;
+ }
+ return valid;
+ }), "return item;");
+ },
+
+ setValues: function(/*object*/obj){
+ // summary: fill in form values from a JSON structure
+
+ // 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);
+ });
+
+ // call setValue() or setAttribute('checked') for each widget, according to obj
+ for(var name in map){
+ var widgets = map[name], // array of widgets w/this name
+ values = dojo.getObject(name, false, obj); // list of values for those widgets
+ 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.setValue(dojo.indexOf(values, w.value) != -1);
+ });
+ }else if(widgets[0]._multiValue){
+ // it takes an array (e.g. multi-select)
+ widgets[0].setValue(values);
+ }else{
+ // otherwise, values is a list of values to be assigned sequentially to each widget
+ dojo.forEach(widgets, function(w, i){
+ w.setValue(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 setValue() on the widget)
+
+ 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(){
+ // summary: generate JSON structure from form values
+
+ // get widget values
+ var obj = { };
+ dojo.forEach(this.getDescendants(), function(widget){
+ var name = widget.name;
+ if(!name){ return; }
+
+ // Single value widget (checkbox, radio, or plain <input> type widget
+ var value = (widget.getValue && !widget._getValueDeprecated) ? widget.getValue() : widget.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{
+ // 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{
+ // plain input
+ 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: make sure that every widget that has a validator function returns true
+ return dojo.every(this.getDescendants(), function(widget){
+ return !widget.isValid || widget.isValid();
+ });
+ }
+ });
+
+dojo.declare(
+ "dijit.form.Form",
+ [dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+ {
+ // summary:
+ // Adds conveniences to regular HTML form
+
+ // HTML <FORM> attributes
+ name: "",
+ action: "",
+ method: "",
+ encType: "",
+ "accept-charset": "",
+ accept: "",
+ target: "",
+
+ templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' name='${name}'></form>",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {action: "", method: "", encType: "", "accept-charset": "", accept: "", target: ""}),
+
+ execute: function(/*Object*/ formContents){
+ // summary:
+ // Deprecated: use submit()
+ },
+
+ onExecute: function(){
+ // summary:
+ // Deprecated: use onSubmit()
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "encType":
+ if(dojo.isIE){ this.domNode.encoding = value; }
+ }
+ },
+
+ postCreate: function(){
+ // IE tries to hide encType
+ if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
+ var item = this.srcNodeRef.attributes.getNamedItem('encType');
+ if(item && !item.specified && (typeof item.value == "string")){
+ this.setAttribute('encType', item.value);
+ }
+ }
+ 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
+ return true; // Boolean
+ },
+
+ _onReset: function(e){
+ // 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.currentTarget, target: e.target
+ };
+ // if return value is not exactly false, and haven't called preventDefault(), then reset
+ if(!(this.onReset(faux) === false) && faux.returnValue){
+ this.reset();
+ }
+ dojo.stopEvent(e);
+ return false;
+ },
+
+ _onSubmit: function(e){
+ var fp = dijit.form.Form.prototype;
+ // TODO: remove ths 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. 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
+
+ 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/includes/js/dijit/form/MultiSelect.js b/includes/js/dijit/form/MultiSelect.js
new file mode 100644
index 0000000..e1f468c
--- /dev/null
+++ b/includes/js/dijit/form/MultiSelect.js
@@ -0,0 +1,84 @@
+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._FormWidget,{
+ // summary: Wrapper for a native select multiple="true" element to
+ // interact with dijit.form.Form
+
+ // 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' dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+ {size:"focusNode"}),
+
+ addSelected: function(/* dijit.form.MultiSelect */select){
+ // summary: Move the selected nodes af an 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);
+ },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
+ });
+ },
+
+ _getValueDeprecated: false, // remove when _FormWidget:_getValueDeprecated is removed in 2.0
+ getValue: function(){
+ // summary: Returns an array of the selected options' values
+ return this.getSelected().map(function(n){
+ return n.value;
+ });
+ },
+
+ _multiValue: true, // for Form
+ setValue: function(/* Array */values){
+ // summary: 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.getValue(), onChange==true);
+ },
+
+ _onChange: function(/*Event*/ e){
+ this._handleOnChange(this.getValue(), true);
+ },
+
+ // for layout widgets:
+ resize: function(/* Object */size){
+ if(size){
+ dojo.marginBox(this.domNode, size);
+ }
+ },
+
+ postCreate: function(){
+ this._onChange();
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/NumberSpinner.js b/includes/js/dijit/form/NumberSpinner.js
new file mode 100644
index 0000000..a9054b0
--- /dev/null
+++ b/includes/js/dijit/form/NumberSpinner.js
@@ -0,0 +1,31 @@
+if(!dojo._hasResource["dijit.form.NumberSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberSpinner"] = true;
+dojo.provide("dijit.form.NumberSpinner");
+
+dojo.require("dijit.form._Spinner");
+dojo.require("dijit.form.NumberTextBox");
+
+dojo.declare(
+"dijit.form.NumberSpinner",
+[dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
+{
+ // summary:
+ // extends NumberTextBox to add up/down arrows for incremental change to the value
+
+ required: true,
+
+ adjust: function(/* Object */ val, /*Number*/ delta){
+ // summary: change Number val by the given amount
+ var newval = val+delta;
+ if(isNaN(val) || isNaN(newval)){ return val; }
+ if((typeof this.constraints.max == "number") && (newval > this.constraints.max)){
+ newval = this.constraints.max;
+ }
+ if((typeof this.constraints.min == "number") && (newval < this.constraints.min)){
+ newval = this.constraints.min;
+ }
+ return newval;
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/NumberTextBox.js b/includes/js/dijit/form/NumberTextBox.js
new file mode 100644
index 0000000..f8344a9
--- /dev/null
+++ b/includes/js/dijit/form/NumberTextBox.js
@@ -0,0 +1,79 @@
+if(!dojo._hasResource["dijit.form.NumberTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.NumberTextBox"] = true;
+dojo.provide("dijit.form.NumberTextBox");
+
+dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dojo.number");
+
+/*=====
+dojo.declare(
+ "dijit.form.NumberTextBox.__Constraints",
+ [dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions]
+);
+=====*/
+
+dojo.declare(
+ "dijit.form.NumberTextBoxMixin",
+ null,
+ {
+ // summary:
+ // A mixin for all number textboxes
+
+ regExpGen: dojo.number.regexp,
+
+ /*=====
+ // constraints: dijit.form.NumberTextBox.__Constraints
+ constraints: {},
+ ======*/
+
+ // editOptions: Object
+ // properties to mix into constraints when the value is being edited
+ editOptions: { pattern: '#.######' },
+
+ _onFocus: function(){
+ this.setValue(this.getValue(), false);
+ this.inherited(arguments);
+ },
+
+ _formatter: dojo.number.format,
+
+ format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+ // summary: formats the value as a Number, according to constraints
+
+ if(typeof value == "string") { return value; }
+ if(isNaN(value)){ return ""; }
+ if(this.editOptions && this._focused){
+ constraints = dojo.mixin(dojo.mixin({}, this.editOptions), this.constraints);
+ }
+ return this._formatter(value, constraints);
+ },
+
+ parse: dojo.number.parse,
+ /*=====
+ parse: function(value, constraints){
+ // summary: parses the value as a Number, according to constraints
+ // value: String
+ //
+ // constraints: dojo.number.__ParseOptions
+ },
+ =====*/
+
+ filter: function(/*Number*/ value){
+ if(typeof value == "string"){ return this.inherited('filter', arguments); }
+ return isNaN(value) ? '' : value;
+ },
+
+ value: NaN
+ }
+);
+
+dojo.declare(
+ "dijit.form.NumberTextBox",
+ [dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
+ {
+ // summary:
+ // A validating, serializable, range-bound text box.
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/SimpleTextarea.js b/includes/js/dijit/form/SimpleTextarea.js
new file mode 100644
index 0000000..54db151
--- /dev/null
+++ b/includes/js/dijit/form/SimpleTextarea.js
@@ -0,0 +1,50 @@
+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._FormWidget");
+
+dojo.declare("dijit.form.SimpleTextarea",
+ dijit.form._FormValueWidget,
+{
+ // 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/>
+ //
+
+ baseClass: "dijitTextArea",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+ {rows:"focusNode", cols: "focusNode"}),
+
+ // rows: Number
+ // The number of rows of text.
+ rows: "",
+
+ // rows: Number
+ // The number of characters per line.
+ cols: "",
+
+ templateString: "<textarea name='${name}' dojoAttachPoint='focusNode,containerNode'>",
+
+ postMixInProperties: function(){
+ if(this.srcNodeRef){
+ this.value = this.srcNodeRef.value;
+ }
+ },
+
+ setValue: function(/*String*/ val){
+ this.domNode.value = val;
+ this.inherited(arguments);
+ },
+
+ getValue: function(){
+ return this.domNode.value.replace(/\r/g,"");
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/Slider.js b/includes/js/dijit/form/Slider.js
new file mode 100644
index 0000000..2290376
--- /dev/null
+++ b/includes/js/dijit/form/Slider.js
@@ -0,0 +1,481 @@
+if(!dojo._hasResource["dijit.form.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Slider"] = true;
+dojo.provide("dijit.form.Slider");
+
+dojo.require("dijit.form._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],
+{
+ // summary
+ // A form widget that allows one to select a value with a horizontally draggable image
+
+ templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></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\" dojoAttachEvent=\"onclick: decrement\"><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 dijitSliderLeftBumper\" dojoAttachEvent=\"onclick:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><div waiRole=\"presentation\" style=\"position:relative;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable dijitSliderMoveableH\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleH\"></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=\"onclick:_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 dijitSliderRightBumper\" dojoAttachEvent=\"onclick:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\" style=\"right:0px;\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" tabIndex=\"-1\" style=\"display:none\" dojoAttachPoint=\"incrementButton\" dojoAttachEvent=\"onclick: increment\"><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\" style=\"text-align:center;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n",
+ value: 0,
+
+ // showButtons: boolean
+ // Show increment/decrement buttons at the ends of the slider?
+ showButtons: true,
+
+ // minimum:: integer
+ // The minimum value allowed.
+ minimum: 0,
+
+ // maximum: integer
+ // The maximum allowed value.
+ maximum: 100,
+
+ // discreteValues: integer
+ // The maximum allowed values dispersed evenly between minimum and maximum (inclusive).
+ discreteValues: Infinity,
+
+ // pageIncrement: integer
+ // The amount of change with shift+arrow
+ pageIncrement: 2,
+
+ // clickSelect: boolean
+ // If clicking the progress 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%
+ slideDuration: 1000,
+
+ widgetsInTemplate: true,
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+ {id:"", name:"valueNode"}),
+
+ baseClass: "dijitSlider",
+
+ _mousePixelCoord: "pageX",
+ _pixelCount: "w",
+ _startingPixelCoord: "x",
+ _startingPixelCount: "l",
+ _handleOffsetCoord: "left",
+ _progressPixelSize: "width",
+
+ _onKeyPress: function(/*Event*/ e){
+ if(this.disabled || this.readOnly || e.altKey || e.ctrlKey){ return; }
+ switch(e.keyCode){
+ case dojo.keys.HOME:
+ this.setValue(this.minimum, true);
+ break;
+ case dojo.keys.END:
+ this.setValue(this.maximum, true);
+ 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:
+ this.inherited(arguments);
+ 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(){
+ return !this.isLeftToRight();
+ },
+
+ _onBarClick: function(e){
+ if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+ dijit.focus(this.sliderHandle);
+ dojo.stopEvent(e);
+ var abspos = dojo.coords(this.sliderBarContainer, true);
+ var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
+ this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
+ },
+
+ _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.setValue((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange);
+ },
+
+ setValue: function(/*Number*/ value, /*Boolean, optional*/ priorityChange){
+ 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(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:"%" };
+ dojo.animateProperty({ node: progressBar, duration: duration,
+ onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; },
+ properties: props
+ }).play();
+ }
+ else{
+ progressBar.style[this._progressPixelSize] = (percent*100) + "%";
+ remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%";
+ }
+ },
+
+ _bumpValue: function(signedChange){
+ 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.setValue(value, true);
+ },
+
+ _onClkIncBumper: function(){
+ this.setValue(this._descending === false ? this.minimum : this.maximum, true);
+ },
+
+ _onClkDecBumper: function(){
+ this.setValue(this._descending === false ? this.maximum : this.minimum, true);
+ },
+
+ decrement: function(e){
+ // summary
+ // decrement slider by 1 unit
+ this._bumpValue(e.keyCode == dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
+ },
+
+ increment: function(e){
+ // summary
+ // increment slider by 1 unit
+ this._bumpValue(e.keyCode == dojo.keys.PAGE_UP?this.pageIncrement:1);
+ },
+
+ _mouseWheeled: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ var scrollAmount = 0;
+ if(typeof evt.wheelDelta == 'number'){ // IE
+ scrollAmount = evt.wheelDelta;
+ }else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+ scrollAmount = -evt.detail;
+ }
+ if(scrollAmount > 0){
+ this.increment(evt);
+ }else if(scrollAmount < 0){
+ this.decrement(evt);
+ }
+ },
+
+ startup: function(){
+ dojo.forEach(this.getChildren(), function(child){
+ if(this[child.container] != this.containerNode){
+ this[child.container].appendChild(child.domNode);
+ }
+ }, this);
+ },
+
+ postCreate: function(){
+ if(this.showButtons){
+ this.incrementButton.style.display="";
+ this.decrementButton.style.display="";
+ }
+ this.connect(this.domNode, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+
+ // define a custom constructor for a SliderMover that points back to me
+ var _self = this;
+ var mover = function(){
+ dijit.form._SliderMover.apply(this, arguments);
+ this.widget = _self;
+ };
+ dojo.extend(mover, dijit.form._SliderMover.prototype);
+
+ this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
+ dijit.setWaiState(this.focusNode, "valuemin", this.minimum);
+ dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
+
+ this.inherited(arguments);
+ },
+
+ destroy: function(){
+ this._movable.destroy();
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare(
+ "dijit.form.VerticalSlider",
+ dijit.form.HorizontalSlider,
+{
+ // summary
+ // A form widget that allows one to select a value with a vertically draggable image
+
+ templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\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=\"incrementButton\" dojoAttachEvent=\"onclick:_topButtonClicked\"><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 dijitSliderTopBumper\" dojoAttachEvent=\"onclick:_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\" style=\"text-align:center;height:100%;\"></td\n\t\t><td class=\"dijitReset\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" name=\"${name}\"\n\t\t\t/><center waiRole=\"presentation\" style=\"position:relative;height:100%;\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onclick:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div waiRole=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onclick:_onBarClick\"\n\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderMoveable\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_onHandleClick\" style=\"vertical-align:top;\" waiRole=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"\n\t\t\t\t\t\t><div class=\"dijitSliderImageHandle dijitSliderImageHandleV\"></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\" style=\"text-align:center;height:100%;\"></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 dijitSliderBottomBumper\" dojoAttachEvent=\"onclick:_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=\"decrementButton\" dojoAttachEvent=\"onclick:_bottomButtonClicked\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></tbody></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,
+
+ startup: function(){
+ if(this._started){ return; }
+
+ if(!this.isLeftToRight() && dojo.isMoz){
+ if(this.leftDecoration){this._rtlRectify(this.leftDecoration);}
+ if(this.rightDecoration){this._rtlRectify(this.rightDecoration);}
+ }
+
+ this.inherited(arguments);
+ },
+
+ _isReversed: function(){
+ return this._descending;
+ },
+
+ _topButtonClicked: function(e){
+ if(this._descending){
+ this.increment(e);
+ }else{
+ this.decrement(e);
+ }
+ },
+
+ _bottomButtonClicked: function(e){
+ if(this._descending){
+ this.decrement(e);
+ }else{
+ this.increment(e);
+ }
+ },
+
+ _rtlRectify: function(decorationNode/*NodeList*/){
+ // summary:
+ // Rectify children nodes for left/right decoration in rtl case.
+ // Simply switch the rule and label child for each decoration node.
+ var childNodes = [];
+ while(decorationNode.firstChild){
+ childNodes.push(decorationNode.firstChild);
+ decorationNode.removeChild(decorationNode.firstChild);
+ }
+ for(var i = childNodes.length-1; i >=0; i--){
+ if(childNodes[i]){
+ decorationNode.appendChild(childNodes[i]);
+ }
+ }
+ }
+});
+
+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.coords(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.setValue(widget.value, true);
+ }
+});
+
+
+dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
+{
+ // Summary:
+ // Create hash marks for the Horizontal slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+ // count: Integer
+ // Number of hash marks to generate
+ count: 3,
+
+ // container: Node
+ // If this is a child widget, connect it to this parent node
+ 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: 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;
+ }
+});
+
+dojo.declare("dijit.form.VerticalRule", dijit.form.HorizontalRule,
+{
+ // Summary:
+ // Create hash marks for the Vertical slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+ _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:',
+
+ _isHorizontal: false
+});
+
+dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule,
+{
+ // Summary:
+ // Create labels for the Horizontal slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+ // labelStyle: String
+ // CSS style to apply to individual text labels
+ labelStyle: "",
+
+ // labels: Array
+ // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top
+ 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: '"><span class="dijitRuleLabel dijitRuleLabelH">',
+ _suffix: '</span></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(){
+ // summary: user replaceable function to return the labels array
+
+ // 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;
+ }
+});
+
+dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels,
+{
+ // Summary:
+ // Create labels for the Vertical slider
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+
+ _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:',
+ _labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">',
+
+ _calcPosition: function(pos){
+ return 100-pos;
+ },
+
+ _isHorizontal: false
+});
+
+}
diff --git a/includes/js/dijit/form/TextBox.js b/includes/js/dijit/form/TextBox.js
new file mode 100644
index 0000000..f36aff4
--- /dev/null
+++ b/includes/js/dijit/form/TextBox.js
@@ -0,0 +1,185 @@
+if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.TextBox"] = true;
+dojo.provide("dijit.form.TextBox");
+
+dojo.require("dijit.form._FormWidget");
+
+dojo.declare(
+ "dijit.form.TextBox",
+ dijit.form._FormValueWidget,
+ {
+ // summary:
+ // A base class for textbox form inputs
+ //
+ // trim: Boolean
+ // Removes leading and trailing whitespace if true. Default is false.
+ trim: false,
+
+ // uppercase: Boolean
+ // Converts all characters to uppercase if true. Default is false.
+ uppercase: false,
+
+ // lowercase: Boolean
+ // Converts all characters to lowercase if true. Default is false.
+ lowercase: false,
+
+ // propercase: Boolean
+ // Converts the first character of each word to uppercase if true.
+ propercase: false,
+
+ // maxLength: String
+ // HTML INPUT tag maxLength declaration.
+ maxLength: "",
+
+ templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode' name=\"${name}\"\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'\n\tautocomplete=\"off\" type=\"${type}\"\n\t/>\n",
+ baseClass: "dijitTextBox",
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+ {maxLength:"focusNode"}),
+
+ getDisplayedValue: function(){
+ // summary:
+ // Returns the formatted value that the user sees in the textbox, which may be different
+ // from the serialized value that's actually sent to the server (see dijit.form.ValidationTextBox.serialize)
+ return this.filter(this.textbox.value);
+ },
+
+ getValue: function(){
+ return this.parse(this.getDisplayedValue(), this.constraints);
+ },
+
+ setValue: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // 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 = this.filter(value);
+ if((((typeof filteredValue == typeof value) && (value !== undefined/*#5317*/)) || (value === null/*#5329*/)) && (formattedValue == null || formattedValue == undefined)){
+ formattedValue = this.format(filteredValue, this.constraints);
+ }
+ if(formattedValue != null && formattedValue != undefined){
+ this.textbox.value = formattedValue;
+ }
+ dijit.form.TextBox.superclass.setValue.call(this, filteredValue, priorityChange);
+ },
+
+ setDisplayedValue: function(/*String*/value, /*Boolean?*/ priorityChange){
+ // summary:
+ // 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.
+ //
+ // priorityChange:
+ // If true, an onChange event is fired immediately instead of
+ // waiting for the next blur event.
+
+ this.textbox.value = value;
+ this.setValue(this.getValue(), priorityChange);
+ },
+
+ format: function(/* String */ value, /* Object */ constraints){
+ // summary:
+ // Replacable function to convert a value to a properly formatted string
+ 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
+ return value;
+ },
+
+ postCreate: function(){
+ // setting the value here is needed since value="" in the template causes "undefined"
+ // and setting in the DOM (instead of the JS object) helps with form reset actions
+ this.textbox.setAttribute("value", this.getDisplayedValue());
+ this.inherited(arguments);
+
+ /*#5297:if(this.srcNodeRef){
+ dojo.style(this.textbox, "cssText", this.style);
+ this.textbox.className += " " + this["class"];
+ }*/
+ this._layoutHack();
+ },
+
+ filter: function(val){
+ // summary:
+ // Apply specified filters to textbox value
+ if(val === null || val === undefined){ return ""; }
+ else 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.setValue(this.getValue(), (this.isValid ? this.isValid() : true));
+ },
+
+ _onBlur: function(){
+ this._setBlurValue();
+ this.inherited(arguments);
+ },
+
+ onkeyup: function(){
+ // summary:
+ // User replaceable keyup event handler
+ }
+ }
+);
+
+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; }
+ element.focus();
+ if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
+ if(element.createTextRange){
+ var range = element.createTextRange();
+ with(range){
+ collapse(true);
+ moveStart("character", start);
+ moveEnd("character", stop);
+ select();
+ }
+ }
+ }else if(_window["getSelection"]){
+ var selection = _window.getSelection();
+ // FIXME: does this work on Safari?
+ if(element.setSelectionRange){
+ element.setSelectionRange(start, stop);
+ }
+ }
+}
+
+}
diff --git a/includes/js/dijit/form/Textarea.js b/includes/js/dijit/form/Textarea.js
new file mode 100644
index 0000000..b879aae
--- /dev/null
+++ b/includes/js/dijit/form/Textarea.js
@@ -0,0 +1,261 @@
+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._FormWidget");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit.form", "Textarea", null, "zh,pt,da,tr,ru,de,ROOT,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+ "dijit.form.Textarea",
+ dijit.form._FormValueWidget,
+ {
+ // summary: A resizing textarea widget
+ //
+ // description:
+ // A textarea that resizes vertically to contain the data.
+ // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes.
+ // Cols is not supported and the width should be specified with style width.
+ // Rows is not supported since this widget adjusts the height.
+ //
+ // example:
+ // | <textarea dojoType="dijit.form.TextArea">...</textarea>
+ //
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormValueWidget.prototype.attributeMap),
+ {style:"styleNode", 'class':"styleNode"}),
+
+ templateString: (dojo.isIE || dojo.isSafari || dojo.isFF) ?
+ ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '<fieldset id="${id}" class="dijitInline dijitInputField dijitTextArea" dojoAttachPoint="styleNode" waiRole="presentation"><div dojoAttachPoint="editNode,focusNode,eventNode" dojoAttachEvent="onpaste:_changing,oncut:_changing" waiRole="textarea" style="text-decoration:none;display:block;overflow:auto;" contentEditable="true"></div>'
+ : '<span id="${id}" class="dijitReset">'+
+ '<iframe src="javascript:<html><head><title>${_iframeEditTitle}</title></head><body><script>var _postCreate=window.frameElement?window.frameElement.postCreate:null;if(_postCreate)_postCreate();</script></body></html>"'+
+ ' dojoAttachPoint="iframe,styleNode" dojoAttachEvent="onblur:_onIframeBlur" class="dijitInline dijitInputField dijitTextArea"></iframe>')
+ + '<textarea name="${name}" value="${value}" dojoAttachPoint="formValueNode" style="display:none;"></textarea>'
+ + ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '</fieldset>':'</span>')
+ : '<textarea id="${id}" name="${name}" value="${value}" dojoAttachPoint="formValueNode,editNode,focusNode,styleNode" class="dijitInputField dijitTextArea">'+dojo.isFF+'</textarea>',
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ this.formValueNode.disabled = this.disabled;
+ case "readOnly":
+ if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+ this.editNode.contentEditable = (!this.disabled && !this.readOnly);
+ }else if(dojo.isFF){
+ this.iframe.contentDocument.designMode = (this.disabled || this.readOnly)? "off" : "on";
+ }
+ }
+ },
+
+ focus: function(){
+ // summary: Received focus, needed for the InlineEditBox widget
+ if(!this.disabled && !this.readOnly){
+ this._changing(); // set initial height
+ }
+ dijit.focus(this.iframe || this.focusNode);
+ },
+
+ setValue: function(/*String*/ value, /*Boolean, optional*/ priorityChange){
+ var editNode = this.editNode;
+ if(typeof value == "string"){
+ editNode.innerHTML = ""; // wipe out old nodes
+ if(value.split){
+ var _this=this;
+ var isFirst = true;
+ dojo.forEach(value.split("\n"), function(line){
+ if(isFirst){ isFirst = false; }
+ else{
+ editNode.appendChild(dojo.doc.createElement("BR")); // preserve line breaks
+ }
+ if(line){
+ editNode.appendChild(dojo.doc.createTextNode(line)); // use text nodes so that imbedded tags can be edited
+ }
+ });
+ }else if(value){
+ editNode.appendChild(dojo.doc.createTextNode(value));
+ }
+ if(!dojo.isIE){
+ editNode.appendChild(dojo.doc.createElement("BR")); // so that you see a cursor
+ }
+ }else{
+ // blah<BR>blah --> blah\nblah
+ // <P>blah</P><P>blah</P> --> blah\nblah
+ // <DIV>blah</DIV><DIV>blah</DIV> --> blah\nblah
+ // &amp;&lt;&gt; -->&< >
+ value = editNode.innerHTML;
+ if(this.iframe){ // strip sizeNode
+ value = value.replace(/<div><\/div>\r?\n?$/i,"");
+ }
+ value = value.replace(/\s*\r?\n|^\s+|\s+$|&nbsp;/g,"").replace(/>\s+</g,"><").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])<div>/g,"$1\n").replace(/<\/p>\s*<p[^>]*>|<br[^>]*>|<\/div>\s*<div[^>]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&amp;/gi,"\&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">");
+ if(!dojo.isIE){
+ value = value.replace(/\n$/,""); // remove added <br>
+ }
+ }
+ this.value = this.formValueNode.value = value;
+ if(this.iframe){
+ var sizeNode = dojo.doc.createElement('div');
+ editNode.appendChild(sizeNode);
+ var newHeight = sizeNode.offsetTop;
+ if(editNode.scrollWidth > editNode.clientWidth){ newHeight+=16; } // scrollbar space needed?
+ if(this.lastHeight != newHeight){ // cache size so that we don't get a resize event because of a resize event
+ if(newHeight == 0){ newHeight = 16; } // height = 0 causes the browser to not set scrollHeight
+ dojo.contentBox(this.iframe, {h: newHeight});
+ this.lastHeight = newHeight;
+ }
+ editNode.removeChild(sizeNode);
+ }
+ dijit.form.Textarea.superclass.setValue.call(this, this.getValue(), priorityChange);
+ },
+
+ getValue: function(){
+ return this.value.replace(/\r/g,"");
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ // don't let the source text be converted to a DOM structure since we just want raw text
+ if(this.srcNodeRef && this.srcNodeRef.innerHTML != ""){
+ this.value = this.srcNodeRef.innerHTML;
+ this.srcNodeRef.innerHTML = "";
+ }
+ if((!this.value || this.value == "") && this.srcNodeRef && this.srcNodeRef.value){
+ this.value = this.srcNodeRef.value;
+ }
+ if(!this.value){ this.value = ""; }
+ this.value = this.value.replace(/\r\n/g,"\n").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&");
+ if(dojo.isFF == 2){
+ // In the case of Firefox an iframe is used and when the text gets focus,
+ // focus is fired from the document object. There isn't a way to put a
+ // waiRole on the document object and as a result screen readers don't
+ // announce the role. As a result screen reader users are lost.
+ //
+ // An additional problem is that the browser gives the document object a
+ // very cryptic accessible name, e.g.
+ // wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html
+ // When focus is fired from the document object, the screen reader speaks
+ // the accessible name. The cyptic accessile name is confusing.
+ //
+ // A workaround for both of these problems is to give the iframe's
+ // document a title, the name of which is similar to a role name, i.e.
+ // "edit area". This will be used as the accessible name which will replace
+ // the cryptic name and will also convey the role information to the user.
+ // Because it is read directly to the user, the string must be localized.
+ // In addition, since a <label> element can not be associated with an iframe, if
+ // this control has a label, insert the label text into the title as well.
+ var _nlsResources = dojo.i18n.getLocalization("dijit.form", "Textarea");
+ this._iframeEditTitle = _nlsResources.iframeEditTitle;
+ this._iframeFocusTitle = _nlsResources.iframeFocusTitle;
+ var label=dojo.query('label[for="'+this.id+'"]');
+ if(label.length){
+ this._iframeEditTitle = label[0].innerHTML + " " + this._iframeEditTitle;
+ }
+ var body = this.focusNode = this.editNode = dojo.doc.createElement('BODY');
+ body.style.margin="0px";
+ body.style.padding="0px";
+ body.style.border="0px";
+ }
+ },
+
+ postCreate: function(){
+ if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){
+ this.domNode.style.overflowY = 'hidden';
+ }else if(dojo.isFF){
+ var w = this.iframe.contentWindow;
+ var title = '';
+ try { // #4715: peeking at the title can throw a security exception during iframe setup
+ title = this.iframe.contentDocument.title;
+ } catch(e) {}
+ if(!w || !title){
+ this.iframe.postCreate = dojo.hitch(this, this.postCreate);
+ return;
+ }
+ var d = w.document;
+ d.getElementsByTagName('HTML')[0].replaceChild(this.editNode, d.getElementsByTagName('BODY')[0]);
+ if(!this.isLeftToRight()){
+ d.getElementsByTagName('HTML')[0].dir = "rtl";
+ }
+ this.iframe.style.overflowY = 'hidden';
+ this.eventNode = d;
+ // this.connect won't destroy this handler cleanly since its on the iframe's window object
+ // resize is a method of window, not document
+ w.addEventListener("resize", dojo.hitch(this, this._changed), false); // resize is only on the window object
+ }else{
+ this.focusNode = this.domNode;
+ }
+ if(this.eventNode){
+ this.connect(this.eventNode, "keypress", this._onKeyPress);
+ this.connect(this.eventNode, "mousemove", this._changed);
+ this.connect(this.eventNode, "focus", this._focused);
+ this.connect(this.eventNode, "blur", this._blurred);
+ }
+ if(this.editNode){
+ this.connect(this.editNode, "change", this._changed); // needed for mouse paste events per #3479
+ }
+ this.inherited('postCreate', arguments);
+ },
+
+ // event handlers, you can over-ride these in your own subclasses
+ _focused: function(e){
+ dojo.addClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+ this._changed(e);
+ },
+
+ _blurred: function(e){
+ dojo.removeClass(this.iframe||this.domNode, "dijitInputFieldFocused");
+ this._changed(e, true);
+ },
+
+ _onIframeBlur: function(){
+ // Reset the title back to "edit area".
+ this.iframe.contentDocument.title = this._iframeEditTitle;
+ },
+
+ _onKeyPress: function(e){
+ if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
+ // Pressing the tab key in the iframe (with designMode on) will cause the
+ // entry of a tab character so we have to trap that here. Since we don't
+ // know the next focusable object we put focus on the iframe and then the
+ // user has to press tab again (which then does the expected thing).
+ // A problem with that is that the screen reader user hears "edit area"
+ // announced twice which causes confusion. By setting the
+ // contentDocument's title to "edit area frame" the confusion should be
+ // eliminated.
+ this.iframe.contentDocument.title = this._iframeFocusTitle;
+ // Place focus on the iframe. A subsequent tab or shift tab will put focus
+ // on the correct control.
+ // Note: Can't use this.focus() because that results in a call to
+ // dijit.focus and if that receives an iframe target it will set focus
+ // on the iframe's contentWindow.
+ this.iframe.focus(); // this.focus(); won't work
+ dojo.stopEvent(e);
+ }else if(e.keyCode == dojo.keys.ENTER){
+ e.stopPropagation();
+ }else if(this.inherited("_onKeyPress", arguments) && this.iframe){
+ // #3752:
+ // The key press will not make it past the iframe.
+ // If a widget is listening outside of the iframe, (like InlineEditBox)
+ // it will not hear anything.
+ // Create an equivalent event so everyone else knows what is going on.
+ var te = dojo.doc.createEvent("KeyEvents");
+ te.initKeyEvent("keypress", true, true, null, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode);
+ this.iframe.dispatchEvent(te);
+ }
+ this._changing();
+ },
+
+ _changing: function(e){
+ // summary: event handler for when a change is imminent
+ setTimeout(dojo.hitch(this, "_changed", e, false), 1);
+ },
+
+ _changed: function(e, priorityChange){
+ // summary: event handler for when a change has already happened
+ if(this.iframe && this.iframe.contentDocument.designMode != "on" && !this.disabled && !this.readOnly){
+ this.iframe.contentDocument.designMode="on"; // in case this failed on init due to being hidden
+ }
+ this.setValue(null, priorityChange || false);
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/TimeTextBox.js b/includes/js/dijit/form/TimeTextBox.js
new file mode 100644
index 0000000..1774e61
--- /dev/null
+++ b/includes/js/dijit/form/TimeTextBox.js
@@ -0,0 +1,33 @@
+if(!dojo._hasResource["dijit.form.TimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.TimeTextBox"] = true;
+dojo.provide("dijit.form.TimeTextBox");
+
+dojo.require("dijit._TimePicker");
+dojo.require("dijit.form._DateTimeTextBox");
+
+/*=====
+dojo.declare(
+ "dijit.form.TimeTextBox.__Constraints",
+ [dijit.form._DateTimeTextBox.__Constraints, dijit._TimePicker.__Constraints]
+);
+=====*/
+
+dojo.declare(
+ "dijit.form.TimeTextBox",
+ dijit.form._DateTimeTextBox,
+ {
+ // summary:
+ // A validating, serializable, range-bound time text box with a popup time picker
+
+ popupClass: "dijit._TimePicker",
+ _selector: "time"
+
+/*=====
+ ,
+ // constraints: dijit.form.TimeTextBox.__Constraints
+ constraints:{}
+=====*/
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/ValidationTextBox.js b/includes/js/dijit/form/ValidationTextBox.js
new file mode 100644
index 0000000..4f354d0
--- /dev/null
+++ b/includes/js/dijit/form/ValidationTextBox.js
@@ -0,0 +1,308 @@
+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, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,ROOT,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+/*=====
+ 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:
+ // A TextBox subclass with the ability to validate content of various types and provide user feedback.
+
+ templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></div\n\t></div\n></div>\n",
+ baseClass: "dijitTextBox",
+
+ // default values for new subclass properties
+ // required: Boolean
+ // Can be true or false, default is false.
+ required: false,
+
+ // promptMessage: String
+ // Hint string
+ promptMessage: "",
+
+ // invalidMessage: String
+ // The message to display if value is invalid.
+ invalidMessage: "$_unset_$", // read from the message file if not overridden
+
+ // constraints: dijit.form.ValidationTextBox.__Constraints
+ // user-defined object needed to pass parameters to the validator functions
+ constraints: {},
+
+ // regExp: String
+ // regular expression string used to validate the input
+ // Do not specify both regExp and regExpGen
+ regExp: ".*",
+
+ // regExpGen: Function
+ // user replaceable function used to generate regExp when dependent on constraints
+ // Do not specify both regExp and regExpGen
+ regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/constraints){ return this.regExp; },
+
+ // 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: [],
+
+ setValue: function(){
+ this.inherited(arguments);
+ this.validate(this._focused);
+ },
+
+ validator: function(/*anything*/value, /*dijit.form.ValidationTextBox.__Constraints*/constraints){
+ // summary: user replaceable function used to validate the text input against the regular expression.
+ return (new RegExp("^(" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
+ (!this.required || !this._isEmpty(value)) &&
+ (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ // summary: Need to over-ride with your own validation code in subclasses
+ 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
+ return this.invalidMessage; // String
+ },
+
+ getPromptMessage: function(/*Boolean*/ isFocused){
+ // summary: return a hint to show if appropriate
+ return this.promptMessage; // String
+ },
+
+ validate: function(/*Boolean*/ isFocused){
+ // summary:
+ // Called by oninit, onblur, and onkeypress.
+ // description:
+ // Show missing or invalid messages if appropriate, and highlight textbox field.
+ var message = "";
+ var isValid = this.isValid(isFocused);
+ var isEmpty = this._isEmpty(this.textbox.value);
+ this.state = (isValid || (!this._hasBeenBlurred && isEmpty)) ? "" : "Error";
+ this._setStateClass();
+ dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
+ if(isFocused){
+ if(isEmpty){
+ message = this.getPromptMessage(true);
+ }
+ if(!message && this.state == "Error"){
+ message = this.getErrorMessage(true);
+ }
+ }
+ this.displayMessage(message);
+ return isValid;
+ },
+
+ // currently displayed message
+ _message: "",
+
+ displayMessage: function(/*String*/ message){
+ // summary:
+ // User overridable method to display validation errors/hints.
+ // By default uses a tooltip.
+ if(this._message == message){ return; }
+ this._message = message;
+ dijit.hideTooltip(this.domNode);
+ if(message){
+ dijit.showTooltip(message, this.domNode, this.tooltipPosition);
+ }
+ },
+
+ _refreshState: function(){
+ this.validate(this._focused);
+ },
+
+ _update: function(/*Event*/e){
+ this._refreshState();
+ this._onMouse(e); // update CSS classes
+ },
+
+ _onkeyup: function(/*Event*/e){
+ this._update(e);
+ this.onkeyup(e);
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.constraints = {};
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.constraints.locale = this.lang;
+ this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
+ if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; }
+ var p = this.regExpGen(this.constraints);
+ this.regExp = p;
+ }
+ }
+);
+
+dojo.declare(
+ "dijit.form.MappedTextBox",
+ dijit.form.ValidationTextBox,
+ {
+ // summary:
+ // A dijit.form.ValidationTextBox subclass which provides a visible formatted display and a serializable
+ // value in a hidden input field which is actually sent to the server. 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 serveris defined by the dijit.form.MappedTextBox.serialize method and is typically
+ // locale-neutral.
+
+ serialize: function(/*anything*/val, /*Object?*/options){
+ // summary: user replaceable function used to convert the getValue() result to a String
+ return val.toString ? val.toString() : ""; // String
+ },
+
+ toString: function(){
+ // summary: display the widget as a printable string using the widget's value
+ var val = this.filter(this.getValue());
+ return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
+ },
+
+ validate: function(){
+ this.valueNode.value = this.toString();
+ return this.inherited(arguments);
+ },
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ if(this.valueNode){
+ this.valueNode.disabled = this.disabled;
+ }
+ }
+ },
+
+ postCreate: function(){
+ var textbox = this.textbox;
+ var valueNode = (this.valueNode = dojo.doc.createElement("input"));
+ valueNode.setAttribute("type", textbox.type);
+ valueNode.setAttribute("value", this.toString());
+ dojo.style(valueNode, "display", "none");
+ valueNode.name = this.textbox.name;
+ valueNode.disabled = this.textbox.disabled;
+ this.textbox.name = this.textbox.name + "_displayed_";
+ this.textbox.removeAttribute("name");
+ dojo.place(valueNode, textbox, "after");
+
+ 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:
+ // A dijit.form.MappedTextBox subclass which defines a range of valid values
+ //
+ // constraints: dijit.form.RangeBoundTextBox.__Constraints
+ //
+ // rangeMessage: String
+ // The message to display if value is out-of-range
+
+ /*=====
+ constraints: {},
+ ======*/
+ rangeMessage: "",
+
+ compare: function(/*anything*/val1, /*anything*/val2){
+ // summary: compare 2 values
+ return val1 - val2; // anything
+ },
+
+ rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){
+ // summary: user replaceable function used to validate the range of the numeric input value
+ var isMin = "min" in constraints;
+ var isMax = "max" in constraints;
+ if(isMin || isMax){
+ return (!isMin || this.compare(primitive,constraints.min) >= 0) &&
+ (!isMax || this.compare(primitive,constraints.max) <= 0);
+ }
+ return true; // Boolean
+ },
+
+ isInRange: function(/*Boolean*/ isFocused){
+ // summary: Need to over-ride with your own validation code in subclasses
+ return this.rangeCheck(this.getValue(), this.constraints);
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ return this.inherited(arguments) &&
+ ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
+ },
+
+ getErrorMessage: function(/*Boolean*/ isFocused){
+ if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ 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;
+ }
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ if(this.constraints.min !== undefined){
+ dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min);
+ }
+ if(this.constraints.max !== undefined){
+ dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
+ }
+ },
+
+ setValue: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+ dijit.setWaiState(this.focusNode, "valuenow", value);
+ this.inherited('setValue', arguments);
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/_DateTimeTextBox.js b/includes/js/dijit/form/_DateTimeTextBox.js
new file mode 100644
index 0000000..2f3b933
--- /dev/null
+++ b/includes/js/dijit/form/_DateTimeTextBox.js
@@ -0,0 +1,175 @@
+if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._DateTimeTextBox"] = true;
+dojo.provide("dijit.form._DateTimeTextBox");
+
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+dojo.require("dojo.date.stamp");
+dojo.require("dijit.form.ValidationTextBox");
+
+/*=====
+dojo.declare(
+ "dijit.form._DateTimeTextBox.__Constraints",
+ [dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions]
+);
+=====*/
+
+dojo.declare(
+ "dijit.form._DateTimeTextBox",
+ dijit.form.RangeBoundTextBox,
+ {
+ // summary:
+ // A validating, serializable, range-bound date or time text box.
+ //
+ // constraints: dijit.form._DateTimeTextBox.__Constraints
+
+ /*=====
+ constraints: {},
+ ======*/
+ regExpGen: dojo.date.locale.regexp,
+ compare: dojo.date.compare,
+ format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+ // summary: formats the value as a Date, according to constraints
+ if(!value){ return ''; }
+ return dojo.date.locale.format(value, constraints);
+ },
+ parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+ // summary: parses the value as a Date, according to constraints
+ return dojo.date.locale.parse(value, constraints) || undefined; /* can't return null to getValue since that's special */
+ },
+
+ serialize: dojo.date.stamp.toISOString,
+
+ // value: Date
+ // The value of this widget as a JavaScript Date object. Use `getValue`/`setValue` to manipulate.
+ // When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
+ value: new Date(""), // value.toString()="NaN"
+
+ // popupClass: String
+ // Name of the popup widget class used to select a date/time
+ popupClass: "", // default is no popup = text only
+ _selector: "",
+
+ postMixInProperties: function(){
+ //dijit.form.RangeBoundTextBox.prototype.postMixInProperties.apply(this, arguments);
+ this.inherited(arguments);
+ if(!this.value || this.value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
+ this.value = undefined;
+ }
+ var constraints = this.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); }
+ },
+
+ _onFocus: function(/*Event*/ evt){
+ // summary: open the TimePicker popup
+ this._open();
+ },
+
+ setValue: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // Sets the date on this textbox. Note that `value` must be a Javascript Date object.
+ this.inherited(arguments);
+ if(this._picker){
+ // #3948: fix blank date on popup only
+ if(!value){value=new Date();}
+ this._picker.setValue(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){
+
+ 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.setValue.call(textBox, value, true);
+ },
+ lang: textBox.lang,
+ constraints: textBox.constraints,
+ 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, "date") > 0) ||
+ (constraints.max && compare(constraints.max, date, "date") < 0));
+ }
+ });
+ this._picker.setValue(this.getValue() || new Date());
+ }
+ if(!this._opened){
+ dijit.popup.open({
+ parent: this,
+ popup: this._picker,
+ 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.
+ },
+
+ getDisplayedValue:function(){
+ return this.textbox.value;
+ },
+
+ setDisplayedValue:function(/*String*/ value, /*Boolean?*/ priorityChange){
+ this.setValue(this.parse(value, this.constraints), priorityChange, value);
+ },
+
+ destroy: function(){
+ if(this._picker){
+ this._picker.destroy();
+ delete this._picker;
+ }
+ this.inherited(arguments);
+ },
+
+ _onKeyPress: function(/*Event*/e){
+ if(dijit.form._DateTimeTextBox.superclass._onKeyPress.apply(this, arguments)){
+ if(this._opened && e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+ this._close();
+ dojo.stopEvent(e);
+ }
+ }
+ }
+ }
+);
+
+}
diff --git a/includes/js/dijit/form/_FormWidget.js b/includes/js/dijit/form/_FormWidget.js
new file mode 100644
index 0000000..5f29df2
--- /dev/null
+++ b/includes/js/dijit/form/_FormWidget.js
@@ -0,0 +1,340 @@
+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("dijit._Widget");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
+{
+ /*
+ Summary:
+ _FormWidget's correspond to native HTML elements such as <checkbox> or <button>.
+ Each _FormWidget 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.
+
+ They also share some common methods.
+ */
+
+ // baseClass: String
+ // Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
+ // (ex: "dijitTextBox dijitTextBoxInvalid dijitTextBoxFocused dijitTextBoxInvalidFocused")
+ // See _setStateClass().
+ baseClass: "",
+
+ // 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,
+
+ // 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,
+
+ // intermediateChanges: Boolean
+ // Fires onChange for each value change or only on demand
+ intermediateChanges: false,
+
+ // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
+ // 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.
+ attributeMap: dojo.mixin(dojo.clone(dijit._Widget.prototype.attributeMap),
+ {value:"focusNode", disabled:"focusNode", readOnly:"focusNode", id:"focusNode", tabIndex:"focusNode", alt:"focusNode"}),
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ this.inherited(arguments);
+ switch(attr){
+ case "disabled":
+ var tabIndexNode = this[this.attributeMap['tabIndex']||'domNode'];
+ if(value){
+ //reset those, because after the domNode is disabled, we can no longer receive
+ //mouse related events, see #4200
+ this._hovering = false;
+ this._active = false;
+ // remove the tabIndex, especially for FF
+ tabIndexNode.removeAttribute('tabIndex');
+ }else{
+ tabIndexNode.setAttribute('tabIndex', this.tabIndex);
+ }
+ dijit.setWaiState(this[this.attributeMap['disabled']||'domNode'], "disabled", value);
+ this._setStateClass();
+ }
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Set disabled state of widget (Deprecated).
+ dojo.deprecated("setDisabled("+disabled+") is deprecated. Use setAttribute('disabled',"+disabled+") instead.", "", "2.0");
+ this.setAttribute('disabled', disabled);
+ },
+
+
+ _onMouse : function(/*Event*/ event){
+ // summary:
+ // Sets _hovering, _active, and stateModifier properties depending on mouse state,
+ // then calls setStateClass() to set appropriate CSS classes for this.domNode.
+ //
+ // To get a different CSS class for hover, send onmouseover and onmouseout events to this method.
+ // To get a different CSS class while mouse button is depressed, send onmousedown to this method.
+
+ var mouseNode = event.currentTarget;
+ if(mouseNode && mouseNode.getAttribute){
+ this.stateModifier = mouseNode.getAttribute("stateModifier") || "";
+ }
+
+ if(!this.disabled){
+ switch(event.type){
+ case "mouseenter":
+ case "mouseover":
+ this._hovering = true;
+ this._active = this._mouseDown;
+ break;
+
+ case "mouseout":
+ case "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 the button
+ var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){
+ this._active = false;
+ this._mouseDown = false;
+ this._setStateClass();
+ this.disconnect(mouseUpConnector);
+ });
+ if(this.isFocusable()){ this.focus(); }
+ break;
+ }
+ this._setStateClass();
+ }
+ },
+
+ isFocusable: function(){
+ return !this.disabled && !this.readOnly && this.focusNode && (dojo.style(this.domNode, "display") != "none");
+ },
+
+ focus: function(){
+ setTimeout(dojo.hitch(this, dijit.focus, this.focusNode), 0); // cannot call focus() from an event handler directly
+ },
+
+ _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).
+ //
+ // 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".
+ //
+ // For complex widgets with multiple regions, there can be various hover/active states,
+ // such as "Hover" or "CloseButtonHover" (for tab buttons).
+ // This is controlled by a stateModifier="CloseButton" attribute on the close button node.
+ //
+ // 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
+
+ // Get original (non state related, non baseClass related) class specified in template
+ if(!("staticClass" in this)){
+ this.staticClass = (this.stateNode||this.domNode).className;
+ }
+
+ // Compute new set of classes
+ var classes = [ this.baseClass ];
+
+ function multiply(modifier){
+ classes=classes.concat(dojo.map(classes, function(c){ return c+modifier; }), "dijit"+modifier);
+ }
+
+ 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(this.stateModifier+"Active");
+ }else{
+ if(this._focused){
+ multiply("Focused");
+ }
+ if(this._hovering){
+ multiply(this.stateModifier+"Hover");
+ }
+ }
+
+ (this.stateNode || this.domNode).className = this.staticClass + " " + classes.join(" ");
+ },
+
+ onChange: function(newValue){
+ // summary: callback when value is changed
+ },
+
+ _onChangeMonitor: 'value',
+ _onChangeActive: false,
+
+ _handleOnChange: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ // summary: set the value of the widget.
+ this._lastValue = newValue;
+ if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){
+ this._resetValue = this._lastValueReported = newValue;
+ }
+ if((this.intermediateChanges || priorityChange || priorityChange === undefined) &&
+ ((newValue && newValue.toString)?newValue.toString():newValue) !== ((this._lastValueReported && this._lastValueReported.toString)?this._lastValueReported.toString():this._lastValueReported)){
+ this._lastValueReported = newValue;
+ if(this._onChangeActive){ this.onChange(newValue); }
+ }
+ },
+
+ reset: function(){
+ this._hasBeenBlurred = false;
+ if(this.setValue && !this._getValueDeprecated){
+ this.setValue(this._resetValue, true);
+ }else if(this._onChangeMonitor){
+ this.setAttribute(this._onChangeMonitor, (this._resetValue !== undefined && this._resetValue !== null)? this._resetValue : '');
+ }
+ },
+
+ create: function(){
+ this.inherited(arguments);
+ this._onChangeActive = true;
+ this._setStateClass();
+ },
+
+ destroy: function(){
+ if(this._layoutHackHandle){
+ clearTimeout(this._layoutHackHandle);
+ }
+ this.inherited(arguments);
+ },
+
+ setValue: function(/*String*/ value){
+ dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use setAttribute('value',"+value+") instead.", "", "2.0");
+ this.setAttribute('value', value);
+ },
+
+ _getValueDeprecated: true, // Form uses this, remove when getValue is removed
+ getValue: function(){
+ dojo.deprecated("dijit.form._FormWidget:getValue() is deprecated. Use widget.value instead.", "", "2.0");
+ return this.value;
+ },
+
+ _layoutHack: function(){
+ // summary: work around table sizing bugs on FF2 by forcing redraw
+ if(dojo.isFF == 2){
+ var node=this.domNode;
+ var old = node.style.opacity;
+ node.style.opacity = "0.999";
+ this._layoutHackHandle = setTimeout(dojo.hitch(this, function(){
+ this._layoutHackHandle = null;
+ node.style.opacity = old;
+ }), 0);
+ }
+ }
+});
+
+dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
+{
+ /*
+ Summary:
+ _FormValueWidget's correspond to native HTML elements such as <input> or <select> that have user changeable values.
+ Each _ValueWidget represents a single input value, and has a (possibly hidden) <input> element,
+ to which it serializes its input value, so that form submission (either normal submission or via FormBind?)
+ works as expected.
+ */
+
+ attributeMap: dojo.mixin(dojo.clone(dijit.form._FormWidget.prototype.attributeMap),
+ {value:""}),
+
+ postCreate: function(){
+ this.setValue(this.value, null);
+ },
+
+ setValue: function(/*anything*/ newValue, /*Boolean, optional*/ priorityChange){
+ // summary: set the value of the widget.
+ this.value = newValue;
+ this._handleOnChange(newValue, priorityChange);
+ },
+
+ _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.setValue(this._lastValueReported, false);
+ },
+
+ _valueChanged: function(){
+ var v = this.getValue();
+ var lv = this._lastValueReported;
+ // Equality comparison of objects such as dates are done by reference so
+ // two distinct objects are != even if they have the same data. So use
+ // toStrings in case the values are objects.
+ return ((v !== null && (v !== undefined) && v.toString)?v.toString():'') !== ((lv !== null && (lv !== undefined) && lv.toString)?lv.toString():'');
+ },
+
+ _onKeyPress: function(e){
+ if(e.keyCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+ if(this._valueChanged()){
+ this.undo();
+ dojo.stopEvent(e);
+ return false;
+ }
+ }
+ return true;
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/_Spinner.js b/includes/js/dijit/form/_Spinner.js
new file mode 100644
index 0000000..6837552
--- /dev/null
+++ b/includes/js/dijit/form/_Spinner.js
@@ -0,0 +1,117 @@
+if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form._Spinner"] = true;
+dojo.provide("dijit.form._Spinner");
+
+dojo.require("dijit.form.ValidationTextBox");
+
+dojo.declare(
+ "dijit.form._Spinner",
+ dijit.form.RangeBoundTextBox,
+ {
+
+ // summary: Mixin for validation widgets with a spinner
+ // description: This class basically (conceptually) extends dijit.form.ValidationTextBox.
+ // It modifies the template to have up/down arrows, and provides related handling code.
+
+ // defaultTimeout: Number
+ // number of milliseconds before a held 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,
+
+ // 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:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContainer\"\n\t\t\t>&nbsp;<div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"UpArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div\n\t\t\t></div\n\t\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"downArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\"\n\t\t\t\tstateModifier=\"DownArrow\"\n\t\t\t\t><div class=\"dijitArrowButtonInner\">&thinsp;</div\n\t\t\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div\n\t\t\t></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitValidationIcon\"><br></div\n\t\t><div class=\"dijitReset dijitValidationIconText\">&Chi;</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class='dijitReset' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress\"\n\t\t\t\twaiRole=\"spinbutton\" autocomplete=\"off\" name=\"${name}\"\n\t\t/></div\n\t></div\n></div>\n",
+ baseClass: "dijitSpinner",
+
+ adjust: function(/* Object */ val, /*Number*/ delta){
+ // summary: user replaceable 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
+ return val;
+ },
+
+ _arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
+ this._active = pressed;
+ this.stateModifier = node.getAttribute("stateModifier") || "";
+ this._setStateClass();
+ },
+
+ _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction){
+ if(this.disabled || this.readOnly){ return; }
+ this._arrowState(nodePressed, true);
+ this.setValue(this.adjust(this.getValue(), direction*this.smallDelta), false);
+ dijit.selectInputText(this.textbox, this.textbox.value.length);
+ },
+
+ _arrowReleased: function(/*Node*/ node){
+ this._wheelTimer = null;
+ if(this.disabled || this.readOnly){ return; }
+ this._arrowState(node, false);
+ },
+
+ _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+ if(node == this.textbox){ node = (evt.keyCode == dojo.keys.UP_ARROW) ? this.upArrowNode : this.downArrowNode; }
+ if(count == -1){ this._arrowReleased(node); }
+ else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1); }
+ },
+
+ _wheelTimer: null,
+ _mouseWheeled: function(/*Event*/ evt){
+ dojo.stopEvent(evt);
+ var scrollAmount = 0;
+ if(typeof evt.wheelDelta == 'number'){ // IE
+ scrollAmount = evt.wheelDelta;
+ }else if(typeof evt.detail == 'number'){ // Mozilla+Firefox
+ scrollAmount = -evt.detail;
+ }
+ var node, dir;
+ if(scrollAmount > 0){
+ node = this.upArrowNode;
+ dir = +1;
+ }else if(scrollAmount < 0){
+ node = this.downArrowNode;
+ dir = -1;
+ }else{ return; }
+ this._arrowPressed(node, dir);
+ if(this._wheelTimer != null){
+ clearTimeout(this._wheelTimer);
+ }
+ var _this = this;
+ this._wheelTimer = setTimeout(function(){_this._arrowReleased(node);}, 50);
+ },
+
+ postCreate: function(){
+ this.inherited('postCreate', arguments);
+
+ // extra listeners
+ this.connect(this.textbox, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+ this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {keyCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+ this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {keyCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+ if(dojo.isIE){
+ // When spinner is moved from hidden to visible, call _setStateClass to remind IE to render it. (#6123)
+ var _this = this;
+ this.connect(this.domNode, "onresize",
+ function(){ setTimeout(dojo.hitch(_this,
+ function(){
+ // cause the IE expressions to rerun
+ this.upArrowNode.style.behavior = '';
+ this.downArrowNode.style.behavior = '';
+ // cause IE to rerender
+ this._setStateClass();
+ }), 0);
+ }
+ );
+ }
+ }
+});
+
+}
diff --git a/includes/js/dijit/form/nls/ComboBox.js b/includes/js/dijit/form/nls/ComboBox.js
new file mode 100644
index 0000000..49bba39
--- /dev/null
+++ b/includes/js/dijit/form/nls/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Previous choices","nextMessage":"More choices"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/Textarea.js b/includes/js/dijit/form/nls/Textarea.js
new file mode 100644
index 0000000..4b0e996
--- /dev/null
+++ b/includes/js/dijit/form/nls/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ar/ComboBox.js b/includes/js/dijit/form/nls/ar/ComboBox.js
new file mode 100644
index 0000000..d165d7e
--- /dev/null
+++ b/includes/js/dijit/form/nls/ar/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"الاختيارات السابقة ","nextMessage":"مزيد من الاختيارات "}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ar/Textarea.js b/includes/js/dijit/form/nls/ar/Textarea.js
new file mode 100644
index 0000000..fe623c6
--- /dev/null
+++ b/includes/js/dijit/form/nls/ar/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ar/validate.js b/includes/js/dijit/form/nls/ar/validate.js
new file mode 100644
index 0000000..81106f5
--- /dev/null
+++ b/includes/js/dijit/form/nls/ar/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"هذه القيمة ليس بالمدى الصحيح. ","invalidMessage":"القيمة التي تم ادخالها غير صحيحة. ","missingMessage":"يجب ادخال هذه القيمة. "}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/cs/ComboBox.js b/includes/js/dijit/form/nls/cs/ComboBox.js
new file mode 100644
index 0000000..84e0841
--- /dev/null
+++ b/includes/js/dijit/form/nls/cs/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Předchozí volby","nextMessage":"Další volby"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/cs/Textarea.js b/includes/js/dijit/form/nls/cs/Textarea.js
new file mode 100644
index 0000000..8a75ddc
--- /dev/null
+++ b/includes/js/dijit/form/nls/cs/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/cs/validate.js b/includes/js/dijit/form/nls/cs/validate.js
new file mode 100644
index 0000000..7bb7b9e
--- /dev/null
+++ b/includes/js/dijit/form/nls/cs/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/da/ComboBox.js b/includes/js/dijit/form/nls/da/ComboBox.js
new file mode 100644
index 0000000..4ddc10d
--- /dev/null
+++ b/includes/js/dijit/form/nls/da/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Forrige valg","nextMessage":"Flere valg"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/da/Textarea.js b/includes/js/dijit/form/nls/da/Textarea.js
new file mode 100644
index 0000000..244c210
--- /dev/null
+++ b/includes/js/dijit/form/nls/da/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/da/validate.js b/includes/js/dijit/form/nls/da/validate.js
new file mode 100644
index 0000000..2874dd8
--- /dev/null
+++ b/includes/js/dijit/form/nls/da/validate.js
@@ -0,0 +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
diff --git a/includes/js/dijit/form/nls/de/ComboBox.js b/includes/js/dijit/form/nls/de/ComboBox.js
new file mode 100644
index 0000000..6cce34b
--- /dev/null
+++ b/includes/js/dijit/form/nls/de/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/de/Textarea.js b/includes/js/dijit/form/nls/de/Textarea.js
new file mode 100644
index 0000000..2cf75db
--- /dev/null
+++ b/includes/js/dijit/form/nls/de/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/de/validate.js b/includes/js/dijit/form/nls/de/validate.js
new file mode 100644
index 0000000..597796d
--- /dev/null
+++ b/includes/js/dijit/form/nls/de/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/el/ComboBox.js b/includes/js/dijit/form/nls/el/ComboBox.js
new file mode 100644
index 0000000..ec294d1
--- /dev/null
+++ b/includes/js/dijit/form/nls/el/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/el/Textarea.js b/includes/js/dijit/form/nls/el/Textarea.js
new file mode 100644
index 0000000..9ce37a9
--- /dev/null
+++ b/includes/js/dijit/form/nls/el/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/el/validate.js b/includes/js/dijit/form/nls/el/validate.js
new file mode 100644
index 0000000..cc57d55
--- /dev/null
+++ b/includes/js/dijit/form/nls/el/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/es/ComboBox.js b/includes/js/dijit/form/nls/es/ComboBox.js
new file mode 100644
index 0000000..5bf69f9
--- /dev/null
+++ b/includes/js/dijit/form/nls/es/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/es/Textarea.js b/includes/js/dijit/form/nls/es/Textarea.js
new file mode 100644
index 0000000..f92a50f
--- /dev/null
+++ b/includes/js/dijit/form/nls/es/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/es/validate.js b/includes/js/dijit/form/nls/es/validate.js
new file mode 100644
index 0000000..65e190e
--- /dev/null
+++ b/includes/js/dijit/form/nls/es/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fi/ComboBox.js b/includes/js/dijit/form/nls/fi/ComboBox.js
new file mode 100644
index 0000000..6d9b830
--- /dev/null
+++ b/includes/js/dijit/form/nls/fi/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fi/Textarea.js b/includes/js/dijit/form/nls/fi/Textarea.js
new file mode 100644
index 0000000..5efaee9
--- /dev/null
+++ b/includes/js/dijit/form/nls/fi/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fi/validate.js b/includes/js/dijit/form/nls/fi/validate.js
new file mode 100644
index 0000000..276efcd
--- /dev/null
+++ b/includes/js/dijit/form/nls/fi/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fr/ComboBox.js b/includes/js/dijit/form/nls/fr/ComboBox.js
new file mode 100644
index 0000000..14b3976
--- /dev/null
+++ b/includes/js/dijit/form/nls/fr/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Choix précédents","nextMessage":"Plus de choix"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fr/Textarea.js b/includes/js/dijit/form/nls/fr/Textarea.js
new file mode 100644
index 0000000..4abb6c3
--- /dev/null
+++ b/includes/js/dijit/form/nls/fr/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/fr/validate.js b/includes/js/dijit/form/nls/fr/validate.js
new file mode 100644
index 0000000..95a0169
--- /dev/null
+++ b/includes/js/dijit/form/nls/fr/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/he/ComboBox.js b/includes/js/dijit/form/nls/he/ComboBox.js
new file mode 100644
index 0000000..169d0f5
--- /dev/null
+++ b/includes/js/dijit/form/nls/he/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/he/Textarea.js b/includes/js/dijit/form/nls/he/Textarea.js
new file mode 100644
index 0000000..809eadf
--- /dev/null
+++ b/includes/js/dijit/form/nls/he/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/he/validate.js b/includes/js/dijit/form/nls/he/validate.js
new file mode 100644
index 0000000..5b58183
--- /dev/null
+++ b/includes/js/dijit/form/nls/he/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"הערך מחוץ לטווח. ","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש. "}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/hu/ComboBox.js b/includes/js/dijit/form/nls/hu/ComboBox.js
new file mode 100644
index 0000000..4b6a620
--- /dev/null
+++ b/includes/js/dijit/form/nls/hu/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/hu/Textarea.js b/includes/js/dijit/form/nls/hu/Textarea.js
new file mode 100644
index 0000000..9b4ca01
--- /dev/null
+++ b/includes/js/dijit/form/nls/hu/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/hu/validate.js b/includes/js/dijit/form/nls/hu/validate.js
new file mode 100644
index 0000000..35edb8b
--- /dev/null
+++ b/includes/js/dijit/form/nls/hu/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Az érték kívül van a megengedett tartományon. ","invalidMessage":"A megadott érték érvénytelen. ","missingMessage":"Meg kell adni egy értéket. "}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/it/ComboBox.js b/includes/js/dijit/form/nls/it/ComboBox.js
new file mode 100644
index 0000000..9f67072
--- /dev/null
+++ b/includes/js/dijit/form/nls/it/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/it/Textarea.js b/includes/js/dijit/form/nls/it/Textarea.js
new file mode 100644
index 0000000..1b14ecc
--- /dev/null
+++ b/includes/js/dijit/form/nls/it/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/it/validate.js b/includes/js/dijit/form/nls/it/validate.js
new file mode 100644
index 0000000..af7227f
--- /dev/null
+++ b/includes/js/dijit/form/nls/it/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ja/ComboBox.js b/includes/js/dijit/form/nls/ja/ComboBox.js
new file mode 100644
index 0000000..6b34170
--- /dev/null
+++ b/includes/js/dijit/form/nls/ja/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ja/Textarea.js b/includes/js/dijit/form/nls/ja/Textarea.js
new file mode 100644
index 0000000..8a52f4a
--- /dev/null
+++ b/includes/js/dijit/form/nls/ja/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ja/validate.js b/includes/js/dijit/form/nls/ja/validate.js
new file mode 100644
index 0000000..450cd7e
--- /dev/null
+++ b/includes/js/dijit/form/nls/ja/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ko/ComboBox.js b/includes/js/dijit/form/nls/ko/ComboBox.js
new file mode 100644
index 0000000..87d0f06
--- /dev/null
+++ b/includes/js/dijit/form/nls/ko/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ko/Textarea.js b/includes/js/dijit/form/nls/ko/Textarea.js
new file mode 100644
index 0000000..5c4e916
--- /dev/null
+++ b/includes/js/dijit/form/nls/ko/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ko/validate.js b/includes/js/dijit/form/nls/ko/validate.js
new file mode 100644
index 0000000..c76c676
--- /dev/null
+++ b/includes/js/dijit/form/nls/ko/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nb/ComboBox.js b/includes/js/dijit/form/nls/nb/ComboBox.js
new file mode 100644
index 0000000..de14554
--- /dev/null
+++ b/includes/js/dijit/form/nls/nb/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Tidligere valg","nextMessage":"Flere valg"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nb/Textarea.js b/includes/js/dijit/form/nls/nb/Textarea.js
new file mode 100644
index 0000000..16fadf5
--- /dev/null
+++ b/includes/js/dijit/form/nls/nb/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme for redigeringsområde"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nb/validate.js b/includes/js/dijit/form/nls/nb/validate.js
new file mode 100644
index 0000000..2fe96f2
--- /dev/null
+++ b/includes/js/dijit/form/nls/nb/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nl/ComboBox.js b/includes/js/dijit/form/nls/nl/ComboBox.js
new file mode 100644
index 0000000..b5885d7
--- /dev/null
+++ b/includes/js/dijit/form/nls/nl/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Eerdere opties","nextMessage":"Meer opties"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nl/Textarea.js b/includes/js/dijit/form/nls/nl/Textarea.js
new file mode 100644
index 0000000..d13c3a6
--- /dev/null
+++ b/includes/js/dijit/form/nls/nl/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/nl/validate.js b/includes/js/dijit/form/nls/nl/validate.js
new file mode 100644
index 0000000..b3062c1
--- /dev/null
+++ b/includes/js/dijit/form/nls/nl/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pl/ComboBox.js b/includes/js/dijit/form/nls/pl/ComboBox.js
new file mode 100644
index 0000000..f2b4b08
--- /dev/null
+++ b/includes/js/dijit/form/nls/pl/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pl/Textarea.js b/includes/js/dijit/form/nls/pl/Textarea.js
new file mode 100644
index 0000000..8948800
--- /dev/null
+++ b/includes/js/dijit/form/nls/pl/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"obszar edycji","iframeFocusTitle":"ramka obszaru edycji"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pl/validate.js b/includes/js/dijit/form/nls/pl/validate.js
new file mode 100644
index 0000000..cf05d2f
--- /dev/null
+++ b/includes/js/dijit/form/nls/pl/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt-pt/ComboBox.js b/includes/js/dijit/form/nls/pt-pt/ComboBox.js
new file mode 100644
index 0000000..2540542
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt-pt/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt-pt/Textarea.js b/includes/js/dijit/form/nls/pt-pt/Textarea.js
new file mode 100644
index 0000000..bcd75e7
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt-pt/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt-pt/validate.js b/includes/js/dijit/form/nls/pt-pt/validate.js
new file mode 100644
index 0000000..c9312e2
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt-pt/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"O valor é requerido."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt/ComboBox.js b/includes/js/dijit/form/nls/pt/ComboBox.js
new file mode 100644
index 0000000..2540542
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt/Textarea.js b/includes/js/dijit/form/nls/pt/Textarea.js
new file mode 100644
index 0000000..7fc20ab
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/pt/validate.js b/includes/js/dijit/form/nls/pt/validate.js
new file mode 100644
index 0000000..fab945e
--- /dev/null
+++ b/includes/js/dijit/form/nls/pt/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Este valor está fora dos limites.","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ru/ComboBox.js b/includes/js/dijit/form/nls/ru/ComboBox.js
new file mode 100644
index 0000000..193f4ee
--- /dev/null
+++ b/includes/js/dijit/form/nls/ru/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ru/Textarea.js b/includes/js/dijit/form/nls/ru/Textarea.js
new file mode 100644
index 0000000..ad7ad22
--- /dev/null
+++ b/includes/js/dijit/form/nls/ru/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/ru/validate.js b/includes/js/dijit/form/nls/ru/validate.js
new file mode 100644
index 0000000..35fb5ca
--- /dev/null
+++ b/includes/js/dijit/form/nls/ru/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/sv/ComboBox.js b/includes/js/dijit/form/nls/sv/ComboBox.js
new file mode 100644
index 0000000..860bf75
--- /dev/null
+++ b/includes/js/dijit/form/nls/sv/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/sv/Textarea.js b/includes/js/dijit/form/nls/sv/Textarea.js
new file mode 100644
index 0000000..9e508ac
--- /dev/null
+++ b/includes/js/dijit/form/nls/sv/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/sv/validate.js b/includes/js/dijit/form/nls/sv/validate.js
new file mode 100644
index 0000000..8c1b537
--- /dev/null
+++ b/includes/js/dijit/form/nls/sv/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/tr/ComboBox.js b/includes/js/dijit/form/nls/tr/ComboBox.js
new file mode 100644
index 0000000..46f71dc
--- /dev/null
+++ b/includes/js/dijit/form/nls/tr/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/tr/Textarea.js b/includes/js/dijit/form/nls/tr/Textarea.js
new file mode 100644
index 0000000..3f2b5e7
--- /dev/null
+++ b/includes/js/dijit/form/nls/tr/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/tr/validate.js b/includes/js/dijit/form/nls/tr/validate.js
new file mode 100644
index 0000000..838dbda
--- /dev/null
+++ b/includes/js/dijit/form/nls/tr/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/validate.js b/includes/js/dijit/form/nls/validate.js
new file mode 100644
index 0000000..29a1a47
--- /dev/null
+++ b/includes/js/dijit/form/nls/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh-tw/ComboBox.js b/includes/js/dijit/form/nls/zh-tw/ComboBox.js
new file mode 100644
index 0000000..ead5fa6
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh-tw/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh-tw/Textarea.js b/includes/js/dijit/form/nls/zh-tw/Textarea.js
new file mode 100644
index 0000000..cb7abda
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh-tw/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh-tw/validate.js b/includes/js/dijit/form/nls/zh-tw/validate.js
new file mode 100644
index 0000000..b398a31
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh-tw/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh/ComboBox.js b/includes/js/dijit/form/nls/zh/ComboBox.js
new file mode 100644
index 0000000..7cc92cf
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh/ComboBox.js
@@ -0,0 +1 @@
+({"previousMessage":"先前选项","nextMessage":"更多选项"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh/Textarea.js b/includes/js/dijit/form/nls/zh/Textarea.js
new file mode 100644
index 0000000..e1cf172
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh/Textarea.js
@@ -0,0 +1 @@
+({"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/nls/zh/validate.js b/includes/js/dijit/form/nls/zh/validate.js
new file mode 100644
index 0000000..e2c01f5
--- /dev/null
+++ b/includes/js/dijit/form/nls/zh/validate.js
@@ -0,0 +1 @@
+({"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"}) \ No newline at end of file
diff --git a/includes/js/dijit/form/templates/Button.html b/includes/js/dijit/form/templates/Button.html
new file mode 100644
index 0000000..09dbad8
--- /dev/null
+++ b/includes/js/dijit/form/templates/Button.html
@@ -0,0 +1,11 @@
+<div class="dijit dijitReset dijitLeft dijitInline"
+ dojoAttachEvent="onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse"
+ waiRole="presentation"
+ ><button class="dijitReset dijitStretch dijitButtonNode dijitButtonContents" dojoAttachPoint="focusNode,titleNode"
+ type="${type}" waiRole="button" waiState="labelledby-${id}_label"
+ ><span class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode"
+ ><span class="dijitReset dijitToggleButtonIconChar">&#10003;</span
+ ></span
+ ><div class="dijitReset dijitInline"><center class="dijitReset dijitButtonText" id="${id}_label" dojoAttachPoint="containerNode">${label}</center></div
+ ></button
+></div>
diff --git a/includes/js/dijit/form/templates/CheckBox.html b/includes/js/dijit/form/templates/CheckBox.html
new file mode 100644
index 0000000..580b820
--- /dev/null
+++ b/includes/js/dijit/form/templates/CheckBox.html
@@ -0,0 +1,7 @@
+<div class="dijitReset dijitInline" waiRole="presentation"
+ ><input
+ type="${type}" name="${name}"
+ class="dijitReset dijitCheckBoxInput"
+ dojoAttachPoint="focusNode"
+ dojoAttachEvent="onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick"
+/></div>
diff --git a/includes/js/dijit/form/templates/ComboBox.html b/includes/js/dijit/form/templates/ComboBox.html
new file mode 100644
index 0000000..b957b54
--- /dev/null
+++ b/includes/js/dijit/form/templates/ComboBox.html
@@ -0,0 +1,19 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+ id="widget_${id}"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" dojoAttachPoint="comboNode" waiRole="combobox" tabIndex="-1"
+ ><div style="overflow:hidden;"
+ ><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'
+ dojoAttachPoint="downArrowNode" waiRole="presentation"
+ dojoAttachEvent="onmousedown:_onArrowMouseDown,onmouseup:_onMouse,onmouseenter:_onMouse,onmouseleave:_onMouse"
+ ><div class="dijitArrowButtonInner">&thinsp;</div
+ ><div class="dijitArrowButtonChar">&#9660;</div
+ ></div
+ ><div class="dijitReset dijitValidationIcon"><br></div
+ ><div class="dijitReset dijitValidationIconText">&Chi;</div
+ ><div class="dijitReset dijitInputField"
+ ><input type="text" autocomplete="off" name="${name}" class='dijitReset'
+ dojoAttachEvent="onkeypress:_onKeyPress, onfocus:_update, compositionend,onkeyup"
+ dojoAttachPoint="textbox,focusNode" waiRole="textbox" waiState="haspopup-true,autocomplete-list"
+ /></div
+ ></div
+></div>
diff --git a/includes/js/dijit/form/templates/ComboButton.html b/includes/js/dijit/form/templates/ComboButton.html
new file mode 100644
index 0000000..6b46ea0
--- /dev/null
+++ b/includes/js/dijit/form/templates/ComboButton.html
@@ -0,0 +1,21 @@
+<table class='dijit dijitReset dijitInline dijitLeft'
+ cellspacing='0' cellpadding='0' waiRole="presentation"
+ ><tbody waiRole="presentation"><tr waiRole="presentation"
+ ><td class="dijitReset dijitStretch dijitButtonContents dijitButtonNode"
+ tabIndex="${tabIndex}"
+ dojoAttachEvent="ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" dojoAttachPoint="titleNode"
+ waiRole="button" waiState="labelledby-${id}_label"
+ ><div class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode" waiRole="presentation"></div
+ ><div class="dijitReset dijitInline dijitButtonText" id="${id}_label" dojoAttachPoint="containerNode" waiRole="presentation">${label}</div
+ ></td
+ ><td class='dijitReset dijitStretch dijitButtonNode dijitArrowButton dijitDownArrowButton'
+ dojoAttachPoint="popupStateNode,focusNode"
+ dojoAttachEvent="ondijitclick:_onArrowClick, onkeypress:_onKey,onmouseenter:_onMouse,onmouseleave:_onMouse"
+ stateModifier="DownArrow"
+ title="${optionsTitle}" name="${name}"
+ waiRole="button" waiState="haspopup-true"
+ ><div class="dijitReset dijitArrowButtonInner" waiRole="presentation">&thinsp;</div
+ ><div class="dijitReset dijitArrowButtonChar" waiRole="presentation">&#9660;</div
+ ></td
+ ></tr></tbody
+></table>
diff --git a/includes/js/dijit/form/templates/DropDownButton.html b/includes/js/dijit/form/templates/DropDownButton.html
new file mode 100644
index 0000000..2e62f55
--- /dev/null
+++ b/includes/js/dijit/form/templates/DropDownButton.html
@@ -0,0 +1,13 @@
+<div class="dijit dijitReset dijitLeft dijitInline"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey"
+ waiRole="presentation"
+ ><div class='dijitReset dijitRight' waiRole="presentation"
+ ><button class="dijitReset dijitStretch dijitButtonNode dijitButtonContents" type="${type}"
+ dojoAttachPoint="focusNode,titleNode" waiRole="button" waiState="haspopup-true,labelledby-${id}_label"
+ ><div class="dijitReset dijitInline ${iconClass}" dojoAttachPoint="iconNode" waiRole="presentation"></div
+ ><div class="dijitReset dijitInline dijitButtonText" dojoAttachPoint="containerNode,popupStateNode" waiRole="presentation"
+ id="${id}_label">${label}</div
+ ><div class="dijitReset dijitInline dijitArrowButtonInner" waiRole="presentation">&thinsp;</div
+ ><div class="dijitReset dijitInline dijitArrowButtonChar" waiRole="presentation">&#9660;</div
+ ></button
+></div></div>
diff --git a/includes/js/dijit/form/templates/HorizontalSlider.html b/includes/js/dijit/form/templates/HorizontalSlider.html
new file mode 100644
index 0000000..4dac451
--- /dev/null
+++ b/includes/js/dijit/form/templates/HorizontalSlider.html
@@ -0,0 +1,37 @@
+<table class="dijit dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none"
+ ><tr class="dijitReset"
+ ><td class="dijitReset" colspan="2"></td
+ ><td dojoAttachPoint="containerNode,topDecoration" class="dijitReset" style="text-align:center;width:100%;"></td
+ ><td class="dijitReset" colspan="2"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH"
+ ><div class="dijitSliderDecrementIconH" tabIndex="-1" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onclick: decrement"><span class="dijitSliderButtonInner">-</span></div
+ ></td
+ ><td class="dijitReset"
+ ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper dijitSliderLeftBumper" dojoAttachEvent="onclick:_onClkDecBumper"></div
+ ></td
+ ><td class="dijitReset"
+ ><input dojoAttachPoint="valueNode" type="hidden" name="${name}"
+ /><div waiRole="presentation" style="position:relative;" dojoAttachPoint="sliderBarContainer"
+ ><div waiRole="presentation" dojoAttachPoint="progressBar" class="dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH" dojoAttachEvent="onclick:_onBarClick"
+ ><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable dijitSliderMoveableH" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_onHandleClick" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"
+ ><div class="dijitSliderImageHandle dijitSliderImageHandleH"></div
+ ></div
+ ></div
+ ><div waiRole="presentation" dojoAttachPoint="remainingBar" class="dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH" dojoAttachEvent="onclick:_onBarClick"></div
+ ></div
+ ></td
+ ><td class="dijitReset"
+ ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper dijitSliderRightBumper" dojoAttachEvent="onclick:_onClkIncBumper"></div
+ ></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH" style="right:0px;"
+ ><div class="dijitSliderIncrementIconH" tabIndex="-1" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onclick: increment"><span class="dijitSliderButtonInner">+</span></div
+ ></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset" colspan="2"></td
+ ><td dojoAttachPoint="containerNode,bottomDecoration" class="dijitReset" style="text-align:center;"></td
+ ><td class="dijitReset" colspan="2"></td
+ ></tr
+></table>
diff --git a/includes/js/dijit/form/templates/InlineEditBox.html b/includes/js/dijit/form/templates/InlineEditBox.html
new file mode 100644
index 0000000..6db3496
--- /dev/null
+++ b/includes/js/dijit/form/templates/InlineEditBox.html
@@ -0,0 +1,12 @@
+<span
+ ><fieldset dojoAttachPoint="editNode" style="display:none;" waiRole="presentation"
+ ><div dojoAttachPoint="containerNode" dojoAttachEvent="onkeypress:_onEditWidgetKeyPress"></div
+ ><div dojoAttachPoint="buttonContainer"
+ ><button class='saveButton' dojoAttachPoint="saveButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:save">${buttonSave}</button
+ ><button class='cancelButton' dojoAttachPoint="cancelButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:cancel">${buttonCancel}</button
+ ></div
+ ></fieldset
+ ><span tabIndex="0" dojoAttachPoint="textNode,focusNode" waiRole="button" style="display:none;"
+ dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onClick,onmouseout:_onMouseOut,onmouseover:_onMouseOver,onfocus:_onMouseOver,onblur:_onMouseOut"
+ ></span
+></span>
diff --git a/includes/js/dijit/form/templates/Spinner.html b/includes/js/dijit/form/templates/Spinner.html
new file mode 100644
index 0000000..981c698
--- /dev/null
+++ b/includes/js/dijit/form/templates/Spinner.html
@@ -0,0 +1,28 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+ id="widget_${id}"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" waiRole="presentation"
+ ><div class="dijitInputLayoutContainer"
+ ><div class="dijitReset dijitSpinnerButtonContainer"
+ >&nbsp;<div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton"
+ dojoAttachPoint="upArrowNode"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse"
+ stateModifier="UpArrow"
+ ><div class="dijitArrowButtonInner">&thinsp;</div
+ ><div class="dijitArrowButtonChar">&#9650;</div
+ ></div
+ ><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton"
+ dojoAttachPoint="downArrowNode"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse"
+ stateModifier="DownArrow"
+ ><div class="dijitArrowButtonInner">&thinsp;</div
+ ><div class="dijitArrowButtonChar">&#9660;</div
+ ></div
+ ></div
+ ><div class="dijitReset dijitValidationIcon"><br></div
+ ><div class="dijitReset dijitValidationIconText">&Chi;</div
+ ><div class="dijitReset dijitInputField"
+ ><input class='dijitReset' dojoAttachPoint="textbox,focusNode" type="${type}" dojoAttachEvent="onfocus:_update,onkeyup:_onkeyup,onkeypress:_onKeyPress"
+ waiRole="spinbutton" autocomplete="off" name="${name}"
+ /></div
+ ></div
+></div>
diff --git a/includes/js/dijit/form/templates/TextBox.html b/includes/js/dijit/form/templates/TextBox.html
new file mode 100644
index 0000000..804fe1e
--- /dev/null
+++ b/includes/js/dijit/form/templates/TextBox.html
@@ -0,0 +1,4 @@
+<input class="dijit dijitReset dijitLeft" dojoAttachPoint='textbox,focusNode' name="${name}"
+ dojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse,onfocus:_onMouse,onblur:_onMouse,onkeypress:_onKeyPress,onkeyup'
+ autocomplete="off" type="${type}"
+ /> \ No newline at end of file
diff --git a/includes/js/dijit/form/templates/TimePicker.html b/includes/js/dijit/form/templates/TimePicker.html
new file mode 100644
index 0000000..0bf3c40
--- /dev/null
+++ b/includes/js/dijit/form/templates/TimePicker.html
@@ -0,0 +1,5 @@
+<div id="widget_${id}" class="dijitMenu"
+ ><div dojoAttachPoint="upArrow" class="dijitButtonNode"><span class="dijitTimePickerA11yText">&#9650;</span></div
+ ><div dojoAttachPoint="timeMenu,focusNode" dojoAttachEvent="onclick:_onOptionSelected,onmouseover,onmouseout"></div
+ ><div dojoAttachPoint="downArrow" class="dijitButtonNode"><span class="dijitTimePickerA11yText">&#9660;</span></div
+></div>
diff --git a/includes/js/dijit/form/templates/ValidationTextBox.html b/includes/js/dijit/form/templates/ValidationTextBox.html
new file mode 100644
index 0000000..2bdb674
--- /dev/null
+++ b/includes/js/dijit/form/templates/ValidationTextBox.html
@@ -0,0 +1,12 @@
+<div class="dijit dijitReset dijitInlineTable dijitLeft"
+ id="widget_${id}"
+ dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" waiRole="presentation"
+ ><div style="overflow:hidden;"
+ ><div class="dijitReset dijitValidationIcon"><br></div
+ ><div class="dijitReset dijitValidationIconText">&Chi;</div
+ ><div class="dijitReset dijitInputField"
+ ><input class="dijitReset" dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus:_update,onkeyup:_onkeyup,onblur:_onMouse,onkeypress:_onKeyPress' autocomplete="off"
+ type='${type}' name='${name}'
+ /></div
+ ></div
+></div>
diff --git a/includes/js/dijit/form/templates/VerticalSlider.html b/includes/js/dijit/form/templates/VerticalSlider.html
new file mode 100644
index 0000000..88b2951
--- /dev/null
+++ b/includes/js/dijit/form/templates/VerticalSlider.html
@@ -0,0 +1,46 @@
+<table class="dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none"
+><tbody class="dijitReset"
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+ ><div class="dijitSliderIncrementIconV" tabIndex="-1" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onclick:_topButtonClicked"><span class="dijitSliderButtonInner">+</span></div
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset"
+ ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper dijitSliderTopBumper" dojoAttachEvent="onclick:_onClkIncBumper"></div></center
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td dojoAttachPoint="leftDecoration" class="dijitReset" style="text-align:center;height:100%;"></td
+ ><td class="dijitReset" style="height:100%;"
+ ><input dojoAttachPoint="valueNode" type="hidden" name="${name}"
+ /><center waiRole="presentation" style="position:relative;height:100%;" dojoAttachPoint="sliderBarContainer"
+ ><div waiRole="presentation" dojoAttachPoint="remainingBar" class="dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV" dojoAttachEvent="onclick:_onBarClick"><!--#5629--></div
+ ><div waiRole="presentation" dojoAttachPoint="progressBar" class="dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV" dojoAttachEvent="onclick:_onBarClick"
+ ><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_onHandleClick" style="vertical-align:top;" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"
+ ><div class="dijitSliderImageHandle dijitSliderImageHandleV"></div
+ ></div
+ ></div
+ ></center
+ ></td
+ ><td dojoAttachPoint="containerNode,rightDecoration" class="dijitReset" style="text-align:center;height:100%;"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset"
+ ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper dijitSliderBottomBumper" dojoAttachEvent="onclick:_onClkDecBumper"></div></center
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+ ><div class="dijitSliderDecrementIconV" tabIndex="-1" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onclick:_bottomButtonClicked"><span class="dijitSliderButtonInner">-</span></div
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+></tbody></table>
diff --git a/includes/js/dijit/layout/AccordionContainer.js b/includes/js/dijit/layout/AccordionContainer.js
new file mode 100644
index 0000000..12f8945
--- /dev/null
+++ b/includes/js/dijit/layout/AccordionContainer.js
@@ -0,0 +1,229 @@
+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.layout.StackContainer");
+dojo.require("dijit.layout.ContentPane");
+
+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.AccordionPane" title="pane 1">
+ // | <div dojoType="dijit.layout.ContentPane">...</div>
+ // | </div>
+ // | <div dojoType="dijit.layout.AccordionPane" title="pane 2">
+ // | <p>This is some text</p>
+ // || ...
+ // | </div>
+ //
+ // duration: Integer
+ // Amount of time (in ms) it takes to slide panes
+ duration: 250,
+
+ _verticalSpace: 0,
+
+ postCreate: function(){
+ this.domNode.style.overflow="hidden";
+ this.inherited("postCreate",arguments);
+ dijit.setWaiRole(this.domNode, "tablist");
+ dojo.addClass(this.domNode,"dijitAccordionContainer");
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ this.inherited("startup",arguments);
+ if(this.selectedChildWidget){
+ var style = this.selectedChildWidget.containerNode.style;
+ style.display = "";
+ style.overflow = "auto";
+ this.selectedChildWidget._setSelectedState(true);
+ }
+ },
+
+ layout: function(){
+ // summary:
+ // Set the height of the open pane based on what room remains
+
+ // get cumulative height of all the title bars, and figure out which pane is open
+ var totalCollapsedHeight = 0;
+ var openPane = this.selectedChildWidget;
+ dojo.forEach(this.getChildren(), function(child){
+ totalCollapsedHeight += child.getTitleHeight();
+ });
+ var mySize = this._contentBox;
+ this._verticalSpace = (mySize.h - totalCollapsedHeight);
+ if(openPane){
+ openPane.containerNode.style.height = this._verticalSpace + "px";
+/***
+TODO: this is wrong. probably you wanted to call resize on the SplitContainer
+inside the AccordionPane??
+ if(openPane.resize){
+ openPane.resize({h: this._verticalSpace});
+ }
+***/
+ }
+ },
+
+ _setupChild: function(/*Widget*/ page){
+ // Summary: prepare the given child
+ return page;
+ },
+
+ _transition: function(/*Widget?*/newWidget, /*Widget?*/oldWidget){
+//TODO: should be able to replace this with calls to slideIn/slideOut
+ if(this._inTransition){ return; }
+ this._inTransition = true;
+ var animations = [];
+ var paneHeight = this._verticalSpace;
+ if(newWidget){
+ newWidget.setSelected(true);
+ var newContents = newWidget.containerNode;
+ newContents.style.display = "";
+
+ animations.push(dojo.animateProperty({
+ node: newContents,
+ duration: this.duration,
+ properties: {
+ height: { start: "1", end: paneHeight }
+ },
+ onEnd: function(){
+ newContents.style.overflow = "auto";
+ }
+ }));
+ }
+ if(oldWidget){
+ oldWidget.setSelected(false);
+ var oldContents = oldWidget.containerNode;
+ oldContents.style.overflow = "hidden";
+ animations.push(dojo.animateProperty({
+ node: oldContents,
+ duration: this.duration,
+ properties: {
+ height: { start: paneHeight, end: "1" }
+ },
+ onEnd: function(){
+ oldContents.style.display = "none";
+ }
+ }));
+ }
+
+ this._inTransition = false;
+
+ dojo.fx.combine(animations).play();
+ },
+
+ // note: we are treating the container as controller here
+ _onKeyPress: function(/*Event*/ e){
+ if(this.disabled || e.altKey || !(e._dijitWidget || e.ctrlKey)){ return; }
+ var k = dojo.keys;
+ var fromTitle = e._dijitWidget;
+ switch(e.keyCode){
+ case k.LEFT_ARROW:
+ case k.UP_ARROW:
+ if (fromTitle){
+ this._adjacent(false)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.PAGE_UP:
+ if (e.ctrlKey){
+ this._adjacent(false)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.RIGHT_ARROW:
+ case k.DOWN_ARROW:
+ if (fromTitle){
+ this._adjacent(true)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ case k.PAGE_DOWN:
+ if (e.ctrlKey){
+ this._adjacent(true)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+ break;
+ default:
+ if(e.ctrlKey && e.keyCode == k.TAB){
+ this._adjacent(e._dijitWidget, !e.shiftKey)._onTitleClick();
+ dojo.stopEvent(e);
+ }
+
+ }
+ }
+ }
+);
+
+dojo.declare("dijit.layout.AccordionPane",
+ [dijit.layout.ContentPane, dijit._Templated, dijit._Contained],
+ {
+ // summary:
+ // AccordionPane is a ContentPane with a title that may contain another widget.
+ // Nested layout widgets, such as SplitContainer, are not supported at this time.
+ // example:
+ // | see dijit.layout.AccordionContainer
+
+ templateString:"<div class='dijitAccordionPane'\n\t><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\"\n\t\t><div class='dijitAccordionArrow' waiRole=\"presentation\"></div\n\t\t><div class='arrowTextUp' waiRole=\"presentation\">&#9650;</div\n\t\t><div class='arrowTextDown' waiRole=\"presentation\">&#9660;</div\n\t\t><div waiRole=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div\n\t><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'\n\t\tclass='dijitAccordionBody' wairole=\"tabpanel\"\n\t></div></div>\n</div>\n",
+
+ postCreate: function(){
+ this.inherited("postCreate",arguments)
+ dojo.setSelectable(this.titleNode, false);
+ this.setSelected(this.selected);
+ },
+
+ getTitleHeight: function(){
+ // summary: returns the height of the title dom node
+ return dojo.marginBox(this.titleNode).h; // Integer
+ },
+
+ _onTitleClick: function(){
+ // summary: callback when someone clicks my title
+ var parent = this.getParent();
+ if(!parent._inTransition){
+ parent.selectChild(this);
+ dijit.focus(this.focusNode);
+ }
+ },
+
+ _onTitleKeyPress: function(/*Event*/ evt){
+ evt._dijitWidget = this;
+ return this.getParent()._onKeyPress(evt);
+ },
+
+ _setSelectedState: function(/*Boolean*/ isSelected){
+ this.selected = isSelected;
+ dojo[(isSelected ? "addClass" : "removeClass")](this.titleNode,"dijitAccordionTitle-selected");
+ this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
+ },
+
+ _handleFocus: function(/*Event*/e){
+ // summary: handle the blur and focus state of this widget
+ dojo[(e.type=="focus" ? "addClass" : "removeClass")](this.focusNode,"dijitAccordionFocused");
+ },
+
+ setSelected: function(/*Boolean*/ isSelected){
+ // summary: change the selected state on this pane
+ this._setSelectedState(isSelected);
+ if(isSelected){
+ this.onSelected();
+ this._loadCheck(true); // if href specified, trigger load
+ }
+ },
+
+ onSelected: function(){
+ // summary: called when this pane is selected
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/BorderContainer.js b/includes/js/dijit/layout/BorderContainer.js
new file mode 100644
index 0000000..4419fe4
--- /dev/null
+++ b/includes/js/dijit/layout/BorderContainer.js
@@ -0,0 +1,515 @@
+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._Widget, dijit._Container, dijit._Contained],
+ dijit.layout._LayoutWidget,
+{
+ // summary:
+ // Provides layout in 5 regions, a center and borders along its 4 sides.
+ //
+ // description:
+ // A BorderContainer is a box with a specified size (like 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. 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.
+ // Optional splitters may be specified on the edge widgets only to make them resizable by the user.
+ //
+ // example:
+ // | <style>
+ // | html, body { height: 100%; width: 100%; }
+ // | </style>
+ // | <div dojoType="BorderContainer" design="sidebar" style="width: 100%; height: 100%">
+ // | <div dojoType="ContentPane" region="top">header text</div>
+ // | <div dojoType="ContentPane" region="right" style="width: 200px;">table of contents</div>
+ // | <div dojoType="ContentPane" region="center">client area</div>
+ // | </div>
+ //
+ // design: String
+ // choose which design is used for the layout: "headline" (default) where the top and bottom extend
+ // the full width of the container, or "sidebar" where the left and right sides extend from top to bottom.
+ design: "headline",
+
+ // 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, // Boolean
+
+ // _splitterClass: String
+ // Optional hook to override the default Splitter widget used by BorderContainer
+ _splitterClass: "dijit.layout._Splitter",
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ this._splitters = {};
+ this._splitterThickness = {};
+ dojo.addClass(this.domNode, "dijitBorderContainer");
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ dojo.forEach(this.getChildren(), this._setupChild, this);
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*Widget*/child){
+ var region = child.region;
+ if(region){
+// dojo.addClass(child.domNode, "dijitBorderContainerPane");
+ child.domNode.style.position = "absolute"; // bill says not to set this in CSS, since we can't keep others
+ // from destroying the class list
+
+ var ltr = this.isLeftToRight();
+ if(region == "leading"){ region = ltr ? "left" : "right"; }
+ if(region == "trailing"){ region = ltr ? "right" : "left"; }
+
+ this["_"+region] = child.domNode;
+ this["_"+region+"Widget"] = child;
+
+ if(child.splitter){
+ var _Splitter = dojo.getObject(this._splitterClass);
+ var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'};
+ var oppNodeList = dojo.query('[region=' + flip[child.region] + ']', this.domNode);
+ var splitter = new _Splitter({ container: this, child: child, region: region,
+ oppNode: oppNodeList[0], live: this.liveSplitters });
+ this._splitters[region] = splitter.domNode;
+ dojo.place(splitter.domNode, child.domNode, "after");
+ this._computeSplitterThickness(region);
+ }
+ child.region = region;
+ }
+ },
+
+ _computeSplitterThickness: function(region){
+ var re = new RegExp("top|bottom");
+ this._splitterThickness[region] =
+ dojo.marginBox(this._splitters[region])[(re.test(region) ? 'h' : 'w')];
+ },
+
+ layout: function(){
+ this._layoutChildren();
+ },
+
+ addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+ this.inherited(arguments);
+ this._setupChild(child);
+ if(this._started){
+ this._layoutChildren(); //OPT
+ }
+ },
+
+ removeChild: function(/*Widget*/ child){
+ 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(child.region);
+ }
+ },
+
+ _layoutChildren: function(/*String?*/changedRegion){
+ 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);
+ if(this._top){
+ topStyle = layoutTopBottom && this._top.style;
+ topHeight = dojo.marginBox(this._top).h;
+ }
+ if(this._left){
+ leftStyle = layoutSides && this._left.style;
+ leftWidth = dojo.marginBox(this._left).w;
+ }
+ if(this._right){
+ rightStyle = layoutSides && this._right.style;
+ rightWidth = dojo.marginBox(this._right).w;
+ }
+ if(this._bottom){
+ bottomStyle = layoutTopBottom && this._bottom.style;
+ bottomHeight = dojo.marginBox(this._bottom).h;
+ }
+
+ var splitters = this._splitters;
+ var topSplitter = splitters.top;
+ var bottomSplitter = splitters.bottom;
+ var leftSplitter = splitters.left;
+ var rightSplitter = splitters.right;
+ var splitterThickness = this._splitterThickness;
+ var topSplitterThickness = splitterThickness.top || 0;
+ var leftSplitterThickness = splitterThickness.left || 0;
+ var rightSplitterThickness = splitterThickness.right || 0;
+ var 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(){
+ for(var region in this._splitters){
+ this._computeSplitterThickness(region);
+ }
+ this._layoutChildren();
+ }), 50);
+ return false;
+ }
+
+ var splitterBounds = {
+ left: (sidebarLayout ? leftWidth + leftSplitterThickness: "0") + "px",
+ right: (sidebarLayout ? rightWidth + rightSplitterThickness: "0") + "px"
+ };
+
+ if(topSplitter){
+ dojo.mixin(topSplitter.style, splitterBounds);
+ topSplitter.style.top = topHeight + "px";
+ }
+
+ if(bottomSplitter){
+ dojo.mixin(bottomSplitter.style, splitterBounds);
+ bottomSplitter.style.bottom = bottomHeight + "px";
+ }
+
+ splitterBounds = {
+ top: (sidebarLayout ? "0" : topHeight + topSplitterThickness) + "px",
+ bottom: (sidebarLayout ? "0" : bottomHeight + bottomSplitterThickness) + "px"
+ };
+
+ if(leftSplitter){
+ dojo.mixin(leftSplitter.style, splitterBounds);
+ leftSplitter.style.left = leftWidth + "px";
+ }
+
+ if(rightSplitter){
+ dojo.mixin(rightSplitter.style, splitterBounds);
+ rightSplitter.style.right = rightWidth + "px";
+ }
+
+ dojo.mixin(centerStyle, {
+ top: topHeight + topSplitterThickness + "px",
+ left: leftWidth + leftSplitterThickness + "px",
+ right: rightWidth + rightSplitterThickness + "px",
+ bottom: bottomHeight + bottomSplitterThickness + "px"
+ });
+
+ var bounds = {
+ top: sidebarLayout ? "0" : centerStyle.top,
+ bottom: sidebarLayout ? "0" : centerStyle.bottom
+ };
+ dojo.mixin(leftStyle, bounds);
+ dojo.mixin(rightStyle, bounds);
+ leftStyle.left = rightStyle.right = topStyle.top = bottomStyle.bottom = "0";
+ if(sidebarLayout){
+ topStyle.left = bottomStyle.left = leftWidth + (this.isLeftToRight() ? leftSplitterThickness : 0) + "px";
+ topStyle.right = bottomStyle.right = rightWidth + (this.isLeftToRight() ? 0 : rightSplitterThickness) + "px";
+ }else{
+ topStyle.left = topStyle.right = bottomStyle.left = bottomStyle.right = "0";
+ }
+
+ // Nodes in IE respond to t/l/b/r, and TEXTAREA doesn't respond in any browser
+ var janky = dojo.isIE || dojo.some(this.getChildren(), function(child){
+ return child.domNode.tagName == "TEXTAREA";
+ });
+ if(janky){
+ // Set the size of the children the old fashioned way, by calling
+ // childNode.resize({h: int, w: int}) for each child node)
+
+ var borderBox = function(n, b){
+ n=dojo.byId(n);
+ var s = dojo.getComputedStyle(n);
+ if(!b){ return dojo._getBorderBox(n, s); }
+ var me = dojo._getMarginExtents(n, s);
+ dojo._setMarginBox(n, b.l, b.t, b.w + me.w, b.h + me.h, s);
+ return null;
+ };
+
+ var resizeWidget = function(widget, dim){
+ if(widget){
+ widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
+ }
+ };
+
+ // TODO: use dim passed in to resize() (see _LayoutWidget.js resize())
+ // Then can make borderBox setBorderBox(), since no longer need to ever get the borderBox() size
+ var thisBorderBox = borderBox(this.domNode);
+
+ var containerHeight = thisBorderBox.h;
+ var middleHeight = containerHeight;
+ if(this._top){ middleHeight -= topHeight; }
+ if(this._bottom){ middleHeight -= bottomHeight; }
+ if(topSplitter){ middleHeight -= topSplitterThickness; }
+ if(bottomSplitter){ middleHeight -= bottomSplitterThickness; }
+ var centerDim = { h: middleHeight };
+
+ var sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
+ if(leftSplitter){ leftSplitter.style.height = sidebarHeight; }
+ if(rightSplitter){ rightSplitter.style.height = sidebarHeight; }
+ resizeWidget(this._leftWidget, {h: sidebarHeight});
+ resizeWidget(this._rightWidget, {h: sidebarHeight});
+
+ var containerWidth = thisBorderBox.w;
+ var middleWidth = containerWidth;
+ if(this._left){ middleWidth -= leftWidth; }
+ if(this._right){ middleWidth -= rightWidth; }
+ if(leftSplitter){ middleWidth -= leftSplitterThickness; }
+ if(rightSplitter){ middleWidth -= rightSplitterThickness; }
+ centerDim.w = middleWidth;
+
+ var sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
+ if(topSplitter){ topSplitter.style.width = sidebarWidth; }
+ if(bottomSplitter){ bottomSplitter.style.width = sidebarWidth; }
+ resizeWidget(this._topWidget, {w: sidebarWidth});
+ resizeWidget(this._bottomWidget, {w: sidebarWidth});
+
+ resizeWidget(this._centerWidget, centerDim);
+ }else{
+
+ // We've already sized the children by setting style.top/bottom/left/right...
+ // Now just need to call resize() on those children so they can re-layout themselves
+
+ // TODO: calling child.resize() without an argument is bad, because it forces
+ // the child to query it's own size (even though this function already knows
+ // the size), plus which querying the size of a node right after setting it
+ // is known to cause problems (incorrect answer or an exception).
+ // This is a setback from older layout widgets, which
+ // don't do that. See #3399, #2678, #3624 and #2955, #1988
+
+ var resizeList = {};
+ if(changedRegion){
+ resizeList[changedRegion] = resizeList.center = true;
+ if(/top|bottom/.test(changedRegion) && this.design != "sidebar"){
+ resizeList.left = resizeList.right = true;
+ }else if(/left|right/.test(changedRegion) && this.design == "sidebar"){
+ resizeList.top = resizeList.bottom = true;
+ }
+ }
+
+ dojo.forEach(this.getChildren(), function(child){
+ if(child.resize && (!changedRegion || child.region in resizeList)){
+ // console.log(this.id, ": resizing child id=" + child.id + " (region=" + child.region + "), style before resize is " +
+ // "{ t: " + child.domNode.style.top +
+ // ", b: " + child.domNode.style.bottom +
+ // ", l: " + child.domNode.style.left +
+ // ", r: " + child.domNode.style.right +
+ // ", w: " + child.domNode.style.width +
+ // ", h: " + child.domNode.style.height +
+ // "}"
+ // );
+ child.resize();
+ // console.log(this.id, ": after resize of child id=" + child.id + " (region=" + child.region + ") " +
+ // "{ t: " + child.domNode.style.top +
+ // ", b: " + child.domNode.style.bottom +
+ // ", l: " + child.domNode.style.left +
+ // ", r: " + child.domNode.style.right +
+ // ", w: " + child.domNode.style.width +
+ // ", h: " + child.domNode.style.height +
+ // "}"
+ // );
+ }
+ }, this);
+ }
+ }
+});
+
+// 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: String
+ // "top", "bottom", "leading", "trailing", "left", "right", "center".
+ // See the BorderContainer description for details on this parameter.
+ region: '',
+
+ // splitter: Boolean
+ splitter: false,
+
+ // minSize: Number
+ minSize: 0,
+
+ // maxSize: Number
+ maxSize: Infinity
+});
+
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
+{
+/*=====
+ container: null,
+ child: null,
+ region: null,
+=====*/
+
+ // live: 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,
+
+ // summary: A draggable spacer between two items in a BorderContainer
+ templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag" 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._minSize = this.child.minSize;
+
+ this._computeMaxSize();
+ //TODO: might be more accurate to recompute constraints on resize?
+ this.connect(this.container, "layout", dojo.hitch(this, this._computeMaxSize));
+
+ 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(){
+ var dim = this.horizontal ? 'h' : 'w';
+ var available = dojo.contentBox(this.container.domNode)[dim] - (this.oppNode ? dojo.marginBox(this.oppNode)[dim] : 0);
+ this._maxSize = 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");
+ }else{
+ this.cover.style.zIndex = 1;
+ }
+
+ // Safeguard in case the stop event was missed. Shouldn't be necessary if we always get the mouse up.
+ if(this.fake){ dojo._destroyElement(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");
+
+ //Performance: load data info local vars for onmousevent function closure
+ var factor = this._factor,
+ max = this._maxSize,
+ min = this._minSize || 10;
+ var axis = this.horizontal ? "pageY" : "pageX";
+ var pageStart = e[axis];
+ var splitterStyle = this.domNode.style;
+ var dim = this.horizontal ? 'h' : 'w';
+ var childStart = dojo.marginBox(this.child.domNode)[dim];
+ var splitterStart = parseInt(this.domNode.style[this.region]);
+ var resize = this._resize;
+ var region = this.region;
+ var mb = {};
+ var childNode = this.child.domNode;
+ var layoutFunc = dojo.hitch(this.container, this.container._layoutChildren);
+
+ var de = dojo.doc.body;
+ 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){
+ mb[dim] = boundChildSize;
+ // TODO: inefficient; we set the marginBox here and then immediately layoutFunc() needs to query it
+ dojo.marginBox(childNode, mb);
+ layoutFunc(region);
+ }
+ splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
+ }),
+ dojo.connect(de, "onmouseup", this, "_stopDrag")
+ ]);
+ dojo.stopEvent(e);
+ },
+
+ _stopDrag: function(e){
+ try{
+ if(this.cover){ this.cover.style.zIndex = -1; }
+ if(this.fake){ dojo._destroyElement(this.fake); }
+ dojo.removeClass(this.domNode, "dijitSplitterActive");
+ 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"]);
+ }
+ },
+
+ _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.keyCode){
+ 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;
+ var mb = {};
+ mb[ this.horizontal ? "h" : "w"] = Math.max(Math.min(childSize, this._maxSize), this._minSize);
+ dojo.marginBox(this.child.domNode, mb);
+ this.container._layoutChildren(this.region);
+ dojo.stopEvent(e);
+ },
+
+ destroy: function(){
+ this._cleanupHandlers();
+ delete this.child;
+ delete this.container;
+ delete this.fake;
+ this.inherited(arguments);
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/ContentPane.js b/includes/js/dijit/layout/ContentPane.js
new file mode 100644
index 0000000..c3a4ca4
--- /dev/null
+++ b/includes/js/dijit/layout/ContentPane.js
@@ -0,0 +1,445 @@
+if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.ContentPane"] = true;
+dojo.provide("dijit.layout.ContentPane");
+
+dojo.require("dijit._Widget");
+dojo.require("dijit.layout._LayoutWidget");
+
+dojo.require("dojo.parser");
+dojo.require("dojo.string");
+dojo.requireLocalization("dijit", "loading", null, "zh,pt,da,tr,ru,ROOT,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+dojo.declare(
+ "dijit.layout.ContentPane",
+ dijit._Widget,
+{
+ // summary:
+ // A widget that acts as a Container for other widgets, and includes a ajax interface
+ // description:
+ // A widget that can be used as a standalone widget
+ // or as a baseclass 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 .setContent('<b>new content</b>')
+ //
+ // Or you can send it a NodeList, .setContent(dojo.query('div [class=selected]', userSelection))
+ // please note that the nodes in NodeList will copied, not moved
+ //
+ // To do a ajax update use .setHref('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; see setHref();
+ href: "",
+
+ // extractContent: Boolean
+ // Extract visible content from inside of <body> .... </body>
+ extractContent: false,
+
+ // parseOnLoad: Boolean
+ // parse content and create the widgets, if any
+ parseOnLoad: true,
+
+ // preventCache: Boolean
+ // Cache content retreived externally
+ preventCache: false,
+
+ // preload: Boolean
+ // Force load of data 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: Boolean
+ // Tells loading status see onLoad|onUnload for event hooks
+ isLoaded: false,
+
+ // class: String
+ // Class name to apply to ContentPane dom nodes
+ // TODO: this should be called "baseClass" like in the other widgets
+ "class": "dijitContentPane",
+
+ // doLayout: String/Boolean
+ // false - don't adjust size of children
+ // true - looks for the first sizable child widget (ie, having resize() method) and sets it's size to
+ // however big the ContentPane is (TODO: implement)
+ // auto - if there is a single sizable child widget (ie, having resize() method), set it's size to
+ // however big the ContentPane is
+ doLayout: "auto",
+
+ postCreate: function(){
+ // remove the title attribute so it doesn't show up when i hover
+ // over a node
+ this.domNode.title = "";
+
+ if(!this.containerNode){
+ // make getDescendants() work
+ this.containerNode = this.domNode;
+ }
+
+ if(this.preload){
+ this._loadCheck();
+ }
+
+ var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
+ this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
+ this.errorMessage = dojo.string.substitute(this.errorMessage, messages);
+ var curRole = dijit.getWaiRole(this.domNode);
+ if (!curRole){
+ dijit.setWaiRole(this.domNode, "group");
+ }
+
+ // for programatically created ContentPane (with <span> tag), need to muck w/CSS
+ // or it's as though overflow:visible is set
+ dojo.addClass(this.domNode, this["class"]);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ if(this.doLayout != "false" && this.doLayout !== false){
+ this._checkIfSingleChild();
+ if(this._singleChild){
+ this._singleChild.startup();
+ }
+ }
+ this._loadCheck();
+ this.inherited(arguments);
+ },
+
+ _checkIfSingleChild: function(){
+ // summary:
+ // Test if we have exactly one 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.
+
+ // TODO: if there are two child widgets (a data store and a TabContainer, for example),
+ // should still find the TabContainer
+ var childNodes = dojo.query(">", this.containerNode || this.domNode),
+ childWidgets = childNodes.filter("[widgetId]");
+
+ if(childNodes.length == 1 && childWidgets.length == 1){
+ this.isContainer = true;
+ this._singleChild = dijit.byNode(childWidgets[0]);
+ }else{
+ delete this.isContainer;
+ delete this._singleChild;
+ }
+ },
+
+ refresh: function(){
+ // summary:
+ // Force a refresh (re-download) of content, be sure to turn off cache
+
+ // we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+ return this._prepareLoad(true);
+ },
+
+ setHref: function(/*String|Uri*/ href){
+ // summary:
+ // 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
+ this.href = href;
+
+ // we return result of _prepareLoad here to avoid code dup. in dojox.layout.ContentPane
+ return this._prepareLoad();
+ },
+
+ setContent: function(/*String|DomNode|Nodelist*/data){
+ // summary:
+ // 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 cant run refresh and clear content
+ // refresh should only work if we downloaded the content
+ if(!this._isDownloaded){
+ this.href = "";
+ this._onUnloadHandler();
+ }
+
+ this._setContent(data || "");
+
+ this._isDownloaded = false; // must be set after _setContent(..), pathadjust in dojox.layout.ContentPane
+
+ if(this.parseOnLoad){
+ this._createSubWidgets();
+ }
+
+ if(this.doLayout != "false" && this.doLayout !== false){
+ this._checkIfSingleChild();
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.startup();
+ this._singleChild.resize(this._contentBox || dojo.contentBox(this.containerNode || this.domNode));
+ }
+ }
+
+ this._onLoadHandler();
+ },
+
+ cancel: function(){
+ // summary:
+ // Cancels a inflight download of content
+ if(this._xhrDfd && (this._xhrDfd.fired == -1)){
+ this._xhrDfd.cancel();
+ }
+ delete this._xhrDfd; // garbage collect
+ },
+
+ destroy: function(){
+ // if we have multiple controllers destroying us, bail after the first
+ if(this._beingDestroyed){
+ return;
+ }
+ // make sure we call onUnload
+ this._onUnloadHandler();
+ this._beingDestroyed = true;
+ this.inherited("destroy",arguments);
+ },
+
+ resize: function(size){
+ dojo.marginBox(this.domNode, size);
+
+ // Compute content box size in case we [later] need to size child
+ // 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 node = this.containerNode || this.domNode,
+ mb = dojo.mixin(dojo.marginBox(node), size||{});
+
+ this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+ // If we have a single widget child then size it to fit snugly within my borders
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.resize(this._contentBox);
+ }
+ },
+
+ _prepareLoad: function(forceLoad){
+ // sets up for a xhrLoad, load is deferred until widget onShow
+ // cancels a inflight download
+ this.cancel();
+ this.isLoaded = false;
+ this._loadCheck(forceLoad);
+ },
+
+ _isShown: function(){
+ // summary: returns true if the content is currently shown
+ if("open" in this){
+ return this.open; // for TitlePane, etc.
+ }else{
+ var node = this.domNode;
+ return (node.style.display != 'none') && (node.style.visibility != 'hidden');
+ }
+ },
+
+ _loadCheck: function(/*Boolean*/ forceLoad){
+ // call this when you change onShow (onSelected) status when selected in parent container
+ // it's used as a trigger for href download when this.domNode.display != 'none'
+
+ // sequence:
+ // if no href -> bail
+ // forceLoad -> always load
+ // this.preload -> load when download not in progress, domNode display doesn't matter
+ // this.refreshOnShow -> load when download in progress bails, domNode display !='none' AND
+ // this.open !== false (undefined is ok), isLoaded doesn't matter
+ // else -> load when download not in progress, if this.open !== false (undefined is ok) AND
+ // domNode display != 'none', isLoaded must be false
+
+ var displayState = this._isShown();
+
+ if(this.href &&
+ (forceLoad ||
+ (this.preload && !this._xhrDfd) ||
+ (this.refreshOnShow && displayState && !this._xhrDfd) ||
+ (!this.isLoaded && displayState && !this._xhrDfd)
+ )
+ ){
+ this._downloadExternalContent();
+ }
+ },
+
+ _downloadExternalContent: function(){
+ this._onUnloadHandler();
+
+ // display loading message
+ this._setContent(
+ this.onDownloadStart.call(this)
+ );
+
+ 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.onDownloadEnd.call(self);
+ self._isDownloaded = true;
+ self.setContent.call(self, html); // onload event is called from here
+ }catch(err){
+ self._onError.call(self, 'Content', err); // onContentError
+ }
+ delete self._xhrDfd;
+ return html;
+ });
+
+ hand.addErrback(function(err){
+ if(!hand.cancelled){
+ // show error message in the pane
+ self._onError.call(self, 'Download', err); // onDownloadError
+ }
+ delete self._xhrDfd;
+ return err;
+ });
+ },
+
+ _onLoadHandler: function(){
+ this.isLoaded = true;
+ try{
+ this.onLoad.call(this);
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onLoad code');
+ }
+ },
+
+ _onUnloadHandler: function(){
+ this.isLoaded = false;
+ this.cancel();
+ try{
+ this.onUnload.call(this);
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onUnload code');
+ }
+ },
+
+ _setContent: function(cont){
+ this.destroyDescendants();
+
+ try{
+ var node = this.containerNode || this.domNode;
+ while(node.firstChild){
+ dojo._destroyElement(node.firstChild);
+ }
+ if(typeof cont == "string"){
+ // dijit.ContentPane does only minimal fixes,
+ // No pathAdjustments, script retrieval, style clean etc
+ // some of these should be available in the dojox.layout.ContentPane
+ if(this.extractContent){
+ match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+ if(match){ cont = match[1]; }
+ }
+ node.innerHTML = cont;
+ }else{
+ // domNode or NodeList
+ if(cont.nodeType){ // domNode (htmlNode 1 or textNode 3)
+ node.appendChild(cont);
+ }else{// nodelist or array such as dojo.Nodelist
+ dojo.forEach(cont, function(n){
+ node.appendChild(n.cloneNode(true));
+ });
+ }
+ }
+ }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
+ var errMess = this.onContentError(e);
+ try{
+ node.innerHTML = errMess;
+ }catch(e){
+ console.error('Fatal '+this.id+' could not change content due to '+e.message, e);
+ }
+ }
+ },
+
+ _onError: function(type, err, consoleText){
+ // 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.call(this, errText);
+ }
+ },
+
+ _createSubWidgets: function(){
+ // summary: scan my contents and create subwidgets
+ var rootNode = this.containerNode || this.domNode;
+ try{
+ dojo.parser.parse(rootNode, true);
+ }catch(e){
+ this._onError('Content', e, "Couldn't create widgets in "+this.id
+ +(this.href ? " from "+this.href : ""));
+ }
+ },
+
+ // EVENT's, should be overide-able
+ onLoad: function(e){
+ // summary:
+ // Event hook, is called after everything is loaded and widgetified
+ },
+
+ onUnload: function(e){
+ // summary:
+ // Event hook, is called before old content is cleared
+ },
+
+ onDownloadStart: function(){
+ // summary:
+ // called before download starts
+ // 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
+ return this.loadingMessage;
+ },
+
+ onContentError: function(/*Error*/ error){
+ // summary:
+ // called on DOM faults, require fault etc in content
+ // default is to display errormessage inside pane
+ },
+
+ onDownloadError: function(/*Error*/ error){
+ // summary:
+ // Called when download error occurs, default is to display
+ // errormessage inside pane. Overide function to change that.
+ // The string returned by this function will be the html
+ // that tells the user a error happend
+ return this.errorMessage;
+ },
+
+ onDownloadEnd: function(){
+ // summary:
+ // called when download is finished
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/LayoutContainer.js b/includes/js/dijit/layout/LayoutContainer.js
new file mode 100644
index 0000000..11b8c9f
--- /dev/null
+++ b/includes/js/dijit/layout/LayoutContainer.js
@@ -0,0 +1,74 @@
+if(!dojo._hasResource["dijit.layout.LayoutContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LayoutContainer"] = true;
+dojo.provide("dijit.layout.LayoutContainer");
+
+dojo.require("dijit.layout._LayoutWidget");
+
+dojo.declare("dijit.layout.LayoutContainer",
+ dijit.layout._LayoutWidget,
+ {
+ // summary:
+ // Provides Delphi-style panel layout semantics.
+ //
+ // description:
+ // 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.
+ //
+
+ 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(/*Widget*/ child, /*Integer?*/ insertIndex){
+ dijit._Container.prototype.addChild.apply(this, arguments);
+ if(this._started){
+ dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ },
+
+ removeChild: function(/*Widget*/ widget){
+ dijit._Container.prototype.removeChild.apply(this, 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/includes/js/dijit/layout/LinkPane.js b/includes/js/dijit/layout/LinkPane.js
new file mode 100644
index 0000000..cddaaee
--- /dev/null
+++ b/includes/js/dijit/layout/LinkPane.js
@@ -0,0 +1,36 @@
+if(!dojo._hasResource["dijit.layout.LinkPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.LinkPane"] = true;
+dojo.provide("dijit.layout.LinkPane");
+
+dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout.LinkPane",
+ [dijit.layout.ContentPane, dijit._Templated],
+ {
+ // summary:
+ // A ContentPane that loads data remotely
+ // description:
+ // LinkPane is just a ContentPane that loads data remotely (via the href attribute),
+ // and has markup similar 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"></div>',
+
+ postCreate: 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("postCreate",arguments);
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/SplitContainer.js b/includes/js/dijit/layout/SplitContainer.js
new file mode 100644
index 0000000..671d1fc
--- /dev/null
+++ b/includes/js/dijit/layout/SplitContainer.js
@@ -0,0 +1,553 @@
+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.require("dojo.cookie");
+dojo.require("dijit.layout._LayoutWidget");
+
+dojo.declare("dijit.layout.SplitContainer",
+ dijit.layout._LayoutWidget,
+ {
+ // summary:
+ // A Container widget with sizing handles in-between each child
+ // description:
+ // 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.
+
+ 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,
+
+ postMixInProperties: function(){
+ this.inherited("postMixInProperties",arguments);
+ this.isHorizontal = (this.orientation == 'horizontal');
+ },
+
+ postCreate: function(){
+ this.inherited("postCreate",arguments);
+ this.sizers = [];
+ dojo.addClass(this.domNode, "dijitSplitContainer");
+ // 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 = this.virtualSizer = dojo.doc.createElement('div');
+ 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._injectChild(child);
+
+ if(i < children.length-1){
+ this._addSizer();
+ }
+ }, this);
+
+ if(this.persist){
+ this._restoreState();
+ }
+
+ this.inherited(arguments);
+ },
+
+ _injectChild: function(child){
+ child.domNode.style.position = "absolute";
+ dojo.addClass(child.domNode, "dijitSplitPane");
+ },
+
+ _addSizer: function(){
+ var i = this.sizers.length;
+
+ // TODO: use a template for this!!!
+ var sizer = this.sizers[i] = dojo.doc.createElement('div');
+ 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?
+ var self = this;
+ var handler = (function(){ var sizer_i = i; return function(e){ self.beginSizing(e, sizer_i); } })();
+ this.connect(sizer, "onmousedown", handler);
+
+ 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._destroyElement(this.sizers[i]);
+ this.sizers.splice(i,1);
+ }
+ }
+
+ // Remove widget and repaint
+ this.inherited(arguments);
+ if(this._started){
+ this.layout();
+ }
+ },
+
+ addChild: function(/*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("addChild",arguments);
+
+ if(this._started){
+ // Do the stuff that startup() does for each widget
+ this._injectChild(child);
+ var children = this.getChildren();
+ if(children.length > 1){
+ this._addSizer();
+ }
+
+ // 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.doc.createElement('div');
+ this.domNode.appendChild(this.cover);
+ var s = this.cover.style;
+ s.position = 'absolute';
+ s.zIndex = 1;
+ s.top = 0;
+ s.left = 0;
+ s.width = "100%";
+ s.height = "100%";
+ }else{
+ this.cover.style.zIndex = 1;
+ }
+ this.sizingSplitter.style.zIndex = 2;
+
+ // 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.coords(children[0].domNode, true);
+ if(this.isHorizontal){
+ var client = (e.layerX ? e.layerX : e.offsetX);
+ var screen = e.pageX;
+ this.originPos = this.originPos.x;
+ }else{
+ var client = (e.layerY ? e.layerY : e.offsetY);
+ 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(){
+ dojo.forEach(this.getChildren(), function(child, i){
+ dojo.cookie(this._getCookieName(i), child.sizeShare);
+ }, 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: Integer
+ // Minimum size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ sizeMin: 10,
+
+ // sizeShare: Integer
+ // Size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ // For example, if there are two children and each has sizeShare=10, then
+ // each takes up 50% of the available space.
+ sizeShare: 10
+});
+
+}
diff --git a/includes/js/dijit/layout/StackContainer.js b/includes/js/dijit/layout/StackContainer.js
new file mode 100644
index 0000000..3119972
--- /dev/null
+++ b/includes/js/dijit/layout/StackContainer.js
@@ -0,0 +1,493 @@
+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.require("dijit.form.Button");
+dojo.require("dijit.Menu");
+dojo.requireLocalization("dijit", "common", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,ROOT,pt-pt,cs,fr,es,ko,nl,zh-tw,pl,it,hu");
+
+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,
+
+ _started: false,
+/*=====
+ // selectedChildWidget: Widget
+ // References the currently selected child widget, if any
+ //
+ selectedChildWidget: null,
+=====*/
+ postCreate: function(){
+ dijit.setWaiRole((this.containerNode || this.domNode), "tabpanel");
+ this.connect(this.domNode, "onkeypress", this._onKeyPress);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ var children = this.getChildren();
+
+ // Setup each page panel
+ dojo.forEach(children, this._setupChild, this);
+
+ // Figure out which child to initially display
+ dojo.some(children, function(child){
+ if(child.selected){
+ this.selectedChildWidget = child;
+ }
+ return child.selected;
+ }, this);
+
+ var selected = this.selectedChildWidget;
+
+ // Default to the first child
+ if(!selected && children[0]){
+ selected = this.selectedChildWidget = children[0];
+ selected.selected = true;
+ }
+ if(selected){
+ this._showChild(selected);
+ }
+
+ // Now publish information about myself so any StackControllers can initialize..
+ dojo.publish(this.id+"-startup", [{children: children, selected: selected}]);
+
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*Widget*/ page){
+ // Summary: prepare the given child
+
+ page.domNode.style.display = "none";
+
+ // since we are setting the width/height of the child elements, they need
+ // to be position:relative, or IE has problems (See bug #2033)
+ page.domNode.style.position = "relative";
+
+ return page; // dijit._Widget
+ },
+
+ addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+ // summary: Adds a widget to the stack
+
+ dijit._Container.prototype.addChild.apply(this, arguments);
+ child = this._setupChild(child);
+
+ if(this._started){
+ // in case the tab titles have overflowed from one line to two lines
+ this.layout();
+
+ dojo.publish(this.id+"-addChild", [child, insertIndex]);
+
+ // if this is the first child, then select it
+ if(!this.selectedChildWidget){
+ this.selectChild(child);
+ }
+ }
+ },
+
+ removeChild: function(/*Widget*/ page){
+ // summary: Removes the pane from the stack
+
+ dijit._Container.prototype.removeChild.apply(this, arguments);
+
+ // 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; }
+
+ 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]);
+
+ // in case the tab titles now take up one line instead of two lines
+ this.layout();
+ }
+
+ if(this.selectedChildWidget === page){
+ this.selectedChildWidget = undefined;
+ if(this._started){
+ var children = this.getChildren();
+ if(children.length){
+ this.selectChild(children[0]);
+ }
+ }
+ }
+ },
+
+ selectChild: function(/*Widget*/ page){
+ // summary:
+ // Show the given widget (which must be one of my children)
+
+ page = dijit.byId(page);
+
+ if(this.selectedChildWidget != page){
+ // Deselect old page and select new one
+ this._transition(page, this.selectedChildWidget);
+ this.selectedChildWidget = page;
+ dojo.publish(this.id+"-selectChild", [page]);
+ }
+ },
+
+ _transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+ 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.
+ // page must be visible for resizing to work
+ if(this.doLayout && newWidget.resize){
+ newWidget.resize(this._containerContentBox || this._contentBox);
+ }
+ },
+
+ _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));
+ },
+
+ back: function(){
+ // Summary: go back to previous page
+ this.selectChild(this._adjacent(false));
+ },
+
+ _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._contentBox);
+ }
+ },
+
+ _showChild: function(/*Widget*/ page){
+ var children = this.getChildren();
+ page.isFirstChild = (page == children[0]);
+ page.isLastChild = (page == children[children.length-1]);
+ page.selected = true;
+
+ page.domNode.style.display="";
+ if(page._loadCheck){
+ page._loadCheck(); // trigger load in ContentPane
+ }
+ if(page.onShow){
+ page.onShow();
+ }
+ },
+
+ _hideChild: function(/*Widget*/ page){
+ page.selected=false;
+ page.domNode.style.display="none";
+ if(page.onHide){
+ page.onHide();
+ }
+ },
+
+ closeChild: function(/*Widget*/ page){
+ // summary:
+ // callback when user clicks the [X] to remove a page
+ // if onClose() returns true then remove and destroy the child
+ var remove = page.onClose(this, page);
+ if(remove){
+ this.removeChild(page);
+ // makes sure we can clean up executeScripts in ContentPane onUnLoad
+ page.destroyRecursive();
+ }
+ },
+
+ destroy: function(){
+ this._beingDestroyed = true;
+ this.inherited(arguments);
+ }
+});
+
+dojo.declare(
+ "dijit.layout.StackController",
+ [dijit._Widget, dijit._Templated, dijit._Container],
+ {
+ // summary:
+ // Set of buttons to select a page in a page list.
+ // 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: String
+ // the id of the page container that I point to
+ containerId: "",
+
+ // buttonWidget: 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");
+
+ // TODO: change key from object to id, to get more separation from StackContainer
+ this.pane2button = {}; // mapping from panes to buttons
+ this.pane2menu = {}; // mapping from panes to close menu
+
+ this._subscriptions=[
+ dojo.subscribe(this.containerId+"-startup", this, "onStartup"),
+ dojo.subscribe(this.containerId+"-addChild", this, "onAddChild"),
+ dojo.subscribe(this.containerId+"-removeChild", this, "onRemoveChild"),
+ dojo.subscribe(this.containerId+"-selectChild", this, "onSelectChild"),
+ dojo.subscribe(this.containerId+"-containerKeyPress", this, "onContainerKeyPress")
+ ];
+ },
+
+ onStartup: function(/*Object*/ info){
+ // summary: called after StackContainer has finished initializing
+ dojo.forEach(info.children, this.onAddChild, this);
+ this.onSelectChild(info.selected);
+ },
+
+ destroy: function(){
+ for(var pane in this.pane2button){
+ this.onRemoveChild(pane);
+ }
+ dojo.forEach(this._subscriptions, dojo.unsubscribe);
+ this.inherited(arguments);
+ },
+
+ onAddChild: function(/*Widget*/ page, /*Integer?*/ insertIndex){
+ // summary:
+ // Called whenever a page is added to the container.
+ // Create button corresponding to the page.
+
+ // add a node that will be promoted to the button widget
+ var refNode = dojo.doc.createElement("span");
+ this.domNode.appendChild(refNode);
+ // create an instance of the button widget
+ var cls = dojo.getObject(this.buttonWidget);
+ var button = new cls({label: page.title, closeButton: page.closable}, refNode);
+ this.addChild(button, insertIndex);
+ this.pane2button[page] = button;
+ page.controlButton = button; // this value might be overwritten if two tabs point to same container
+
+ dojo.connect(button, "onClick", dojo.hitch(this,"onButtonClick",page));
+ if(page.closable){
+ dojo.connect(button, "onClickCloseButton", dojo.hitch(this,"onCloseButtonClick",page));
+ // add context menu onto title button
+ var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+ var closeMenu = new dijit.Menu({targetNodeIds:[button.id], id:button.id+"_Menu"});
+ var mItem = new dijit.MenuItem({label:_nlsResources.itemClose});
+ dojo.connect(mItem, "onClick", dojo.hitch(this, "onCloseButtonClick", page));
+ closeMenu.addChild(mItem);
+ this.pane2menu[page] = closeMenu;
+ }
+ if(!this._currentChild){ // put the first child into the tab order
+ button.focusNode.setAttribute("tabIndex", "0");
+ this._currentChild = page;
+ }
+ //make sure all tabs have the same length
+ if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
+ this._rectifyRtlTabList();
+ }
+ },
+
+ onRemoveChild: function(/*Widget*/ page){
+ // summary:
+ // Called whenever a page is removed from the container.
+ // Remove the button corresponding to the page.
+ if(this._currentChild === page){ this._currentChild = null; }
+ var button = this.pane2button[page];
+ var menu = this.pane2menu[page];
+ if (menu){
+ menu.destroy();
+ }
+ if(button){
+ // TODO? if current child { reassign }
+ button.destroy();
+ }
+ this.pane2button[page] = null;
+ },
+
+ onSelectChild: function(/*Widget*/ page){
+ // summary:
+ // Called when a page has been selected in the StackContainer, either by me or by another StackController
+
+ if(!page){ return; }
+
+ if(this._currentChild){
+ var oldButton=this.pane2button[this._currentChild];
+ oldButton.setAttribute('checked', false);
+ oldButton.focusNode.setAttribute("tabIndex", "-1");
+ }
+
+ var newButton=this.pane2button[page];
+ newButton.setAttribute('checked', true);
+ this._currentChild = page;
+ newButton.focusNode.setAttribute("tabIndex", "0");
+ var container = dijit.byId(this.containerId);
+ dijit.setWaiState(container.containerNode || container.domNode, "labelledby", newButton.id);
+ },
+
+ onButtonClick: function(/*Widget*/ page){
+ // summary:
+ // Called whenever one of my child buttons is pressed in an attempt to select a page
+ var container = dijit.byId(this.containerId); // TODO: do this via topics?
+ container.selectChild(page);
+ },
+
+ onCloseButtonClick: function(/*Widget*/ page){
+ // summary:
+ // Called whenever one of my child buttons [X] is pressed in an attempt to close a page
+ var container = dijit.byId(this.containerId);
+ container.closeChild(page);
+ var b = this.pane2button[this._currentChild];
+ if(b){
+ dijit.focus(b.focusNode || b.domNode);
+ }
+ },
+
+ // TODO: this is a bit redundant with forward, back api in StackContainer
+ adjacent: function(/*Boolean*/ forward){
+ 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]);
+ // 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.
+
+ if(this.disabled || e.altKey ){ return; }
+ var forward = null;
+ if(e.ctrlKey || !e._djpage){
+ var k = dojo.keys;
+ switch(e.keyCode){
+ 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.keyCode == k.TAB){
+ this.adjacent(!e.shiftKey).onClick();
+ dojo.stopEvent(e);
+ }else if(e.keyChar == "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){
+ info.e._djpage = info.page;
+ this.onkeypress(info.e);
+ }
+});
+
+dojo.declare("dijit.layout._StackButton",
+ dijit.form.ToggleButton,
+ {
+ // summary
+ // Internal widget used by StackContainer.
+ // The button-like or tab-like object you click to select or delete a page
+
+ tabIndex: "-1", // StackContainer buttons are not in the tab order by default
+
+ 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)
+ 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.
+ evt.stopPropagation();
+ }
+});
+
+// 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, {
+ // title: String
+ // Title of this widget. Used by TabContainer to the name the tab, etc.
+ title: "",
+
+ // selected: Boolean
+ // Is this child currently selected?
+ selected: false,
+
+ // closable: Boolean
+ // True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+ closable: false, // true if user can close this tab pane
+
+ onClose: function(){
+ // summary: Callback if someone tries to close the child, child will be closed if func returns true
+ return true;
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/TabContainer.js b/includes/js/dijit/layout/TabContainer.js
new file mode 100644
index 0000000..769a25f
--- /dev/null
+++ b/includes/js/dijit/layout/TabContainer.js
@@ -0,0 +1,184 @@
+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.StackContainer");
+dojo.require("dijit._Templated");
+
+dojo.declare("dijit.layout.TabContainer",
+ [dijit.layout.StackContainer, dijit._Templated],
+ {
+ // summary:
+ // A Container with Title Tabs, each one pointing at a pane in the container.
+ // 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 title (aka title) of the pane, and optionally a close button.
+ //
+ // Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+ // (where [widgetId] is the id of the TabContainer itself.
+ //
+ // tabPosition: String
+ // Defines where tabs go relative to tab content.
+ // "top", "bottom", "left-h", "right-h"
+ tabPosition: "top",
+
+ templateString: null, // override setting in StackContainer
+ templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div class=\"dijitTabPaneWrapper\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",
+
+ // _controllerWidget: String
+ // An optional parameter to overrider the default TabContainer controller used.
+ _controllerWidget: "dijit.layout.TabController",
+
+ postCreate: function(){
+ this.inherited(arguments);
+ // create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+ var TabController = dojo.getObject(this._controllerWidget);
+ this.tablist = new TabController({
+ id: this.id + "_tablist",
+ tabPosition: this.tabPosition,
+ doLayout: this.doLayout,
+ containerId: this.id
+ }, this.tablistNode);
+ },
+
+ _setupChild: function(/* Widget */tab){
+ dojo.addClass(tab.domNode, "dijitTabPane");
+ this.inherited(arguments);
+ return tab; // Widget
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ // wire up the tablist and its tabs
+ this.tablist.startup();
+ this.inherited(arguments);
+
+ if(dojo.isSafari){
+ // sometimes safari 3.0.3 miscalculates the height of the tab labels, see #4058
+ setTimeout(dojo.hitch(this, "layout"), 0);
+ }
+
+ if(dojo.isIE && !this.isLeftToRight() && this.tabPosition == "right-h" &&
+ this.tablist && this.tablist.pane2button){
+ //need rectify non-closable tab in IE, only for "right-h" mode
+ for(var pane in this.tablist.pane2button){
+ var tabButton = this.tablist.pane2button[pane];
+ if(!tabButton.closeButton){ continue; }
+ tabButtonStyle = tabButton.closeButtonNode.style;
+ tabButtonStyle.position ="absolute";
+ if(dojo.isIE < 7){
+ tabButtonStyle.left = tabButton.domNode.offsetWidth + "px";
+ }else{
+ tabButtonStyle.padding = "0px";
+ }
+ }
+ }
+ },
+
+ layout: function(){
+ // Summary: Configure the content pane to take up all the space except for where the tabs are
+ if(!this.doLayout){ return; }
+
+ // position and size the titles and the container node
+ var titleAlign = this.tabPosition.replace(/-h/,"");
+ var children = [
+ { domNode: this.tablist.domNode, layoutAlign: titleAlign },
+ { domNode: this.containerNode, layoutAlign: "client" }
+ ];
+ dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+
+ // Compute size to make each of my children.
+ // children[1] is the margin-box size of this.containerNode, set by layoutChildren() call above
+ this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[1]);
+
+ if(this.selectedChildWidget){
+ this._showChild(this.selectedChildWidget);
+ if(this.doLayout && this.selectedChildWidget.resize){
+ this.selectedChildWidget.resize(this._containerContentBox);
+ }
+ }
+ },
+
+ destroy: function(){
+ if(this.tablist){
+ this.tablist.destroy();
+ }
+ this.inherited(arguments);
+ }
+});
+
+//TODO: make private?
+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).
+ // 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.
+
+ 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",
+
+ // doLayout: Boolean
+ // TODOC: deprecate doLayout? not sure.
+ doLayout: true,
+
+ // buttonWidget: String
+ // The name of the tab widget to create to correspond to each page
+ buttonWidget: "dijit.layout._TabButton",
+
+ postMixInProperties: function(){
+ this["class"] = "dijitTabLabels-" + this.tabPosition + (this.doLayout ? "" : " dijitTabNoLayout");
+ this.inherited(arguments);
+ },
+
+//TODO: can this be accomplished in CSS?
+ _rectifyRtlTabList: function(){
+ //Summary: Rectify the length of all tabs in rtl, otherwise the tab lengths are different in IE
+ if(0 >= this.tabPosition.indexOf('-h')){ return; }
+ if(!this.pane2button){ return; }
+
+ var maxLen = 0;
+ for(var pane in this.pane2button){
+ maxLen = Math.max(maxLen, dojo.marginBox(this.pane2button[pane].innerDiv).w);
+ }
+ //unify the length of all the tabs
+ for(pane in this.pane2button){
+ this.pane2button[pane].innerDiv.style.width = maxLen + '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.
+
+ baseClass: "dijitTab",
+
+ templateString:"<div waiRole=\"presentation\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n\t <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>\n\t <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>\n\t <span dojoAttachPoint='closeText' class='closeText'>x</span>\n\t </span>\n </div>\n </div>\n</div>\n",
+
+ postCreate: function(){
+ if(this.closeButton){
+ dojo.addClass(this.innerDiv, "dijitClosable");
+ }else{
+ this.closeButtonNode.style.display="none";
+ }
+ this.inherited(arguments);
+ dojo.setSelectable(this.containerNode, false);
+ }
+});
+
+}
diff --git a/includes/js/dijit/layout/_LayoutWidget.js b/includes/js/dijit/layout/_LayoutWidget.js
new file mode 100644
index 0000000..3877802
--- /dev/null
+++ b/includes/js/dijit/layout/_LayoutWidget.js
@@ -0,0 +1,188 @@
+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.declare("dijit.layout._LayoutWidget",
+ [dijit._Widget, dijit._Container, dijit._Contained],
+ {
+ // summary
+ // Mixin for widgets that contain a list of children like SplitContainer.
+ // Widgets which mixin this code must define layout() to lay out the children
+
+ isLayoutContainer: true,
+
+ postCreate: function(){
+ 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; }
+
+ dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+ // If I am a top level widget
+ if(!this.getParent || !this.getParent()){
+ // 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 is width=height=100% (or something similar),
+ // then I need to watch when the window resizes, and size myself accordingly
+ // (passing in no argument to resize means that it has to glean the size itself)
+ this.connect(window, 'onresize', function(){this.resize();});
+ }
+
+ this.inherited(arguments);
+ },
+
+ resize: function(args){
+ // summary:
+ // Explicitly set this widget's size (in pixels),
+ // and then call layout() to resize contents (and maybe adjust child widgets)
+ //
+ // args: Object?
+ // {w: int, h: int, l: int, t: int}
+
+ var node = this.domNode;
+
+ // set margin box size, unless it wasn't specified, in which case use current size
+ if(args){
+ dojo.marginBox(node, args);
+
+ // set offset of the node
+ if(args.t){ node.style.top = args.t + "px"; }
+ if(args.l){ node.style.left = args.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 = dojo.mixin(dojo.marginBox(node), args||{});
+
+// console.log(this, ": setting size to ", mb);
+
+ // Save the size of my content box.
+ this._contentBox = dijit.layout.marginBox2contentBox(node, mb);
+
+ // Callback for widget to adjust size of it's children
+ this.layout();
+ },
+
+ layout: function(){
+ // summary
+ // Widgets override this method to size & 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.
+ }
+ }
+);
+
+dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
+ // summary:
+ // Given the margin-box size of a node, return it's 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 it's 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);
+ }
+ });
+ };
+
+})();
+
+}
diff --git a/includes/js/dijit/layout/templates/AccordionPane.html b/includes/js/dijit/layout/templates/AccordionPane.html
new file mode 100644
index 0000000..a675d3a
--- /dev/null
+++ b/includes/js/dijit/layout/templates/AccordionPane.html
@@ -0,0 +1,11 @@
+<div class='dijitAccordionPane'
+ ><div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus'
+ class='dijitAccordionTitle' wairole="tab"
+ ><div class='dijitAccordionArrow' waiRole="presentation"></div
+ ><div class='arrowTextUp' waiRole="presentation">&#9650;</div
+ ><div class='arrowTextDown' waiRole="presentation">&#9660;</div
+ ><div waiRole="presentation" dojoAttachPoint='titleTextNode' class='dijitAccordionText'>${title}</div></div
+ ><div><div dojoAttachPoint='containerNode' style='overflow: hidden; height: 1px; display: none'
+ class='dijitAccordionBody' wairole="tabpanel"
+ ></div></div>
+</div>
diff --git a/includes/js/dijit/layout/templates/TabContainer.html b/includes/js/dijit/layout/templates/TabContainer.html
new file mode 100644
index 0000000..105e8c6
--- /dev/null
+++ b/includes/js/dijit/layout/templates/TabContainer.html
@@ -0,0 +1,4 @@
+<div class="dijitTabContainer">
+ <div dojoAttachPoint="tablistNode"></div>
+ <div class="dijitTabPaneWrapper" dojoAttachPoint="containerNode"></div>
+</div>
diff --git a/includes/js/dijit/layout/templates/TooltipDialog.html b/includes/js/dijit/layout/templates/TooltipDialog.html
new file mode 100644
index 0000000..5925500
--- /dev/null
+++ b/includes/js/dijit/layout/templates/TooltipDialog.html
@@ -0,0 +1,6 @@
+<div class="dijitTooltipDialog" waiRole="presentation">
+ <div class="dijitTooltipContainer" waiRole="presentation">
+ <div class ="dijitTooltipContents dijitTooltipFocusNode" dojoAttachPoint="containerNode" tabindex="-1" waiRole="dialog"></div>
+ </div>
+ <div class="dijitTooltipConnector" waiRole="presenation"></div>
+</div>
diff --git a/includes/js/dijit/layout/templates/_TabButton.html b/includes/js/dijit/layout/templates/_TabButton.html
new file mode 100644
index 0000000..b7b37ac
--- /dev/null
+++ b/includes/js/dijit/layout/templates/_TabButton.html
@@ -0,0 +1,10 @@
+<div waiRole="presentation" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>
+ <div waiRole="presentation" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>
+ <div waiRole="presentation" class='dijitTabContent' dojoAttachPoint='tabContent'>
+ <span dojoAttachPoint='containerNode,focusNode' class='tabLabel'>${!label}</span>
+ <span dojoAttachPoint='closeButtonNode' class='closeImage' dojoAttachEvent='onmouseenter:_onMouse, onmouseleave:_onMouse, onclick:onClickCloseButton' stateModifier='CloseButton'>
+ <span dojoAttachPoint='closeText' class='closeText'>x</span>
+ </span>
+ </div>
+ </div>
+</div>
diff --git a/includes/js/dijit/nls/ar/common.js b/includes/js/dijit/nls/ar/common.js
new file mode 100644
index 0000000..99af508
--- /dev/null
+++ b/includes/js/dijit/nls/ar/common.js
@@ -0,0 +1 @@
+({"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ar/loading.js b/includes/js/dijit/nls/ar/loading.js
new file mode 100644
index 0000000..a8f7829
--- /dev/null
+++ b/includes/js/dijit/nls/ar/loading.js
@@ -0,0 +1 @@
+({"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ "}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/common.js b/includes/js/dijit/nls/common.js
new file mode 100644
index 0000000..6573dcd
--- /dev/null
+++ b/includes/js/dijit/nls/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/cs/common.js b/includes/js/dijit/nls/cs/common.js
new file mode 100644
index 0000000..83b3682
--- /dev/null
+++ b/includes/js/dijit/nls/cs/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/cs/loading.js b/includes/js/dijit/nls/cs/loading.js
new file mode 100644
index 0000000..c611926
--- /dev/null
+++ b/includes/js/dijit/nls/cs/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/da/common.js b/includes/js/dijit/nls/da/common.js
new file mode 100644
index 0000000..8c51ed8
--- /dev/null
+++ b/includes/js/dijit/nls/da/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/da/loading.js b/includes/js/dijit/nls/da/loading.js
new file mode 100644
index 0000000..5088eaf
--- /dev/null
+++ b/includes/js/dijit/nls/da/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/de/common.js b/includes/js/dijit/nls/de/common.js
new file mode 100644
index 0000000..cd60c45
--- /dev/null
+++ b/includes/js/dijit/nls/de/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/de/loading.js b/includes/js/dijit/nls/de/loading.js
new file mode 100644
index 0000000..4989983
--- /dev/null
+++ b/includes/js/dijit/nls/de/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/dijit-all_ROOT.js b/includes/js/dijit/nls/dijit-all_ROOT.js
new file mode 100644
index 0000000..2c454ec
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ROOT.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ROOT");dijit.form.nls.Textarea.ROOT={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ROOT");dojo.cldr.nls.currency.ROOT={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ROOT");dojo.cldr.nls.gregorian.ROOT={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ROOT");dijit.form.nls.Textarea.ROOT={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_ar.js b/includes/js/dijit/nls/dijit-all_ar.js
new file mode 100644
index 0000000..b4447ed
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ar.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ar");dijit.form.nls.Textarea.ar={"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"};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":"ادراج/تحرير جدول ","underline":"تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول ","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","italic":"مائل","fontName":"اسم طاقم الطباعة","justifyLeft":"محاذاة الى اليسار","unlink":"ازالة وصلة","toggleTableBorder":"تبديل حدود الجدول ","fontSize":"حجم طاقم الطباعة","indent":"ازاحة للداخل","redo":"اعادة","strikethrough":"تشطيب","justifyFull":"ضبط","justifyCenter":"محاذاة في الوسط","hiliteColor":"لون الخلفية","deleteTable":"حذف جدول ","outdent":"ازاحة للخارج","cut":"قص","plainFormatBlock":"نمط الفقرة","toggleDir":"تبديل الاتجاه ","bold":"عريض","systemShortcutFF":"يكون التصرف \"${0}\" متاحا فقط في برنامج Mozilla Firefox باستخدام اختصارات لوحة المفاتيح. استخدم ${1}.","justifyRight":"محاذاة الى اليمين","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ar");dojo.cldr.nls.number.ar={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ar");dojo.cldr.nls.currency.ar={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ar");dojo.cldr.nls.gregorian.ar={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ar");dijit.form.nls.Textarea.ar={"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ar");dijit.nls.common.ar={"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"};
diff --git a/includes/js/dijit/nls/dijit-all_cs.js b/includes/js/dijit/nls/dijit-all_cs.js
new file mode 100644
index 0000000..f0c7f46
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_cs.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.cs");dijit.form.nls.Textarea.cs={"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"};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","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","insertHorizontalRule":"Vodorovné pravítko","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obraz","superscript":"Horní index","subscript":"Dolní index","createLink":"Vytvořit odkaz","undo":"Zpět","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","ctrlKey":"Ctrl+${0}","fontSize":"Velikost písma","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é","systemShortcutFF":"Akce \"${0}\" je v prohlížeči Mozilla Firefox dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesy ${1}.","justifyRight":"Zarovnat vpravo","appleKey":"⌘${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.cs");dojo.cldr.nls.number.cs={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.cs");dojo.cldr.nls.currency.cs={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.cs");dojo.cldr.nls.gregorian.cs={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.cs");dijit.form.nls.Textarea.cs={"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_da.js b/includes/js/dijit/nls/dijit-all_da.js
new file mode 100644
index 0000000..e1f6519
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_da.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.da");dijit.form.nls.Textarea.da={"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"};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","underline":"Understreget","foreColor":"Forgrundsfarve","htmlToggle":"HTML-kilde","formatBlock":"Afsnitstypografi","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","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejusteret","unlink":"Fjern link","toggleTableBorder":"Skift tabelramme","fontSize":"Skriftstørrelse","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","systemShortcutFF":"Funktionen \"${0}\" kan kun bruges i Mozilla Firefox med en tastaturgenvej. Brug ${1}.","justifyRight":"Højrejusteret","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.da");dojo.cldr.nls.number.da={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.da");dojo.cldr.nls.currency.da={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.da");dojo.cldr.nls.gregorian.da={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.da");dijit.form.nls.Textarea.da={"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_de-de.js b/includes/js/dijit/nls/dijit-all_de-de.js
new file mode 100644
index 0000000..46b026b
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_de-de.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.de_de");dijit.form.nls.Textarea.de_de={"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"};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","underline":"Unterstrichen","foreColor":"Vordergrundfarbe","htmlToggle":"HTML-Quelltext","formatBlock":"Absatzstil","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","italic":"Kursiv","fontName":"Schriftartname","justifyLeft":"Linksbündig","unlink":"Link entfernen","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","ctrlKey":"Strg+${0}","fontSize":"Schriftgröße","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":"Richtung wechseln","bold":"Fett","systemShortcutFF":"Die Aktion \"${0}\" ist in Mozilla Firefox nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.","justifyRight":"Rechtsbündig","appleKey":"⌘${0}"};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={"currencyFormat":"#,##0.00 ¤","decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0 %","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("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.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","CHF_symbol":"SFr.","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","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"dd.MM.yyyy","field-second":"Sekunde","field-week":"Woche","pm":"nachm.","timeFormat-full":"HH:mm:ss v","dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","d. MMMM","dd.MM.","d.M.","mm:ss","MM.yy","MMM yy","Q yy","yyyy","MMMM yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["v. Chr.","n. Chr."],"am":"vorm.","days-standAlone-narrow":["S","M","D","M","D","F","S"],"field-year":"Jahr","field-minute":"Minute","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"Stunde","dateFormat-long":"d. MMMM yyyy","field-day":"Tag","field-dayperiod":"Tageshälfte","field-month":"Monat","dateFormat-short":"dd.MM.yy","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"field-era":"Epoche","timeFormat-short":"HH:mm","months-format-abbr":["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"eraAbbr":["v. Chr.","n. Chr."],"timeFormat-long":"HH:mm:ss z","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormat-full":"EEEE, d. MMMM yyyy","field-weekday":"Wochentag","days-format-abbr":["So","Mo","Di","Mi","Do","Fr","Sa"],"field-zone":"Zone","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.de_de");dijit.form.nls.Textarea.de_de={"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_de.js b/includes/js/dijit/nls/dijit-all_de.js
new file mode 100644
index 0000000..e0a4696
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_de.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.de");dijit.form.nls.Textarea.de={"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"};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","underline":"Unterstrichen","foreColor":"Vordergrundfarbe","htmlToggle":"HTML-Quelltext","formatBlock":"Absatzstil","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","italic":"Kursiv","fontName":"Schriftartname","justifyLeft":"Linksbündig","unlink":"Link entfernen","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","ctrlKey":"Strg+${0}","fontSize":"Schriftgröße","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":"Richtung wechseln","bold":"Fett","systemShortcutFF":"Die Aktion \"${0}\" ist in Mozilla Firefox nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.","justifyRight":"Rechtsbündig","appleKey":"⌘${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.de");dojo.cldr.nls.number.de={"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("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.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","CHF_symbol":"SFr.","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","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"dd.MM.yyyy","field-second":"Sekunde","field-week":"Woche","pm":"nachm.","timeFormat-full":"HH:mm:ss v","dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","d. MMMM","dd.MM.","d.M.","mm:ss","MM.yy","MMM yy","Q yy","yyyy","MMMM yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["v. Chr.","n. Chr."],"am":"vorm.","days-standAlone-narrow":["S","M","D","M","D","F","S"],"field-year":"Jahr","field-minute":"Minute","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"Stunde","dateFormat-long":"d. MMMM yyyy","field-day":"Tag","field-dayperiod":"Tageshälfte","field-month":"Monat","dateFormat-short":"dd.MM.yy","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"field-era":"Epoche","timeFormat-short":"HH:mm","months-format-abbr":["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"days-format-wide":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],"eraAbbr":["v. Chr.","n. Chr."],"timeFormat-long":"HH:mm:ss z","quarters-format-wide":["1. Quartal","2. Quartal","3. Quartal","4. Quartal"],"dateFormat-full":"EEEE, d. MMMM yyyy","field-weekday":"Wochentag","days-format-abbr":["So","Mo","Di","Mi","Do","Fr","Sa"],"field-zone":"Zone","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.de");dijit.form.nls.Textarea.de={"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_el.js b/includes/js/dijit/nls/dijit-all_el.js
new file mode 100644
index 0000000..cbf73ae
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_el.js
@@ -0,0 +1 @@
+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":"OK","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.el");dijit.form.nls.Textarea.el={"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"};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":"Εισαγωγή/Τροποποίηση πίνακα","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","superscript":"Εκθέτης","subscript":"Δείκτης","createLink":"Δημιουργία διασύνδεσης","undo":"Αναίρεση","italic":"Πλάγια","fontName":"Όνομα γραμματοσειράς","justifyLeft":"Στοίχιση αριστερά","unlink":"Αφαίρεση διασύνδεσης","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","fontSize":"Μέγεθος γραμματοσειράς","indent":"Εσοχή","redo":"Επανάληψη","strikethrough":"Διαγράμμιση","justifyFull":"Πλήρης στοίχιση","justifyCenter":"Στοίχιση στο κέντρο","hiliteColor":"Χρώμα φόντου","deleteTable":"Διαγραφή πίνακα","outdent":"Μείωση περιθωρίου","cut":"Αποκοπή","plainFormatBlock":"Στυλ παραγράφου","toggleDir":"Εναλλαγή κατεύθυνσης","bold":"Έντονα","systemShortcutFF":"Η ενέργεια \"${0}\" είναι διαθέσιμη μόνο στο Mozilla Firefox με τη χρήση συντόμευσης πληκτρολογίου. Χρησιμοποιήστε το ${1}.","justifyRight":"Στοίχιση δεξιά","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.el");dojo.cldr.nls.number.el={"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("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.el");dijit.nls.common.el={"buttonOk":"OK","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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.el");dojo.cldr.nls.currency.el={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.el");dojo.cldr.nls.gregorian.el={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.el");dijit.form.nls.Textarea.el={"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.el");dijit.nls.common.el={"buttonOk":"OK","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"};
diff --git a/includes/js/dijit/nls/dijit-all_en-gb.js b/includes/js/dijit/nls/dijit-all_en-gb.js
new file mode 100644
index 0000000..b0d71d9
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_en-gb.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en_gb");dijit.form.nls.Textarea.en_gb={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};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":",","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("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.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","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","USD_symbol":"$","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","CAD_symbol":"Can$","USD_displayName":"US Dollar","CNY_symbol":"Y","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","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={"dateFormat-short":"dd/MM/yyyy","timeFormat-long":"HH:mm:ss z","dateFormat-medium":"d MMM yyyy","dateFormat-long":"d MMMM yyyy","timeFormat-medium":"HH:mm:ss","timeFormat-short":"HH:mm","timeFormat-full":"HH:mm:ss v","dateFormat-full":"EEEE, d MMMM yyyy","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"pm":"PM","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","MMMM d","M/d","mm:ss","MM/yy","Q yy","QQQQ yy","MMM yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Before Christ","Anno Domini"],"am":"AM","days-standAlone-narrow":["S","M","T","W","T","F","S"],"field-dayperiod":"AM/PM","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"eraAbbr":["BC","AD"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-minute":"Minute","field-weekday":"Day of the Week","dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en_gb");dijit.form.nls.Textarea.en_gb={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_en-us.js b/includes/js/dijit/nls/dijit-all_en-us.js
new file mode 100644
index 0000000..f23ed44
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_en-us.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en_us");dijit.form.nls.Textarea.en_us={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};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={"currencyFormat":"¤#,##0.00;(¤#,##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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.en_us");dojo.cldr.nls.currency.en_us={"USD_symbol":"$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","CAD_symbol":"Can$","USD_displayName":"US Dollar","CNY_symbol":"Y","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"MMM d, yyyy","pm":"PM","timeFormat-full":"h:mm:ss a v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","MMMM d","M/d","mm:ss","MM/yy","Q yy","QQQQ yy","MMM yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Before Christ","Anno Domini"],"am":"AM","days-standAlone-narrow":["S","M","T","W","T","F","S"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"MMMM d, yyyy","field-dayperiod":"AM/PM","dateFormat-short":"M/d/yy","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"timeFormat-short":"h:mm a","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"eraAbbr":["BC","AD"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"timeFormat-long":"h:mm:ss a z","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, MMMM d, yyyy","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-minute":"Minute","field-weekday":"Day of the Week","dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en_us");dijit.form.nls.Textarea.en_us={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_en.js b/includes/js/dijit/nls/dijit-all_en.js
new file mode 100644
index 0000000..1578c84
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_en.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en");dijit.form.nls.Textarea.en={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en");dojo.cldr.nls.number.en={"currencyFormat":"¤#,##0.00;(¤#,##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("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.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","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","USD_symbol":"$","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","CAD_symbol":"Can$","USD_displayName":"US Dollar","CNY_symbol":"Y","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"MMM d, yyyy","pm":"PM","timeFormat-full":"h:mm:ss a v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","MMMM d","M/d","mm:ss","MM/yy","Q yy","QQQQ yy","MMM yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Before Christ","Anno Domini"],"am":"AM","days-standAlone-narrow":["S","M","T","W","T","F","S"],"timeFormat-medium":"h:mm:ss a","dateFormat-long":"MMMM d, yyyy","field-dayperiod":"AM/PM","dateFormat-short":"M/d/yy","months-format-wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"timeFormat-short":"h:mm a","months-format-abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"eraAbbr":["BC","AD"],"days-format-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"timeFormat-long":"h:mm:ss a z","quarters-format-wide":["1st quarter","2nd quarter","3rd quarter","4th quarter"],"dateFormat-full":"EEEE, MMMM d, yyyy","days-format-abbr":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-minute":"Minute","field-weekday":"Day of the Week","dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.en");dijit.form.nls.Textarea.en={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_es-es.js b/includes/js/dijit/nls/dijit-all_es-es.js
new file mode 100644
index 0000000..5932b67
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_es-es.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.es_es");dijit.form.nls.Textarea.es_es={"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"};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","underline":"Subrayado","foreColor":"Color de primer plano","htmlToggle":"Fuente HTML","formatBlock":"Estilo de párrafo","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","italic":"Cursiva","fontName":"Nombre de font","justifyLeft":"Alinear izquierda","unlink":"Eliminar enlace","toggleTableBorder":"Conmutar borde de tabla","ctrlKey":"Control+${0}","fontSize":"Tamaño de font","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","systemShortcutFF":"La acción \"${0}\" sólo está disponible en Mozilla Firefox mediante un atajo de teclado. Utilice ${1}.","justifyRight":"Alinear derecha","appleKey":"⌘${0}"};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={"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("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.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","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"dólar canadiense","CNY_displayName":"yuan renminbi chino","AUD_displayName":"dólar australiano","JPY_displayName":"yen japonés","CAD_symbol":"Can$","USD_displayName":"dólar estadounidense","CNY_symbol":"Y","GBP_displayName":"libra esterlina británica","AUD_symbol":"$A","EUR_displayName":"euro","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"timeFormat-medium":"H:mm:ss","timeFormat-full":"HH'H'mm''ss\" v","timeFormat-short":"H:mm","quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MM/yyyy","field-second":"segundo","field-week":"semana","pm":"p.m.","dateTimeAvailableFormats":"QQQQ 'de' yy","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["antes de Cristo","anno Dómini"],"am":"a.m.","days-standAlone-narrow":["D","L","M","M","J","V","S"],"field-year":"año","field-minute":"minuto","field-hour":"hora","dateFormat-long":"d 'de' MMMM 'de' yyyy","field-day":"día","field-dayperiod":"periodo del día","field-month":"mes","dateFormat-short":"dd/MM/yy","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"field-era":"era","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"eraAbbr":["a.C.","d.C."],"quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"dateFormat-full":"EEEE d 'de' MMMM 'de' yyyy","field-weekday":"día de la semana","days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"field-zone":"zona","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.es_es");dijit.form.nls.Textarea.es_es={"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_es.js b/includes/js/dijit/nls/dijit-all_es.js
new file mode 100644
index 0000000..2e50da5
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_es.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.es");dijit.form.nls.Textarea.es={"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"};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","underline":"Subrayado","foreColor":"Color de primer plano","htmlToggle":"Fuente HTML","formatBlock":"Estilo de párrafo","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","italic":"Cursiva","fontName":"Nombre de font","justifyLeft":"Alinear izquierda","unlink":"Eliminar enlace","toggleTableBorder":"Conmutar borde de tabla","ctrlKey":"Control+${0}","fontSize":"Tamaño de font","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","systemShortcutFF":"La acción \"${0}\" sólo está disponible en Mozilla Firefox mediante un atajo de teclado. Utilice ${1}.","justifyRight":"Alinear derecha","appleKey":"⌘${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.es");dojo.cldr.nls.number.es={"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("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.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","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"dólar canadiense","CNY_displayName":"yuan renminbi chino","AUD_displayName":"dólar australiano","JPY_displayName":"yen japonés","CAD_symbol":"Can$","USD_displayName":"dólar estadounidense","CNY_symbol":"Y","GBP_displayName":"libra esterlina británica","AUD_symbol":"$A","EUR_displayName":"euro","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MM/yyyy","field-second":"segundo","field-week":"semana","pm":"p.m.","timeFormat-full":"hh:mm:ss a v","dateTimeAvailableFormats":"QQQQ 'de' yy","months-standAlone-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["antes de Cristo","anno Dómini"],"am":"a.m.","days-standAlone-narrow":["D","L","M","M","J","V","S"],"field-year":"año","field-minute":"minuto","field-hour":"hora","dateFormat-long":"d 'de' MMMM 'de' yyyy","field-day":"día","field-dayperiod":"periodo del día","field-month":"mes","dateFormat-short":"dd/MM/yy","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"field-era":"era","months-format-abbr":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"days-format-wide":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"eraAbbr":["a.C.","d.C."],"quarters-format-wide":["1er trimestre","2º trimestre","3er trimestre","4º trimestre"],"dateFormat-full":"EEEE d 'de' MMMM 'de' yyyy","field-weekday":"día de la semana","days-format-abbr":["dom","lun","mar","mié","jue","vie","sáb"],"field-zone":"zona","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","timeFormat-medium":"HH:mm:ss","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.es");dijit.form.nls.Textarea.es={"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_fi-fi.js b/includes/js/dijit/nls/dijit-all_fi-fi.js
new file mode 100644
index 0000000..4ac7152
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_fi-fi.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fi_fi");dijit.form.nls.Textarea.fi_fi={"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"};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","underline":"Alleviivaus","foreColor":"Edustaväri","htmlToggle":"HTML-lähde","formatBlock":"Kappaletyyli","insertHorizontalRule":"Vaakasuuntainen viiva","delete":"Poista","insertUnorderedList":"Numeroimaton luettelo","tableProp":"Taulukon ominaisuudet","insertImage":"Lisää kuva","superscript":"Yläindeksi","subscript":"Alaindeksi","createLink":"Luo linkki","undo":"Kumoa","italic":"Kursivointi","fontName":"Fontin nimi","justifyLeft":"Tasaus vasemmalle","unlink":"Poista linkki","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","fontSize":"Fontin koko","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","systemShortcutFF":"Toiminto \"${0}\" on käytettävissä vain Mozilla Firefox -ohjelmassa, kun käytetään pikanäppäimiä. Käytä kohdetta ${1}.","justifyRight":"Tasaus oikealle","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fi_fi");dojo.cldr.nls.currency.fi_fi={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};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={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fi_fi");dijit.form.nls.Textarea.fi_fi={"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_fi.js b/includes/js/dijit/nls/dijit-all_fi.js
new file mode 100644
index 0000000..df4ad56
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_fi.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fi");dijit.form.nls.Textarea.fi={"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"};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","underline":"Alleviivaus","foreColor":"Edustaväri","htmlToggle":"HTML-lähde","formatBlock":"Kappaletyyli","insertHorizontalRule":"Vaakasuuntainen viiva","delete":"Poista","insertUnorderedList":"Numeroimaton luettelo","tableProp":"Taulukon ominaisuudet","insertImage":"Lisää kuva","superscript":"Yläindeksi","subscript":"Alaindeksi","createLink":"Luo linkki","undo":"Kumoa","italic":"Kursivointi","fontName":"Fontin nimi","justifyLeft":"Tasaus vasemmalle","unlink":"Poista linkki","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","fontSize":"Fontin koko","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","systemShortcutFF":"Toiminto \"${0}\" on käytettävissä vain Mozilla Firefox -ohjelmassa, kun käytetään pikanäppäimiä. Käytä kohdetta ${1}.","justifyRight":"Tasaus oikealle","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fi");dojo.cldr.nls.number.fi={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.fi");dojo.cldr.nls.currency.fi={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.fi");dojo.cldr.nls.gregorian.fi={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fi");dijit.form.nls.Textarea.fi={"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_fr-fr.js b/includes/js/dijit/nls/dijit-all_fr-fr.js
new file mode 100644
index 0000000..032704c
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_fr-fr.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fr_fr");dijit.form.nls.Textarea.fr_fr={"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"};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","underline":"Souligner","foreColor":"Couleur d'avant-plan","htmlToggle":"Source HTML","formatBlock":"Style de paragraphe","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","italic":"Italique","fontName":"Nom de police","justifyLeft":"Aligner à gauche","unlink":"Supprimer le lien","toggleTableBorder":"Afficher/Masquer la bordure du tableau","fontSize":"Taille de police","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":"Afficher/Masquer la direction","bold":"Gras","systemShortcutFF":"L'action \"${0}\" est disponible dans Mozilla Firefox uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","justifyRight":"Aligner à droite","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"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("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.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":"sFr.","JPY_symbol":"¥JP","HKD_symbol":"$HK","CAD_displayName":"dollar canadien","CNY_displayName":"Yuan Ren-min-bi","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen","CAD_symbol":"$Ca","USD_displayName":"dollars américains","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$A","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={"quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"d MMM yyyy","field-second":"seconde","field-week":"semaine","pm":"PM","timeFormat-full":"HH:mm:ss v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","E d MMM","d MMMM","dd/MM","d/M","mm:ss","MM/yy","MMM yy","Q yy","QQQQ yy","MMMM yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["avant Jésus-Christ","après Jésus-Christ"],"am":"AM","days-standAlone-narrow":["D","L","M","M","J","V","S"],"field-year":"année","field-minute":"minute","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"heure","dateFormat-long":"d MMMM yyyy","field-day":"jour","field-dayperiod":"cadran","field-month":"mois","dateFormat-short":"dd/MM/yy","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"field-era":"ère","timeFormat-short":"HH:mm","months-format-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"days-format-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"eraAbbr":["av. J.-C.","ap. J.-C."],"timeFormat-long":"HH:mm:ss z","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormat-full":"EEEE d MMMM yyyy","field-weekday":"jour de la semaine","days-format-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"field-zone":"fuseau horaire","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fr_fr");dijit.form.nls.Textarea.fr_fr={"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_fr.js b/includes/js/dijit/nls/dijit-all_fr.js
new file mode 100644
index 0000000..4273e83
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_fr.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fr");dijit.form.nls.Textarea.fr={"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"};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","underline":"Souligner","foreColor":"Couleur d'avant-plan","htmlToggle":"Source HTML","formatBlock":"Style de paragraphe","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","italic":"Italique","fontName":"Nom de police","justifyLeft":"Aligner à gauche","unlink":"Supprimer le lien","toggleTableBorder":"Afficher/Masquer la bordure du tableau","fontSize":"Taille de police","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":"Afficher/Masquer la direction","bold":"Gras","systemShortcutFF":"L'action \"${0}\" est disponible dans Mozilla Firefox uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","justifyRight":"Aligner à droite","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fr");dojo.cldr.nls.number.fr={"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("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.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":"sFr.","JPY_symbol":"¥JP","HKD_symbol":"$HK","CAD_displayName":"dollar canadien","CNY_displayName":"Yuan Ren-min-bi","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen","CAD_symbol":"$Ca","USD_displayName":"dollars américains","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$A","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={"quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"d MMM yyyy","field-second":"seconde","field-week":"semaine","pm":"PM","timeFormat-full":"HH:mm:ss v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","E d MMM","d MMMM","dd/MM","d/M","mm:ss","MM/yy","MMM yy","Q yy","QQQQ yy","MMMM yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["avant Jésus-Christ","après Jésus-Christ"],"am":"AM","days-standAlone-narrow":["D","L","M","M","J","V","S"],"field-year":"année","field-minute":"minute","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"heure","dateFormat-long":"d MMMM yyyy","field-day":"jour","field-dayperiod":"cadran","field-month":"mois","dateFormat-short":"dd/MM/yy","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],"field-era":"ère","timeFormat-short":"HH:mm","months-format-abbr":["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],"days-format-wide":["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"eraAbbr":["av. J.-C.","ap. J.-C."],"timeFormat-long":"HH:mm:ss z","quarters-format-wide":["1er trimestre","2e trimestre","3e trimestre","4e trimestre"],"dateFormat-full":"EEEE d MMMM yyyy","field-weekday":"jour de la semaine","days-format-abbr":["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],"field-zone":"fuseau horaire","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.fr");dijit.form.nls.Textarea.fr={"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_he-il.js b/includes/js/dijit/nls/dijit-all_he-il.js
new file mode 100644
index 0000000..4ea9882
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_he-il.js
@@ -0,0 +1 @@
+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":"midnight blue","cadetblue":"כחול ים","seashell":"צדף ","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"סלמון ","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"misty rose","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום ","white":"לבן ","navajowhite":"navajo white","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"טורקיז כהה","yellow":"צהוב ","linen":"linen","olive":"olive","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה ","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"חום ורדרד ","mediumslateblue":"medium slate blue","magenta":"בורדו ","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום ","darkgoldenrod":"dark goldenrod","slateblue":"כחול צפחה","mediumaquamarine":"medium aquamarine","lavender":"לבנדר ","mediumseagreen":"medium sea green","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"כחול כהה","mediumvioletred":"medium violet-red","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי ","pink":"pink","firebrick":"fire brick","indigo":"אינדיגו","snow":"שלג","darkorchid":"dark orchid","turquoise":"טורקיז ","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"כחול-ירוק כהה","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"סגול ","gainsboro":"gainsboro","plum":"שזיף ","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"honeydew","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן ","wheat":"חיוט","violet":"סגול ","lightskyblue":"כחול שמיים בהיר","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"כחול שמיים ","crimson":"ארגמן ","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"peru","lightgrey":"אפור בהיר","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"אפור צפחה","palegoldenrod":"pale goldenrod","darkorange":"כתום כהה","aquamarine":"aquamarine","lightgreen":"ירוק בהיר","burlywood":"burlywood","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב ","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר ","limegreen":"ירוק לימוני","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","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.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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.he_il");dijit.form.nls.Textarea.he_il={"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"};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":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית ","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה","italic":"נטוי","fontName":"שם גופן","justifyLeft":"יישור לשמאל","unlink":"סילוק הקישור","toggleTableBorder":"מיתוג גבול טבלה","fontSize":"גופן יחסי","indent":"הגדלת כניסה","redo":"שחזור פעולה","strikethrough":"קו חוצה","justifyFull":"יישור דו-צדדי","justifyCenter":"יישור למרכז","hiliteColor":"צבע רקע","deleteTable":"מחיקת טבלה","outdent":"הקטנת כניסה","cut":"גזירה","plainFormatBlock":"סגנון פיסקה","toggleDir":"מיתוג כיוון ","bold":"מודגש","systemShortcutFF":"הפעולה \"${0}\" זמינה בדפדפן Mozilla Firefox רק באמצעות קיצור דרך במקלדת. נא להשתמש ב-${1}.","justifyRight":"יישור לימין","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.he_il");dojo.cldr.nls.currency.he_il={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};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={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.he_il");dijit.form.nls.Textarea.he_il={"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"};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":"סגירה"};
diff --git a/includes/js/dijit/nls/dijit-all_he.js b/includes/js/dijit/nls/dijit-all_he.js
new file mode 100644
index 0000000..9004de9
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_he.js
@@ -0,0 +1 @@
+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":"midnight blue","cadetblue":"כחול ים","seashell":"צדף ","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"סלמון ","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"misty rose","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום ","white":"לבן ","navajowhite":"navajo white","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"טורקיז כהה","yellow":"צהוב ","linen":"linen","olive":"olive","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה ","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"חום ורדרד ","mediumslateblue":"medium slate blue","magenta":"בורדו ","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום ","darkgoldenrod":"dark goldenrod","slateblue":"כחול צפחה","mediumaquamarine":"medium aquamarine","lavender":"לבנדר ","mediumseagreen":"medium sea green","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"כחול כהה","mediumvioletred":"medium violet-red","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי ","pink":"pink","firebrick":"fire brick","indigo":"אינדיגו","snow":"שלג","darkorchid":"dark orchid","turquoise":"טורקיז ","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"כחול-ירוק כהה","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"סגול ","gainsboro":"gainsboro","plum":"שזיף ","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"honeydew","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן ","wheat":"חיוט","violet":"סגול ","lightskyblue":"כחול שמיים בהיר","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"כחול שמיים ","crimson":"ארגמן ","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"peru","lightgrey":"אפור בהיר","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"אפור צפחה","palegoldenrod":"pale goldenrod","darkorange":"כתום כהה","aquamarine":"aquamarine","lightgreen":"ירוק בהיר","burlywood":"burlywood","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב ","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר ","limegreen":"ירוק לימוני","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","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.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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.he");dijit.form.nls.Textarea.he={"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"};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":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית ","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה","italic":"נטוי","fontName":"שם גופן","justifyLeft":"יישור לשמאל","unlink":"סילוק הקישור","toggleTableBorder":"מיתוג גבול טבלה","fontSize":"גופן יחסי","indent":"הגדלת כניסה","redo":"שחזור פעולה","strikethrough":"קו חוצה","justifyFull":"יישור דו-צדדי","justifyCenter":"יישור למרכז","hiliteColor":"צבע רקע","deleteTable":"מחיקת טבלה","outdent":"הקטנת כניסה","cut":"גזירה","plainFormatBlock":"סגנון פיסקה","toggleDir":"מיתוג כיוון ","bold":"מודגש","systemShortcutFF":"הפעולה \"${0}\" זמינה בדפדפן Mozilla Firefox רק באמצעות קיצור דרך במקלדת. נא להשתמש ב-${1}.","justifyRight":"יישור לימין","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.he");dojo.cldr.nls.number.he={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.he");dojo.cldr.nls.currency.he={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.he");dojo.cldr.nls.gregorian.he={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.he");dijit.form.nls.Textarea.he={"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.he");dijit.nls.common.he={"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"};
diff --git a/includes/js/dijit/nls/dijit-all_hu.js b/includes/js/dijit/nls/dijit-all_hu.js
new file mode 100644
index 0000000..3118025
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_hu.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.hu");dijit.form.nls.Textarea.hu={"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"};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","underline":"Aláhúzott","foreColor":"Előtérszín","htmlToggle":"HTML forrás","formatBlock":"Bekezdés stílusa","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","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","fontSize":"Betűméret","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ányváltás","bold":"Félkövér","systemShortcutFF":"A(z) \"${0}\" művelet csak Mozilla Firefox böngészőben érhető el billentyűparancs használatával. Használja a következőt: ${1}.","justifyRight":"Jobbra igazítás","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.hu");dojo.cldr.nls.number.hu={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.hu");dojo.cldr.nls.currency.hu={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.hu");dojo.cldr.nls.gregorian.hu={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.hu");dijit.form.nls.Textarea.hu={"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_it-it.js b/includes/js/dijit/nls/dijit-all_it-it.js
new file mode 100644
index 0000000..33f3f62
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_it-it.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.it_it");dijit.form.nls.Textarea.it_it={"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"};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","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":"Inserisci immagine","superscript":"Apice","subscript":"Pedice","createLink":"Crea collegamento","undo":"Annulla","italic":"Corsivo","fontName":"Nome carattere","justifyLeft":"Allinea a sinistra","unlink":"Rimuovi collegamento","toggleTableBorder":"Mostra/Nascondi margine tabella","fontSize":"Dimensione carattere","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","systemShortcutFF":"L'azione \"${0}\" è disponibile solo in Mozilla Firefox tramite tasti di scelta rapida. Utilizzare ${1}.","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"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:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.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","CHF_symbol":"SFr.","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$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"timeFormat-long":"H:mm:ss z","quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MMM/yyyy","field-second":"secondo","field-week":"settimana","pm":"p.","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"am":"m.","days-standAlone-narrow":["D","L","M","M","G","V","S"],"field-year":"anno","field-minute":"minuto","field-hour":"ora","dateFormat-long":"dd MMMM yyyy","field-day":"giorno","field-dayperiod":"periodo del giorno","field-month":"mese","dateFormat-short":"dd/MM/yy","months-format-wide":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"field-era":"era","months-format-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"days-format-wide":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"eraAbbr":["aC","dC"],"quarters-format-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"dateFormat-full":"EEEE d MMMM yyyy","field-weekday":"giorno della settimana","days-format-abbr":["dom","lun","mar","mer","gio","ven","sab"],"field-zone":"zona","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","eraNames":["BCE","CE"],"dateTimeFormats-appendItem-Year":"{0} {1}","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","timeFormat-medium":"HH:mm:ss","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-short":"HH:mm","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.it_it");dijit.form.nls.Textarea.it_it={"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_it.js b/includes/js/dijit/nls/dijit-all_it.js
new file mode 100644
index 0000000..bd8e139
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_it.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.it");dijit.form.nls.Textarea.it={"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"};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","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":"Inserisci immagine","superscript":"Apice","subscript":"Pedice","createLink":"Crea collegamento","undo":"Annulla","italic":"Corsivo","fontName":"Nome carattere","justifyLeft":"Allinea a sinistra","unlink":"Rimuovi collegamento","toggleTableBorder":"Mostra/Nascondi margine tabella","fontSize":"Dimensione carattere","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","systemShortcutFF":"L'azione \"${0}\" è disponibile solo in Mozilla Firefox tramite tasti di scelta rapida. Utilizzare ${1}.","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.it");dojo.cldr.nls.number.it={"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:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.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","CHF_symbol":"SFr.","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$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MMM/yyyy","field-second":"secondo","field-week":"settimana","pm":"p.","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"am":"m.","days-standAlone-narrow":["D","L","M","M","G","V","S"],"field-year":"anno","field-minute":"minuto","field-hour":"ora","dateFormat-long":"dd MMMM yyyy","field-day":"giorno","field-dayperiod":"periodo del giorno","field-month":"mese","dateFormat-short":"dd/MM/yy","months-format-wide":["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],"field-era":"era","months-format-abbr":["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],"days-format-wide":["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],"eraAbbr":["aC","dC"],"quarters-format-wide":["1o trimestre","2o trimestre","3o trimestre","4o trimestre"],"dateFormat-full":"EEEE d MMMM yyyy","field-weekday":"giorno della settimana","days-format-abbr":["dom","lun","mar","mer","gio","ven","sab"],"field-zone":"zona","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","eraNames":["BCE","CE"],"dateTimeFormats-appendItem-Year":"{0} {1}","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","timeFormat-medium":"HH:mm:ss","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.it");dijit.form.nls.Textarea.it={"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_ja-jp.js b/includes/js/dijit/nls/dijit-all_ja-jp.js
new file mode 100644
index 0000000..49a9982
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ja-jp.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ja_jp");dijit.form.nls.Textarea.ja_jp={"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"};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":"テーブルの挿入/編集","underline":"下線","foreColor":"前景色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの除去","toggleTableBorder":"テーブル・ボーダーの切り替え","fontSize":"フォント・サイズ","indent":"インデント","redo":"やり直し","strikethrough":"取り消し線","justifyFull":"両端揃え","justifyCenter":"中央揃え","hiliteColor":"背景色","deleteTable":"テーブルの削除","outdent":"アウトデント","cut":"切り取り","plainFormatBlock":"段落スタイル","toggleDir":"方向の切り替え","bold":"太字","systemShortcutFF":"\"${0}\" アクションは、キーボード・ショートカットを使用して Mozilla Firefox でのみ使用できます。${1} を使用してください。","justifyRight":"右揃え","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"currencyFormat":"¤#,##0.00","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":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.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":"中国人民元","AUD_displayName":"オーストラリア ドル","JPY_displayName":"日本円","USD_displayName":"米ドル","CNY_symbol":"元","GBP_displayName":"英国ポンド","EUR_displayName":"ユーロ","USD_symbol":"US$","GBP_symbol":"UK£","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"yyyy/MM/dd","field-second":"秒","field-week":"週","pm":"午後","timeFormat-full":"H時mm分ss秒v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["d 日(E)","GGGGy年M月d日","H 時","MMM/d(E)","MMMM d 日","MM/dd","M/d","mm:ss","yy 年 MMM","yy/Q","yy Q","yyyy"],"months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"eraNames":["紀元前","西暦"],"am":"午前","days-standAlone-narrow":["日","月","火","水","木","金","土"],"field-year":"年","field-minute":"分","timeFormat-medium":"H:mm:ss","field-hour":"時","dateFormat-long":"yyyy年M月d日","field-day":"日","field-dayperiod":"午前/午後","field-month":"月","dateFormat-short":"yy/MM/dd","months-format-wide":["1 月","2 月","3 月","4 月","5 月","6 月","7 月","8 月","9 月","10 月","11 月","12 月"],"field-era":"時代","timeFormat-short":"H:mm","months-format-abbr":["1 月","2 月","3 月","4 月","5 月","6 月","7 月","8 月","9 月","10 月","11 月","12 月"],"eraAbbr":["紀元前","西暦"],"days-format-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"timeFormat-long":"H:mm:ss:z","quarters-format-wide":["第 1 四半期","第 2 四半期","第 3 四半期","第 4 四半期"],"dateFormat-full":"yyyy年M月d日EEEE","field-weekday":"曜日","field-zone":"時間帯","days-format-abbr":["日","月","火","水","木","金","土"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ja_jp");dijit.form.nls.Textarea.ja_jp={"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"};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":"閉じる"};
diff --git a/includes/js/dijit/nls/dijit-all_ja.js b/includes/js/dijit/nls/dijit-all_ja.js
new file mode 100644
index 0000000..d8b4c30
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ja.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ja");dijit.form.nls.Textarea.ja={"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"};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":"テーブルの挿入/編集","underline":"下線","foreColor":"前景色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの除去","toggleTableBorder":"テーブル・ボーダーの切り替え","fontSize":"フォント・サイズ","indent":"インデント","redo":"やり直し","strikethrough":"取り消し線","justifyFull":"両端揃え","justifyCenter":"中央揃え","hiliteColor":"背景色","deleteTable":"テーブルの削除","outdent":"アウトデント","cut":"切り取り","plainFormatBlock":"段落スタイル","toggleDir":"方向の切り替え","bold":"太字","systemShortcutFF":"\"${0}\" アクションは、キーボード・ショートカットを使用して Mozilla Firefox でのみ使用できます。${1} を使用してください。","justifyRight":"右揃え","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ja");dojo.cldr.nls.number.ja={"currencyFormat":"¤#,##0.00","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":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.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":"中国人民元","AUD_displayName":"オーストラリア ドル","JPY_displayName":"日本円","USD_displayName":"米ドル","CNY_symbol":"元","GBP_displayName":"英国ポンド","EUR_displayName":"ユーロ","USD_symbol":"US$","GBP_symbol":"UK£","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={"quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateFormat-medium":"yyyy/MM/dd","field-second":"秒","field-week":"週","pm":"午後","timeFormat-full":"H時mm分ss秒v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["d 日(E)","GGGGy年M月d日","H 時","MMM/d(E)","MMMM d 日","MM/dd","M/d","mm:ss","yy 年 MMM","yy/Q","yy Q","yyyy"],"months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"eraNames":["紀元前","西暦"],"am":"午前","days-standAlone-narrow":["日","月","火","水","木","金","土"],"field-year":"年","field-minute":"分","timeFormat-medium":"H:mm:ss","field-hour":"時","dateFormat-long":"yyyy年M月d日","field-day":"日","field-dayperiod":"午前/午後","field-month":"月","dateFormat-short":"yy/MM/dd","months-format-wide":["1 月","2 月","3 月","4 月","5 月","6 月","7 月","8 月","9 月","10 月","11 月","12 月"],"field-era":"時代","timeFormat-short":"H:mm","months-format-abbr":["1 月","2 月","3 月","4 月","5 月","6 月","7 月","8 月","9 月","10 月","11 月","12 月"],"eraAbbr":["紀元前","西暦"],"days-format-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"timeFormat-long":"H:mm:ss:z","quarters-format-wide":["第 1 四半期","第 2 四半期","第 3 四半期","第 4 四半期"],"dateFormat-full":"yyyy年M月d日EEEE","field-weekday":"曜日","field-zone":"時間帯","days-format-abbr":["日","月","火","水","木","金","土"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ja");dijit.form.nls.Textarea.ja={"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"};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":"閉じる"};
diff --git a/includes/js/dijit/nls/dijit-all_ko-kr.js b/includes/js/dijit/nls/dijit-all_ko-kr.js
new file mode 100644
index 0000000..e386e67
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ko-kr.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ko_kr");dijit.form.nls.Textarea.ko_kr={"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"};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":"테이블 삽입/편집","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","insertHorizontalRule":"수평 자","delete":"삭제","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","italic":"이탤릭체","fontName":"글꼴 이름","justifyLeft":"왼쪽 맞춤","unlink":"링크 제거","toggleTableBorder":"토글 테이블 경계","fontSize":"글꼴 크기","indent":"들여쓰기","redo":"다시 실행","strikethrough":"취소선","justifyFull":"양쪽 맞춤","justifyCenter":"가운데 맞춤","hiliteColor":"배경색","deleteTable":"테이블 삭제","outdent":"내어쓰기","cut":"잘라내기","plainFormatBlock":"단락 양식","toggleDir":"토글 방향","bold":"굵은체","systemShortcutFF":"\"${0}\" 조치는 키보드 바로 가기를 사용하는 Mozilla Firefox에서만 사용 가능합니다. ${1} 사용.","justifyRight":"오른쪽 맞춤","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"currencyFormat":"¤#,##0.00","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":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ko_kr");dojo.cldr.nls.currency.ko_kr={"HKD_displayName":"홍콩 달러","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔화","CAD_symbol":"Can$","USD_displayName":"미국 달러","GBP_displayName":"영국령 파운드 스털링","EUR_displayName":"유로화","USD_symbol":"US$","GBP_symbol":"UK£","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={"timeFormat-medium":"a h:mm:ss","timeFormat-short":"a h:mm","quarters-format-abbreviated":["1분기","2분기","3분기","4분기"],"dateFormat-medium":"yyyy. M. d.","field-second":"초","field-week":"주","pm":"오후","timeFormat-full":"a hh시 mm분 ss초 v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["d일 (E)","HH:mm","HH:mm:ss","H시 m분 s초","MMM d일 (E)","MMMM d일","M. d.","mm:ss","yy년 MMM","yy년 Q분기","yyyy. MM","yyyy"],"months-standAlone-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"eraNames":["서력기원전","서력기원"],"am":"오전","days-standAlone-narrow":["일","월","화","수","목","금","토"],"field-year":"년","field-minute":"분","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"시","dateFormat-long":"yyyy년 M월 d일","field-day":"일","field-dayperiod":"오전/오후","field-month":"월","dateFormat-short":"yy. M. d.","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"field-era":"연호","months-format-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"eraAbbr":["기원전","서기"],"days-format-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"timeFormat-long":"a hh시 mm분 ss초 z","quarters-format-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"dateFormat-full":"yyyy년 M월 d일 EEEE","field-weekday":"요일","field-zone":"시간대","days-format-abbr":["일","월","화","수","목","금","토"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ko_kr");dijit.form.nls.Textarea.ko_kr={"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"};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":"닫기"};
diff --git a/includes/js/dijit/nls/dijit-all_ko.js b/includes/js/dijit/nls/dijit-all_ko.js
new file mode 100644
index 0000000..ea7e84b
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ko.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ko");dijit.form.nls.Textarea.ko={"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"};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":"테이블 삽입/편집","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","insertHorizontalRule":"수평 자","delete":"삭제","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","italic":"이탤릭체","fontName":"글꼴 이름","justifyLeft":"왼쪽 맞춤","unlink":"링크 제거","toggleTableBorder":"토글 테이블 경계","fontSize":"글꼴 크기","indent":"들여쓰기","redo":"다시 실행","strikethrough":"취소선","justifyFull":"양쪽 맞춤","justifyCenter":"가운데 맞춤","hiliteColor":"배경색","deleteTable":"테이블 삭제","outdent":"내어쓰기","cut":"잘라내기","plainFormatBlock":"단락 양식","toggleDir":"토글 방향","bold":"굵은체","systemShortcutFF":"\"${0}\" 조치는 키보드 바로 가기를 사용하는 Mozilla Firefox에서만 사용 가능합니다. ${1} 사용.","justifyRight":"오른쪽 맞춤","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ko");dojo.cldr.nls.number.ko={"currencyFormat":"¤#,##0.00","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":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"};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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ko");dojo.cldr.nls.currency.ko={"HKD_displayName":"홍콩 달러","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔화","CAD_symbol":"Can$","USD_displayName":"미국 달러","GBP_displayName":"영국령 파운드 스털링","EUR_displayName":"유로화","USD_symbol":"US$","GBP_symbol":"UK£","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={"quarters-format-abbreviated":["1분기","2분기","3분기","4분기"],"dateFormat-medium":"yyyy. M. d.","field-second":"초","field-week":"주","pm":"오후","timeFormat-full":"a hh시 mm분 ss초 v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["d일 (E)","HH:mm","HH:mm:ss","H시 m분 s초","MMM d일 (E)","MMMM d일","M. d.","mm:ss","yy년 MMM","yy년 Q분기","yyyy. MM","yyyy"],"months-standAlone-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"eraNames":["서력기원전","서력기원"],"am":"오전","days-standAlone-narrow":["일","월","화","수","목","금","토"],"field-year":"년","field-minute":"분","timeFormat-medium":"a h:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"시","dateFormat-long":"yyyy년 M월 d일","field-day":"일","field-dayperiod":"오전/오후","field-month":"월","dateFormat-short":"yy. M. d.","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"field-era":"연호","timeFormat-short":"a h:mm","months-format-abbr":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"eraAbbr":["기원전","서기"],"days-format-wide":["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],"timeFormat-long":"a hh시 mm분 ss초 z","quarters-format-wide":["제 1/4분기","제 2/4분기","제 3/4분기","제 4/4분기"],"dateFormat-full":"yyyy년 M월 d일 EEEE","field-weekday":"요일","field-zone":"시간대","days-format-abbr":["일","월","화","수","목","금","토"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ko");dijit.form.nls.Textarea.ko={"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ko");dijit.nls.common.ko={"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"};
diff --git a/includes/js/dijit/nls/dijit-all_nl-nl.js b/includes/js/dijit/nls/dijit-all_nl-nl.js
new file mode 100644
index 0000000..545edac
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_nl-nl.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.nl_nl");dijit.form.nls.Textarea.nl_nl={"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"};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","underline":"Onderstrepen","foreColor":"Voorgrondkleur","htmlToggle":"HTML-bron","formatBlock":"Alineastijl","insertHorizontalRule":"Horizontale liniaal","delete":"Wissen","insertUnorderedList":"Lijst met opsommingstekens","tableProp":"Tabeleigenschap","insertImage":"Afbeelding invoegen","superscript":"Superscript","subscript":"Subscript","createLink":"Link maken","undo":"Ongedaan maken","italic":"Cursief","fontName":"Lettertype","justifyLeft":"Links uitlijnen","unlink":"Link verwijderen","toggleTableBorder":"Tabelkader wijzigen","ctrlKey":"Ctrl+${0}","fontSize":"Lettergrootte","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","systemShortcutFF":"De actie \"${0}\" is alleen beschikbaar in Mozilla Firefox via een sneltoestcombinatie. Gebruik ${1}.","justifyRight":"Rechts uitlijnen","appleKey":"⌘${0}"};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={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.nl_nl");dojo.cldr.nls.currency.nl_nl={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};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={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.nl_nl");dijit.form.nls.Textarea.nl_nl={"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_nl.js b/includes/js/dijit/nls/dijit-all_nl.js
new file mode 100644
index 0000000..5bfc19a
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_nl.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.nl");dijit.form.nls.Textarea.nl={"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"};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","underline":"Onderstrepen","foreColor":"Voorgrondkleur","htmlToggle":"HTML-bron","formatBlock":"Alineastijl","insertHorizontalRule":"Horizontale liniaal","delete":"Wissen","insertUnorderedList":"Lijst met opsommingstekens","tableProp":"Tabeleigenschap","insertImage":"Afbeelding invoegen","superscript":"Superscript","subscript":"Subscript","createLink":"Link maken","undo":"Ongedaan maken","italic":"Cursief","fontName":"Lettertype","justifyLeft":"Links uitlijnen","unlink":"Link verwijderen","toggleTableBorder":"Tabelkader wijzigen","ctrlKey":"Ctrl+${0}","fontSize":"Lettergrootte","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","systemShortcutFF":"De actie \"${0}\" is alleen beschikbaar in Mozilla Firefox via een sneltoestcombinatie. Gebruik ${1}.","justifyRight":"Rechts uitlijnen","appleKey":"⌘${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nl");dojo.cldr.nls.number.nl={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.nl");dojo.cldr.nls.currency.nl={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.nl");dojo.cldr.nls.gregorian.nl={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.nl");dijit.form.nls.Textarea.nl={"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_no.js b/includes/js/dijit/nls/dijit-all_no.js
new file mode 100644
index 0000000..ea6239f
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_no.js
@@ -0,0 +1 @@
+dojo.provide("dijit.nls.dijit-all_no");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.no");dojo.nls.colors.no={"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.no");dijit.nls.loading.no={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.no");dijit.nls.common.no={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.no");dijit.form.nls.Textarea.no={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};dojo.provide("dijit._editor.nls.commands");dijit._editor.nls.commands._built=true;dojo.provide("dijit._editor.nls.commands.no");dijit._editor.nls.commands.no={"removeFormat":"Remove Format","copy":"Copy","paste":"Paste","selectAll":"Select All","insertOrderedList":"Numbered List","insertTable":"Insert/Edit Table","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.no");dojo.cldr.nls.number.no={"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("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.no");dijit.nls.common.no={"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.no");dijit.form.nls.validate.no={"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.no");dijit.form.nls.ComboBox.no={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.no");dojo.cldr.nls.currency.no={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.no");dojo.cldr.nls.gregorian.no={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.no");dijit.form.nls.Textarea.no={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.no");dijit.nls.common.no={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};
diff --git a/includes/js/dijit/nls/dijit-all_pl.js b/includes/js/dijit/nls/dijit-all_pl.js
new file mode 100644
index 0000000..8873535
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_pl.js
@@ -0,0 +1 @@
+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":"Trwa ł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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pl");dijit.form.nls.Textarea.pl={"iframeEditTitle":"obszar edycji","iframeFocusTitle":"ramka obszaru edycji"};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ę","underline":"Podkreślenie","foreColor":"Kolor pierwszego planu","htmlToggle":"Źródło HTML","formatBlock":"Styl akapitu","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","italic":"Kursywa","fontName":"Nazwa czcionki","justifyLeft":"Wyrównaj do lewej","unlink":"Usuń odsyłacz","toggleTableBorder":"Przełącz ramkę tabeli","fontSize":"Wielkość czcionki","indent":"Wcięcie","redo":"Przywróć","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","systemShortcutFF":"Działanie ${0} jest dostępne w przeglądarce Mozilla Firefox wyłącznie za pomocą skrótu klawiaturowego. Użyj ${1}.","justifyRight":"Wyrównaj do prawej","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pl");dojo.cldr.nls.number.pl={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.pl");dojo.cldr.nls.currency.pl={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.pl");dojo.cldr.nls.gregorian.pl={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pl");dijit.form.nls.Textarea.pl={"iframeEditTitle":"obszar edycji","iframeFocusTitle":"ramka obszaru edycji"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_pt-br.js b/includes/js/dijit/nls/dijit-all_pt-br.js
new file mode 100644
index 0000000..030071c
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_pt-br.js
@@ -0,0 +1 @@
+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 metálico claro","orangered":"vermelho-alaranjado","midnightblue":"azul noturno","cadetblue":"azul-cadete","seashell":"concha marinha","slategrey":"ardósia cinza","coral":"coral","darkturquoise":"turquesa-escuro","antiquewhite":"branco velho","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza-escuro","ivory":"marfim","greenyellow":"verde-amarelado","mistyrose":"rosa nublado","lightsalmon":"salmão claro","silver":"prata","dimgrey":"cinza-escuro","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"fita velha","chartreuse":"verde-amarelado","darkcyan":"ciano-escuro","yellow":"amarelo","linen":"linho","olive":"verde-oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo-claro","tan":"canela","darkviolet":"violeta-escuro","lightslategrey":"ardósia cinza-claro","grey":"cinza","darkkhaki":"cáqui-escuro","green":"verde","deepskyblue":"azul celeste profundo","aqua":"azul-água","sienna":"marrom-avermelhado","mintcream":"menta","rosybrown":"marrom rosado","mediumslateblue":"ardósia azul médio","magenta":"magenta","lightseagreen":"verde-mar claro","cyan":"ciano","olivedrab":"verde-acastanhado","darkgoldenrod":"ouro-escuro","slateblue":"ardósia azul","mediumaquamarine":"verde-azulado temperado","lavender":"lavanda","mediumseagreen":"verde mar temperado","maroon":"castanho","darkslategray":"ardósia cinza-escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul-escuro","mediumvioletred":"violeta avermelhado médio","brown":"marrom","lightgray":"cinza-claro","sandybrown":"marrom arenoso","pink":"rosado","firebrick":"tijolo queimado","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea-escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"marinho","lemonchiffon":"gaze limão","teal":"azul-esverdeado","floralwhite":"branco floral","cornflowerblue":"centáurea azul","paleturquoise":"turquesa pálida","purple":"púrpura","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde-escuro","honeydew":"verde mel","darkseagreen":"verde-mar escuro","lightcoral":"coral-claro","palevioletred":"violeta pálida","mediumpurple":"púrpura temperado","saddlebrown":"marrom couro","darkmagenta":"magenta-escuro","thistle":"cardo","whitesmoke":"branco esfumaçado","wheat":"trigo","violet":"violeta","lightskyblue":"azul celeste claro","goldenrod":"ouro","mediumblue":"azul temperado","skyblue":"azul celeste","crimson":"carmim","darksalmon":"salmão escuro","darkred":"vermelho-escuro","darkslategrey":"ardósia cinza-escuro","peru":"peru","lightgrey":"cinza-claro","lightgoldenrodyellow":"amarelo-claro","blanchedalmond":"branco-amêndoa","aliceblue":"azul-bebê","bisque":"biscuit","slategray":"ardósia cinza","palegoldenrod":"ouro pálido","darkorange":"laranja-escuro","aquamarine":"água-marinha","lightgreen":"verde-claro","burlywood":"madeira","dodgerblue":"azul fugidio","darkgray":"cinza-escuro","lightcyan":"ciano-claro","powderblue":"azul pólvora","blueviolet":"violeta azulado","orchid":"orquídea","dimgray":"cinza-escuro","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul metálico","tomato":"vermelho tomate","lightpink":"rosa-claro","limegreen":"verde lima","indianred":"vermelho oriental","papayawhip":"mamão papaia","lightslategray":"ardósia cinza-claro","gray":"cinza","mediumorchid":"orquídea temperado","cornsilk":"fios de milho","black":"preto","seagreen":"verde-mar","darkslateblue":"ardósia azul-escuro","khaki":"cáqui","lightblue":"azul-claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-oliva escuro","yellowgreen":"amarelo esverdeado"};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":"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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt_br");dijit.form.nls.Textarea.pt_br={"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"};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","underline":"Sublinhado","foreColor":"Cor do Primeiro Plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de Parágrafo","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","italic":"Itálico","fontName":"Nome da Fonte","justifyLeft":"Alinhar pela Esquerda","unlink":"Remover Link","toggleTableBorder":"Alternar Moldura da Tabela","fontSize":"Tamanho da Fonte","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":"Alternar Direção","bold":"Negrito","systemShortcutFF":"A ação \"${0}\" está disponível apenas no Mozilla Firefox utilizando um atalho do teclado. Utilize ${1}.","justifyRight":"Alinhar pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00;(¤#,##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("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 dos limites.","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.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$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"field-hour":"Hora","field-dayperiod":"Período do dia","field-minute":"Minuto","timeFormat-full":"HH'h'mm'min'ss's' z","field-week":"Semana","field-weekday":"Dia da semana","field-second":"Segundo","dateFormat-medium":"dd/MM/yyyy","field-day":"Dia","timeFormat-long":"H'h'm'min's's' z","field-month":"Mês","field-year":"Ano","dateFormat-short":"dd/MM/yy","field-zone":"Fuso","quarters-format-abbreviated":["T1","T2","T3","T4"],"pm":"PM","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","d MMMM","d/M","mm:ss","MM/yy","MMM yy","Q yy","MMM/yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Antes de Cristo","Ano do Senhor"],"am":"AM","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-long":"d 'de' MMMM 'de' yyyy","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"field-era":"Era","timeFormat-short":"HH:mm","months-format-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"eraAbbr":["a.C.","d.C."],"days-format-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"quarters-format-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"dateFormat-full":"EEEE, d 'de' MMMM 'de' yyyy","days-format-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt_br");dijit.form.nls.Textarea.pt_br={"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_pt-pt.js b/includes/js/dijit/nls/dijit-all_pt-pt.js
new file mode 100644
index 0000000..bec8f17
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_pt-pt.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt_pt");dijit.form.nls.Textarea.pt_pt={"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"};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","underline":"Sublinhado","foreColor":"Cor de primeiro plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de parágrafo","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","italic":"Itálico","fontName":"Nome do tipo de letra","justifyLeft":"Alinhar à esquerda","unlink":"Remover ligação","toggleTableBorder":"Alternar limite da tabela","fontSize":"Tamanho do tipo de letra","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","systemShortcutFF":"A acção \"${0}\" apenas está disponível no Mozilla Firefox utilizando um atalho de teclado. Utilize ${1}.","justifyRight":"Alinhar à direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00;(¤#,##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("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":"O 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.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$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MM/yyyy","field-second":"Segundo","field-week":"Semana","pm":"PM","timeFormat-full":"HH'h'mm'min'ss's' v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","d MMMM","d/M","mm:ss","MM/yy","MMM yy","Q yy","MMM/yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Antes de Cristo","Ano do Senhor"],"am":"AM","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"field-year":"Ano","field-minute":"Minuto","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"Hora","dateFormat-long":"d 'de' MMMM 'de' yyyy","field-day":"Dia","field-dayperiod":"Período do dia","field-month":"Mês","dateFormat-short":"dd/MM/yy","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"field-era":"Era","timeFormat-short":"HH:mm","months-format-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"eraAbbr":["a.C.","d.C."],"days-format-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"quarters-format-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"dateFormat-full":"EEEE, d 'de' MMMM 'de' yyyy","field-weekday":"Dia da semana","field-zone":"Fuso","days-format-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt_pt");dijit.form.nls.Textarea.pt_pt={"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_pt.js b/includes/js/dijit/nls/dijit-all_pt.js
new file mode 100644
index 0000000..e00bd7d
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_pt.js
@@ -0,0 +1 @@
+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 metálico claro","orangered":"vermelho-alaranjado","midnightblue":"azul noturno","cadetblue":"azul-cadete","seashell":"concha marinha","slategrey":"ardósia cinza","coral":"coral","darkturquoise":"turquesa-escuro","antiquewhite":"branco velho","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza-escuro","ivory":"marfim","greenyellow":"verde-amarelado","mistyrose":"rosa nublado","lightsalmon":"salmão claro","silver":"prata","dimgrey":"cinza-escuro","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"fita velha","chartreuse":"verde-amarelado","darkcyan":"ciano-escuro","yellow":"amarelo","linen":"linho","olive":"verde-oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo-claro","tan":"canela","darkviolet":"violeta-escuro","lightslategrey":"ardósia cinza-claro","grey":"cinza","darkkhaki":"cáqui-escuro","green":"verde","deepskyblue":"azul celeste profundo","aqua":"azul-água","sienna":"marrom-avermelhado","mintcream":"menta","rosybrown":"marrom rosado","mediumslateblue":"ardósia azul médio","magenta":"magenta","lightseagreen":"verde-mar claro","cyan":"ciano","olivedrab":"verde-acastanhado","darkgoldenrod":"ouro-escuro","slateblue":"ardósia azul","mediumaquamarine":"verde-azulado temperado","lavender":"lavanda","mediumseagreen":"verde mar temperado","maroon":"castanho","darkslategray":"ardósia cinza-escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul-escuro","mediumvioletred":"violeta avermelhado médio","brown":"marrom","lightgray":"cinza-claro","sandybrown":"marrom arenoso","pink":"rosado","firebrick":"tijolo queimado","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea-escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"marinho","lemonchiffon":"gaze limão","teal":"azul-esverdeado","floralwhite":"branco floral","cornflowerblue":"centáurea azul","paleturquoise":"turquesa pálida","purple":"púrpura","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde-escuro","honeydew":"verde mel","darkseagreen":"verde-mar escuro","lightcoral":"coral-claro","palevioletred":"violeta pálida","mediumpurple":"púrpura temperado","saddlebrown":"marrom couro","darkmagenta":"magenta-escuro","thistle":"cardo","whitesmoke":"branco esfumaçado","wheat":"trigo","violet":"violeta","lightskyblue":"azul celeste claro","goldenrod":"ouro","mediumblue":"azul temperado","skyblue":"azul celeste","crimson":"carmim","darksalmon":"salmão escuro","darkred":"vermelho-escuro","darkslategrey":"ardósia cinza-escuro","peru":"peru","lightgrey":"cinza-claro","lightgoldenrodyellow":"amarelo-claro","blanchedalmond":"branco-amêndoa","aliceblue":"azul-bebê","bisque":"biscuit","slategray":"ardósia cinza","palegoldenrod":"ouro pálido","darkorange":"laranja-escuro","aquamarine":"água-marinha","lightgreen":"verde-claro","burlywood":"madeira","dodgerblue":"azul fugidio","darkgray":"cinza-escuro","lightcyan":"ciano-claro","powderblue":"azul pólvora","blueviolet":"violeta azulado","orchid":"orquídea","dimgray":"cinza-escuro","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul metálico","tomato":"vermelho tomate","lightpink":"rosa-claro","limegreen":"verde lima","indianred":"vermelho oriental","papayawhip":"mamão papaia","lightslategray":"ardósia cinza-claro","gray":"cinza","mediumorchid":"orquídea temperado","cornsilk":"fios de milho","black":"preto","seagreen":"verde-mar","darkslateblue":"ardósia azul-escuro","khaki":"cáqui","lightblue":"azul-claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-oliva escuro","yellowgreen":"amarelo esverdeado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt");dijit.nls.loading.pt={"loadingState":"Carregando...","errorState":"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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt");dijit.form.nls.Textarea.pt={"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"};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","underline":"Sublinhado","foreColor":"Cor do Primeiro Plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de Parágrafo","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","italic":"Itálico","fontName":"Nome da Fonte","justifyLeft":"Alinhar pela Esquerda","unlink":"Remover Link","toggleTableBorder":"Alternar Moldura da Tabela","fontSize":"Tamanho da Fonte","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":"Alternar Direção","bold":"Negrito","systemShortcutFF":"A ação \"${0}\" está disponível apenas no Mozilla Firefox utilizando um atalho do teclado. Utilize ${1}.","justifyRight":"Alinhar pela Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt");dojo.cldr.nls.number.pt={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00;(¤#,##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("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 dos limites.","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.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$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"quarters-format-abbreviated":["T1","T2","T3","T4"],"dateFormat-medium":"dd/MM/yyyy","field-second":"Segundo","field-week":"Semana","pm":"PM","timeFormat-full":"HH'h'mm'min'ss's' v","dateTimeFormat":"{1} {0}","dateTimeAvailableFormats":["HH:mm","HH:mm:ss","d MMMM","d/M","mm:ss","MM/yy","MMM yy","Q yy","MMM/yyyy","yy MMM","yy Q","yyyy"],"months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"eraNames":["Antes de Cristo","Ano do Senhor"],"am":"AM","days-standAlone-narrow":["D","S","T","Q","Q","S","S"],"field-year":"Ano","field-minute":"Minuto","timeFormat-medium":"HH:mm:ss","quarters-stand-alone-narrow":["1","2","3","4"],"field-hour":"Hora","dateFormat-long":"d 'de' MMMM 'de' yyyy","field-day":"Dia","field-dayperiod":"Período do dia","field-month":"Mês","dateFormat-short":"dd/MM/yy","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"field-era":"Era","timeFormat-short":"HH:mm","months-format-abbr":["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],"eraAbbr":["a.C.","d.C."],"days-format-wide":["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],"quarters-format-wide":["1º trimestre","2º trimestre","3º trimestre","4º trimestre"],"dateFormat-full":"EEEE, d 'de' MMMM 'de' yyyy","field-weekday":"Dia da semana","field-zone":"Fuso","days-format-abbr":["dom","seg","ter","qua","qui","sex","sáb"],"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","timeFormat-long":"HH:mm:ss z","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.pt");dijit.form.nls.Textarea.pt={"iframeEditTitle":"área de edição","iframeFocusTitle":"quadro da área de edição"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_ru.js b/includes/js/dijit/nls/dijit-all_ru.js
new file mode 100644
index 0000000..14ffb0f
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_ru.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ru");dijit.form.nls.Textarea.ru={"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"};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":"Вставить/изменить таблицу","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Код HTML","formatBlock":"Стиль абзаца","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript":"Верхний индекс","subscript":"Нижний индекс","createLink":"Создать ссылку","undo":"Отменить","italic":"Курсив","fontName":"Название шрифта","justifyLeft":"По левому краю","unlink":"Удалить ссылку","toggleTableBorder":"Переключить рамку таблицы","fontSize":"Размер шрифта","indent":"Отступ","redo":"Повторить","strikethrough":"Перечеркивание","justifyFull":"По ширине","justifyCenter":"По центру","hiliteColor":"Цвет фона","deleteTable":"Удалить таблицу","outdent":"Втяжка","cut":"Вырезать","plainFormatBlock":"Стиль абзаца","toggleDir":"Изменить направление","bold":"Полужирный","systemShortcutFF":"Действие \"${0}\" доступно в Mozilla Firefox только через сочетание клавиш. Используйте ${1}.","justifyRight":"По правому краю","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ru");dojo.cldr.nls.number.ru={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.ru");dojo.cldr.nls.currency.ru={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.ru");dojo.cldr.nls.gregorian.ru={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.ru");dijit.form.nls.Textarea.ru={"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ru");dijit.nls.common.ru={"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"};
diff --git a/includes/js/dijit/nls/dijit-all_sv.js b/includes/js/dijit/nls/dijit-all_sv.js
new file mode 100644
index 0000000..59bcaad
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_sv.js
@@ -0,0 +1 @@
+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":"medelvå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":"medelskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"medelakvamarin","lavender":"lavendel","mediumseagreen":"medelhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"medelturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"medelviolettrö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":"medellila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"medelblå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":"medelorkidé","cornsilk":"gulvitt","black":"black","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.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.sv");dijit.form.nls.Textarea.sv={"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"};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","underline":"Understrykning","foreColor":"Förgrundsfärg","htmlToggle":"HTML-källkod","formatBlock":"Styckeformat","insertHorizontalRule":"Horisontell linjal","delete":"Ta bort","insertUnorderedList":"Punktlista","tableProp":"Tabellegenskap","insertImage":"Infoga bild","superscript":"Upphöjt","subscript":"Nedsänkt","createLink":"Skapa länk","undo":"Ångra","italic":"Kursiv","fontName":"Teckensnittsnamn","justifyLeft":"Vänsterjustera","unlink":"Ta bort länk","toggleTableBorder":"Aktivera/avaktivera tabellram","ctrlKey":"Ctrl+${0}","fontSize":"Teckenstorlek","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","systemShortcutFF":"Åtgärden \"${0}\" är endast tillgänglig i Mozilla Firefox med hjälp av ett kortkommando. Använd ${1}.","justifyRight":"Högerjustera","appleKey":"⌘${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sv");dojo.cldr.nls.number.sv={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.sv");dojo.cldr.nls.currency.sv={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.sv");dojo.cldr.nls.gregorian.sv={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.sv");dijit.form.nls.Textarea.sv={"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_tr.js b/includes/js/dijit/nls/dijit-all_tr.js
new file mode 100644
index 0000000..25ad38a
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_tr.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.tr");dijit.form.nls.Textarea.tr={"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"};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","underline":"Altı Çizili","foreColor":"Ön Plan Rengi","htmlToggle":"HTML Kaynağı","formatBlock":"Paragraf Stili","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","italic":"İtalik","fontName":"Yazı Tipi Adı","justifyLeft":"Sola Hizala","unlink":"Bağlantıyı Kaldır","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","fontSize":"Yazı Tipi Boyutu","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","systemShortcutFF":"\"${0}\" işlemi yalnızca Mozilla Firefox'ta bir klavye kısayoluyla birlikte kullanılabilir. ${1} işlemini kullanın.","justifyRight":"Sağa Hizala","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.tr");dojo.cldr.nls.number.tr={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.tr");dojo.cldr.nls.currency.tr={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.tr");dojo.cldr.nls.gregorian.tr={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.tr");dijit.form.nls.Textarea.tr={"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_xx.js b/includes/js/dijit/nls/dijit-all_xx.js
new file mode 100644
index 0000000..6463b39
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_xx.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.xx");dijit.form.nls.Textarea.xx={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","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","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","ctrlKey":"ctrl+${0}","fontSize":"Font Size","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","systemShortcutFF":"The \"${0}\" action is only available in Mozilla Firefox using a keyboard shortcut. Use ${1}.","justifyRight":"Align Right"};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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.xx");dojo.cldr.nls.currency.xx={"USD_symbol":"US$","EUR_displayName":"EUR","GBP_displayName":"GBP","JPY_displayName":"JPY","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€","USD_displayName":"USD"};dojo.provide("dojo.cldr.nls.gregorian");dojo.cldr.nls.gregorian._built=true;dojo.provide("dojo.cldr.nls.gregorian.xx");dojo.cldr.nls.gregorian.xx={"dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","field-dayperiod":"Dayperiod","field-minute":"Minute","eraNames":["BCE","CE"],"field-weekday":"Day of the Week","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","field-era":"Era","field-hour":"Hour","timeFormat-full":"HH:mm:ss v","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","days-standAlone-narrow":["1","2","3","4","5","6","7"],"eraAbbr":["BCE","CE"],"dateFormat-long":"yyyy MMMM d","timeFormat-medium":"HH:mm:ss","field-zone":"Zone","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateFormat-medium":"yyyy MMM d","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","field-year":"Year","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","field-week":"Week","timeFormat-long":"HH:mm:ss z","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-short":"HH:mm","field-month":"Month","dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","days-format-abbr":["1","2","3","4","5","6","7"],"pm":"PM","field-second":"Second","field-day":"Day","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","am":"AM","quarters-stand-alone-narrow":["1","2","3","4"],"dateFormat-short":"yyyy-MM-dd","dateFormat-full":"EEEE, yyyy MMMM dd","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeAvailableFormats":["E d","H","HH:mm","HH:mm:ss","E MMM d","MMMM d","M-d","mm:ss","yy-MM","yy MMM","yy Q","yyyy"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"days-format-wide":["1","2","3","4","5","6","7"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.xx");dijit.form.nls.Textarea.xx={"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"};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"};
diff --git a/includes/js/dijit/nls/dijit-all_zh-cn.js b/includes/js/dijit/nls/dijit-all_zh-cn.js
new file mode 100644
index 0000000..2ecb6b4
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_zh-cn.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh_cn");dijit.form.nls.Textarea.zh_cn={"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"};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":"插入/编辑表","underline":"下划线","foreColor":"前景色","htmlToggle":"HTML 源代码","formatBlock":"段落样式","insertHorizontalRule":"水平线","delete":"删除","insertUnorderedList":"符号列表","tableProp":"表属性","insertImage":"插入图像","superscript":"上标","subscript":"下标","createLink":"创建链接","undo":"撤销","italic":"斜体","fontName":"字体名称","justifyLeft":"左对齐","unlink":"除去链接","toggleTableBorder":"切换表边框","fontSize":"字体大小","indent":"增加缩进","redo":"重做","strikethrough":"删除线","justifyFull":"对齐","justifyCenter":"居中","hiliteColor":"背景色","deleteTable":"删除表","outdent":"减少缩进","cut":"剪切","plainFormatBlock":"段落样式","toggleDir":"固定方向","bold":"粗体","systemShortcutFF":"只能在 Mozilla Firefox 中通过键盘快捷方式执行“${0}”操作。请使用 ${1}。","justifyRight":"右对齐","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"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("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.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":"瑞士法郎","HKD_symbol":"HK$","CAD_displayName":"加拿大元","CNY_displayName":"人民币","AUD_displayName":"澳大利亚元","JPY_displayName":"日元","USD_displayName":"美元","CNY_symbol":"¥","GBP_displayName":"英镑","EUR_displayName":"欧元","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"dateFormat-short":"yy-M-d","timeFormat-long":"ahh'时'mm'分'ss'秒'","dateFormat-medium":"yyyy-M-d","dateFormat-long":"yyyy'年'M'月'd'日'","timeFormat-medium":"ahh:mm:ss","timeFormat-short":"ah:mm","timeFormat-full":"ahh'时'mm'分'ss'秒' z","dateFormat-full":"yyyy'年'M'月'd'日'EEEE","field-second":"秒钟","field-week":"周","pm":"下午","dateTimeAvailableFormats":"M-d","months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"am":"上午","days-standAlone-narrow":["日","一","二","三","四","五","六"],"field-year":"年","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"field-minute":"分钟","field-hour":"小时","field-day":"日","field-dayperiod":"上午/下午","field-month":"月","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"field-era":"时期","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"eraAbbr":["公元前","公元"],"field-weekday":"周天","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"field-zone":"区域","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","eraNames":["BCE","CE"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh_cn");dijit.form.nls.Textarea.zh_cn={"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"};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":"关闭"};
diff --git a/includes/js/dijit/nls/dijit-all_zh-tw.js b/includes/js/dijit/nls/dijit-all_zh-tw.js
new file mode 100644
index 0000000..2213ea7
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_zh-tw.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh_tw");dijit.form.nls.Textarea.zh_tw={"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"};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":"插入/編輯表格","underline":"底線","foreColor":"前景顏色","htmlToggle":"HTML 原始檔","formatBlock":"段落樣式","insertHorizontalRule":"水平尺規","delete":"刪除","insertUnorderedList":"項目符號清單","tableProp":"表格內容","insertImage":"插入影像","superscript":"上標","subscript":"下標","createLink":"建立鏈結","undo":"復原","italic":"斜體","fontName":"字型名稱","justifyLeft":"靠左對齊","unlink":"移除鏈結","toggleTableBorder":"切換表格邊框","fontSize":"字型大小","indent":"縮排","redo":"重做","strikethrough":"加刪除線","justifyFull":"對齊","justifyCenter":"置中對齊","hiliteColor":"背景顏色","deleteTable":"刪除表格","outdent":"凸排","cut":"剪下","plainFormatBlock":"段落樣式","toggleDir":"切換方向","bold":"粗體","systemShortcutFF":"\"${0}\" 動作在 Mozilla Firefox 中,只能使用鍵盤快速鍵。請使用 ${1}。","justifyRight":"靠右對齊","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};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={"currencyFormat":"¤#,##0.00","group":",","list":";","decimal":".","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.zh_tw");dojo.cldr.nls.currency.zh_tw={"EUR_displayName":"歐元","CAD_displayName":"加幣","GBP_displayName":"英鎊","JPY_displayName":"日圓","GBP_symbol":"GBP","AUD_displayName":"澳幣","EUR_symbol":"EUR","CNY_displayName":"人民幣","HKD_displayName":"港元","CHF_displayName":"瑞士法郎","HKD_symbol":"HK$","USD_displayName":"美元","CNY_symbol":"¥","USD_symbol":"US$","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={"quarters-format-abbreviated":["1季","2季","3季","4季"],"dateFormat-medium":"yyyy/M/d","field-second":"秒","field-week":"週","timeFormat-full":"ahh時mm分ss秒 v","dateTimeAvailableFormats":"M/d","eraNames":["西元前","西元"],"field-minute":"分鐘","timeFormat-medium":"a h:mm:ss","field-hour":"小時","dateFormat-short":"yyyy/M/d","field-era":"年代","timeFormat-short":"a h:mm","timeFormat-long":"ahh時mm分ss秒 z","quarters-format-wide":["第1季","第2季","第3季","第4季"],"quarters-stand-alone-abbreviated":["1季","2季","3季","4季"],"field-weekday":"週天","field-zone":"區域","days-format-abbr":["週日","週一","週二","週三","週四","週五","週六"],"pm":"下午","months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"am":"上午","days-standAlone-narrow":["日","一","二","三","四","五","六"],"field-year":"年","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"dateFormat-long":"yyyy年M月d日","field-day":"日","field-dayperiod":"上午/下午","field-month":"月","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"eraAbbr":["公元前","公元"],"dateFormat-full":"yyyy年M月d日EEEE","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh_tw");dijit.form.nls.Textarea.zh_tw={"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"};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":"關閉"};
diff --git a/includes/js/dijit/nls/dijit-all_zh.js b/includes/js/dijit/nls/dijit-all_zh.js
new file mode 100644
index 0000000..f4d1a6e
--- /dev/null
+++ b/includes/js/dijit/nls/dijit-all_zh.js
@@ -0,0 +1 @@
+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.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh");dijit.form.nls.Textarea.zh={"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"};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":"插入/编辑表","underline":"下划线","foreColor":"前景色","htmlToggle":"HTML 源代码","formatBlock":"段落样式","insertHorizontalRule":"水平线","delete":"删除","insertUnorderedList":"符号列表","tableProp":"表属性","insertImage":"插入图像","superscript":"上标","subscript":"下标","createLink":"创建链接","undo":"撤销","italic":"斜体","fontName":"字体名称","justifyLeft":"左对齐","unlink":"除去链接","toggleTableBorder":"切换表边框","fontSize":"字体大小","indent":"增加缩进","redo":"重做","strikethrough":"删除线","justifyFull":"对齐","justifyCenter":"居中","hiliteColor":"背景色","deleteTable":"删除表","outdent":"减少缩进","cut":"剪切","plainFormatBlock":"段落样式","toggleDir":"固定方向","bold":"粗体","systemShortcutFF":"只能在 Mozilla Firefox 中通过键盘快捷方式执行“${0}”操作。请使用 ${1}。","justifyRight":"右对齐","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh");dojo.cldr.nls.number.zh={"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("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.currency");dojo.cldr.nls.currency._built=true;dojo.provide("dojo.cldr.nls.currency.zh");dojo.cldr.nls.currency.zh={"HKD_displayName":"港元","CHF_displayName":"瑞士法郎","HKD_symbol":"HK$","CAD_displayName":"加拿大元","CNY_displayName":"人民币","AUD_displayName":"澳大利亚元","JPY_displayName":"日元","USD_displayName":"美元","CNY_symbol":"¥","GBP_displayName":"英镑","EUR_displayName":"欧元","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","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={"dateFormat-medium":"yyyy-M-d","field-second":"秒钟","field-week":"周","pm":"下午","timeFormat-full":"ahh时mm分ss秒 v","dateTimeAvailableFormats":"M-d","months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"months-standAlone-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"am":"上午","days-standAlone-narrow":["日","一","二","三","四","五","六"],"field-year":"年","months-standAlone-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],"field-minute":"分钟","timeFormat-medium":"ahh:mm:ss","field-hour":"小时","dateFormat-long":"yyyy年M月d日","field-day":"日","field-dayperiod":"上午/下午","field-month":"月","dateFormat-short":"yy-M-d","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"field-era":"时期","timeFormat-short":"ah:mm","days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],"timeFormat-long":"ahh时mm分ss秒 z","eraAbbr":["公元前","公元"],"dateFormat-full":"yyyy年M月d日EEEE","field-weekday":"周天","days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"],"field-zone":"区域","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","eraNames":["BCE","CE"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormats-appendItem-Week":"{0} ({2}: {1})","dateTimeFormats-appendItem-Timezone":"{0} {1}","dateTimeFormats-appendItem-Month":"{0} ({2}: {1})","dateTimeFormats-appendItem-Minute":"{0} ({2}: {1})","quarters-format-abbreviated":["Q1","Q2","Q3","Q4"],"dateTimeFormat":"{1} {0}","dateTimeFormats-appendItem-Day":"{0} ({2}: {1})","months-format-abbr":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Quarter":"{0} ({2}: {1})","dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateTimeFormats-appendItem-Hour":"{0} ({2}: {1})","quarters-stand-alone-narrow":["1","2","3","4"],"dateTimeFormats-appendItem-Era":"{0} {1}","quarters-format-wide":["Q1","Q2","Q3","Q4"],"eraNarrow":["BCE","CE"]};dojo.provide("dijit.form.nls.Textarea");dijit.form.nls.Textarea._built=true;dojo.provide("dijit.form.nls.Textarea.zh");dijit.form.nls.Textarea.zh={"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh");dijit.nls.common.zh={"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"};
diff --git a/includes/js/dijit/nls/el/common.js b/includes/js/dijit/nls/el/common.js
new file mode 100644
index 0000000..5edd7e5
--- /dev/null
+++ b/includes/js/dijit/nls/el/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/el/loading.js b/includes/js/dijit/nls/el/loading.js
new file mode 100644
index 0000000..9567b3c
--- /dev/null
+++ b/includes/js/dijit/nls/el/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/es/common.js b/includes/js/dijit/nls/es/common.js
new file mode 100644
index 0000000..b4feef9
--- /dev/null
+++ b/includes/js/dijit/nls/es/common.js
@@ -0,0 +1 @@
+({"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/es/loading.js b/includes/js/dijit/nls/es/loading.js
new file mode 100644
index 0000000..dc969a3
--- /dev/null
+++ b/includes/js/dijit/nls/es/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/fi/common.js b/includes/js/dijit/nls/fi/common.js
new file mode 100644
index 0000000..8b2fc26
--- /dev/null
+++ b/includes/js/dijit/nls/fi/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/fi/loading.js b/includes/js/dijit/nls/fi/loading.js
new file mode 100644
index 0000000..73e10a1
--- /dev/null
+++ b/includes/js/dijit/nls/fi/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/fr/common.js b/includes/js/dijit/nls/fr/common.js
new file mode 100644
index 0000000..9f6aabe
--- /dev/null
+++ b/includes/js/dijit/nls/fr/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/fr/loading.js b/includes/js/dijit/nls/fr/loading.js
new file mode 100644
index 0000000..ec7192b
--- /dev/null
+++ b/includes/js/dijit/nls/fr/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Chargement...","errorState":"Une erreur est survenue"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/he/common.js b/includes/js/dijit/nls/he/common.js
new file mode 100644
index 0000000..b04d1cc
--- /dev/null
+++ b/includes/js/dijit/nls/he/common.js
@@ -0,0 +1 @@
+({"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/he/loading.js b/includes/js/dijit/nls/he/loading.js
new file mode 100644
index 0000000..bc9801e
--- /dev/null
+++ b/includes/js/dijit/nls/he/loading.js
@@ -0,0 +1 @@
+({"loadingState":"טעינה...","errorState":"אירעה שגיאה"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/hu/common.js b/includes/js/dijit/nls/hu/common.js
new file mode 100644
index 0000000..21a773f
--- /dev/null
+++ b/includes/js/dijit/nls/hu/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/hu/loading.js b/includes/js/dijit/nls/hu/loading.js
new file mode 100644
index 0000000..d61e9a2
--- /dev/null
+++ b/includes/js/dijit/nls/hu/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/it/common.js b/includes/js/dijit/nls/it/common.js
new file mode 100644
index 0000000..6b3dc74
--- /dev/null
+++ b/includes/js/dijit/nls/it/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/it/loading.js b/includes/js/dijit/nls/it/loading.js
new file mode 100644
index 0000000..60d05e0
--- /dev/null
+++ b/includes/js/dijit/nls/it/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ja/common.js b/includes/js/dijit/nls/ja/common.js
new file mode 100644
index 0000000..b0b48c6
--- /dev/null
+++ b/includes/js/dijit/nls/ja/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ja/loading.js b/includes/js/dijit/nls/ja/loading.js
new file mode 100644
index 0000000..fa67d67
--- /dev/null
+++ b/includes/js/dijit/nls/ja/loading.js
@@ -0,0 +1 @@
+({"loadingState":"ロード中...","errorState":"エラーが発生しました。"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ko/common.js b/includes/js/dijit/nls/ko/common.js
new file mode 100644
index 0000000..8e12bbf
--- /dev/null
+++ b/includes/js/dijit/nls/ko/common.js
@@ -0,0 +1 @@
+({"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ko/loading.js b/includes/js/dijit/nls/ko/loading.js
new file mode 100644
index 0000000..5d1ca12
--- /dev/null
+++ b/includes/js/dijit/nls/ko/loading.js
@@ -0,0 +1 @@
+({"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/loading.js b/includes/js/dijit/nls/loading.js
new file mode 100644
index 0000000..1d6fa9b
--- /dev/null
+++ b/includes/js/dijit/nls/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Loading...","errorState":"Sorry, an error occurred"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/nb/common.js b/includes/js/dijit/nls/nb/common.js
new file mode 100644
index 0000000..73e38c7
--- /dev/null
+++ b/includes/js/dijit/nls/nb/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/nb/loading.js b/includes/js/dijit/nls/nb/loading.js
new file mode 100644
index 0000000..dbc314d
--- /dev/null
+++ b/includes/js/dijit/nls/nb/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Laster inn...","errorState":"Det oppsto en feil"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/nl/common.js b/includes/js/dijit/nls/nl/common.js
new file mode 100644
index 0000000..fa4c66e
--- /dev/null
+++ b/includes/js/dijit/nls/nl/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/nl/loading.js b/includes/js/dijit/nls/nl/loading.js
new file mode 100644
index 0000000..c9870fd
--- /dev/null
+++ b/includes/js/dijit/nls/nl/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pl/common.js b/includes/js/dijit/nls/pl/common.js
new file mode 100644
index 0000000..c84e539
--- /dev/null
+++ b/includes/js/dijit/nls/pl/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pl/loading.js b/includes/js/dijit/nls/pl/loading.js
new file mode 100644
index 0000000..eab3476
--- /dev/null
+++ b/includes/js/dijit/nls/pl/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Trwa ładowanie...","errorState":"Niestety, wystąpił błąd"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pt-pt/common.js b/includes/js/dijit/nls/pt-pt/common.js
new file mode 100644
index 0000000..7992705
--- /dev/null
+++ b/includes/js/dijit/nls/pt-pt/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pt-pt/loading.js b/includes/js/dijit/nls/pt-pt/loading.js
new file mode 100644
index 0000000..80257d3
--- /dev/null
+++ b/includes/js/dijit/nls/pt-pt/loading.js
@@ -0,0 +1 @@
+({"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pt/common.js b/includes/js/dijit/nls/pt/common.js
new file mode 100644
index 0000000..b94e6bc
--- /dev/null
+++ b/includes/js/dijit/nls/pt/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/pt/loading.js b/includes/js/dijit/nls/pt/loading.js
new file mode 100644
index 0000000..bf7057a
--- /dev/null
+++ b/includes/js/dijit/nls/pt/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Carregando...","errorState":"Ocorreu um erro"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ru/common.js b/includes/js/dijit/nls/ru/common.js
new file mode 100644
index 0000000..9a76d09
--- /dev/null
+++ b/includes/js/dijit/nls/ru/common.js
@@ -0,0 +1 @@
+({"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/ru/loading.js b/includes/js/dijit/nls/ru/loading.js
new file mode 100644
index 0000000..55cd03b
--- /dev/null
+++ b/includes/js/dijit/nls/ru/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/sv/common.js b/includes/js/dijit/nls/sv/common.js
new file mode 100644
index 0000000..cd3444f
--- /dev/null
+++ b/includes/js/dijit/nls/sv/common.js
@@ -0,0 +1 @@
+({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/sv/loading.js b/includes/js/dijit/nls/sv/loading.js
new file mode 100644
index 0000000..95b90d2
--- /dev/null
+++ b/includes/js/dijit/nls/sv/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Läser in...","errorState":"Det uppstod ett fel."}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/tr/common.js b/includes/js/dijit/nls/tr/common.js
new file mode 100644
index 0000000..e89e645
--- /dev/null
+++ b/includes/js/dijit/nls/tr/common.js
@@ -0,0 +1 @@
+({"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/tr/loading.js b/includes/js/dijit/nls/tr/loading.js
new file mode 100644
index 0000000..b0ed738
--- /dev/null
+++ b/includes/js/dijit/nls/tr/loading.js
@@ -0,0 +1 @@
+({"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/zh-tw/common.js b/includes/js/dijit/nls/zh-tw/common.js
new file mode 100644
index 0000000..5d3fee0
--- /dev/null
+++ b/includes/js/dijit/nls/zh-tw/common.js
@@ -0,0 +1 @@
+({"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/zh-tw/loading.js b/includes/js/dijit/nls/zh-tw/loading.js
new file mode 100644
index 0000000..0078541
--- /dev/null
+++ b/includes/js/dijit/nls/zh-tw/loading.js
@@ -0,0 +1 @@
+({"loadingState":"載入中...","errorState":"抱歉,發生錯誤"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/zh/common.js b/includes/js/dijit/nls/zh/common.js
new file mode 100644
index 0000000..0bb6267
--- /dev/null
+++ b/includes/js/dijit/nls/zh/common.js
@@ -0,0 +1 @@
+({"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"}) \ No newline at end of file
diff --git a/includes/js/dijit/nls/zh/loading.js b/includes/js/dijit/nls/zh/loading.js
new file mode 100644
index 0000000..f68b8fa
--- /dev/null
+++ b/includes/js/dijit/nls/zh/loading.js
@@ -0,0 +1 @@
+({"loadingState":"正在装入...","errorState":"对不起,发生了错误"}) \ No newline at end of file
diff --git a/includes/js/dijit/resources/_modules.js b/includes/js/dijit/resources/_modules.js
new file mode 100644
index 0000000..fbefc92
--- /dev/null
+++ b/includes/js/dijit/resources/_modules.js
@@ -0,0 +1,15 @@
+/*=====
+// 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/includes/js/dijit/templates/Calendar.html b/includes/js/dijit/templates/Calendar.html
new file mode 100644
index 0000000..d025351
--- /dev/null
+++ b/includes/js/dijit/templates/Calendar.html
@@ -0,0 +1,35 @@
+<table cellspacing="0" cellpadding="0" class="dijitCalendarContainer">
+ <thead>
+ <tr class="dijitReset dijitCalendarMonthContainer" valign="top">
+ <th class='dijitReset' dojoAttachPoint="decrementMonth">
+ <div class="dijitInline dijitCalendarIncrementControl dijitCalendarDecrease"><span dojoAttachPoint="decreaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner">-</span></div>
+ </th>
+ <th class='dijitReset' colspan="5">
+ <div dojoAttachPoint="monthLabelSpacer" class="dijitCalendarMonthLabelSpacer"></div>
+ <div dojoAttachPoint="monthLabelNode" class="dijitCalendarMonthLabel"></div>
+ </th>
+ <th class='dijitReset' dojoAttachPoint="incrementMonth">
+ <div class="dijitInline dijitCalendarIncrementControl dijitCalendarIncrease"><span dojoAttachPoint="increaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner">+</span></div>
+ </th>
+ </tr>
+ <tr>
+ <th class="dijitReset dijitCalendarDayLabelTemplate"><span class="dijitCalendarDayLabel"></span></th>
+ </tr>
+ </thead>
+ <tbody dojoAttachEvent="onclick: _onDayClick" class="dijitReset dijitCalendarBodyContainer">
+ <tr class="dijitReset dijitCalendarWeekTemplate">
+ <td class="dijitReset dijitCalendarDateTemplate"><span class="dijitCalendarDateLabel"></span></td>
+ </tr>
+ </tbody>
+ <tfoot class="dijitReset dijitCalendarYearContainer">
+ <tr>
+ <td class='dijitReset' valign="top" colspan="7">
+ <h3 class="dijitCalendarYearLabel">
+ <span dojoAttachPoint="previousYearLabelNode" class="dijitInline dijitCalendarPreviousYear"></span>
+ <span dojoAttachPoint="currentYearLabelNode" class="dijitInline dijitCalendarSelectedYear"></span>
+ <span dojoAttachPoint="nextYearLabelNode" class="dijitInline dijitCalendarNextYear"></span>
+ </h3>
+ </td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/includes/js/dijit/templates/ColorPalette.html b/includes/js/dijit/templates/ColorPalette.html
new file mode 100644
index 0000000..e4557c7
--- /dev/null
+++ b/includes/js/dijit/templates/ColorPalette.html
@@ -0,0 +1,5 @@
+<div class="dijitInline dijitColorPalette">
+ <div class="dijitColorPaletteInner" dojoAttachPoint="divNode" waiRole="grid" tabIndex="${tabIndex}">
+ <img class="dijitColorPaletteUnder" dojoAttachPoint="imageNode" waiRole="presentation">
+ </div>
+</div>
diff --git a/includes/js/dijit/templates/Dialog.html b/includes/js/dijit/templates/Dialog.html
new file mode 100644
index 0000000..f3a2e5c
--- /dev/null
+++ b/includes/js/dijit/templates/Dialog.html
@@ -0,0 +1,9 @@
+<div class="dijitDialog" tabindex="-1" waiRole="dialog" waiState="labelledby-${id}_title">
+ <div dojoAttachPoint="titleBar" class="dijitDialogTitleBar">
+ <span dojoAttachPoint="titleNode" class="dijitDialogTitle" id="${id}_title">${title}</span>
+ <span dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: onCancel">
+ <span dojoAttachPoint="closeText" class="closeText">x</span>
+ </span>
+ </div>
+ <div dojoAttachPoint="containerNode" class="dijitDialogPaneContent"></div>
+</div>
diff --git a/includes/js/dijit/templates/InlineEditBox.html b/includes/js/dijit/templates/InlineEditBox.html
new file mode 100644
index 0000000..449705b
--- /dev/null
+++ b/includes/js/dijit/templates/InlineEditBox.html
@@ -0,0 +1,8 @@
+<fieldset dojoAttachPoint="editNode" waiRole="presentation" style="position: absolute; visibility:hidden" class="dijitReset dijitInline"
+ dojoAttachEvent="onkeypress: _onKeyPress"
+ ><input dojoAttachPoint="editorPlaceholder"
+ /><span dojoAttachPoint="buttonContainer"
+ ><button class='saveButton' dojoAttachPoint="saveButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:save" disabled="true">${buttonSave}</button
+ ><button class='cancelButton' dojoAttachPoint="cancelButton" dojoType="dijit.form.Button" dojoAttachEvent="onClick:cancel">${buttonCancel}</button
+ ></span
+></fieldset>
diff --git a/includes/js/dijit/templates/ProgressBar.html b/includes/js/dijit/templates/ProgressBar.html
new file mode 100644
index 0000000..49b8e22
--- /dev/null
+++ b/includes/js/dijit/templates/ProgressBar.html
@@ -0,0 +1,9 @@
+<div class="dijitProgressBar dijitProgressBarEmpty"
+ ><div waiRole="progressbar" tabindex="0" dojoAttachPoint="internalProgress" class="dijitProgressBarFull"
+ ><div class="dijitProgressBarTile"></div
+ ><span style="visibility:hidden">&nbsp;</span
+ ></div
+ ><div dojoAttachPoint="label" class="dijitProgressBarLabel" id="${id}_label">&nbsp;</div
+ ><img dojoAttachPoint="inteterminateHighContrastImage" class="dijitProgressBarIndeterminateHighContrastImage"
+ ></img
+></div>
diff --git a/includes/js/dijit/templates/TitlePane.html b/includes/js/dijit/templates/TitlePane.html
new file mode 100644
index 0000000..c14905d
--- /dev/null
+++ b/includes/js/dijit/templates/TitlePane.html
@@ -0,0 +1,14 @@
+<div class="${baseClass}">
+ <div dojoAttachEvent="onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus" tabindex="0"
+ waiRole="button" class="dijitTitlePaneTitle" dojoAttachPoint="titleBarNode,focusNode">
+ <div dojoAttachPoint="arrowNode" class="dijitInline dijitArrowNode"><span dojoAttachPoint="arrowNodeInner" class="dijitArrowNodeInner"></span></div>
+ <div dojoAttachPoint="titleNode" class="dijitTitlePaneTextNode"></div>
+ </div>
+ <div class="dijitTitlePaneContentOuter" dojoAttachPoint="hideNode">
+ <div class="dijitReset" dojoAttachPoint="wipeNode">
+ <div class="dijitTitlePaneContentInner" dojoAttachPoint="containerNode" waiRole="region" tabindex="-1">
+ <!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/includes/js/dijit/templates/Tooltip.html b/includes/js/dijit/templates/Tooltip.html
new file mode 100644
index 0000000..8739648
--- /dev/null
+++ b/includes/js/dijit/templates/Tooltip.html
@@ -0,0 +1,4 @@
+<div class="dijitTooltip dijitTooltipLeft" id="dojoTooltip">
+ <div class="dijitTooltipContainer dijitTooltipContents" dojoAttachPoint="containerNode" waiRole='alert'></div>
+ <div class="dijitTooltipConnector"></div>
+</div>
diff --git a/includes/js/dijit/templates/buttons/bg-fade.png b/includes/js/dijit/templates/buttons/bg-fade.png
new file mode 100644
index 0000000..5d74aad
--- /dev/null
+++ b/includes/js/dijit/templates/buttons/bg-fade.png
Binary files differ
diff --git a/includes/js/dijit/templates/colors3x4.png b/includes/js/dijit/templates/colors3x4.png
new file mode 100644
index 0000000..e407881
--- /dev/null
+++ b/includes/js/dijit/templates/colors3x4.png
Binary files differ
diff --git a/includes/js/dijit/templates/colors7x10.png b/includes/js/dijit/templates/colors7x10.png
new file mode 100644
index 0000000..77d22ce
--- /dev/null
+++ b/includes/js/dijit/templates/colors7x10.png
Binary files differ
diff --git a/includes/js/dijit/tests/Container.html b/includes/js/dijit/tests/Container.html
new file mode 100644
index 0000000..64dd5d4
--- /dev/null
+++ b/includes/js/dijit/tests/Container.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Container</title>
+
+ <script type="text/javascript" src="../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit._Widget");
+ dojo.require("dijit._Container");
+
+ dojo.declare("dijit.TestContainer",
+ [dijit._Widget, dijit._Container], { }
+ );
+
+ dojo.require("dojo.parser");
+
+ dojo.addOnLoad(function(){
+ doh.register("t",
+ [
+ {
+ name: "getChildren",
+ runTest: function(t){
+ var c = dijit.byId("container");
+ var children = c.getChildren();
+ t.is(3, children.length);
+ t.is("zero", children[0].id);
+ t.is("one", children[1].id);
+ t.is("two", children[2].id);
+ }
+ },
+ {
+ name: "_getSiblingOfChild",
+ runTest: function(t){
+ var c = dijit.byId("container");
+ var children = c.getChildren();
+ t.is("one", c._getSiblingOfChild(children[0], 1).id);
+ t.is("two", c._getSiblingOfChild(children[1], 1).id);
+ t.is(null, c._getSiblingOfChild(children[2], 1));
+ t.is(null, c._getSiblingOfChild(children[0], -1));
+ t.is("zero", c._getSiblingOfChild(children[1], -1).id);
+ t.is("one", c._getSiblingOfChild(children[2], -1).id);
+ }
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body class="tundra">
+
+ <div id="container" dojoType="dijit.TestContainer">
+ <div id="zero" dojoType="dijit._Widget"></div>
+ <div id="one" dojoType="dijit._Widget"></div>
+ <div id="two" dojoType="dijit._Widget"></div>
+ </div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/Container.js b/includes/js/dijit/tests/Container.js
new file mode 100644
index 0000000..0e9360c
--- /dev/null
+++ b/includes/js/dijit/tests/Container.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests.Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.Container"] = true;
+dojo.provide("dijit.tests.Container");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.Container", dojo.moduleUrl("dijit", "tests/Container.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/_Templated.html b/includes/js/dijit/tests/_Templated.html
new file mode 100644
index 0000000..de6dc59
--- /dev/null
+++ b/includes/js/dijit/tests/_Templated.html
@@ -0,0 +1,164 @@
+<html>
+ <head>
+ <title>_Templated tests</title>
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+
+ dojo.require("dijit._Widget");
+ dojo.require("dijit._Templated");
+
+ function getOuterHTML(/*DomNode*/ node){
+ var wrapper = dojo.doc.createElement("div");
+ wrapper.appendChild(node);
+ return wrapper.innerHTML.toLowerCase(); // IE prints <BUTTON> rather than <button>; normalize it.
+ }
+
+ dojo.addOnLoad(function(){
+ // Template with no variables (should be cached as a DOM tree)
+ dojo.declare("SimpleTemplate", [dijit._Widget, dijit._Templated], {
+ attributeMap: {},
+ id: "test1",
+ templateString: "<button><span>hello &gt; world</span></button>"
+ });
+
+ // Template with variables
+ dojo.declare("VariableTemplate", [dijit._Widget, dijit._Templated], {
+ attributeMap: {},
+ id: "test2",
+ num: 5,
+ text: "hello ><\"' world",
+
+ templateString: "<button><span num=\"${num}\">${text}</span></button>"
+ });
+
+ // Template that starts with special node (has to be constructed inside a <tbody>)
+ dojo.declare("TableRowTemplate", [dijit._Widget, dijit._Templated], {
+ attributeMap: {},
+ id: "test3",
+ text: "bar",
+ templateString: "<tr><td>${text}</td></tr>"
+ });
+
+ // Illegal subsitition variable name
+ dojo.declare("IllegalSubstitution", [dijit._Widget, dijit._Templated], {
+ templateString: "<tr><td>${fake}</td></tr>"
+ });
+
+ // dojoAttachPoint
+ dojo.declare("AttachPoint", [dijit._Widget, dijit._Templated], {
+ attributeMap: {foo: "", style: "", bar: "buttonNode"},
+ templateString: "<div style='border: 1px solid red'>" +
+ "<button dojoAttachPoint='buttonNode,focusNode'>hi</button>" +
+ '<span><input dojoAttachPoint="inputNode" value="input"></span>' +
+ "<span dojoAttachPoint='containerNode'></span>" +
+ "</div>"
+ });
+
+ // dojoAttachEvent
+ dojo.declare("AttachEvent", [dijit._Widget, dijit._Templated], {
+ click: function(){ this.clickCalled=true; },
+ onfocus: function(){ this.focusCalled=true; },
+ focus2: function(){ this.focus2Called=true; },
+ templateString: "<table style='border: 1px solid blue'><tr>" +
+ "<td><button dojoAttachPoint='left' dojoAttachEvent='onclick: click, onfocus'>left</button></td>" +
+ "<td><button dojoAttachPoint='right' dojoAttachEvent='onclick: click, onfocus: focus2'>right</button></td>" +
+ "</tr></table>"
+ });
+
+ // TODO:
+ // TemplatePath
+
+ var testW;
+ doh.register("dijit.tests._Templated.html",
+ [
+ function simple(t){
+ var widget=new SimpleTemplate();
+ var wrapper=dojo.byId("simpleWrapper");
+ wrapper.appendChild(widget.domNode);
+ t.is('<button widgetid=\"test1\"><span>hello &gt; world</span></button>', wrapper.innerHTML.toLowerCase());
+ },
+ function variables(t){
+ var widget=new VariableTemplate();
+ var wrapper=dojo.byId("variables1Wrapper");
+ wrapper.appendChild(widget.domNode);
+ t.is('<button widgetid=\"test2\"><span num="5">hello &gt;&lt;"\' world</span></button>', wrapper.innerHTML.toLowerCase());
+ },
+
+ function variables2(t){
+ var widget = new VariableTemplate({id: "myid", num: -5, text: ""});
+ var wrapper=dojo.byId("variables2Wrapper");
+ wrapper.appendChild(widget.domNode);
+ t.is('<button widgetid=\"myid\"><span num="-5"></span></button>', wrapper.innerHTML.toLowerCase());
+ },
+ function table(t){
+ var widget=new TableRowTemplate({text: "hello"});
+ var wrapper = dojo.byId("trWrapper");
+ wrapper.appendChild(widget.domNode);
+ var actual = wrapper.innerHTML.toLowerCase().replace(/\r/g, "").replace(/\n/g, "");
+ t.is('<tr widgetid="test3"><td>hello</td></tr>', actual);
+ },
+ function illegal(t){
+ var hadException=false;
+ try{
+ var widget=new IllegalSubstitution();
+ }catch(e){
+ console.log(e);
+ hadException=true;
+ }
+ t.t(hadException);
+ },
+ function attachPoint(t){
+ var widget=new AttachPoint();
+ var wrapper = dojo.byId("attachPointWrapper");
+ wrapper.appendChild(widget.domNode);
+ t.is(widget.containerNode.tagName.toLowerCase(), "span");
+ t.is(widget.buttonNode.tagName.toLowerCase(), "button");
+ t.is(widget.focusNode.tagName.toLowerCase(), "button");
+ t.is(widget.inputNode.tagName.toLowerCase(), "input");
+ },
+ function attributeMap(t){
+ var widget=new AttachPoint({foo:"value1", bar:"value2", style:"color: blue"});
+ var wrapper = dojo.byId("attributeMapWrapper");
+ wrapper.appendChild(widget.domNode);
+ t.is("value1", widget.domNode.getAttribute("foo"));
+ t.is("value2", widget.buttonNode.getAttribute("bar"));
+ // TODO: this is() check is unreliable, IE returns a string like
+ // border-right: red 1px solid; border-top: red 1px solid; border-left: red 1px solid; color: blue; border-bottom: red 1px solid
+ // t.is("border: 1px solid red; color: blue;", widget.domNode.style.cssText.toLowerCase());
+ },
+ function attachEvent(t){
+ var deferred = new doh.Deferred();
+ var widget=new AttachEvent();
+ var wrapper = dojo.byId("attachEventWrapper");
+ wrapper.appendChild(widget.domNode);
+ widget.left.focus();
+ widget.right.focus();
+ setTimeout(function(){
+ t.t(widget.focusCalled);
+ t.t(widget.focus2Called);
+ deferred.callback(true);
+ }, 0);
+ return deferred;
+ }
+ ]
+ );
+ doh.run();
+ });
+ </script>
+ <style type="text/css">
+ @import "../themes/tundra/tundra.css";
+ </style>
+ </head>
+ <body>
+ <h1>_Templated test</h1>
+ <div id="simpleWrapper"></div>
+ <div id="variables1Wrapper"></div>
+ <div id="variables2Wrapper"></div>
+ <table><tbody id="trWrapper"></tbody></table>
+ <div id="attachPointWrapper"></div>
+ <div id="attributeMapWrapper"></div>
+ <div id="attachEventWrapper"></div>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/_Templated.js b/includes/js/dijit/tests/_Templated.js
new file mode 100644
index 0000000..ea4e059
--- /dev/null
+++ b/includes/js/dijit/tests/_Templated.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests._Templated"] = true;
+dojo.provide("dijit.tests._Templated");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests._Templated", dojo.moduleUrl("dijit", "tests/_Templated.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/_altCalendar.html b/includes/js/dijit/tests/_altCalendar.html
new file mode 100644
index 0000000..57e9548
--- /dev/null
+++ b/includes/js/dijit/tests/_altCalendar.html
@@ -0,0 +1,36 @@
+<table cellspacing="0" cellpadding="0" class="dijitCalendarContainer">
+ <thead>
+ <tr class="dijitReset dijitCalendarMonthContainer" valign="top">
+ <th><span class='dijitReset' dojoAttachPoint="decrementMonth">
+ <span class="dijitInline dijitCalendarIncrementControl dijitCalendarDecrease"><span dojoAttachPoint="decreaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarDecreaseInner">-</span></span>
+ </span>
+ <span class='dijitReset' dojoAttachEvent="onclick:goToToday">&#9642;</span>
+ <span class='dijitReset' dojoAttachPoint="incrementMonth">
+ <div class="dijitInline dijitCalendarIncrementControl dijitCalendarIncrease"><span dojoAttachPoint="increaseArrowNode" class="dijitA11ySideArrow dijitCalendarIncrementControl dijitCalendarIncreaseInner">+</span></div>
+ </span></th>
+ <th class='dijitReset' colspan="6">
+ <div dojoAttachPoint="monthLabelSpacer" class="dijitCalendarMonthLabelSpacer"></div>
+ <div dojoAttachPoint="monthLabelNode" class="dijitCalendarMonth"></div>
+ </th>
+ </tr>
+ <tr>
+ <th class="dijitReset dijitCalendarDayLabelTemplate"><span class="dijitCalendarDayLabel"></span></th>
+ </tr>
+ </thead>
+ <tbody dojoAttachEvent="onclick: _onDayClick" class="dijitReset dijitCalendarBodyContainer">
+ <tr class="dijitReset dijitCalendarWeekTemplate">
+ <td class="dijitReset dijitCalendarDateTemplate"><span class="dijitCalendarDateLabel"></span><span class="dijitCalendarDateDescription"></span></td>
+ </tr>
+ </tbody>
+ <tfoot class="dijitReset dijitCalendarYearContainer">
+ <tr>
+ <td class='dijitReset' valign="top" colspan="7">
+ <h3 class="dijitCalendarYearLabel">
+ <span dojoAttachPoint="previousYearLabelNode" class="dijitInline dijitCalendarPreviousYear"></span>
+ &#171;<span dojoAttachPoint="currentYearLabelNode" class="dijitInline dijitCalendarSelectedYear"></span>&#187;
+ <span dojoAttachPoint="nextYearLabelNode" class="dijitInline dijitCalendarNextYear"></span>
+ </h3>
+ </td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/includes/js/dijit/tests/_base/manager.html b/includes/js/dijit/tests/_base/manager.html
new file mode 100644
index 0000000..3ca3349
--- /dev/null
+++ b/includes/js/dijit/tests/_base/manager.html
@@ -0,0 +1,322 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit manager unit test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit.dijit");
+
+ dojo.declare("foo", dijit._Widget, {
+ name: "",
+ attr1: 0,
+ attr2: 0
+ });
+
+ dojo.declare("bar", dijit._Widget, {
+ name: "",
+ attr1: 0,
+ attr2: 0
+ });
+
+ dojo.addOnLoad(function(){
+ doh.register("dijit._base.manager",
+ [
+ function forEachTest(t){
+ var names=[];
+ dijit.registry.forEach(function(widget){ names.push(widget.name); });
+ t.is(names.join(" "), "bob is your uncle");
+ },
+ function filterTest(t){
+ var names=[];
+ dijit.registry.
+ filter(function(widget){ return widget.attr1==10; }).
+ forEach(function(widget){ names.push(widget.name); });
+ t.is(names.join(" "), "bob uncle");
+ },
+ function byId(t){
+ t.is(dijit.byId("three").name, "your");
+ },
+ function byClass(t){
+ var names=[];
+ dijit.registry.
+ byClass("bar").
+ forEach(function(widget){ names.push(widget.name); });
+ t.is(names.join(" "), "your uncle");
+ },
+ function deleteTest(t){
+ var names=[];
+ dijit.byId("two").destroy();
+ dijit.byId("four").destroy();
+ var names=[];
+ dijit.registry.forEach(function(widget){ names.push(widget.name); });
+ t.is(names.join(" "), "bob your");
+ },
+ function getEnclosingWidgetTest(t){
+ t.is(dijit.getEnclosingWidget(dojo.byId("not-a-widget")), null);
+ t.is(dijit.getEnclosingWidget(dojo.byId("three")).name, "your");
+ t.is(dijit.getEnclosingWidget(dojo.byId("three.one")).name, "your");
+ t.is(dijit.getEnclosingWidget(dojo.byId("three.one.one")).name, "your");
+ },
+ function isTabNavigable(t){
+ t.t(dijit.isTabNavigable(dojo.byId("a-with-href")));
+ t.f(dijit.isTabNavigable(dojo.byId("a-without-href")));
+ t.t(dijit.isTabNavigable(dojo.byId("area")));
+ t.t(dijit.isTabNavigable(dojo.byId("button")));
+ t.t(dijit.isTabNavigable(dojo.byId("input")));
+ t.t(dijit.isTabNavigable(dojo.byId("object")));
+ t.t(dijit.isTabNavigable(dojo.byId("select")));
+ t.t(dijit.isTabNavigable(dojo.byId("textarea")));
+ t.f(dijit.isTabNavigable(dojo.byId("empty")));
+ t.t(dijit.isTabNavigable(dojo.byId("zero-tabindex-div")));
+ },
+ function findTabNullOnEmpty(t){
+ t.is(null, dijit.getFirstInTabbingOrder("empty"));
+ t.is(null, dijit.getLastInTabbingOrder("empty"));
+ },
+ function findTabElements(t){
+ t.is(null, dijit.getFirstInTabbingOrder("div-container"));
+ t.is(null, dijit.getFirstInTabbingOrder("a-without-href-container"));
+ t.is("a-with-href", dijit.getFirstInTabbingOrder("a-with-href-container").id);
+
+ // in Safari area elements are not in the tab order
+ // and their display style property is "none";
+ // therefore it is expected that this test will fail
+ if(!dojo.isSafari){
+ t.is("area", dijit.getFirstInTabbingOrder("area-map").id);
+ }
+
+ t.is("button", dijit.getFirstInTabbingOrder("button-container").id);
+ t.is("input", dijit.getFirstInTabbingOrder("input-container").id);
+ t.is("object", dijit.getFirstInTabbingOrder("object-container").id);
+ t.is("select", dijit.getFirstInTabbingOrder("select-container").id);
+ t.is("textarea", dijit.getFirstInTabbingOrder("textarea-container").id);
+ t.is(null, dijit.getLastInTabbingOrder("div-container"));
+ t.is(null, dijit.getLastInTabbingOrder("a-without-href-container"));
+ t.is("a-with-href", dijit.getLastInTabbingOrder("a-with-href-container").id);
+
+ // in Safari area elements are not in the tab order
+ // and their display style property is "none";
+ // therefore it is expected that this test will fail
+ if(!dojo.isSafari){
+ t.is("area", dijit.getLastInTabbingOrder("area-map").id);
+ }
+
+ t.is("button", dijit.getLastInTabbingOrder("button-container").id);
+ t.is("input", dijit.getLastInTabbingOrder("input-container").id);
+ t.is("object", dijit.getLastInTabbingOrder("object-container").id);
+ t.is("select", dijit.getLastInTabbingOrder("select-container").id);
+ t.is("textarea", dijit.getLastInTabbingOrder("textarea-container").id);
+ },
+ function findTabOnElementRatherThanString(t){
+ t.is("a-with-href", dijit.getFirstInTabbingOrder(dojo.byId("a-with-href-container")).id);
+ t.is("a-with-href", dijit.getLastInTabbingOrder(dojo.byId("a-with-href-container")).id);
+ },
+ function findTabSkipDisabled(t){
+ t.is("not-disabled-input", dijit.getFirstInTabbingOrder("skip-disabled").id);
+ t.is("not-disabled-input", dijit.getLastInTabbingOrder("skip-disabled").id);
+ },
+ function findTabZeroTabindex(t){
+ t.is("zero-tabindex-div", dijit.getFirstInTabbingOrder("zero-tabindex-div-container").id);
+ t.is("zero-tabindex-input", dijit.getFirstInTabbingOrder("zero-tabindex-input-container").id);
+ t.is("zero-tabindex-div", dijit.getLastInTabbingOrder("zero-tabindex-div-container").id);
+ t.is("zero-tabindex-input", dijit.getLastInTabbingOrder("zero-tabindex-input-container").id);
+ },
+ function findTabPositiveTabindex(t){
+ t.is("positive-tabindex-input1a", dijit.getFirstInTabbingOrder("positive-tabindex-mixed-with-no-tabindex").id);
+ t.is("positive-tabindex-input3a", dijit.getFirstInTabbingOrder("positive-tabindex").id);
+ t.is("no-tabindex-input2", dijit.getLastInTabbingOrder("positive-tabindex-mixed-with-no-tabindex").id);
+ t.is("positive-tabindex-input4b", dijit.getLastInTabbingOrder("positive-tabindex").id);
+ },
+ function findTabSkipMinusOneTabindex(t){
+ t.is("not-minus-one-input", dijit.getFirstInTabbingOrder("skip-minus-one").id);
+ t.is("not-minus-one-input", dijit.getLastInTabbingOrder("skip-minus-one").id);
+ },
+ function findTabDescend(t){
+ t.is("child-input1", dijit.getFirstInTabbingOrder("descend").id);
+ t.is("child-input2", dijit.getLastInTabbingOrder("descend").id);
+ },
+ function findTabOuterInner(t){
+ t.is("outer1", dijit.getFirstInTabbingOrder("outer-inner-container").id);
+ t.is("inner2", dijit.getLastInTabbingOrder("outer-inner-container").id);
+ },
+ function skipNotShown(t){
+ t.is(null, dijit.getFirstInTabbingOrder("hidden-element-container"));
+ t.is(null, dijit.getFirstInTabbingOrder("hidden-container-tabindex-zero"));
+ t.is(null, dijit.getFirstInTabbingOrder("hidden-container-no-tabindex"));
+ t.is(null, dijit.getFirstInTabbingOrder("container-with-hidden-containers"));
+
+ t.is(null, dijit.getFirstInTabbingOrder("display-none-element-container"));
+ t.is(null, dijit.getFirstInTabbingOrder("display-none-container-tabindex-zero"));
+ t.is(null, dijit.getFirstInTabbingOrder("display-none-container-no-tabindex"));
+ t.is(null, dijit.getFirstInTabbingOrder("container-with-display-none-containers"));
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body>
+ <h1>Dijit Manager Unit Test</h1>
+ <div dojoType="foo" id="one" name="bob" attr1="10" attr2="10"></div>
+ <div dojoType="foo" id="two" name="is" attr1="5" attr2="10"></div>
+ <div dojoType="bar" id="three" name="your" attr1="5" attr2="5">
+ <div id="three.one">
+ <div id="three.one.one"></div>
+ </div>
+ </div>
+ <div dojoType="bar" id="four" name="uncle" attr1="10" attr2="5"></div>
+ <div id="not-a-widget"></div>
+
+ <div id="empty"></div>
+
+ <div id="div-container">
+ <div id="div"></div>
+ </div>
+ <div id="a-without-href-container">
+ <a id="a-without-href" name="named-link-anchor"></a>
+ </div>
+ <div id="a-with-href-container">
+ <a id="a-with-href" href="#named-link-anchor"></a>
+ </div>
+
+ <div><img src="../images/flatScreen.gif" alt="picture of a flat-screen monitor" usemap="#area-map"></div>
+ <map id="area-map" name="area-map">
+ <area id="area" href="#" alt="example area" shape="rect" coords="0,0,8,8">
+ </map>
+
+ <div id="button-container">
+ <button id="button"></button>
+ </div>
+ <div id="input-container">
+ <input id="input">
+ </div>
+ <div id="object-container">
+ <object id="object"></object>
+ </div>
+ <div id="select-container">
+ <select id="select"></select>
+ </div>
+ <div id="textarea-container">
+ <textarea id="textarea"></textarea>
+ </div>
+
+ <div id="skip-disabled">
+ <input id="disabled-input1" disabled="disabled">
+ <input id="not-disabled-input">
+ <input id="disabled-input2" disabled="disabled">
+ </div>
+
+ <div id="zero-tabindex-div-container">
+ <div id="zero-tabindex-div" tabindex="0"></div>
+ </div>
+
+ <div id="zero-tabindex-input-container">
+ <input id="zero-tabindex-input" tabindex="0">
+ </div>
+
+ <div id="positive-tabindex-mixed-with-no-tabindex">
+ <input id="no-tabindex-input1">
+ <input id="no-tabindex-input2">
+ <input id="positive-tabindex-input1a" tabindex="1">
+ <input id="positive-tabindex-input1b" tabindex="1">
+ <input id="positive-tabindex-input2a" tabindex="2">
+ <input id="positive-tabindex-input2b" tabindex="2">
+ </div>
+
+ <div id="positive-tabindex">
+ <input id="positive-tabindex-input3a" tabindex="3">
+ <input id="positive-tabindex-input3b" tabindex="3">
+ <input id="positive-tabindex-input4a" tabindex="4">
+ <input id="positive-tabindex-input4b" tabindex="4">
+ </div>
+
+ <div id="skip-minus-one">
+ <input id="minus-one-input1" tabindex="-1">
+ <input id="not-minus-one-input">
+ <input id="minus-one-input2" tabindex="-1">
+ </div>
+
+ <div id="descend">
+ <input disabled="disabled">
+ <div>
+ <input disabled="disabled">
+ <div>
+ <input disabled="disabled">
+ </div>
+ </div>
+ <div>
+ <input disabled="disabled">
+ <div>
+ <input disabled="disabled">
+ </div>
+ <div>
+ <input id="child-input1">
+ </div>
+ <div>
+ <input id="child-input2">
+ </div>
+ </div>
+ <div>
+ <div>
+ <input disabled="disabled">
+ </div>
+ <input disabled="disabled">
+ </div>
+ <input disabled="disabled">
+ </div>
+
+ <div id="outer-inner-container">
+ <div id="outer1" tabindex="0">
+ <div id="inner1" tabindex="0"></div>
+ </div>
+ <div id="outer2" tabindex="0">
+ <div id="inner2" tabindex="0"></div>
+ </div>
+ </div>
+
+ <div id="hidden-element-container">
+ <div id="hidden-element" tabindex="0" style="visibility: hidden;">
+ </div>
+ </div>
+
+ <div id="container-with-hidden-containers">
+ <div id="hidden-container-tabindex-zero" tabindex="0" style="visibility: hidden;">
+ <div id="inside-hidden-container-tabindex-zero" tabindex="0">
+ </div>
+ </div>
+
+ <div id="hidden-container-no-tabindex" style="visibility: hidden;">
+ <div id="inside-hidden-container-no-tabindex" tabindex="0">
+ </div>
+ </div>
+ </div>
+
+ <div id="display-none-element-container">
+ <div id="display-none-element" tabindex="0" style="display: none;">
+ </div>
+ </div>
+
+ <div id="container-with-display-none-containers">
+ <div id="display-none-container-tabindex-zero" tabindex="0" style="display: none;">
+ <div id="inside-display-none-container-tabindex-zero" tabindex="0">
+ </div>
+ </div>
+
+ <div id="display-none-container-no-tabindex" style="display: none;">
+ <div id="inside-display-none-container-no-tabindex" tabindex="0">
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/manager.js b/includes/js/dijit/tests/_base/manager.js
new file mode 100644
index 0000000..667a763
--- /dev/null
+++ b/includes/js/dijit/tests/_base/manager.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests._base.manager"] = true;
+dojo.provide("dijit.tests._base.manager");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests._base.manager", dojo.moduleUrl("dijit", "tests/_base/manager.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/_base/test_FocusManager.html b/includes/js/dijit/tests/_base/test_FocusManager.html
new file mode 100644
index 0000000..1d6a707
--- /dev/null
+++ b/includes/js/dijit/tests/_base/test_FocusManager.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.focus Test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("dijit._base.focus");
+ var savedFocus;
+ dojo.addOnLoad(function(){
+ fakeWidget = { domNode: dojo.byId("save") };
+ dojo.subscribe("focusNode", function(node){ console.log("focused on " + (node?(node.id||node.tagName):"nothing"));});
+ });
+ function save(){
+ savedFocus = dijit.getFocus(fakeWidget);
+ console.debug("saved focus: ", savedFocus);
+
+ }
+ function restore(){
+ dijit.focus(savedFocus);
+ }
+ </script>
+</head>
+<body style="background-color: #fff; color: black; padding: 0; margin: 0" class="tundra">
+
+ <h3>Focus/Selection Save/Restore Test</h3>
+ <p>This is for testing whether focus and selection are restored by the focus manager</p>
+ <form style="border: 2px solid blue;">
+ <input id=input1 value=tom><br>
+ <input id=input2 value=jones><br>
+ <textarea id=textarea>hello there!</textarea><br>
+ <button id=button>push me</button>
+ </form>
+
+ <button id="save" onclick="save();" tabIndex="1">Save focus/selection state</button>
+ <button onclick="restore();">Restore focus/selection state</button>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/test_focusWidget.html b/includes/js/dijit/tests/_base/test_focusWidget.html
new file mode 100644
index 0000000..edc01c1
--- /dev/null
+++ b/includes/js/dijit/tests/_base/test_focusWidget.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.focus Test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.layout.ContentPane");
+
+ var queue=[];
+ var animation;
+ function animateBorderColor(widget, color, startWidth, endWidth){
+ if(animation){
+ queue.push(arguments);
+ return;
+ }
+ with(widget.domNode.style){
+ borderStyle="solid";
+ outlineStyle="solid";
+
+ }
+ animation = dojo.animateProperty({
+ node: widget.domNode,
+ duration: 400,
+ properties: {
+ // depending on browser and node type, sometimes border or outline is ineffective.
+ // doing both seems to work in all cases though (for at least one of them)
+ borderColor: { end: color },
+ borderWidth: { start: startWidth, end: endWidth },
+ outlineColor: { end: color },
+ outlineWidth: { start: startWidth, end: endWidth }
+ },
+ onEnd: function(){
+ animation=null;
+ if(queue.length){
+ animateBorderColor.apply(null, queue.shift());
+ }
+ }
+ });
+ animation.play();
+ }
+
+ dojo.addOnLoad(function(){
+ dojo.subscribe("widgetFocus", function(widget){
+ console.log("focused on widget " + (widget?widget:"nothing"));
+ animateBorderColor(widget, "#ff0000", 2, 5);
+ });
+ dojo.subscribe("widgetBlur", function(widget){
+ console.log("blurred widget " + (widget?widget:"nothing"));
+ animateBorderColor(widget, "#0000ff", 5, 2);
+ });
+ dojo.subscribe("focusNode", function(node){ console.log("focused on node " + (node?(node.id||node.tagName):"nothing"));});
+ });
+ </script>
+ <style>
+ div, fieldset, form, input {
+ padding: 10px;
+ margin: 10px;
+ border: 2px solid blue;
+ }
+ </style>
+</head>
+<body style="background-color: #fff; color: black; padding: 0; margin: 0" class="tundra">
+
+ <h3>Widget Focus Test</h3>
+ <p>
+ This is for testing code to detect onBlur and onFocus on a widget level.<br>
+ Focused widgets' borders will turn red.<br>
+ Also, heck the console log for focus and blur events on widgets.
+ </p>
+
+ <label for="fieldset1">a form ContentPane widget:</label><br>
+ <form dojoType="dijit.layout.ContentPane">
+ <label for="first">simple input: </label><input id=first><br>
+
+ <label for="fieldset1">a fieldset ContentPane widget:</label><br>
+ <fieldset id=fieldset1 dojoType="dijit.layout.ContentPane">
+ <label for="select">a ComboBox widget:</label>
+ <select id=select dojoType="dijit.form.ComboBox">
+ <option>this</option>
+ <option>is</option>
+ <option>a</option>
+ <option>list</option>
+ </select>
+ <label for="plain">a plain input:</label>
+ <input id=plain value=plain>
+ </fieldset>
+ <br>
+ <label for="fieldset1">another fieldset ContentPane:</label><br>
+ <fieldset id=fieldset2 dojoType="dijit.layout.ContentPane">
+ <label for="date">a DateTextBox widget:</label>
+ <input id=date dojoType="dijit.form.DateTextBox"><br>
+
+ <label for="textarea">a plain textarea:</label><br>
+ <textarea id=textarea>hello there!</textarea><br>
+
+ <label for="spinner">a Spinner widget:</label>
+ <input id=spinner dojoType="dijit.form.NumberSpinner" value=100><br>
+
+ <label for="button">a Combobutton widget:</label>
+ <div id=button dojoType="dijit.form.ComboButton" tabIndex=0>
+ <span>push me</span>
+ <div id=menu dojoType="dijit.Menu">
+ <div id=mi1 dojoType="dijit.MenuItem">menu item 1</div>
+ <div id=mi2 dojoType="dijit.MenuItem">menu item 2</div>
+ <div id=popupMenuItem dojoType="dijit.PopupMenuItem">
+ <span>submenu</span>
+ <div id=submenu dojoType="dijit.Menu">
+ <div id=smi1 dojoType="dijit.MenuItem">submenu item 1</div>
+ <div id=smi2 dojoType="dijit.MenuItem">submenu item 2</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/test_placeStrict.html b/includes/js/dijit/tests/_base/test_placeStrict.html
new file mode 100644
index 0000000..c40325c
--- /dev/null
+++ b/includes/js/dijit/tests/_base/test_placeStrict.html
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>dijit.place tests</title>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.dijit");
+ </script>
+ <script>
+ dojo.addOnLoad(function(){
+ var vp = dijit.getViewport();
+ alert("viewport w="+vp.w + ", h=" + vp.h);
+ });
+ </script>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ padding: 1em;
+ }
+ .formQuestion {
+ background-color:#d0e3f5;
+ padding:0.3em;
+ font-weight:900;
+ font-family:Verdana, Arial, sans-serif;
+ font-size:0.8em;
+ color:#5a5a5a;
+ }
+ .formAnswer {
+ background-color:#f5eede;
+ padding:0.3em;
+ margin-bottom:1em;
+ }
+ .pageSubContentTitle {
+ color:#8e8e8e;
+ font-size:1em;
+ font-family:Verdana, Arial, sans-serif;
+ margin-bottom:0.75em;
+ }
+ .small {
+ width: 2.5em;
+ }
+ .medium {
+ width: 10em;
+ }
+ .long {
+ width: 20em;
+ }
+
+ .dojoValidationTextBoxMessage {
+ display: inline;
+ margin-left: 1em;
+ font-weight: bold;
+ font-style: italic;
+ font-family: Arial, Verdana, sans-serif;
+ color: #f66;
+ font-size: 0.9em;
+ }
+
+ .noticeMessage {
+ font-weight: normal;
+ font-family:Arial, Verdana, sans-serif;
+ color:#663;
+ font-size:0.9em;
+ }
+ </style>
+ </head>
+
+ <body class=tundra>
+ <h2 class="pageSubContentTitle">Test dijit.place</h2>
+ <p>Currently this just tests getViewport(). Change the size of your browser window and then reload,
+ and see if it reports the browser window size correctly.<br>
+ <p>All the text below is just filler text...<br>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" action="" name="example" method="post">
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q01">First Name: </label></span>
+ <span class="noticeMessage"> TextBox class, <b>tabIndex=2</b>, Attributes: {trim: true, ucFirst: true, class: 'medium'}, First letter of each word is upper case.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q01" type="text" name="firstname" value="testing testing" class="medium" tabIndex=2
+ dojoType="dijit.form.TextBox"
+ trim="true"
+ ucfirst="true" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q02">Last Name: </label></span>
+ <span class="noticeMessage"> TextBox class, Attributes: {trim: true, uppercase: true, class: 'medium'}, all letters converted to upper case. </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q02" type="text" name="lastname" value="testing testing" class="medium"
+ dojoType="dijit.form.TextBox"
+ trim="true"
+ uppercase="true" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q03">Age: </label></span>
+ <span class="noticeMessage"> TextBox class, <b>tabIndex=1</b>, Attributes: {trim: true, digit: true, class: 'small'}, all but digits extracted.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q03" type="text" name="age" value="38" class="small" tabIndex=1
+ dojoType="dijit.form.NumberTextBox"
+ promptMessage="(optional) Enter an age between 0 and 120"
+ constraints={places:0,min:0,max:120}
+ onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+ digit="true"
+ trim="true"
+ />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q04">Occupation: </label></span>
+ <span class="noticeMessage">ValidationTextBox class,
+ Attributes: {lowercase: true, required: true}. Displays a prompt message if field is missing. </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q04" type="text" name="occupation" class="medium"
+ dojoType="dijit.form.ValidationTextBox"
+ lowercase="true"
+ required="true"
+ promptMessage="Enter an occupation" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q05">Elevation: </label></span>
+ <span class="noticeMessage">IntegerTextBox class,
+ Attributes: {required: true, min:-20000, max:+20000 }, Enter feet above sea level with a sign.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q05" class="medium"/>
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q08">Annual Income: </label></span>
+ <span class="noticeMessage">CurrencyTextBox class,
+ Attributes: {fractional: true}. Enter whole and cents. Currency symbol is optional.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q08" type="text" name="income1" class="medium" value="54775.53"
+ dojoType="dijit.form.CurrencyTextBox"
+ required="true"
+ currency="USD"
+ invalidMessage="Invalid amount. Include dollar sign, commas, and cents. Example: $12,000.00" />USD
+ </div>
+
+ <div class="formAnswer">
+ <input id="q08eur" type="text" name="income2" class="medium" value="54775.53"
+ dojoType="dijit.form.CurrencyTextBox"
+ required="true"
+ currency="EUR"
+ invalidMessage="Invalid amount. Include euro sign, commas, and cents. Example: &#x20ac;12,000.00" />EUR
+ </div>
+<!--
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q08a">Annual Income: </label></span>
+ <span class="noticeMessage">Old regexp currency textbox,
+ Attributes: {fractional: true}. Enter dollars and cents.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q08a" type="text" name="income3" class="medium" value="$54,775.53"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.currency"
+ trim="true"
+ required="true"
+ constraints={fractional:true}
+ invalidMessage="Invalid amount. Include dollar sign, commas, and cents. Example: $12,000.00" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q09">IPv4 Address: </label></span>
+ <span class="noticeMessage">IpAddressTextBox class,
+ Attributes: {allowIPv6: false, allowHybrid: false}. Also Dotted Hex works, 0x18.0x11.0x9b.0x28</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q09" type="text" name="ipv4" class="medium" value="24.17.155.40"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.ipAddress"
+ trim="true"
+ required="true"
+ constraints={allowIPv6:false,allowHybrid:false}
+ invalidMessage="Invalid IPv4 address." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q10"> IPv6 Address: </label></span>
+ <span class="noticeMessage">IpAddressTextBox class,
+ Attributes: {allowDottedDecimal: false, allowDottedHex: false}.
+ Also hybrid works, x:x:x:x:x:x:d.d.d.d</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q10" type="text" name="ipv6" class="long" value="0000:0000:0000:0000:0000:0000:0000:0000"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.ipAddress"
+ trim="true"
+ uppercase = "true"
+ required="true"
+ constraints={allowDottedDecimal:false, allowDottedHex:false, allowDottedOctal:false}
+ invalidMessage="Invalid IPv6 address, please enter eight groups of four hexadecimal digits. x:x:x:x:x:x:x:x" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q11"> URL: </label></span>
+ <span class="noticeMessage">UrlTextBox class,
+ Attributes: {required: true, trim: true, scheme: true}. </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q11" type="text" name="url" class="long" value="http://www.xyz.com/a/b/c?x=2#p3"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.url"
+ trim="true"
+ required="true"
+ constraints={scheme:true}
+ invalidMessage="Invalid URL. Be sure to include the scheme, http://..." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q12"> Email Address </label></span>
+ <span class="noticeMessage">EmailTextBox class,
+ Attributes: {required: true, trim: true}. </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q12" type="text" name="email" class="long" value="fred&barney@stonehenge.com"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.emailAddress"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid Email Address." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q13"> Email Address List </label></span>
+ <span class="noticeMessage">EmailListTextBox class,
+ Attributes: {required: true, trim: true}. </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q13" type="text" name="email" class="long" value="a@xyz.com; b@xyz.com; c@xyz.com; "
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.emailAddressList"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid Email Address List." />
+ </div>
+-->
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q14"> Date (American format) </label></span>
+ <span class="noticeMessage">DateTextBox class,
+ Attributes: {locale: "en-us", required: true}. Works for leap years</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q14" type="text" name="date1" class="medium" value="2005-12-30"
+ dojoType="dijit.form.DateTextBox"
+ constraints={locale:'en-us'}
+ required="true"
+ promptMessage="mm/dd/yyyy"
+ invalidMessage="Invalid date. Use mm/dd/yyyy format." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q15"> Date (German format) </label></span>
+ <span class="noticeMessage">DateTextBox class,
+ Attributes: {locale: "de-de", min:2006-01-01, max:2006-12-31}. Works for leap years</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q15" class="medium"/>
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q16"> 12 Hour Time </label></span>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {formatLength: "medium", required: true, trim: true}</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q16" type="text" name="time1" class="medium" value="5:45:00 pm"
+ dojoType="dijit.form.ValidationTextBox"
+ validator="dojo.date.local.parse"
+ constraints={formatLength:'medium',selector:'time'}
+ trim="true"
+ required="true"
+ invalidMessage="Invalid time." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q17"> 24 Hour Time</label></span>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {displayFormat:"HH:mm:ss", required: true, trim: true}</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q17" type="text" name="time2" class="medium" value="17:45:00"
+ dojoType="dijit.form.ValidationTextBox"
+ validator="dojo.date.local.parse"
+ constraints={formatLength:'short',selector:'time',timePattern:'HH:mm:ss'}
+ trim="true"
+ required="true"
+ invalidMessage="Invalid time. Use HH:mm:ss where HH is 00 - 23 hours." />
+ </div>
+
+<!--
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q18"> US State 2 letter abbr. </label></span>
+ <span class="noticeMessage">UsStateTextBox class,
+ Attributes: {required: true, trim: true, uppercase: true}</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q18" type="text" name="state" class="small" value="CA"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.us.state"
+ constraints={allowTerritories:false}
+ trim="true"
+ uppercase="true"
+ required="true"
+ invalidMessage="Invalid US state abbr." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q19"> US Zip Code </label></span>
+ <span class="noticeMessage">UsZipTextBox class,
+ Attributes: {required: true, trim: true} Five digit Zip code or 5 + 4.</span>
+ </div>
+ <div class="formAnswer">
+ <input id="q19" type="text" name="zip" class="medium" value="98225-1649"
+ dojoType="dijit.form.ValidationTextBox"
+ validator="dojo.validate.us.isZipCode"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid US Zip Code." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q20"> US Social Security Number </label></span>
+ <span class="noticeMessage">UsSocialSecurityNumberTextBox class,
+ Attributes: {required: true, trim: true} </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q20" type="text" name="ssn" class="medium" value="123-45-6789"
+ dojoType="dijit.form.ValidationTextBox"
+ validator="dojo.validate.us.isSocialSecurityNumber"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid US Social Security Number." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q21"> 10-digit US Phone Number </label></span>
+ <span class="noticeMessage">UsPhoneNumberTextBox class,
+ Attributes: {required: true, trim: true} </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q21" type="text" name="phone" class="medium" value="(123) 456-7890"
+ dojoType="dijit.form.ValidationTextBox"
+ validator="dojo.validate.us.isPhoneNumber"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid US Phone Number." />
+ </div>
+ -->
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q22"> Regular Expression </label></span>
+ <span class="noticeMessage">RegexpTextBox class,
+ Attributes: {required: true} </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q22" type="text" name="phone" class="medium" value="someTestString"
+ dojoType="dijit.form.ValidationTextBox"
+ regExp="[\w]+"
+ required="true"
+ invalidMessage="Invalid Non-Space Text." />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="q23"> Password </label></span>
+ <span class="noticeMessage">(just a test that type attribute is obeyed) </span>
+ </div>
+ <div class="formAnswer">
+ <input id="q23" type="password" name="password" class="medium"
+ dojoType="dijit.form.TextBox" />
+ </div>
+
+ <div class="formQuestion">
+ <span class="emphasize"><label for="ticket1651">Trac ticket 1651: </label></span>
+ <span class="noticeMessage">value: null should show up as empty</span>
+ </div>
+ <div class="formAnswer">
+ <input id="ticket1651" class="medium" value="not null"/>
+ </div>
+
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/_base/test_typematic.html b/includes/js/dijit/tests/_base/test_typematic.html
new file mode 100644
index 0000000..4a85027
--- /dev/null
+++ b/includes/js/dijit/tests/_base/test_typematic.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Typematic Test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, debugAtAllCosts: true"></script>
+ <script type="text/javascript">
+ dojo.require("dijit._base.typematic");
+
+ var lastCount = 0;
+ function typematicCallBack(count, node, evt){
+ var inputNode = dojo.byId('typematicInput');
+ if (node == inputNode){
+ key = "a";
+ }else{
+ key = "b";
+ }
+ if(-1 == count){
+ console.debug((lastCount+1) + ' ' + key + ' events');
+ }else{
+ lastCount = count;
+ inputNode.value += key;
+ }
+ inputNode.focus();
+ }
+ dojo.addOnLoad(function(){
+ var keyNode = dojo.byId('typematicInput');
+ var mouseNode = dojo.byId('typematicButton');
+ dijit.typematic.addKeyListener(keyNode,
+ {
+ keyCode:dojo.keys.F10,
+ ctrlKey:true
+ },
+ this, typematicCallBack, 200, 200);
+ dijit.typematic.addMouseListener(mouseNode,
+ this, typematicCallBack, 0.9, 200);
+ keyNode.focus(); // make it easier to type
+ });
+ </script>
+</head>
+<body class="tundra">
+
+ <h2>Dijit typematic tests</h2>
+ Press and hold the <b>ctrl+F10</b> keys to see a's typed (constant rate) in the input field,<br>
+ or left-mouse click the button and hold down to see b's typed (increasing rate) in the input field.<br>
+ <input id="typematicInput" size="500"><button id="typematicButton">to B or not to B</button>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/viewport.html b/includes/js/dijit/tests/_base/viewport.html
new file mode 100644
index 0000000..2b8454a
--- /dev/null
+++ b/includes/js/dijit/tests/_base/viewport.html
@@ -0,0 +1,79 @@
+<html>
+<head>
+ <title>dijit.getViewport() test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ html, body { margin: 0px; padding: 0px; }
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: false, parseOnLoad: false"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit.dijit");
+
+ function compute(){
+ var d = dojo.marginBox(dojo.byId("documentBorder")),
+ v = dijit.getViewport();
+ dojo.byId("results").innerHTML +=
+ "Document is " + d.w + "px x " + d.h + "px" +
+ ", viewport is " + v.w + "px x " + v.h + "px" +
+ ", with scroll offset of (" + v.l + ", " + v.t + ")<br>";
+ }
+
+ function addText(){
+ dojo.byId("results").innerHTML += "Adding text...<br><br>";
+ var text="";
+ for(var i=0;i<100;i++){
+ text += "<span style='white-space: nowrap'>";
+ for(var j=0;j<3;j++){ text += "Now is the time for all good men to come to the aid of their country."; }
+ text += "</span><br>";
+ }
+ dojo.byId("documentBorder").innerHTML += text;
+ }
+
+ dojo.addOnLoad(function(){
+ doh.register("dijit._base.manager",
+ [
+ function initial(t){
+ console.log("calling compute");
+ compute();
+ console.log("called compute");
+ var d = dojo.marginBox(dojo.byId("documentBorder")),
+ v = dijit.getViewport();
+ doh.t(v.h > d.h);
+ },
+ function expand(t){
+ var v = dijit.getViewport();
+ addText();
+ compute();
+ var v2 = dijit.getViewport();
+ doh.t(v2.h <= v.h);
+ doh.t(v2.h+20 >= v.h);
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body>
+ <div id="documentBorder" style="border: solid red 2px;">
+ <h1>dijit.getViewport() test</h1>
+ <div style="padding: 10px; border: solid blue 1px;">padding div</div>
+ <button onclick="addText(); compute();">add text and compute size</button>
+ <button onclick="compute();">recompute size</button>
+ <ol>
+ <li>check results div below to see that before adding text, document is smaller than viewport
+ <li>after adding text, document should be bigger than viewport,and check that viewport size hasn't changed,
+ except maybe being a little bit smaller (about 15px) because of the size of the scrollbars
+ <li>resize browser window and click the "recompute size" button; reported viewport size should change
+ <li>scroll the window and click "recompute size" to see that the scroll position is taken into effect
+ </ol>
+ <div id=results style="border: 5px solid blue;">
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/viewport.js b/includes/js/dijit/tests/_base/viewport.js
new file mode 100644
index 0000000..8cee9c4
--- /dev/null
+++ b/includes/js/dijit/tests/_base/viewport.js
@@ -0,0 +1,10 @@
+if(!dojo._hasResource["dijit.tests._base.viewport"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests._base.viewport"] = true;
+dojo.provide("dijit.tests._base.viewport");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests._base.viewport", dojo.moduleUrl("dijit", "tests/_base/viewport.html"));
+ doh.registerUrl("dijit.tests._base.viewportStrict", dojo.moduleUrl("dijit", "tests/_base/viewportStrict.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/_base/viewportStrict.html b/includes/js/dijit/tests/_base/viewportStrict.html
new file mode 100644
index 0000000..812c796
--- /dev/null
+++ b/includes/js/dijit/tests/_base/viewportStrict.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.getViewport() test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ html, body { margin: 0px; padding: 0px; }
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: false, parseOnLoad: false"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit.dijit");
+
+ function compute(){
+ var d = dojo.marginBox(dojo.byId("documentBorder")),
+ v = dijit.getViewport();
+ dojo.byId("results").innerHTML +=
+ "Document is " + d.w + "px x " + d.h + "px" +
+ ", viewport is " + v.w + "px x " + v.h + "px" +
+ ", with scroll offset of (" + v.l + ", " + v.t + ")<br>";
+ }
+
+ function addText(){
+ dojo.byId("results").innerHTML += "Adding text...<br><br>";
+ var text="";
+ for(var i=0;i<100;i++){
+ text += "<span style='white-space: nowrap'>";
+ for(var j=0;j<3;j++){ text += "Now is the time for all good men to come to the aid of their country."; }
+ text += "</span><br>";
+ }
+ dojo.byId("documentBorder").innerHTML += text;
+ }
+
+ dojo.addOnLoad(function(){
+ doh.register("dijit._base.manager",
+ [
+ function initial(t){
+ console.log("calling compute");
+ compute();
+ console.log("called compute");
+ var d = dojo.marginBox(dojo.byId("documentBorder")),
+ v = dijit.getViewport();
+ doh.t(v.h > d.h);
+ },
+ function expand(t){
+ var v = dijit.getViewport();
+ addText();
+ compute();
+ var v2 = dijit.getViewport();
+ doh.t(v2.h <= v.h);
+ doh.t(v2.h+20 >= v.h);
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body>
+ <div id="documentBorder" style="border: solid red 2px;">
+ <h1>dijit.getViewport() test</h1>
+ <div style="padding: 10px; border: solid blue 1px;">padding div</div>
+ <button onclick="addText(); compute();">add text and compute size</button>
+ <button onclick="compute();">recompute size</button>
+ <ol>
+ <li>check results div below to see that before adding text, document is smaller than viewport
+ <li>after adding text, document should be bigger than viewport,and check that viewport size hasn't changed,
+ except maybe being a little bit smaller (about 15px) because of the size of the scrollbars
+ <li>resize browser window and click the "recompute size" button; reported viewport size should change
+ <li>scroll the window and click "recompute size" to see that the scroll position is taken into effect
+ </ol>
+ <div id=results style="border: 5px solid blue;">
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/wai.html b/includes/js/dijit/tests/_base/wai.html
new file mode 100644
index 0000000..50ab8ca
--- /dev/null
+++ b/includes/js/dijit/tests/_base/wai.html
@@ -0,0 +1,115 @@
+<html>
+<head>
+ <title>Dijit wai unit test</title>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit.dijit");
+
+ dojo.addOnLoad(function(){
+ doh.register("dijit.tests._base.wai",
+ [
+ function getWaiRoleOnElementWithNoRole(){
+ var elem = dojo.byId("no-role-or-states");
+ doh.assertFalse(dijit.hasWaiRole(elem));
+ doh.assertEqual("", dijit.getWaiRole(elem));
+ },
+
+ function getEmptyWairoleRole(){
+ var elem = dojo.byId("empty-wairole");
+ doh.assertTrue(dijit.hasWaiRole(elem));
+ doh.assertEqual("", dijit.getWaiRole(elem));
+ },
+
+ function getWairoleRole(){
+ var elem = dojo.byId("wairole");
+ doh.assertTrue(dijit.hasWaiRole(elem));
+ doh.assertEqual("menuitem", dijit.getWaiRole(elem));
+ },
+
+ function getUnprefixedRole(){
+ var elem = dojo.byId("unprefixed-role");
+ doh.assertTrue(dijit.hasWaiRole(elem));
+ doh.assertEqual("menuitem", dijit.getWaiRole(elem));
+ },
+
+ function setWaiRole(){
+ var div = document.createElement("div");
+ dijit.setWaiRole(div, "menuitem");
+ if(dojo.isFF && dojo.isFF < 3){
+ doh.assertEqual("wairole:menuitem",
+ div.getAttribute("role"));
+ }else{
+ doh.assertEqual("menuitem",
+ div.getAttribute("role"));
+ }
+ },
+
+ function removeWaiRole(){
+ var div = document.createElement("div");
+ dijit.setWaiRole(div, "menuitem");
+ dijit.removeWaiRole(div);
+ if(div.hasAttribute){
+ doh.assertFalse(div.hasAttribute("role"));
+ }else{
+ doh.assertTrue(div.getAttribute("role") == null
+ || div.getAttribute("role") == "");
+ }
+ },
+
+ function getWaiStateOnElementWithNoState(){
+ var elem = dojo.byId("no-role-or-states");
+ doh.assertFalse(dijit.hasWaiState(elem, "checked"));
+ doh.assertEqual("", dijit.getWaiState(elem, "checked"));
+ },
+
+ function getWaiState(){
+ if(dojo.isFF && dojo.isFF < 3){
+ var div = document.createElement("div");
+ div.setAttributeNS("http://www.w3.org/2005/07/aaa",
+ "aaa:checked", "true");
+ doh.assertTrue(dijit.hasWaiState(div, "checked"));
+ doh.assertEqual("true",
+ dijit.getWaiState(div, "checked"));
+ }else{
+ var elem = dojo.byId("checked");
+ doh.assertTrue(dijit.hasWaiState(elem, "checked"));
+ doh.assertEqual("true",
+ dijit.getWaiState(elem, "checked"));
+ }
+ },
+
+ function setWaiState(){
+ var div = document.createElement("div");
+ dijit.setWaiState(div, "checked", "true");
+ if(dojo.isFF && dojo.isFF < 3){
+ doh.assertEqual("true",
+ div.getAttributeNS("http://www.w3.org/2005/07/aaa",
+ "checked"));
+ }else{
+ doh.assertEqual("true",
+ div.getAttribute("aria-checked"));
+ }
+ },
+
+ function removeWaiState(){
+ var div = document.createElement("div");
+ dijit.setWaiState(div, "checked", "true");
+ dijit.removeWaiState(div, "checked");
+ doh.assertEqual("", dijit.getWaiState(div, "checked"));
+ }
+ ]
+ );
+ doh.run();
+ });
+ </script>
+</head>
+<body>
+ <div id="no-role-or-states"></div>
+ <div id="empty-wairole" role="wairole:"></div>
+ <div id="wairole" role="wairole:menuitem"></div>
+ <div id="unprefixed-role" role="menuitem"></div>
+ <div id="checked" aria-checked="true"></div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_base/wai.js b/includes/js/dijit/tests/_base/wai.js
new file mode 100644
index 0000000..3bd299a
--- /dev/null
+++ b/includes/js/dijit/tests/_base/wai.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests._base.wai"] = true;
+dojo.provide("dijit.tests._base.wai");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests._base.wai", dojo.moduleUrl("dijit", "tests/_base/wai.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/_data/categories.json b/includes/js/dijit/tests/_data/categories.json
new file mode 100644
index 0000000..3717e1e
--- /dev/null
+++ b/includes/js/dijit/tests/_data/categories.json
@@ -0,0 +1,12 @@
+{
+ identifier: 'id',
+ label: 'name',
+ items: [
+ { id: '0', name:'Foods', numberOfItems:1, children:[ {_reference: '1'}, {_reference: '2'}, {_reference: '3'} ] },
+ { id: '1', name:'Fruits', numberOfItems:1, children:[ {_reference: '4'} ] },
+ { id: '4',name:'Citrus', numberOfItems:1, items:[ {_reference: '5'} ] },
+ { id: '5', name:'Orange'},
+ { id: '2', name:'Vegetables', numberOfItems:0},
+ { id: '3', name:'Cereals', numberOfItems:0}
+ ]
+}
diff --git a/includes/js/dijit/tests/_data/categoriesNested.json b/includes/js/dijit/tests/_data/categoriesNested.json
new file mode 100644
index 0000000..05fb89c
--- /dev/null
+++ b/includes/js/dijit/tests/_data/categoriesNested.json
@@ -0,0 +1,13 @@
+{
+ identifier: 'id',
+ label: 'name',
+ items: [
+ { id: '0', name:'Fruits', numberOfItems:1, children:[
+ { id: '1',name:'Citrus', numberOfItems:1, items:[
+ { id: '4', name:'Orange'}
+ ]}
+ ]},
+ { id: '2', name:'Vegetables', numberOfItems:0},
+ { id: '3', name:'Cereals', numberOfItems:0}
+ ]
+}
diff --git a/includes/js/dijit/tests/_data/countries.json b/includes/js/dijit/tests/_data/countries.json
new file mode 100644
index 0000000..3f16d0b
--- /dev/null
+++ b/includes/js/dijit/tests/_data/countries.json
@@ -0,0 +1,45 @@
+{ identifier: 'name',
+ label: 'name',
+ items: [
+ { name:'Africa', type:'continent', population:'900 million', area: '30,221,532 sq km',
+ timezone: '-1 UTC to +4 UTC',
+ children:[{_reference:'Egypt'}, {_reference:'Kenya'}, {_reference:'Sudan'}] },
+ { name:'Egypt', type:'country' },
+ { name:'Kenya', type:'country',
+ children:[{_reference:'Nairobi'}, {_reference:'Mombasa'}] },
+ { name:'Nairobi', type:'city' },
+ { name:'Mombasa', type:'city' },
+ { name:'Sudan', type:'country',
+ children:{_reference:'Khartoum'} },
+ { name:'Khartoum', type:'city' },
+ { name:'Asia', type:'continent',
+ children:[{_reference:'China'}, {_reference:'India'}, {_reference:'Russia'}, {_reference:'Mongolia'}] },
+ { name:'China', type:'country' },
+ { name:'India', type:'country' },
+ { name:'Russia', type:'country' },
+ { name:'Mongolia', type:'country' },
+ { name:'Australia', type:'continent', population:'21 million',
+ children:{_reference:'Commonwealth of Australia'}},
+ { name:'Commonwealth of Australia', type:'country', population:'21 million'},
+ { name:'Europe', type:'continent',
+ children:[{_reference:'Germany'}, {_reference:'France'}, {_reference:'Spain'}, {_reference:'Italy'}] },
+ { name:'Germany', type:'country' },
+ { name:'France', type:'country' },
+ { name:'Spain', type:'country' },
+ { name:'Italy', type:'country' },
+ { name:'North America', type:'continent',
+ children:[{_reference:'Mexico'}, {_reference:'Canada'}, {_reference:'United States of America'}] },
+ { name:'Mexico', type:'country', population:'108 million', area:'1,972,550 sq km',
+ children:[{_reference:'Mexico City'}, {_reference:'Guadalajara'}] },
+ { name:'Mexico City', type:'city', population:'19 million', timezone:'-6 UTC'},
+ { name:'Guadalajara', type:'city', population:'4 million', timezone:'-6 UTC' },
+ { name:'Canada', type:'country', population:'33 million', area:'9,984,670 sq km',
+ children:[{_reference:'Ottawa'}, {_reference:'Toronto'}] },
+ { name:'Ottawa', type:'city', population:'0.9 million', timezone:'-5 UTC'},
+ { name:'Toronto', type:'city', population:'2.5 million', timezone:'-5 UTC' },
+ { name:'United States of America', type:'country' },
+ { name:'South America', type:'continent',
+ children:[{_reference:'Brazil'}, {_reference:'Argentina'}] },
+ { name:'Brazil', type:'country', population:'186 million' },
+ { name:'Argentina', type:'country', population:'40 million' }
+]}
diff --git a/includes/js/dijit/tests/_data/dijits.json b/includes/js/dijit/tests/_data/dijits.json
new file mode 100644
index 0000000..160581b
--- /dev/null
+++ b/includes/js/dijit/tests/_data/dijits.json
@@ -0,0 +1 @@
+{"timestamp":1193692111,"items":[{"namespace":"dijit","className":"dijit.ColorPalette","summary":"Grid showing various colors, so the user can pick a certain color","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Declaration","summary":"The Declaration widget allows a user to declare new widget\nclasses directly from a snippet of markup.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.DialogUnderlay","summary":"the thing that grays out the screen behind the dialog\n\nTemplate has two divs; outer div is used for fade-in\/fade-out, and also to hold background iframe.\nInner div has opacity specified in CSS file.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Dialog","summary":"Pops up a modal dialog window, blocking access to the screen\nand also graying out the screen Dialog is extended from\nContentPane so it supports all the same parameters (href, etc.)","description":null,"examples":null},{"namespace":"dijit","className":"dijit.TooltipDialog","summary":"Pops up a dialog that appears like a Tooltip","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Editor","summary":"A rich-text Editing widget","description":null,"examples":null},{"namespace":"dijit","className":"dijit.InlineEditBox","summary":"Behavior for an existing node (<p>, <div>, <span>, etc.) so that\nwhen you click it, an editor shows up in place of the original\ntext. Optionally, Save and Cancel button are displayed below the edit widget.\nWhen Save is clicked, the text is pulled from the edit\nwidget and redisplayed and the edit widget is again hidden.\nBy default a plain Textarea widget is used as the editor (or for\ninline values a TextBox), but you can specify an editor such as\ndijit.Editor (for editing HTML) or a Slider (for adjusting a number).\nAn edit widget must support the following API to be used:\nString getDisplayedValue() OR String getValue()\nvoid setDisplayedValue(String) OR void setValue(String)\nvoid focus()","description":null,"examples":null},{"namespace":"dijit","className":"dijit._InlineEditor","summary":"internal widget used by InlineEditBox, displayed when in editing mode\nto display the editor and maybe save\/cancel buttons. Calling code should\nconnect to save\/cancel methods to detect when editing is finished\n\nHas mainly the same parameters as InlineEditBox, plus these values:\n\nstyle: Object\nSet of CSS attributes of display node, to replicate in editor\n\nvalue: String\nValue as an HTML string or plain text string, depending on renderAsHTML flag","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Menu","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.MenuItem","summary":"A line item in a Menu2\n\nMake 3 columns\nicon, label, and expand arrow (BiDi-dependent) indicating sub-menu","description":null,"examples":null},{"namespace":"dijit","className":"dijit.PopupMenuItem","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.MenuSeparator","summary":"A line between two menu items","description":null,"examples":null},{"namespace":"dijit","className":"dijit.ProgressBar","summary":"a progress widget\n\nusage:\n<div dojoType=\"ProgressBar\"","description":null,"examples":null},{"namespace":"dijit","className":"dijit.TitlePane","summary":"A pane with a title on top, that can be opened or collapsed.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Toolbar","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.ToolbarSeparator","summary":"A line between two menu items","description":null,"examples":null},{"namespace":"dijit","className":"dijit._MasterTooltip","summary":"Internal widget that holds the actual tooltip markup,\nwhich occurs once per page.\nCalled by Tooltip widgets which are just containers to hold\nthe markup","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Tooltip","summary":"Pops up a tooltip (a help message) when you hover over a node.","description":null,"examples":null},{"namespace":"dijit","className":"dijit._TreeNode","summary":"Single node within a tree","description":null,"examples":null},{"namespace":"dijit","className":"dijit.Tree","summary":"This widget displays hierarchical data from a store. A query is specified\nto get the \"top level children\" from a data store, and then those items are\nqueried for their children and so on (but lazily, as the user clicks the expand node).\n\nThus in the default mode of operation this widget is technically a forest, not a tree,\nin that there can be multiple \"top level children\". However, if you specify label,\nthen a special top level node (not corresponding to any item in the datastore) is\ncreated, to father all the top level children.","description":null,"examples":null},{"namespace":"dijit","className":"dijit._Calendar","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit._Contained","summary":"Mixin for widgets that are children of a container widget","description":null,"examples":null},{"namespace":"dijit","className":"dijit._Container","summary":"Mixin for widgets that contain a list of children like SplitContainer","description":null,"examples":null},{"namespace":"dijit","className":"dijit._KeyNavContainer","summary":"A _Container with keyboard navigation of its children.\nTo use this mixin, call connectKeyNavHandlers() in\npostCreate() and call connectKeyNavChildren() in startup().","description":null,"examples":null},{"namespace":"dijit","className":"dijit._Templated","summary":"mixin for widgets that are instantiated from a template","description":null,"examples":null},{"namespace":"dijit","className":"dijit._TimePicker","summary":"A graphical time picker that TimeTextBox pops up\nIt is functionally modeled after the Java applet at http:\/\/java.arcadevillage.com\/applets\/timepica.htm\nSee ticket #599","description":null,"examples":null},{"namespace":"dijit","className":"dijit._Widget","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.WidgetSet","summary":"A set of widgets indexed by id","description":null,"examples":null},{"namespace":"dijit","className":"dijit.BackgroundIframe","summary":"For IE z-index schenanigans. id attribute is required.","description":"new dijit.BackgroundIframe(node)\nMakes a background iframe as a child of node, that fills\narea (and position) of node","examples":null},{"namespace":"dijit","className":"dijit._editor.RichText","summary":"dijit._editor.RichText is the core of the WYSIWYG editor in dojo, which\nprovides the basic editing features. It also encapsulates the differences\nof different js engines for various browsers","description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor._Plugin","summary":"only allow updates every two tenths of a second","description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.AlwaysShowToolbar","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.EnterKeyHandling","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.FontChoice","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.DualStateDropDownButton","summary":"a DropDownButton but button can be displayed in two states (checked or unchecked)","description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.UrlTextBox","summary":"the URL input box we use in our dialog\n\nregular expression for URLs, generated from dojo.regexp.url()","description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.LinkDialog","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit._editor.plugins.TextColor","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.range.W3CRange","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.demos.chat.Room","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.Button","summary":"Basically the same thing as a normal HTML button, but with special styling.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.DropDownButton","summary":"push the button and a menu shows up","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.ComboButton","summary":"left side is normal button, right side displays menu","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.ToggleButton","summary":"A button that can be in two states (checked or not).\nCan be base class for things like tabs or checkbox or radio buttons","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.CheckBox","summary":"Same as an HTML checkbox, but with fancy styling.","description":"Value of \"type\" attribute for <input>","examples":null},{"namespace":"dijit","className":"dijit.form.RadioButton","summary":"Same as an HTML radio, but with fancy styling.","description":"This shared object keeps track of all widgets, grouped by name","examples":null},{"namespace":"dijit","className":"dijit.form.ComboBoxMixin","summary":"Auto-completing text box, and base class for FilteringSelect widget.\n\nThe drop down box's values are populated from an class called\na data provider, which returns a list of values based on the characters\nthat the user has typed into the input box.\n\nSome of the options to the ComboBox are actually arguments to the data\nprovider.\n\nYou can assume that all the form widgets (and thus anything that mixes\nin ComboBoxMixin) will inherit from _FormWidget and thus the \"this\"\nreference will also \"be a\" _FormWidget.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form._ComboBoxMenu","summary":"these functions are called in showResultList","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.ComboBox","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.CurrencyTextBox","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.DateTextBox","summary":"A validating, serializable, range-bound date text box.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.FilteringSelect","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form._FormMixin","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.Form","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.InlineEditBox","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.NumberSpinner","summary":"Number Spinner","description":"This widget is the same as NumberTextBox but with up\/down arrows added","examples":null},{"namespace":"dijit","className":"dijit.form.NumberTextBoxMixin","summary":"A mixin for all number textboxes","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.NumberTextBox","summary":"A validating, serializable, range-bound text box.\nconstraints object: min, max, places","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.HorizontalSlider","summary":"A form widget that allows one to select a value with a horizontally draggable image","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.VerticalSlider","summary":"A form widget that allows one to select a value with a vertically draggable image","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form._SliderMover","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.HorizontalRule","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.VerticalRule","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.HorizontalRuleLabels","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.VerticalRuleLabels","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.TextBox","summary":"A generic textbox field.\nServes as a base class to derive more specialized functionality in subclasses.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.Textarea","summary":"event handlers, you can over-ride these in your own subclasses","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.TimeTextBox","summary":"NaN\nNaN","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.ValidationTextBox","summary":"default values for new subclass properties","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.MappedTextBox","summary":"A subclass of ValidationTextBox.\nProvides a hidden input field and a serialize method to override","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form.RangeBoundTextBox","summary":"A subclass of MappedTextBox.\nTests for a value out-of-range","description":null,"examples":null},{"namespace":"dijit","className":"dijit.form._FormWidget","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.form._Spinner","summary":"Mixin for validation widgets with a spinner","description":"This class basically (conceptually) extends dijit.form.ValidationTextBox.\nIt modifies the template to have up\/down arrows, and provides related handling code.","examples":null},{"namespace":"dijit","className":"dijit.layout.AccordionContainer","summary":"Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time,\nand switching between panes is visualized by sliding the other panes up\/down.\nusage:\n<div dojoType=\"dijit.layout.AccordionContainer\">\n<div dojoType=\"dijit.layout.AccordionPane\" title=\"pane 1\">\n<div dojoType=\"dijit.layout.ContentPane\">...<\/div>\n<\/div>\n<div dojoType=\"dijit.layout.AccordionPane\" title=\"pane 2\">\n<p>This is some text<\/p>\n...\n<\/div>","description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout.AccordionPane","summary":"AccordionPane is a ContentPane with a title that may contain another widget.\nNested layout widgets, such as SplitContainer, are not supported at this time.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout.ContentPane","summary":"A widget that acts as a Container for other widgets, and includes a ajax interface","description":"A widget that can be used as a standalone widget\nor as a baseclass for other widgets\nHandles replacement of document fragment using either external uri or javascript\ngenerated markup or DOM content, instantiating widgets within that content.\nDon't confuse it with an iframe, it only needs\/wants document fragments.\nIt's useful as a child of LayoutContainer, SplitContainer, or TabContainer.\nBut note that those classes can contain any widget as a child.\nexample:\nSome quick samples:\nTo change the innerHTML use .setContent('<b>new content<\/b>')\n\nOr you can send it a NodeList, .setContent(dojo.query('div [class=selected]', userSelection))\nplease note that the nodes in NodeList will copied, not moved\n\nTo do a ajax update use .setHref('url')","examples":null},{"namespace":"dijit","className":"dijit.layout.LayoutContainer","summary":"Provides Delphi-style panel layout semantics.\n\ndetails\nA LayoutContainer is a box with a specified size (like style=\"width: 500px; height: 500px;\"),\nthat contains children widgets marked with \"layoutAlign\" of \"left\", \"right\", \"bottom\", \"top\", and \"client\".\nIt takes it's children marked as left\/top\/bottom\/right, and lays them out along the edges of the box,\nand then it takes the child marked \"client\" and puts it into the remaining space in the middle.\n\nLeft\/right positioning is similar to CSS's \"float: left\" and \"float: right\",\nand top\/bottom positioning would be similar to \"float: top\" and \"float: bottom\", if there were such\nCSS.\n\nNote that there can only be one client element, but there can be multiple left, right, top,\nor bottom elements.\n\nusage\n<style>\nhtml, body{ height: 100%; width: 100%; }\n<\/style>\n<div dojoType=\"dijit.layout.LayoutContainer\" style=\"width: 100%; height: 100%\">\n<div dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"top\">header text<\/div>\n<div dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"left\" style=\"width: 200px;\">table of contents<\/div>\n<div dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"client\">client area<\/div>\n<\/div>\n\nLays out each child in the natural order the children occur in.\nBasically each child is laid out into the \"remaining space\", where \"remaining space\" is initially\nthe content area of this widget, but is reduced to a smaller rectangle each time a child is added.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout.LinkPane","summary":"A ContentPane that loads data remotely","description":"LinkPane is just a ContentPane that loads data remotely (via the href attribute),\nand has markup similar to an anchor. The anchor's body (the words between <a> and <\/a>)\nbecome the title of the widget (used for TabContainer, AccordionContainer, etc.)\nexample:\n<a href=\"foo.html\">my title<\/a>\n\nI'm using a template because the user may specify the input as\n<a href=\"foo.html\">title<\/a>, in which case we need to get rid of the\n<a> because we don't want a link.","examples":null},{"namespace":"dijit","className":"dijit.layout.SplitContainer","summary":"A Container widget with sizing handles in-between each child","description":"Contains multiple children widgets, all of which are displayed side by side\n(either horizontally or vertically); there's a bar between each of the children,\nand you can adjust the relative size of each child by dragging the bars.\n\nYou must specify a size (width and height) for the SplitContainer.","examples":null},{"namespace":"dijit","className":"dijit.layout.StackContainer","summary":null,"description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout.StackController","summary":"Set of buttons to select a page in a page list.\nMonitors the specified StackContainer, and whenever a page is\nadded, deleted, or selected, updates itself accordingly.","description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout._StackButton","summary":"StackContainer buttons are not in the tab order by default","description":null,"examples":null},{"namespace":"dijit","className":"dijit.layout.TabContainer","summary":"A Container with Title Tabs, each one pointing at a pane in the container.","description":"A TabContainer is a container that has multiple panes, but shows only\none pane at a time. There are a set of tabs corresponding to each pane,\nwhere each tab has the title (aka title) of the pane, and optionally a close button.\n\nPublishes topics <widgetId>-addChild, <widgetId>-removeChild, and <widgetId>-selectChild\n(where <widgetId> is the id of the TabContainer itself.","examples":null},{"namespace":"dijit","className":"dijit.layout.TabController","summary":"Set of tabs (the things with titles and a close button, that you click to show a tab panel).","description":"Lets the user select the currently shown pane in a TabContainer or StackContainer.\nTabController also monitors the TabContainer, and whenever a pane is\nadded or deleted updates itself accordingly.","examples":null},{"namespace":"dijit","className":"dijit.layout._TabButton","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.\nThis is an internal widget and should not be instantiated directly.","examples":null},{"namespace":"dijit","className":"dijit.layout._LayoutWidget","summary":"Mixin for widgets that contain a list of children like SplitContainer.\nWidgets which mixin this code must define layout() to lay out the children","description":null,"examples":null}],"identifier":"className","label":"className"} \ No newline at end of file
diff --git a/includes/js/dijit/tests/_data/states.json b/includes/js/dijit/tests/_data/states.json
new file mode 100644
index 0000000..d870dfa
--- /dev/null
+++ b/includes/js/dijit/tests/_data/states.json
@@ -0,0 +1,64 @@
+{identifier:"abbreviation",
+items: [
+ {name:"Alabama", label:"<img width='97px' height='127px' src='images/Alabama.jpg'/>Alabama",abbreviation:"AL"},
+ {name:"Alaska", label:"Alaska",abbreviation:"AK"},
+ {name:"American Samoa", label:"American Samoa",abbreviation:"AS"},
+ {name:"Arizona", label:"Arizona",abbreviation:"AZ"},
+ {name:"Arkansas", label:"Arkansas",abbreviation:"AR"},
+ {name:"Armed Forces Europe", label:"Armed Forces Europe",abbreviation:"AE"},
+ {name:"Armed Forces Pacific", label:"Armed Forces Pacific",abbreviation:"AP"},
+ {name:"Armed Forces the Americas", label:"Armed Forces the Americas",abbreviation:"AA"},
+ {name:"California", label:"California",abbreviation:"CA"},
+ {name:"Colorado", label:"Colorado",abbreviation:"CO"},
+ {name:"Connecticut", label:"Connecticut",abbreviation:"CT"},
+ {name:"Delaware", label:"Delaware",abbreviation:"DE"},
+ {name:"District of Columbia", label:"District of Columbia",abbreviation:"DC"},
+ {name:"Federated States of Micronesia", label:"Federated States of Micronesia",abbreviation:"FM"},
+ {name:"Florida", label:"Florida",abbreviation:"FL"},
+ {name:"Georgia", label:"Georgia",abbreviation:"GA"},
+ {name:"Guam", label:"Guam",abbreviation:"GU"},
+ {name:"Hawaii", label:"Hawaii",abbreviation:"HI"},
+ {name:"Idaho", label:"Idaho",abbreviation:"ID"},
+ {name:"Illinois", label:"Illinois",abbreviation:"IL"},
+ {name:"Indiana", label:"Indiana",abbreviation:"IN"},
+ {name:"Iowa", label:"Iowa",abbreviation:"IA"},
+ {name:"Kansas", label:"Kansas",abbreviation:"KS"},
+ {name:"Kentucky", label:"Kentucky",abbreviation:"KY"},
+ {name:"Louisiana", label:"Louisiana",abbreviation:"LA"},
+ {name:"Maine", label:"Maine",abbreviation:"ME"},
+ {name:"Marshall Islands", label:"Marshall Islands",abbreviation:"MH"},
+ {name:"Maryland", label:"Maryland",abbreviation:"MD"},
+ {name:"Massachusetts", label:"Massachusetts",abbreviation:"MA"},
+ {name:"Michigan", label:"Michigan",abbreviation:"MI"},
+ {name:"Minnesota", label:"Minnesota",abbreviation:"MN"},
+ {name:"Mississippi", label:"Mississippi",abbreviation:"MS"},
+ {name:"Missouri", label:"Missouri",abbreviation:"MO"},
+ {name:"Montana", label:"Montana",abbreviation:"MT"},
+ {name:"Nebraska", label:"Nebraska",abbreviation:"NE"},
+ {name:"Nevada", label:"Nevada",abbreviation:"NV"},
+ {name:"New Hampshire", label:"New Hampshire",abbreviation:"NH"},
+ {name:"New Jersey", label:"New Jersey",abbreviation:"NJ"},
+ {name:"New Mexico", label:"New Mexico",abbreviation:"NM"},
+ {name:"New York", label:"New York",abbreviation:"NY"},
+ {name:"North Carolina", label:"North Carolina",abbreviation:"NC"},
+ {name:"North Dakota", label:"North Dakota",abbreviation:"ND"},
+ {name:"Northern Mariana Islands", label:"Northern Mariana Islands",abbreviation:"MP"},
+ {name:"Ohio", label:"Ohio",abbreviation:"OH"},
+ {name:"Oklahoma", label:"Oklahoma",abbreviation:"OK"},
+ {name:"Oregon", label:"Oregon",abbreviation:"OR"},
+ {name:"Pennsylvania", label:"Pennsylvania",abbreviation:"PA"},
+ {name:"Puerto Rico", label:"Puerto Rico",abbreviation:"PR"},
+ {name:"Rhode Island", label:"Rhode Island",abbreviation:"RI"},
+ {name:"South Carolina", label:"South Carolina",abbreviation:"SC"},
+ {name:"South Dakota", label:"South Dakota",abbreviation:"SD"},
+ {name:"Tennessee", label:"Tennessee",abbreviation:"TN"},
+ {name:"Texas", label:"Texas",abbreviation:"TX"},
+ {name:"Utah", label:"Utah",abbreviation:"UT"},
+ {name:"Vermont", label:"Vermont",abbreviation:"VT"},
+ {name: "Virgin Islands, U.S.",label:"Virgin Islands, U.S.",abbreviation:"VI"},
+ {name:"Virginia", label:"Virginia",abbreviation:"VA"},
+ {name:"Washington", label:"Washington",abbreviation:"WA"},
+ {name:"West Virginia", label:"West Virginia",abbreviation:"WV"},
+ {name:"Wisconsin", label:"Wisconsin",abbreviation:"WI"},
+ {name:"Wyoming", label:"Wyoming",abbreviation:"WY"}
+]} \ No newline at end of file
diff --git a/includes/js/dijit/tests/_data/treeTest.json b/includes/js/dijit/tests/_data/treeTest.json
new file mode 100644
index 0000000..c90a110
--- /dev/null
+++ b/includes/js/dijit/tests/_data/treeTest.json
@@ -0,0 +1,22 @@
+{
+ identifier: 'id',
+ label: 'name',
+ items: [
+ { id: 'root', name:'root', someProperty:'root property', children: [
+ {_reference:'node1'},
+ {_reference:'node2'},
+ {_reference:'node3'},
+ {_reference:'node4'},
+ {_reference:'node5'}
+ ]},
+ { id: 'node1', name:'node1', someProperty:'somePropertyA', children: [
+ {_reference:'node1.1'}, {_reference:'node1.2'}
+ ]},
+ { id: 'node1.1',name:'node1.1', someProperty:'somePropertyA1'},
+ { id: 'node1.2',name:'node1.2', someProperty:'somePropertyA2'},
+ { id: 'node2', name:'node2', someProperty:'somePropertyB'},
+ { id: 'node3', name:'node3', someProperty:'somePropertyC'},
+ { id: 'node4', name:'node4', someProperty:'somePropertyA'},
+ { id: 'node5', name:'node5', someProperty:'somePropertyB'}
+ ]
+}
diff --git a/includes/js/dijit/tests/_editor/test_6112.html b/includes/js/dijit/tests/_editor/test_6112.html
new file mode 100644
index 0000000..785cd55
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_6112.html
@@ -0,0 +1,745 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Rich Text System Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript" src="../../_editor/selection.js"></script>
+ <script type="text/javascript" src="../../_editor/RichText.js"></script>
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dijit._editor.RichText");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+
+</head>
+<body>
+
+ <h1 class="testTitle">Rich Text Test</h1>
+
+ <div style="border: 1px dotted black;">
+ <h3>test case for bug #6112</h3>
+ <textarea dojoType="dijit._editor.RichText" id="editor1"
+ styleSheets="../../../dojo/resources/dojo.css">
+<p>
+The Project Gutenberg EBook of Faust, by Goethe
+</p>
+<p>
+This eBook is for the use of anyone anywhere at no cost and with
+almost no restrictions whatsoever. You may copy it, give it away or
+re-use it under the terms of the Project Gutenberg License included
+with this eBook or online at www.gutenberg.net
+
+</p>
+<p>
+
+Title: Faust
+
+</p>
+<p>
+Author: Goethe
+
+</p>
+<p>
+Release Date: December 25, 2004 [EBook #14460]
+
+</p>
+<p>
+Language: English
+
+</p>
+<p>
+Character set encoding: ISO-8859-1
+
+</p>
+<p>
+*** START OF THIS PROJECT GUTENBERG EBOOK FAUST ***
+</p>
+<p>
+Produced by Juliet Sutherland, Charles Bidwell and the PG Online
+Distributed Proofreading Team
+
+</p>
+<p>
+<h1> FAUST </h1>
+<h2>A TRAGEDY</h2>
+
+<h5>
+TRANSLATED FROM THE GERMAN
+<br>
+OF
+<br>
+GOETHE
+
+<br>
+
+WITH NOTES
+
+<br>
+BY
+
+<br>
+CHARLES T BROOKS
+
+<br>
+
+SEVENTH EDITION.
+
+<br>
+BOSTON
+<br>
+TICKNOR AND FIELDS
+
+<br>
+MDCCCLXVIII.
+</h5>
+
+
+
+<p>
+
+Entered according to Act of Congress, in the year 1856,
+by CHARLES T. BROOKS,
+In the Clerk's Office of the District Court
+of the District of Rhode Island.
+
+</p>
+<p>
+UNIVERSITY PRESS:
+WELCH, BIGELOW, AND COMPANY,
+CAMBRIDGE.
+
+</p>
+<p>
+
+
+
+TRANSLATOR'S PREFACE.
+
+</p>
+<p>
+
+Perhaps some apology ought to be given to English scholars, that is, those
+who do not know German, (to those, at least, who do not know what sort of
+a thing Faust is in the original,) for offering another translation to the
+public, of a poem which has been already translated, not only in a literal
+prose form, but also, twenty or thirty times, in metre, and sometimes with
+great spirit, beauty, and power.
+</p>
+<p>
+
+The author of the present version, then, has no knowledge that a rendering
+of this wonderful poem into the exact and ever-changing metre of the
+original has, until now, been so much as attempted. To name only one
+defect, the very best versions which he has seen neglect to follow the
+exquisite artist in the evidently planned and orderly intermixing of
+_male_ and _female_ rhymes, _i.e._ rhymes which fall on the last syllable
+and those which fall on the last but one. Now, every careful student of
+the versification of Faust must feel and see that Goethe did not
+intersperse the one kind of rhyme with the other, at random, as those
+translators do; who, also, give the female rhyme (on which the vivacity of
+dialogue and description often so much depends,) in so small a proportion.
+
+</p>
+<p>
+A similar criticism might be made of their liberty in neglecting Goethe's
+method of alternating different measures with each other.
+
+</p>
+<p>
+It seems as if, in respect to metre, at least, they had asked themselves,
+how would Goethe have written or shaped this in English, had that been his
+native language, instead of seeking _con amore_ (and _con fidelità_) as
+they should have done, to reproduce, both in spirit and in form, the
+movement, so free and yet orderly, of the singularly endowed and
+accomplished poet whom they undertook to represent.
+
+</p>
+<p>
+As to the objections which Hayward and some of his reviewers have
+instituted in advance against the possibility of a good and faithful
+metrical translation of a poem like Faust, they seem to the present
+translator full of paradox and sophistry. For instance, take this
+assertion of one of the reviewers: "The sacred and mysterious union of
+thought with verse, twin-born and immortally wedded from the moment of
+their common birth, can never be understood by those who desire verse
+translations of good poetry." If the last part of this statement had read
+"by those who can be contented with _prose_ translations of good poetry,"
+the position would have been nearer the truth. This much we might well
+admit, that, if the alternative were either to have a poem like Faust in a
+metre different and glaringly different from the original, or to have it
+in simple and strong prose, then the latter alternative would be the one
+every tasteful and feeling scholar would prefer; but surely to every one
+who can read the original or wants to know how this great song _sung
+itself_ (as Carlyle says) out of Goethe's soul, a mere prose rendering
+must be, comparatively, a _corpus mortuum._
+
+</p>
+<p>
+The translator most heartily dissents from Hayward's assertion that a
+translator of Faust "must sacrifice either metre or meaning." At least he
+flatters himself that he has made, in the main, (not a compromise between
+meaning and melody, though in certain instances he may have fallen into
+that, but) a combination of the meaning with the melody, which latter is
+so important, so vital a part of the lyric poem's meaning, in any worthy
+sense. "No poetic translation," says Hayward's reviewer, already quoted,
+"can give the rhythm and rhyme of the original; it can only substitute the
+rhythm and rhyme of the translator." One might just as well say "no
+_prose_ translation can give the _sense and spirit_ of the original; it
+can only substitute the _sense and spirit of the words and phrases of the
+translator's language_;" and then, these two assertions balancing each
+other, there will remain in the metrical translator's favor, that he may
+come as near to giving both the letter and the spirit, as the effects of
+the Babel dispersion will allow.
+
+</p>
+<p>
+As to the original creation, which he has attempted here to reproduce, the
+translator might say something, but prefers leaving his readers to the
+poet himself, as revealed in the poem, and to the various commentaries of
+which we have some accounts, at least, in English. A French translator of
+the poem speaks in his introduction as follows: "This Faust, conceived by
+him in his youth, completed in ripe age, the idea of which he carried with
+him through all the commotions of his life, as Camoens bore his poem with
+him through the waves, this Faust contains him entire. The thirst for
+knowledge and the martyrdom of doubt, had they not tormented his early
+years? Whence came to him the thought of taking refuge in a supernatural
+realm, of appealing to invisible powers, which plunged him, for a
+considerable time, into the dreams of Illuminati and made him even invent
+a religion? This irony of Mephistopheles, who carries on so audacious a
+game with the weakness and the desires of man, is it not the mocking,
+scornful side of the poet's spirit, a leaning to sullenness, which can be
+traced even into the earliest years of his life, a bitter leaven thrown
+into a strong soul forever by early satiety? The character of Faust
+especially, the man whose burning, untiring heart can neither enjoy
+fortune nor do without it, who gives himself unconditionally and watches
+himself with mistrust, who unites the enthusiasm of passion and the
+dejectedness of despair, is not this an eloquent opening up of the most
+secret and tumultuous part of the poet's soul? And now, to complete the
+image of his inner life, he has added the transcendingly sweet person of
+Margaret, an exalted reminiscence of a young girl, by whom, at the age of
+fourteen, he thought himself beloved, whose image ever floated round him,
+and has contributed some traits to each of his heroines. This heavenly
+surrender of a simple, good, and tender heart contrasts wonderfully with
+the sensual and gloomy passion of the lover, who, in the midst of his
+love-dreams, is persecuted by the phantoms of his imagination and by the
+nightmares of thought, with those sorrows of a soul, which is crushed, but
+not extinguished, which is tormented by the invincible want of happiness
+and the bitter feeling, how hard a thing it is to receive or to bestow."
+
+</p>
+<p>
+
+
+
+DEDICATION.[1]
+
+</p>
+<p>
+Once more ye waver dreamily before me,
+Forms that so early cheered my troubled eyes!
+To hold you fast doth still my heart implore me?
+Still bid me clutch the charm that lures and flies?
+Ye crowd around! come, then, hold empire o'er me,
+As from the mist and haze of thought ye rise;
+The magic atmosphere, your train enwreathing,
+Through my thrilled bosom youthful bliss is breathing.
+
+</p>
+<p>
+Ye bring with you the forms of hours Elysian,
+And shades of dear ones rise to meet my gaze;
+First Love and Friendship steal upon my vision
+Like an old tale of legendary days;
+Sorrow renewed, in mournful repetition,
+Runs through life's devious, labyrinthine ways;
+And, sighing, names the good (by Fortune cheated
+Of blissful hours!) who have before me fleeted.
+
+</p>
+<p>
+These later songs of mine, alas! will never
+Sound in their ears to whom the first were sung!
+Scattered like dust, the friendly throng forever!
+Mute the first echo that so grateful rung!
+To the strange crowd I sing, whose very favor
+Like chilling sadness on my heart is flung;
+And all that kindled at those earlier numbers
+Roams the wide earth or in its bosom slumbers.
+
+</p>
+<p>
+And now I feel a long-unwonted yearning
+For that calm, pensive spirit-realm, to-day;
+Like an Aeolian lyre, (the breeze returning,)
+Floats in uncertain tones my lisping lay;
+Strange awe comes o'er me, tear on tear falls burning,
+The rigid heart to milder mood gives way!
+What I possess I see afar off lying,
+And what I lost is real and undying.
+
+</p>
+<p>
+
+
+
+PRELUDE
+
+</p>
+<p>
+IN THE THEATRE.
+
+
+</p>
+<p>
+ _Manager. Dramatic Poet. Merry Person._
+
+</p>
+<p>
+_Manager_. You who in trouble and distress
+Have both held fast your old allegiance,
+What think ye? here in German regions
+Our enterprise may hope success?
+To please the crowd my purpose has been steady,
+Because they live and let one live at least.
+The posts are set, the boards are laid already,
+And every one is looking for a feast.
+They sit, with lifted brows, composed looks wearing,
+Expecting something that shall set them staring.
+I know the public palate, that's confest;
+Yet never pined so for a sound suggestion;
+True, they are not accustomed to the best,
+But they have read a dreadful deal, past question.
+How shall we work to make all fresh and new,
+Acceptable and profitable, too?
+For sure I love to see the torrent boiling,
+When towards our booth they crowd to find a place,
+Now rolling on a space and then recoiling,
+Then squeezing through the narrow door of grace:
+Long before dark each one his hard-fought station
+In sight of the box-office window takes,
+And as, round bakers' doors men crowd to escape starvation,
+For tickets here they almost break their necks.
+This wonder, on so mixed a mass, the Poet
+Alone can work; to-day, my friend, O, show it!
+
+</p>
+<p>
+_Poet_. Oh speak not to me of that motley ocean,
+Whose roar and greed the shuddering spirit chill!
+Hide from my sight that billowy commotion
+That draws us down the whirlpool 'gainst our will.
+No, lead me to that nook of calm devotion,
+Where blooms pure joy upon the Muses' hill;
+Where love and friendship aye create and cherish,
+With hand divine, heart-joys that never perish.
+Ah! what, from feeling's deepest fountain springing,
+Scarce from the stammering lips had faintly passed,
+Now, hopeful, venturing forth, now shyly clinging,
+To the wild moment's cry a prey is cast.
+Oft when for years the brain had heard it ringing
+It comes in full and rounded shape at last.
+What shines, is born but for the moment's pleasure;
+The genuine leaves posterity a treasure.
+
+</p>
+<p>
+_Merry Person_. Posterity! I'm sick of hearing of it;
+Supposing I the future age would profit,
+Who then would furnish ours with fun?
+For it must have it, ripe and mellow;
+The presence of a fine young fellow,
+Is cheering, too, methinks, to any one.
+Whoso can pleasantly communicate,
+Will not make war with popular caprices,
+For, as the circle waxes great,
+The power his word shall wield increases.
+Come, then, and let us now a model see,
+Let Phantasy with all her various choir,
+Sense, reason, passion, sensibility,
+But, mark me, folly too! the scene inspire.
+
+</p>
+<p>
+_Manager_. But the great point is action! Every one
+Comes as spectator, and the show's the fun.
+Let but the plot be spun off fast and thickly,
+So that the crowd shall gape in broad surprise,
+Then have you made a wide impression quickly,
+You are the man they'll idolize.
+The mass can only be impressed by masses;
+Then each at last picks out his proper part.
+Give much, and then to each one something passes,
+And each one leaves the house with happy heart.
+Have you a piece, give it at once in pieces!
+Such a ragout your fame increases;
+It costs as little pains to play as to invent.
+But what is gained, if you a whole present?
+Your public picks it presently to pieces.
+
+</p>
+<p>
+_Poet_. You do not feel how mean a trade like that must be!
+In the true Artist's eyes how false and hollow!
+Our genteel botchers, well I see,
+Have given the maxims that you follow.
+
+</p>
+<p>
+_Manager_. Such charges pass me like the idle wind;
+A man who has right work in mind
+Must choose the instruments most fitting.
+Consider what soft wood you have for splitting,
+And keep in view for whom you write!
+If this one from _ennui_ seeks flight,
+That other comes full from the groaning table,
+Or, the worst case of all to cite,
+From reading journals is for thought unable.
+Vacant and giddy, all agog for wonder,
+As to a masquerade they wing their way;
+The ladies give themselves and all their precious plunder
+And without wages help us play.
+On your poetic heights what dream comes o'er you?
+What glads a crowded house? Behold
+Your patrons in array before you!
+One half are raw, the other cold.
+One, after this play, hopes to play at cards,
+One a wild night to spend beside his doxy chooses,
+Poor fools, why court ye the regards,
+For such a set, of the chaste muses?
+I tell you, give them more and ever more and more,
+And then your mark you'll hardly stray from ever;
+To mystify be your endeavor,
+To satisfy is labor sore....
+What ails you? Are you pleased or pained? What notion----
+
+</p>
+<p>
+_Poet_. Go to, and find thyself another slave!
+What! and the lofty birthright Nature gave,
+The noblest talent Heaven to man has lent,
+Thou bid'st the Poet fling to folly's ocean!
+How does he stir each deep emotion?
+How does he conquer every element?
+But by the tide of song that from his bosom springs,
+And draws into his heart all living things?
+When Nature's hand, in endless iteration,
+The thread across the whizzing spindle flings,
+When the complex, monotonous creation
+Jangles with all its million strings:
+Who, then, the long, dull series animating,
+Breaks into rhythmic march the soulless round?
+And, to the law of All each member consecrating,
+Bids one majestic harmony resound?
+Who bids the tempest rage with passion's power?
+The earnest soul with evening-redness glow?
+Who scatters vernal bud and summer flower
+Along the path where loved ones go?
+Who weaves each green leaf in the wind that trembles
+To form the wreath that merit's brow shall crown?
+Who makes Olympus fast? the gods assembles?
+The power of manhood in the Poet shown.
+
+</p>
+<p>
+_Merry Person_. Come, then, put forth these noble powers,
+And, Poet, let thy path of flowers
+Follow a love-adventure's winding ways.
+One comes and sees by chance, one burns, one stays,
+And feels the gradual, sweet entangling!
+The pleasure grows, then comes a sudden jangling,
+Then rapture, then distress an arrow plants,
+And ere one dreams of it, lo! _there_ is a romance.
+Give us a drama in this fashion!
+Plunge into human life's full sea of passion!
+Each lives it, few its meaning ever guessed,
+Touch where you will, 'tis full of interest.
+Bright shadows fleeting o'er a mirror,
+A spark of truth and clouds of error,
+By means like these a drink is brewed
+To cheer and edify the multitude.
+The fairest flower of the youth sit listening
+Before your play, and wait the revelation;
+Each melancholy heart, with soft eyes glistening,
+Draws sad, sweet nourishment from your creation;
+This passion now, now that is stirred, by turns,
+And each one sees what in his bosom burns.
+Open alike, as yet, to weeping and to laughter,
+They still admire the flights, they still enjoy the show;
+Him who is formed, can nothing suit thereafter;
+The yet unformed with thanks will ever glow.
+
+</p>
+<p>
+_Poet_. Ay, give me back the joyous hours,
+When I myself was ripening, too,
+When song, the fount, flung up its showers
+Of beauty ever fresh and new.
+When a soft haze the world was veiling,
+Each bud a miracle bespoke,
+And from their stems a thousand flowers I broke,
+Their fragrance through the vales exhaling.
+I nothing and yet all possessed,
+Yearning for truth and in illusion blest.
+Give me the freedom of that hour,
+The tear of joy, the pleasing pain,
+Of hate and love the thrilling power,
+Oh, give me back my youth again!
+
+</p>
+<p>
+_Merry Person_. Youth, my good friend, thou needest certainly
+When ambushed foes are on thee springing,
+When loveliest maidens witchingly
+Their white arms round thy neck are flinging,
+When the far garland meets thy glance,
+High on the race-ground's goal suspended,
+When after many a mazy dance
+In drink and song the night is ended.
+But with a free and graceful soul
+To strike the old familiar lyre,
+And to a self-appointed goal
+Sweep lightly o'er the trembling wire,
+There lies, old gentlemen, to-day
+Your task; fear not, no vulgar error blinds us.
+Age does not make us childish, as they say,
+But we are still true children when it finds us.
+
+</p>
+<p>
+_Manager_. Come, words enough you two have bandied,
+Now let us see some deeds at last;
+While you toss compliments full-handed,
+The time for useful work flies fast.
+Why talk of being in the humor?
+Who hesitates will never be.
+If you are poets (so says rumor)
+Now then command your poetry.
+You know full well our need and pleasure,
+We want strong drink in brimming measure;
+Brew at it now without delay!
+To-morrow will not do what is not done to-day.
+Let not a day be lost in dallying,
+But seize the possibility
+Right by the forelock, courage rallying,
+And forth with fearless spirit sallying,--
+Once in the yoke and you are free.
+ Upon our German boards, you know it,
+What any one would try, he may;
+Then stint me not, I beg, to-day,
+In scenery or machinery, Poet.
+With great and lesser heavenly lights make free,
+Spend starlight just as you desire;
+No want of water, rocks or fire
+Or birds or beasts to you shall be.
+So, in this narrow wooden house's bound,
+Stride through the whole creation's round,
+And with considerate swiftness wander
+From heaven, through this world, to the world down yonder.
+
+
+</p>
+<p>
+
+
+ PROLOGUE
+
+</p>
+<p>
+
+ IN HEAVEN.
+
+</p>
+<p>
+
+[THE LORD. THE HEAVENLY HOSTS _afterward_ MEPHISTOPHELES.
+_The three archangels_, RAPHAEL, GABRIEL, _and_ MICHAEL, _come forward_.]
+
+</p>
+<p>
+_Raphael_. The sun, in ancient wise, is sounding,
+ With brother-spheres, in rival song;
+And, his appointed journey rounding,
+ With thunderous movement rolls along.
+His look, new strength to angels lending,
+ No creature fathom can for aye;
+The lofty works, past comprehending,
+ Stand lordly, as on time's first day.
+
+</p>
+<p>
+_Gabriel_. And swift, with wondrous swiftness fleeting,
+ The pomp of earth turns round and round,
+The glow of Eden alternating
+ With shuddering midnight's gloom profound;
+Up o'er the rocks the foaming ocean
+ Heaves from its old, primeval bed,
+And rocks and seas, with endless motion,
+ On in the spheral sweep are sped.
+
+</p>
+<p>
+_Michael_. And tempests roar, glad warfare waging,
+ From sea to land, from land to sea,
+And bind round all, amidst their raging,
+ A chain of giant energy.
+There, lurid desolation, blazing,
+ Foreruns the volleyed thunder's way:
+Yet, Lord, thy messengers[2] are praising
+ The mild procession of thy day.
+
+</p>
+<p>
+_All Three_. The sight new strength to angels lendeth,
+ For none thy being fathom may,
+The works, no angel comprehendeth,
+ Stand lordly as on time's first day.
+
+</p>
+<p>
+_Mephistopheles_. Since, Lord, thou drawest near us once again,
+And how we do, dost graciously inquire,
+And to be pleased to see me once didst deign,
+I too among thy household venture nigher.
+Pardon, high words I cannot labor after,
+Though the whole court should look on me with scorn;
+My pathos certainly would stir thy laughter,
+Hadst thou not laughter long since quite forsworn.
+Of sun and worlds I've nought to tell worth mention,
+How men torment themselves takes my attention.
+The little God o' the world jogs on the same old way
+And is as singular as on the world's first day.
+A pity 'tis thou shouldst have given
+The fool, to make him worse, a gleam of light from heaven;
+He calls it reason, using it
+To be more beast than ever beast was yet.
+He seems to me, (your grace the word will pardon,)
+Like a long-legg'd grasshopper in the garden,
+Forever on the wing, and hops and sings
+The same old song, as in the grass he springs;
+Would he but stay there! no; he needs must muddle
+His prying nose in every puddle.
+
+</p>
+<p>
+_The Lord_. Hast nothing for our edification?
+Still thy old work of accusation?
+Will things on earth be never right for thee?
+
+</p>
+<p>
+_Mephistopheles_. No, Lord! I find them still as bad as bad can be.
+Poor souls! their miseries seem so much to please 'em,
+I scarce can find it in my heart to tease 'em.
+
+</p>
+<p>
+_The Lord_. Knowest thou Faust?
+
+</p>
+<p>
+_Mephistopheles_. The Doctor?
+
+</p>
+<p>
+_The Lord_. Ay, my servant!
+
+</p>
+<p>
+_Mephistopheles_. He!
+Forsooth! he serves you in a famous fashion;
+No earthly meat or drink can feed his passion;
+Its grasping greed no space can measure;
+Half-conscious and half-crazed, he finds no rest;
+The fairest stars of heaven must swell his treasure.
+Each highest joy of earth must yield its zest,
+Not all the world--the boundless azure--
+Can fill the void within his craving breast.
+
+</p>
+<p>
+_The Lord_. He serves me somewhat darkly, now, I grant,
+Yet will he soon attain the light of reason.
+Sees not the gardener, in the green young plant,
+That bloom and fruit shall deck its coming season?
+
+</p>
+<p>
+_Mephistopheles_. What will you bet? You'll surely lose your wager!
+If you will give me leave henceforth,
+To lead him softly on, like an old stager.
+
+</p>
+<p>
+_The Lord_. So long as he shall live on earth,
+Do with him all that you desire.
+Man errs and staggers from his birth.
+
+</p>
+<p>
+_Mephistopheles_. Thank you; I never did aspire
+To have with dead folk much transaction.
+In full fresh cheeks I take the greatest satisfaction.
+A corpse will never find me in the house;
+I love to play as puss does with the mouse.
+
+</p>
+<p>
+_The Lord_. All right, I give thee full permission!
+Draw down this spirit from its source,
+And, canst thou catch him, to perdition
+Carry him with thee in thy course,
+But stand abashed, if thou must needs confess,
+That a good man, though passion blur his vision,
+Has of the right way still a consciousness.
+
+</p>
+<p>
+_Mephistopheles_. Good! but I'll make it a short story.
+About my wager I'm by no means sorry.
+And if I gain my end with glory
+Allow me to exult from a full breast.
+Dust shall he eat and that with zest,
+Like my old aunt, the snake, whose fame is hoary.
+</p>
+<p>
+
+_The Lord_. Well, go and come, and make thy trial;
+The like of thee I never yet did hate.
+Of all the spirits of denial
+The scamp is he I best can tolerate.
+Man is too prone, at best, to seek the way that's easy,
+He soon grows fond of unconditioned rest;
+And therefore such a comrade suits him best,
+Who spurs and works, true devil, always busy.
+But you, true sons of God, in growing measure,
+Enjoy rich beauty's living stores of pleasure!
+The Word[3] divine that lives and works for aye,
+Fold you in boundless love's embrace alluring,
+And what in floating vision glides away,
+That seize ye and make fast with thoughts enduring.
+</p>
+<p>
+[_Heaven closes, the archangels disperse._]
+
+</p>
+<p>
+_Mephistopheles. [Alone.]_ I like at times to exchange with him a word,
+And take care not to break with him. 'Tis civil
+In the old fellow[4] and so great a Lord
+To talk so kindly with the very devil.
+
+</p>
+
+ </textarea>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_editor/test_CustomPlugin.html b/includes/js/dijit/tests/_editor/test_CustomPlugin.html
new file mode 100644
index 0000000..eb8f650
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_CustomPlugin.html
@@ -0,0 +1,151 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Editor Custom Plugin Test/Tutorial</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Editor");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+
+ dojo.require("dijit._Widget");
+ dojo.require("dijit._Templated");
+ dojo.require("dijit._editor._Plugin");
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.i18n");
+ dojo.require("dojo.string");
+ dojo.requireLocalization("dijit._editor", "LinkDialog");
+
+ dojo.declare("myPlugin",
+ dijit._editor._Plugin,
+ {
+ buttonClass: dijit.form.DropDownButton,
+ useDefaultCommand: false,
+ urlRegExp: "((https?|ftps?)\\://|)(([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+(arpa|aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(((\\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])))(\\:(0|[1-9]\\d*))?(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?",
+ 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'>",
+ "</td></tr><tr><td>",
+ "<label for='${id}_textInput'>${text}</label>",
+ "</td><td>",
+ "<input dojoType='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' name='textInput'>",
+ "</td></tr><tr><td colspan='2'>",
+ "<button dojoType='dijit.form.Button' type='submit'>${set}</button>",
+ "</td></tr></table>"
+ ].join(""),
+
+ constructor: function(){
+ var _this = this;
+ this.tag = this.command == 'insertImage' ? 'img' : 'a';
+ var messages = 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);
+ },
+ onClose: dojo.hitch(this, "_onCloseDialog")
+ }));
+
+ this.button = new this.buttonClass({
+ label: "my plugin button",
+ showLabel: true,
+ iconClass: "",
+ dropDown: this.dropDown,
+ tabIndex: "-1"
+ });
+
+ messages.urlRegExp = this.urlRegExp;
+ messages.id = dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+ dropDown.setContent(dropDown.title + "<hr>" + dojo.string.substitute(this.linkDialogTemplate, messages));
+ dropDown.startup();
+ },
+
+ setValue: function(args){
+ // summary: callback from the dialog when user hits "set" button
+ //TODO: prevent closing popup if the text is empty
+ this._onCloseDialog();
+ if(dojo.isIE){ //see #4151
+ var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+ if(a){
+ dojo.withGlobal(this.editor.window, "selectElement", dijit._editor.selection, [a]);
+ }
+ }
+ args.tag = this.tag;
+ args.refAttr = this.tag == 'img' ? 'src' : 'href';
+ //TODO: textInput should be formatted by escapeXml
+ var template = "<${tag} ${refAttr}='${urlInput}' _djrealurl='${urlInput}'" +
+ (args.tag == 'img' ? " alt='${textInput}'>" : ">${textInput}") +
+ "</${tag}>";
+ this.editor.execCommand('inserthtml', dojo.string.substitute(template, args));
+ },
+
+ _onCloseDialog: function(){
+ // FIXME: IE is really messed up here!!
+ if(dojo.isIE){
+ if("_savedSelection" in this){
+ var b = this._savedSelection;
+ delete this._savedSelection;
+ this.editor.focus();
+ var range = this.editor.document.selection.createRange();
+ range.moveToBookmark(b);
+ range.select();
+ }
+ }else{
+ this.editor.focus();
+ }
+ },
+
+ _onOpenDialog: function(){
+ var a = dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.tag]);
+ var url, text;
+ if(a){
+ url = a.getAttribute('_djrealurl');
+ text = this.tag == 'img' ? a.getAttribute('alt') : 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);
+ }
+ // FIXME: IE is *really* b0rken
+ if(dojo.isIE){
+ this._savedSelection = this.editor.document.selection.createRange().getBookmark();
+ }
+ this.dropDown.reset();
+ this.dropDown.setValues({urlInput: url || '', textInput: text || ''});
+ //dijit.focus(this.urlInput);
+ }
+ }
+ );
+
+ /* the following code registers my plugin */
+ dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+ if(o.plugin){ return; }
+ if(o.args.name == "myPlugin"){
+ return new myPlugin({});
+ }
+ });
+ </script>
+</head>
+<body>
+ <div dojoType="dijit.Editor" id="editor1" extraPlugins="['myPlugin']"><p>
+ This editor should have my custom create link plugin
+ </p></div>
+</body>
+</html> \ No newline at end of file
diff --git a/includes/js/dijit/tests/_editor/test_RichText.html b/includes/js/dijit/tests/_editor/test_RichText.html
new file mode 100644
index 0000000..0428edf
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_RichText.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Rich Text System Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript" src="../../_editor/selection.js"></script>
+ <script type="text/javascript" src="../../_editor/RichText.js"></script>
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dijit._editor.RichText");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+
+</head>
+<body>
+
+ <h1 class="testTitle">Rich Text Test</h1>
+
+ <div style="border: 1px dotted black;">
+ <h3>thud</h3>
+ <textarea dojoType="dijit._editor.RichText" id="editor1"
+ styleSheets="../../../dojo/resources/dojo.css">
+ <h1>header one</h1>
+ <ul>
+ <li>Right click on the client area of the page (ctrl-click for Macintosh). Menu should open.</li>
+ <li>Right click on each of the form controls above. Menu should open.</li>
+ <li>Right click near the righthand window border. Menu should open to the left of the pointer.</li>
+ <li>Right click near the bottom window border. Menu should open above the pointer.</li>
+ </ul>
+ </textarea>
+ <button onclick="dijit.byId('editor1').addStyleSheet('test_richtext.css')">add stylesheet</button>
+ <button onclick="dijit.byId('editor1').removeStyleSheet('test_richtext.css')">remove stylesheet</button>
+ </div>
+
+ <div style="border: 1px dotted black;">
+ <h3>blah</h3>
+ <div dojoType="dijit._editor.RichText"
+ styleSheets="../../dojo/resources/dojo.css">
+ <ul>
+ <li>Right click on the client area of the page (ctrl-click for Macintosh). Menu should open.</li>
+ <li>Right click on each of the form controls above. Menu should open.</li>
+ <li>Right click near the righthand window border. Menu should open to the left of the pointer.</li>
+ <li>Right click near the bottom window border. Menu should open above the pointer.</li>
+ </ul>
+ </div>
+ <h3>..after</h3>
+ </div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_editor/test_ToggleDir.html b/includes/js/dijit/tests/_editor/test_ToggleDir.html
new file mode 100644
index 0000000..ec66c75
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_ToggleDir.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Editor Test2</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Editor");
+ dojo.require("dijit._editor.plugins.ToggleDir");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+<!--
+ <script type="text/javascript" src="../../_editor/plugins/ToggleDir.js"></script>
+ <script type="text/javascript" src="../../Editor.js"></script>
+ <script type="text/javascript" src="../../_editor/_Plugin.js"></script>
+-->
+</head>
+<body>
+ <div style="border: 1px dotted black;">
+ <textarea dojoType="dijit.Editor"
+ extraPlugins="['toggleDir','|','dijit._editor.plugins.ToggleDir','|',{name:'dijit._editor.plugins.ToggleDir'}]">
+ <ol>
+ <li>the toggleDir plugin provides an extra button on the toolbar to switch text direction (BiDi) of the
+ edited document. Useful when right-to-left languages like Hebrew and Arabic are combined with
+ left-to-right languages like English.</li>
+ </ol>
+ </textarea>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_editor/test_richtext.css b/includes/js/dijit/tests/_editor/test_richtext.css
new file mode 100644
index 0000000..933acb8
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_richtext.css
@@ -0,0 +1,4 @@
+h1 {
+ border: 1px solid black;
+ background-color:red;
+}
diff --git a/includes/js/dijit/tests/_editor/test_richtext.css.commented.css b/includes/js/dijit/tests/_editor/test_richtext.css.commented.css
new file mode 100644
index 0000000..933acb8
--- /dev/null
+++ b/includes/js/dijit/tests/_editor/test_richtext.css.commented.css
@@ -0,0 +1,4 @@
+h1 {
+ border: 1px solid black;
+ background-color:red;
+}
diff --git a/includes/js/dijit/tests/_programaticTest.html b/includes/js/dijit/tests/_programaticTest.html
new file mode 100644
index 0000000..41b1815
--- /dev/null
+++ b/includes/js/dijit/tests/_programaticTest.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit raw programatic test suite | The Dojo Toolkit</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ body, html { width:100%; height:100%; margin:0; padding:0; background:#fff !important; }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.dijit-all");
+
+ var randomParams = function(){
+ // need better params to test passing
+ return { "length" : 20 };
+ };
+
+ var inspectClass = function(fullClassName){
+ var newDijit, newDijitDom, newDijitParam = null;
+ var createdWidgets = [];
+ className = eval(fullClassName); //
+
+ // just try to make the class:
+ try{
+ newDijit = new className({});
+ createdWidgets.push(newDijit);
+ }catch(e){
+ console.warn('new only: ',fullClassName,e);
+ }
+
+ // try starting this widget
+ try{
+ if (newDijit && newDijit.startup){ newDijit.startup(); }
+ }catch(e){
+ console.warn('call startup: ',fullClassName,e);
+ }
+
+ // try with a div in the dom
+ try{
+ var tmpDiv = dojo.body().appendChild(document.createElement('div'));
+ newDijitDom = new className({},tmpDiv);
+ createdWidgets.push(newDijitDom);
+ }catch(e){
+ console.warn('attached to div: ',fullClassName,e);
+ }
+
+ // lets pass random parameters
+ try{
+ var tmpDiv = dojo.body().appendChild(document.createElement('div'));
+ newDijitParam = new className(randomParams(),tmpDiv);
+ createdWidgets.push(newDijitParam);
+ }catch(e){
+ console.warn('random param test: ',fullClassName,e);
+ }
+ // add more tests ...
+
+ // cleanup after ourselves
+ dojo.forEach(createdWidgets,function(byeWidget){
+ try{
+ if(byeWidget.destroy){ byeWidget.destroy(); }
+ }catch(e){
+ console.warn('destroying: ',byeWidget.declaredClass,e,byeWidget);
+ }
+ });
+
+ };
+
+ var storeError = function(e,request){
+ console.warn(e,request);
+ };
+
+ var storeReady = function(items,request){
+ dojo.forEach(items,function(item){
+ var testClass = theStore.getValue(item,"className");
+ try{
+ inspectClass(testClass);
+ }catch(e){
+ console.warn(e);
+ }
+ });
+ };
+
+ var init = function(){
+ var request = {
+ query: { },
+ onComplete: storeReady,
+ onError: storeError
+ };
+ theStore.fetch(request);
+ };
+ dojo.addOnLoad(init);
+
+ </script>
+
+</head>
+<body>
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="theStore"
+ url="../tests/_data/dijits.json"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/_testCommon.js b/includes/js/dijit/tests/_testCommon.js
new file mode 100644
index 0000000..519675f
--- /dev/null
+++ b/includes/js/dijit/tests/_testCommon.js
@@ -0,0 +1,103 @@
+/*
+ _testCommon.js - a simple module to be included in dijit test pages to allow
+ for easy switching between the many many points of the test-matrix.
+
+ in your test browser, provides a way to switch between available themes,
+ and optionally enable RTL (right to left) mode, and/or dijit_a11y (high-
+ constrast/image off emulation) ... probably not a genuine test for a11y.
+
+ usage: on any dijit test_* page, press ctrl-f9 to popup links.
+
+ there are currently (2 themes * 4 tests) * (10 variations of supported browsers)
+ not including testing individual locale-strings
+
+ you should not be using this in a production enviroment. include
+ your css and set your classes manually. for test purposes only ...
+*/
+
+(function(){
+ var d = dojo;
+ var theme = false; var testMode;
+ if(window.location.href.indexOf("?") > -1){
+ var str = window.location.href.substr(window.location.href.indexOf("?")+1).split(/#/);
+ var ary = str[0].split(/&/);
+ for(var i=0; i<ary.length; i++){
+ var split = ary[i].split(/=/),
+ key = split[0],
+ value = split[1];
+ switch(key){
+ case "locale":
+ // locale string | null
+ dojo.config.locale = locale = value;
+ break;
+ case "dir":
+ // rtl | null
+ document.getElementsByTagName("html")[0].dir = value;
+ break;
+ case "theme":
+ // tundra | soria | noir | squid | nihilo | null
+ theme = value;
+ break;
+ case "a11y":
+ if(value){ testMode = "dijit_a11y"; }
+ }
+ }
+ }
+
+ // always include the default theme files:
+ if(!theme){ theme = dojo.config.defaultTestTheme || 'tundra'; }
+ var themeCss = d.moduleUrl("dijit.themes",theme+"/"+theme+".css");
+ var themeCssRtl = d.moduleUrl("dijit.themes",theme+"/"+theme+"_rtl.css");
+ document.write('<link rel="stylesheet" type="text/css" href="'+themeCss+'"/>');
+ document.write('<link rel="stylesheet" type="text/css" href="'+themeCssRtl+'"/>');
+
+ if(dojo.config.parseOnLoad){
+ dojo.config.parseOnLoad = false;
+ dojo.config._deferParsing = true;
+ }
+
+ d.addOnLoad(function(){
+
+ // set the classes
+ if(!d.hasClass(d.body(),theme)){ d.addClass(d.body(),theme); }
+ if(testMode){ d.addClass(d.body(),testMode); }
+
+ // test-link matrix code:
+ var node = document.createElement('div');
+ node.id = "testNodeDialog";
+ d.addClass(node,"dijitTestNodeDialog");
+ d.body().appendChild(node);
+
+ _populateTestDialog(node);
+
+ d.connect(document,"onkeypress", function _testNodeShow(/* Event */evt){
+ var key = (evt.charCode == d.keys.SPACE ? d.keys.SPACE : evt.keyCode);
+ if(evt.ctrlKey && (key == d.keys.F9)){ // F9 is generic enough?
+ d.style('testNodeDialog',"top",(dijit.getViewport().t + 4) +"px");
+ d.toggleClass('testNodeDialog',"dijitTestNodeShowing");
+ }
+ });
+
+ if(dojo.config._deferParsing){ d.parser.parse(d.body()); }
+
+ });
+
+ var _populateTestDialog = function(/* DomNode */node){
+ // pseudo-function to populate our test-martix-link pop-up
+ var base = window.location.pathname;
+ var str = "";
+ var themes = ["tundra",/*"noir", */ "soria", "nihilo" /* ,"squid" */ ];
+ str += "<b>Tests:</b><br><table>";
+ d.forEach(themes,function(t){
+ str += '<tr><td><a hr'+'ef="'+base+'?theme='+t+'">'+t+'</'+'a></td>'+
+ '<td><a hr'+'ef="'+base+'?theme='+t+'&dir=rtl">rtl</'+'a></td>'+
+ '<td><a hr'+'ef="'+base+'?theme='+t+'&a11y=true">a11y</'+'a></td>'+
+ '<td><a hr'+'ef="'+base+'?theme='+t+'&a11y=true&dir=rtl">a11y+rtl</'+'a></td>'+
+ // too many potential locales to list, use &locale=[lang] to set
+ '</tr>';
+ });
+ str += '<tr><td colspan="4">jump to: <a hr'+'ef="'+(d.moduleUrl("dijit.themes","themeTester.html"))+'">themeTester</'+'a></td></tr>';
+ str += '<tr><td colspan="4">or: <a hr'+'ef="'+(d.moduleUrl("dijit.tests"))+'">tests folder</'+'a></td></tr>';
+ node.innerHTML = str + "</table>";
+ }
+})();
diff --git a/includes/js/dijit/tests/css/dijitTests.css b/includes/js/dijit/tests/css/dijitTests.css
new file mode 100644
index 0000000..cc2f7e4
--- /dev/null
+++ b/includes/js/dijit/tests/css/dijitTests.css
@@ -0,0 +1,69 @@
+
+body {
+ background:#fff url("../images/testsBodyBg.gif") repeat-x top left;
+ padding:2em 2em 2em 2em;
+}
+h1.testTitle {
+ font-size:2em;
+ margin:0 0 1em 0;
+}
+.plusIcon, .plusBlockIcon {
+ background-image: url(../images/plus.gif);
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+}
+.plusBlockIcon {
+ display: block !important;
+}
+.noteIcon {
+ background-image: url(../images/note.gif);
+ background-repeat: no-repeat;
+ width: 20px;
+ height: 20px;
+}
+.flatScreenIcon {
+ background-image: url(../images/flatScreen.gif);
+ background-repeat: no-repeat;
+ width: 32px;
+ height: 32px;
+}
+.dijitTestNodeDialog {
+ position:absolute;
+ top:5px;
+ right:5px;
+ display:block;
+ width:200px;
+ visibility:hidden;
+ background-color:#fff !important;
+ color:#000 !important;
+ border:1px solid #000;
+ padding:5px;
+}
+.dijitTestNodeDialog table {
+ background-color:#fff !important;
+}
+.dijitTestNodeDialog td {
+ padding:3px;
+}
+.dijitTestNodeShowing {
+ visibility:visible;
+}
+.customFolderOpenedIcon, .customFolderClosedIcon {
+ background-image: url('../../demos/mail/icons.png');
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ text-align: center;
+ padding-right:4px;
+ background-position: -44px;
+}
+.dj_ie6 .customFolderOpenedIcon, .dj_ie6 .customFolderClosedIcon {
+ background-image: url('../../demos/mail/icons.gif');
+}
+.customFolderClosedIcon {
+ background-position: -154px;
+}
+body .medium {
+ font-size: larger;
+}
diff --git a/includes/js/dijit/tests/css/dijitTests.css.commented.css b/includes/js/dijit/tests/css/dijitTests.css.commented.css
new file mode 100644
index 0000000..dc91d16
--- /dev/null
+++ b/includes/js/dijit/tests/css/dijitTests.css.commented.css
@@ -0,0 +1,78 @@
+/* Test file styles for Dijit widgets */
+
+body {
+ background:#fff url("../images/testsBodyBg.gif") repeat-x top left;
+ padding:2em 2em 2em 2em;
+}
+
+h1.testTitle {
+ font-size:2em;
+ margin:0 0 1em 0;
+}
+
+/* Icons used in the tests */
+
+.plusIcon, .plusBlockIcon {
+ background-image: url(../images/plus.gif);
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+}
+.plusBlockIcon {
+ display: block !important;
+}
+.noteIcon {
+ background-image: url(../images/note.gif);
+ background-repeat: no-repeat;
+ width: 20px;
+ height: 20px;
+}
+.flatScreenIcon {
+ background-image: url(../images/flatScreen.gif);
+ background-repeat: no-repeat;
+ width: 32px;
+ height: 32px;
+}
+.dijitTestNodeDialog {
+ position:absolute;
+ top:5px;
+ right:5px;
+ display:block;
+ width:200px;
+ visibility:hidden;
+ background-color:#fff !important;
+ color:#000 !important;
+ border:1px solid #000;
+ padding:5px;
+}
+.dijitTestNodeDialog table {
+ background-color:#fff !important;
+}
+.dijitTestNodeDialog td {
+ padding:3px;
+}
+.dijitTestNodeShowing {
+ visibility:visible;
+}
+
+.customFolderOpenedIcon, .customFolderClosedIcon {
+ background-image: url('../../demos/mail/icons.png'); /* mail icons sprite image */
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ text-align: center;
+ padding-right:4px;
+ background-position: -44px;
+}
+
+.dj_ie6 .customFolderOpenedIcon, .dj_ie6 .customFolderClosedIcon {
+ background-image: url('../../demos/mail/icons.gif');
+}
+
+.customFolderClosedIcon {
+ background-position: -154px;
+}
+
+body .medium {
+ font-size: larger; /* help test widget sizing */
+}
diff --git a/includes/js/dijit/tests/form/Form.html b/includes/js/dijit/tests/form/Form.html
new file mode 100644
index 0000000..312399a
--- /dev/null
+++ b/includes/js/dijit/tests/form/Form.html
@@ -0,0 +1,354 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Form unit test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dojo.date");
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.layout.LayoutContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.MultiSelect");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.form.SimpleTextarea");
+ dojo.require("dijit.Editor");
+
+ var obj;
+ function getValues(){
+ obj = dijit.byId('myForm').getValues();
+ console.log("Object is: " + dojo.toJson(obj, true));
+ }
+
+ function setValues(){
+ if(!obj){
+ obj = {testF: 'testi'};
+ }
+ console.log("Object is: " + dojo.toJson(obj, true));
+ dijit.byId('myForm').setValues(obj);
+ }
+
+ // make dojo.toJson() print dates correctly (this feels a bit dirty)
+ Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
+
+ var d = dojo.date.stamp.fromISOString;
+
+ // These are the values assigned to the widgets in the page's HTML
+ var original = {
+ foo: {bar: {baz: {quux: d("2007-12-30")} } },
+ available: {from: d("2005-01-02"), to: d("2006-01-02")},
+ plop: {combo: "one"},
+ cb2: ["2", "3"],
+ r2: "2",
+ ms1: ["VA", "WA"],
+ h1: "hidden",
+ t1: "line 1\nline 2",
+ st1: "simple line 1\nsimple line 2",
+ richtext: "<h1>original</h1><p>This is the default content</p>",
+ filename: ""
+ };
+
+ // we change the form to these values
+ var changed = {
+ foo: {bar: {baz: {quux: d("2005-01-01")} } },
+ available: {from: d("2005-11-02"), to: d("2006-11-02")},
+ plop: {combo: "three"},
+ cb2: ["4"],
+ r2: "1",
+ ms1: ["FL", "CA"],
+ h1: "still hidden",
+ t1: "new line 1\nnew line 2",
+ st1: "new simple line 1\nnew simple line 2",
+ richtext: "<h1>changed</h1><p>This is the changed content set by setValues</p>",
+ filename: ""
+ };
+ // we reset the form to these values
+ var reset = {
+ foo: {bar: {baz: {quux: d("2007-12-30")} } },
+ available: {from: d("2005-01-02"), to: d("2006-01-02")},
+ plop: {combo: "one"},
+ cb2: ["2", "3"],
+ r2: "2",
+ ms1: ["VA", "WA"],
+ h1: "hidden",
+ t1: "line 1\nline 2",
+ st1: "simple line 1\nsimple line 2",
+ richtext: "<h1>changed</h1><p>This is the changed content set by setValues</p>", // not a form element, so not reset
+ filename: ""
+ };
+
+ dojo.addOnLoad(function(){
+ doh.register("dijit.form.Form",
+ [
+ function getValues(){
+ var values = dijit.byId("myForm").getValues();
+
+ // FF3 sticks in some tabs and newlines that mess up the equality check
+ // Need better way to compare two HTML trees but for now do this.
+ values.richtext = values.richtext.replace(/[\n\t]/, "", "g");
+
+ doh.is( dojo.toJson(original), dojo.toJson(values) );
+ },
+ function setValues(){
+ dijit.byId("myForm").setValues(changed);
+ doh.is( dojo.toJson(changed), dojo.toJson(dijit.byId("myForm").getValues()) );
+ },
+ function nameAttributeSurvived(){ // ticket:4753
+ var radios = dojo.query(".RadioButton", dijit.byId("radio-cells")).forEach(
+ function(r) {
+ doh.is( r.inputNode.name, "r2" );
+ });
+
+ },
+ function resetTest(){
+ dijit.byId("myForm").reset();
+ doh.is( dojo.toJson(reset), dojo.toJson(dijit.byId("myForm").getValues()) );
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body>
+ <h1>Form Widget Unit Test</h1>
+ <p>
+ The form widget takes data in a form and serializes/deserializes it, so
+ it can be submitted as a JSON string of nested objects.
+ </p>
+ <div style="color:red">Currently only widgets are supported, not raw elements.</div>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi
+ http://www.tipjar.com/cgi-bin/test -->
+ <form dojoType="dijit.form.Form" id="myForm"
+ encType="multipart/form-data" action="" method="">
+ <script type="dojo/method" event="onReset">
+ return confirm('Press OK to reset widget values');
+ </script>
+ <script type="dojo/method" event="onSubmit">
+ console.debug('Attempting to submit form w/values:\n',
+ dojo.toJson(this.getValues(),true)
+ );
+ if(this.validate()){
+ return confirm('Form is valid, press OK to submit');
+ }else{
+ alert('Form contains invalid data. Please correct first');
+ return false;
+ }
+ return true;
+ </script>
+ <script type="dojo/method" event="onReset">
+ return confirm('reset Form?');
+ </script>
+ <p>Just HTML text</p>
+ <table style="border: 1px solid #9f9f9f;" cellspacing="10">
+ <thead>
+ <tr>
+ <th>Description</th>
+ <th>Name</th>
+ <th>Form node/widget</th>
+ </tr>
+ </thead>
+ <tbody>
+ <!--
+ <tr><td>text</td><td>testF</td><td><input type="text" name="testF" value="bar1" /></td></tr>
+ <tr><td>password</td><td>passwordF</td><td><input type="password" name="passwordF" value="bar4" /></td></tr>
+ <tr><td>hidden</td><td>hiddenF</td><td><input type="hidden" name="hiddenF" value="bar4" /></td></tr>
+ <tr><td>select</td><td>plop.noncombo</td><td>
+ <div class="group">
+ <select name="plop.noncombo">
+ <option value="1">one</option>
+ <option value="2">two</option>
+ <option value="3">three</option>
+ </select>
+ </div>
+
+ </td></tr>
+ -->
+
+ <tr>
+ <td>DateTextBox inside contentpane</td>
+ <td>foo.bar.baz.quux</td>
+ <td>
+ <div dojoType="dijit.layout.ContentPane">
+ <input type="text" name="foo.bar.baz.quux" dojoType="dijit.form.DateTextBox" value="2007-12-30" />
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>Layoutcontainer</td>
+ <td>
+ <div dojoType="dijit.layout.LayoutContainer"></div>
+ </td>
+ </tr>
+ <tr>
+ <td>DateTextBox 1</td>
+ <td>available.from</td>
+ <td>
+ <input type="text" name="available.from" dojoType="dijit.form.DateTextBox" value="2005-01-02" />
+ </td>
+ </tr>
+ <tr>
+ <td>DateTextBox 2</td>
+ <td>available.to</td>
+ <td>
+ <input type="text" name="available.to" dojoType="dijit.form.DateTextBox" value="2006-01-02" />
+ </td>
+ </tr>
+ <tr>
+ <td>ComboBox</td>
+ <td>plop.combo</td>
+ <td>
+ <select name="plop.combo" dojoType="dijit.form.ComboBox">
+ <option value="one">one</option>
+ <option value="two">two</option>
+ <option value="three">three</option>
+ </select>
+ </td>
+ </tr>
+
+ <!--
+ <tr>
+ <td>textarea</td>
+ <td>myTextArea</td>
+ <td>
+ <textarea name="myTextArea">
+ text text text """ \\\/
+ </textarea>
+ </td>
+ </tr>
+ -->
+
+ <!--
+ <tr>
+ <td>CheckBox</td>
+ <td>cb1</td>
+ <td>
+ <input type="checkbox" name="cb1" value="1" /> 1
+ <input type="checkbox" name="cb1" value="2" checked="checked" /> 2
+ <input type="checkbox" name="cb1" value="3" checked="checked" /> 3
+ <input type="checkbox" name="cb1" value="4" /> 4
+ </td>
+ </tr>
+ -->
+
+ <tr>
+ <td>CheckBox widget</td>
+ <td>cb2</td>
+ <td>
+ <input dojoType="dijit.form.CheckBox" type="checkbox" name="cb2" value="1" /> 1
+ <input dojoType="dijit.form.CheckBox" type="checkbox" name="cb2" value="2" checked="checked" /> 2
+ <input dojoType="dijit.form.CheckBox" type="checkbox" name="cb2" value="3" checked="checked" /> 3
+ <input dojoType="dijit.form.CheckBox" type="checkbox" name="cb2" value="4" /> 4
+ </td>
+ </tr>
+
+ <!--
+ <tr>
+ <td>radio</td>
+ <td>r1</td>
+ <td>
+ <input type="radio" name="r1" value="1" /> 1
+ <input type="radio" name="r1" value="2" /> 2
+ <input type="radio" name="r1" value="3" /> 3
+ <input type="radio" name="r1" value="4" /> 4
+ </td>
+ </tr>
+ -->
+
+ <tr>
+ <td>Radio widget</td><td>r2</td>
+ <td id="radio-cells">
+ <input dojoType="dijit.form.RadioButton" type="radio" name="r2" value="1" /> 1
+ <input dojoType="dijit.form.RadioButton" type="radio" name="r2" value="2" checked="checked" /> 2
+ <input dojoType="dijit.form.RadioButton" type="radio" name="r2" value="3"/> 3
+ <input dojoType="dijit.form.RadioButton" type="radio" name="r2" value="4" /> 4
+ </td>
+ </tr>
+
+ <tr>
+ <td>Multi-select</td><td>ms1</td>
+ <td>
+ <select id="ms1" multiple="true" name="ms1"
+ dojoType="dijit.form.MultiSelect"
+ style="height:100px; width:175px; border:5px solid #ededed;">
+
+ <option value="TN">Tennessee</option>
+ <option value="VA" selected="true">Virginia</option>
+ <option value="WA" selected="true">Washington</option>
+ <option value="FL">Florida</option>
+ <option value="CA">California</option>
+
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td>Hidden input</td>
+ <td>h1</td>
+ <td>
+ <input id="h1" name="h1" dojoType="dijit.form.TextBox" type="hidden" value="hidden">
+ </td>
+ </tr>
+
+ <tr>
+ <td>Auto-sizing textarea</td>
+ <td>t1</td>
+ <td>
+ <textarea id="t1" name="t1"
+ dojoType="dijit.form.Textarea">line 1
+line 2</textarea>
+ </td>
+ </tr>
+
+ <tr>
+ <td>Fixed size textarea</td>
+ <td>st1</td>
+ <td>
+ <textarea id="st1" name="st1" dojoType="dijit.form.SimpleTextarea" rows=5 cols=50>
+simple line 1
+simple line 2</textarea>
+ </td>
+ </tr>
+
+ <tr>
+ <td>Editor widget</td>
+ <td>richtext</td>
+ <td>
+ <textarea dojoType="dijit.Editor" name="richtext" pluginsConfig="[{items:['bold','italic']}]"><h1>original</h1><p>This is the default content</p></textarea>
+ </td>
+ </tr>
+
+ <tr>
+ <td>File upload</td>
+ <td>filename</td>
+ <td>
+ <input dojoType="dijit.form.TextBox" name="filename" type="file">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+
+ <button dojoType=dijit.form.Button onClick="getValues();">Get Values from form!</button>
+ <button dojoType=dijit.form.Button onClick="setValues();">Set Values to form!</button>
+ <button dojoType=dijit.form.Button type="submit">Submit</button>
+ <button dojoType=dijit.form.Button type="reset">Reset</button>
+ </form>
+
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/Form.js b/includes/js/dijit/tests/form/Form.js
new file mode 100644
index 0000000..f0f6d8d
--- /dev/null
+++ b/includes/js/dijit/tests/form/Form.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.form.Form"] = true;
+dojo.provide("dijit.tests.form.Form");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.form.Form", dojo.moduleUrl("dijit", "tests/form/Form.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/form/images/Alabama.jpg b/includes/js/dijit/tests/form/images/Alabama.jpg
new file mode 100644
index 0000000..f2018e6
--- /dev/null
+++ b/includes/js/dijit/tests/form/images/Alabama.jpg
Binary files differ
diff --git a/includes/js/dijit/tests/form/test_Button.html b/includes/js/dijit/tests/form/test_Button.html
new file mode 100644
index 0000000..7c04f50
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_Button.html
@@ -0,0 +1,286 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo Button Widget Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ /* group multiple buttons in a row */
+ .box {
+ display: block;
+ text-align: center;
+ }
+ .box .dijit {
+ margin-right: 10px;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser");
+ </script>
+ </head>
+<body>
+ <h1 class="testTitle">Dijit Button Test</h1>
+ <h2>Simple, drop down &amp; combo buttons</h2>
+ <p>
+ Buttons can do an action, display a menu, or both:
+ </p>
+ <div class="box">
+ <button id="1465" dojoType="dijit.form.Button" onClick='console.log("clicked simple")' iconClass="plusIcon">
+ Create
+ </button>
+ <span dojoType="dijit.Tooltip" connectId="1465">tooltip on button</span>
+ <div dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+ <span>Edit<b>!</b></span>
+ <div dojoType="dijit.Menu">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="console.log('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="console.log('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="console.log('not actually pasting anything, just a test!')">Paste</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu2">
+ <div dojoType="dijit.MenuItem" onClick="console.log('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="console.log('Submenu 2!')">Submenu Item Two</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu4">
+ <div dojoType="dijit.MenuItem" onClick="console.log('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="console.log('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+ <span>Color</span>
+ <div dojoType="dijit.ColorPalette" id="colorPalette" style="display: none" palette="3x4"
+ onChange="console.log(this.value);"></div>
+ </div>
+ <div dojoType="dijit.form.ComboButton" optionsTitle='save options' onClick='console.log("clicked combo save")'
+ iconClass="plusBlockIcon">
+ <span>Save</span>
+ <div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconSave"
+ onClick="console.log('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem"
+ onClick="console.log('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </div>
+ <button dojoType="dijit.form.Button" onClick='console.log("clicked simple")' disabled='true' iconClass="plusIcon">
+ Disabled
+ </button>
+ </div>
+ <br clear=both>
+ <h2>Buttons with no text label</h2>
+ <p>Buttons have showLabel=false so text is not displayed. Should have title attribute displayed on mouse over</p>
+ <div class="box">
+ <button id="1466" dojoType="dijit.form.Button" onClick='console.log("clicked simple button with no text label")'
+ iconClass="plusIcon" showLabel="false">
+ <span><b>Rich</b><i> Text</i> Test!</span>
+ </button>
+ <div dojoType="dijit.form.DropDownButton" iconClass="noteIcon" showLabel="false">
+ <span>Color</span>
+ <div dojoType="dijit.ColorPalette" id="colorPalette2" style="display: none" palette="3x4"
+ onChange="console.log(this.value);">
+ </div>
+ </div>
+ <div dojoType="dijit.form.ComboButton" optionsTitle='save options' onClick='console.log("clicked combo save")'
+ iconClass="plusBlockIcon" showLabel="false">
+ <span>Save</span>
+ <div dojoType="dijit.Menu" id="saveMenu2" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconSave"
+ onClick="console.log('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem"
+ onClick="console.log('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </div>
+ </div>
+ <br clear=both>
+ <h2>Toggle buttons</h2>
+ <p>The button CSS as well as the icon CSS can change on toggle </p>
+ <div class="box">
+ <button dojoType="dijit.form.ToggleButton" checked onChange="console.log('toggled button checked='+arguments[0]);" iconClass="dijitCheckBoxIcon">
+ Toggle me
+ </button>
+ <button dojoType="dijit.form.ToggleButton" onChange="console.log('toggled button checked='+arguments[0]);" iconClass="dijitRadioIcon">
+ Toggle me
+ </button>
+ </div>
+ <br clear=both>
+ <h2>Sizing</h2>
+ <p>Short button, tall buttons, big buttons, small buttons...
+ These buttons size to their content (just like &lt;button&gt;).</p>
+ <div class="box">
+ <button dojoType="dijit.form.Button" onclick='console.log("big");' iconClass="flatScreenIcon">
+ <span style="font-size:xx-large">big</span>
+ </button>
+ <button id="smallButton1" dojoType="dijit.form.Button" onclick='console.log("small");'>
+ <img src="../images/arrowSmall.gif" width="15" height="5">
+ <span style="font-size:x-small">small</span>
+ </button>
+ <button dojoType="dijit.form.Button" onclick='console.log("long");'>
+ <img src="../images/tube.gif" width="150" height="16">
+ long
+ </button>
+ <button dojoType="dijit.form.Button" onclick='console.log("tall");' width2height="0.1">
+ <img src="../images/tubeTall.gif" height="75" width="35"><br>
+ <span style="font-size:medium">tall</span>
+ </button>
+ <div style="clear: both;"></div>
+ </div>
+ <br clear=both>
+ <h2>Customized buttons</h2>
+ <p>Dojo users can customize styles. Here's an example:</p>
+ <style>
+ .acmeButton .dijitButtonNode {
+ background: rgb(96,96,96) !important;
+ color: white !important;
+ padding: 10px !important;
+ font-size: x-large !important;
+ padding-top: 10px !important;
+ padding-bottom: 10px !important;
+ border: 2px inset rgb(96,96,96);
+ }
+ .acmeButtonHover .dijitButtonNode {
+ background-color: rgb(89,94,111) !important;
+ color: cyan !important;
+ }
+ .acmeButtonFocused .dijitButtonNode {
+ border: yellow inset 2px;
+ }
+ .acmeButtonActive .dijitButtonNode {
+ background-color: white !important;
+ color: black !important;
+ border: 2px solid black !important;
+ }
+ </style>
+ <div class="box">
+ <button baseClass="acmeButton" dojoType="dijit.form.Button" onclick='console.log("short");'>
+ short
+ </button>
+ <button baseClass="acmeButton" dojoType="dijit.form.Button" onclick='console.log("longer");'>
+ bit longer
+ </button>
+ <button baseClass="acmeButton" dojoType="dijit.form.Button" onclick='console.log("longer yet");'>
+ ridiculously long
+ </button>
+ <div style="clear: both;"></div>
+ </div>
+ <h2>Toggling the display test</h2>
+ <p>
+ (Ticket <a href="http://trac.dojotoolkit.org/ticket/403">#403</a>)
+ </p>
+ <div class="box">
+ <button dojoType="dijit.form.Button" onclick='dojo.byId("hiddenNode").style.display="inline";'>
+ Show Hidden Buttons
+ </button>
+ </div>
+ <div class="box" style="display:none;" id="hiddenNode">
+ <button dojoType="dijit.form.Button" onclick='console.log("clicked simple")' iconClass="plusIcon">
+ Create
+ </button>
+ <button dojoType="dijit.form.Button" onclick='console.log("clicked simple")' iconClass="plusIcon">
+ Create
+ </button>
+ </div>
+ <div style="clear: both;"></div>
+ <h2>Programatically changing buttons</h2>
+ <p>clicking the buttons below will change the buttons above</p>
+ <script type="text/javascript">
+ // FIXME: doesn't the manager have a function for filtering by type?
+ function forEachButton(func){
+ dijit.registry.filter(function(widget){ return widget instanceof dijit.form.Button; }).forEach(func);
+ }
+ var disabled=false;
+ function toggleDisabled(){
+ disabled=!disabled;
+ forEachButton(function(widget){ widget.setAttribute('disabled',disabled); });
+ dojo.byId("toggle").innerHTML= disabled ? "Enable all" : "Disable all";
+ }
+ var labels=["<img src='../images/note.gif' width='20' height='20'>All", "<i>work</i>", "and no", "<h1>play</h1>",
+ "<span style='color: red'>makes</span>", "Jack", "<h3>a</h3>", "dull",
+ "<img src='../images/plus.gif' width='16' height='16'>boy"];
+ var idx=0;
+ function changeLabels(){
+ forEachButton(function(widget){
+ widget.setLabel( labels[idx++ % labels.length]);
+ });
+ }
+ </script>
+ <div>
+ <button id="toggle" onclick='toggleDisabled()'>Disable all</button>
+ <button onclick='changeLabels()'>Change labels</button>
+ <button onclick='location.reload()'>Revert</button>
+ </div>
+ <h3>Button instantiated via javacript:</h3>
+ <div id="buttonContainer"></div>
+ <script type="text/javascript">
+ // See if we can make a button in script and attach it to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var params = {
+ label: "hello!",
+ name: "programmatic"
+ };
+ var widget = new dijit.form.Button(params, document.getElementById("buttonContainer"));
+ });
+ </script>
+ <h3>DropDownButton instantiated via javacript:</h3>
+ <div id="dropdownButtonContainer"></div>
+ <script type="text/javascript">
+ // See if we can make a drop down button in script and attach it to the DOM ourselves.
+ function createButton(){
+ var menu = new dijit.Menu({ });
+ menu.domNode.style.display="none";
+ var menuItem1 = new dijit.MenuItem({
+ label: "Save",
+ iconClass:"dijitEditorIcon dijitEditorIconSave",
+ onClick: function(){ alert('save'); }
+ });
+ menu.addChild(menuItem1);
+
+ var menuItem2 = new dijit.MenuItem({
+ label: "Cut",
+ iconClass:"dijitEditorIcon dijitEditorIconCut",
+ onClick: function(){ alert('cut'); }
+ });
+ menu.addChild(menuItem2);
+
+ var params = {
+ label: "hello!",
+ name: "programmatic2",
+ dropDown: menu,
+ id: "progButton"
+ };
+ var widget = new dijit.form.DropDownButton(params);
+ dojo.byId("dropdownButtonContainer").appendChild(widget.domNode);
+ dojo.byId("createButton").disabled = true;
+ dojo.byId("destroyButton").disabled = false;
+ }
+ function destroyButton(){
+ var button = dijit.byId("progButton");
+ button.destroyRecursive();
+ dojo.byId("createButton").disabled = false;
+ dojo.byId("destroyButton").disabled = true;
+ }
+ </script>
+ <button id="createButton" onclick="createButton();">create dropdown button</button>
+ <button id="destroyButton" onclick="destroyButton();">destroy dropdown button</button>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_CheckBox.html b/includes/js/dijit/tests/form/test_CheckBox.html
new file mode 100644
index 0000000..4358270
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_CheckBox.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>CheckBox Widget Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ label { margin-right: 0.80em; }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dojo.parser"); // find widgets
+
+ function outputValues(form){
+ var str = "";
+ for(var i=0;i<form.elements.length;i++){
+ var e = form.elements[i];
+ if(e.type=="submit") break;
+ if(e.checked){
+ str += "submit: name="+e.name+" id="+e.id+" value="+e.value+ "<br>";
+ }
+ }
+ dojo.byId("result").innerHTML = str;
+ return false;
+ }
+
+ function reportChecked(checked) {
+ dojo.byId("oncheckedoutput").innerHTML = checked;
+ }
+
+ function reportValueChanged(value) {
+ dojo.byId("onvaluechangedoutput").innerHTML = value;
+ }
+
+ dojo.addOnLoad(function(){
+ var params = {id: "cb6", name: "cb6"};
+ var widget = new dijit.form.CheckBox(params, dojo.byId("checkboxContainer"));
+ widget.setAttribute('checked', true);
+ });
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Dijit CheckBox Test</h1>
+ <p>
+ Here are some checkboxes. Try clicking, and hovering, tabbing, and using the space bar to select:
+ </p>
+ <!-- <form onSubmit="return outputValues(this);"> -->
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form>
+ <input type="checkbox" name="cb0" id="cb0" />
+ <label for="cb0">cb0: Vanilla (non-dojo) checkbox (for comparison purposes)</label>
+ <br>
+ <input type="checkbox" name="cb1" id="cb1" value="foo" dojoType="dijit.form.CheckBox" onClick="console.log('clicked cb1')">
+ <label for="cb1">cb1: normal checkbox, with value=foo, clicking generates console log messages</label>
+ <br>
+ <input onChange="reportChecked" type="checkbox" name="cb2" id="cb2" dojoType="dijit.form.CheckBox" checked="checked"/>
+ <label for="cb2">cb2: normal checkbox, initially turned on.</label>
+ <span>"onChange" handler updates: [<span id="oncheckedoutput"></span>]</span>
+ <br>
+ <input type="checkbox" name="cb3" id="cb3" dojoType="dijit.form.CheckBox" disabled="disabled">
+ <label for="cb3">cb3: disabled checkbox</label>
+ <br>
+ <input type="checkbox" name="cb4" id="cb4" dojoType="dijit.form.CheckBox" disabled="disabled" checked="checked"/>
+ <label for="cb4">cb4: disabled checkbox, turned on</label>
+ <br>
+ <input type="checkbox" name="cb5" id="cb5" />
+ <label for="cb5">cb5: Vanilla (non-dojo) checkbox (for comparison purposes)</label>
+ <br>
+ <div id="checkboxContainer"></div>
+ <label for="cb6">cb6: instantiated from script</label>
+ <br>
+ <input onChange="reportValueChanged" type="checkbox" name="cb7" id="cb7" dojoType="dijit.form.CheckBox">
+ <label for="cb7">cb7: normal checkbox.</label>
+ <input type="button" onclick='dijit.byId("cb7").setAttribute("disabled",true);' value="disable" />
+ <input type="button" onclick='dijit.byId("cb7").setAttribute("disabled",false);' value="enable" />
+ <input type="button" onclick='dijit.byId("cb7").setValue("fish");' value='set value to "fish"' />
+ <input type="button" onclick='dijit.byId("cb7").reset();' value='Reset value+checked' />
+ <span>"onChange" handler updates: [<span id="onvaluechangedoutput"></span>]</span>
+ <br>
+ <p>
+ Here are some radio buttons. Try clicking, and hovering, tabbing, and arrowing
+ </p>
+ <p>
+ <span>Radio group #1:</span>
+ <input type="radio" name="g1" id="g1rb1" value="news" dojoType="dijit.form.RadioButton">
+ <label for="g1rb1">news</label>
+ <input type="radio" name="g1" id="g1rb2" value="talk" dojoType="dijit.form.RadioButton" checked="checked"/>
+ <label for="g1rb2">talk</label>
+ <input type="radio" name="g1" id="g1rb3" value="weather" dojoType="dijit.form.RadioButton" disabled="disabled"/>
+ <label for="g1rb3">weather</label>
+ </p>
+ <p>
+ <span>Radio group #2: (no default value, and has breaks)</span><br>
+ <input type="radio" name="g2" id="g2rb1" value="top40" dojoType="dijit.form.RadioButton"/>
+ <label for="g2rb1">top 40</label><br>
+ <input type="radio" name="g2" id="g2rb2" value="oldies" dojoType="dijit.form.RadioButton"/>
+ <label for="g2rb2">oldies</label><br>
+ <input type="radio" name="g2" id="g2rb3" value="country" dojoType="dijit.form.RadioButton"/>
+ <label for="g2rb3">country</label><br>
+ (Note if using keyboard: tab to navigate, and use arrow or space to select)
+ </p>
+ <p>
+ <span>Radio group #3 (native radio buttons):</span>
+ <input type="radio" name="g3" id="g3rb1" value="rock"/>
+ <label for="g3rb1">rock</label>
+ <input type="radio" name="g3" id="g3rb2" value="jazz" disabled="disabled"/>
+ <label for="g3rb2">jazz</label>
+ <input type="radio" name="g3" id="g3rb3" value="classical" checked="checked"/>
+ <label for="g3rb3">classical</label>
+ </p>
+ <input type="submit" />
+ </form>
+
+ <!-- <p>Submitted data:</p>
+ <div id="result"></div>
+ -->
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_ComboBox.html b/includes/js/dijit/tests/form/test_ComboBox.html
new file mode 100644
index 0000000..895a968
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_ComboBox.html
@@ -0,0 +1,289 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo ComboBox Widget Test</title>
+
+ <style>
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ .dj_ie INPUT#setvaluetest { font-family: Courier; } /* help IE with font inheritance
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function setVal1(val){
+ dojo.byId('value1').value=val;
+ }
+ function setVal2(val){
+ dojo.byId('value2').value=val;
+ console.debug("Value changed to ["+val+"] in second ComboBox (#1652)");
+ }
+ function setVal3(val){
+ dojo.byId('value3').value=val;
+ }
+ function setVal4(val){
+ dojo.byId('value4').value=val;
+ }
+ var combo;
+ function init(){
+ var store = new dojo.data.ItemFileReadStore({url: '../_data/states.json'});
+ combo = new dijit.form.ComboBox({
+ name:"prog",
+ autoComplete:false,
+ store: store,
+ searchAttr:"name"
+ }, dojo.byId("progCombo"));
+
+ var store2 = new dojo.data.ItemFileReadStore({url: '../../demos/i18n/data.json'});
+ combo = new dijit.form.ComboBox({
+ name:"prog2",
+ autoComplete:false,
+ store:store2,
+ query:{type:'country'},
+ searchAttr:"name"
+ }, dojo.byId("progCombo2"));
+ }
+ dojo.addOnLoad(init);
+
+ function toggleDisabled(button, widget){
+ widget = dijit.byId(widget);
+ button = dojo.byId(button);
+ widget.setAttribute('disabled',!widget.disabled);
+ button.innerHTML= widget.disabled ? "Enable" : "Disable";
+ }
+ </script>
+</head>
+
+<body>
+<h1>Dojo ComboBox Widget Test</h1>
+<p>
+A ComboBox is like a text &lt;input&gt; field (ie, you can input any value you want),
+but it also has a list of suggested values that you can choose from.
+The drop down list is filtered by the data you have already typed in.
+</p>
+<form action="#" method="GET">
+
+ <p>ComboBox #1: inlined data, autoComplete=false, default value of Iowa, pageSize=30</p>
+ <label for="setvaluetest">US State test 1</label> (200% Courier font):
+ <select id="setvaluetest"
+ name="state1"
+ dojoType="dijit.form.ComboBox"
+ class="medium"
+ style="width:50%;font-size:200%;font-family:Courier;"
+ name="foo.bar1"
+ autoComplete="false"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ pageSize="30"
+ >
+ <option></option>
+ <option>Alabama</option>
+ <option>Alaska</option>
+ <option>American Samoa</option>
+ <option>Arizona</option>
+ <option>Arkansas</option>
+ <option>Armed Forces Europe</option>
+ <option>Armed Forces Pacific</option>
+ <option>Armed Forces the Americas</option>
+ <option>California</option>
+ <option>Colorado</option>
+ <option>Connecticut</option>
+ <option>Delaware</option>
+ <option>District of Columbia</option>
+ <option>Federated States of Micronesia</option>
+ <option>Florida</option>
+ <option>Georgia</option>
+ <option>Guam</option>
+ <option>Hawaii</option>
+ <option>Idaho</option>
+ <option>Illinois</option>
+ <option>Indiana</option>
+ <option selected>Iowa</option>
+ <option>Kansas</option>
+ <option>Kentucky</option>
+ <option>Louisiana</option>
+ <option>Maine</option>
+ <option>Marshall Islands</option>
+ <option>Maryland</option>
+ <option>Massachusetts</option>
+ <option>Michigan</option>
+ <option>Minnesota</option>
+ <option>Mississippi</option>
+ <option>Missouri</option>
+ <option>Montana</option>
+ <option>Nebraska</option>
+ <option>Nevada</option>
+ <option>New Hampshire</option>
+ <option>New Jersey</option>
+ <option>New Mexico</option>
+ <option>New York</option>
+ <option>North Carolina</option>
+ <option>North Dakota</option>
+ <option>Northern Mariana Islands</option>
+ <option>Ohio</option>
+ <option>Oklahoma</option>
+ <option>Oregon</option>
+ <option>Pennsylvania</option>
+ <option>Puerto Rico</option>
+ <option>Rhode Island</option>
+ <option>South Carolina</option>
+ <option>South Dakota</option>
+ <option>Tennessee</option>
+ <option>Texas</option>
+ <option>Utah</option>
+ <option>Vermont</option>
+ <option>Virgin Islands, U.S.</option>
+ <option>Virginia</option>
+ <option>Washington</option>
+ <option>West Virginia</option>
+ <option>Wisconsin</option>
+ <option>Wyoming</option>
+ </select>
+ <br>onChange:<input id="oc1" disabled value="not fired yet!" autocomplete="off">
+ <input type="button" value="Set displayed value to Kentucky" onClick="dijit.byId('setvaluetest').setDisplayedValue('Kentucky')">
+ <input type="button" value="Set displayed value to Canada" onClick="dijit.byId('setvaluetest').setDisplayedValue('Canada')">
+
+ <hr>
+
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../_data/states.json"></div>
+
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="dijitStore"
+ url="../_data/dijits.json"></div>
+
+ <p>ComboBox #2: url, autoComplete=true:</p>
+ <label for="datatest">US State test 2</label> (8pt font):
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ store="stateStore"
+ searchAttr="name"
+ style="width: 200px; font-size: 8pt;"
+ name="state2"
+ onChange="setVal2"
+ id="datatest"
+ >
+ <span>Value: <input id="value2" disabled value="California"></span>
+ <hr>
+ <label for="datatestDijit">Dijit List test #1</label> (150% font):
+ <input dojoType="dijit.form.ComboBox"
+ value="dijit.Editor"
+ class="medium"
+ store="dijitStore"
+ searchAttr="className"
+ style="width: 200px; font-size: 150%;"
+ name="dijitList1"
+ id="datatestDijit"
+ >
+ <span>Hey look, this one is kind of useful.</span>
+ <hr>
+
+ <p>ComboBox #3: initially disabled, url, autoComplete=false:</p>
+ <label for="combo3">US State test 3: </label>
+ <input id="combo3"
+ dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ store="stateStore"
+ searchAttr="name"
+ style="width: 300px;"
+ name="state3"
+ autoComplete="false"
+ onChange="setVal3"
+ disabled
+ >
+ <span>Value: <input id="value3" disabled></span>
+ <div>
+ <button id="but" onclick='toggleDisabled("but", "combo3"); return false;'>Enable</button>
+ </div>
+ <hr>
+ <p>ComboBox #4: url, autoComplete=false required=true:</p>
+ <label for="combobox4">US State test 4: </label>
+ <input dojoType="dijit.form.ComboBox"
+ value=""
+ class="medium"
+ store="stateStore"
+ searchAttr="name"
+ style="width: 300px;"
+ name="state4"
+ onChange="setVal4"
+ autoComplete="false"
+ id="combobox4"
+ required="true"
+ >
+ <span>Value: <input id="value4" disabled></span>
+ <hr>
+ <p>A ComboBox with no arrow</p>
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ store="stateStore"
+ searchAttr="name"
+ name="state5"
+ autoComplete="false"
+ hasDownArrow="false"
+ >
+ <hr>
+ <p>A combo created by createWidget</p>
+ <input id="progCombo">
+ <hr>
+ <p>A ComboBox with an initial query. (Limits list to items with type = country.)</p>
+ <input id="progCombo2">
+ <hr>
+ <input type="button" value="Create one in a window" onclick="var win=window.open(window.location);"></input>
+ <input type="submit">
+
+</form>
+<p>
+This is some text below the ComboBoxes. It shouldn't get pushed out of the way when search results get returned.
+also: adding a simple combo box to test IE bleed through problem:
+</p>
+
+<select>
+ <option>test for</option>
+ <option>IE bleed through</option>
+ <option>problem</option>
+</select>
+<h3>Some tests:</h3>
+<ol>
+<li>Type in D - dropdown shows Delaware and District of columbia. [Would be nice if it bolded the D's in the dropdown list!]</li>
+<li>Type in DX - input box shows DX and no dropdown.</li>
+<li>Open dropdown, click an item, it selects and closes dropdown.</li>
+<li>Click triangle icon - dropdown shows. Click it again - dropdown goes.</li>
+<li>Check that you can type in more than required (e.g. alaba for alabama) and it still correctly shows alabama</li>
+<li>Tab into the combo works, list should not apear.</li>
+<li>Tab out of the combo works - closes dropdown and goes to next control (focus should not go to the dropdown because tabindex="-1").</li>
+<li>Do the dropdown and click outside of it - the dropdown disappears.</li>
+<li>Javascript disabled -&gt; fallback to old style combo?</li>
+<li>Can you paste in the start of a match? [no]</li>
+<li>Backspace to start - dropdown shows all all items</li>
+<li>Backspace deselects last character [Borked: currently you have to backspace twice]</li>
+<li>Press down key to open dropdown</li>
+<li>Down and up keys select previous/next in dropdown.</li>
+<li>Non-alpha keys (F12, ctrl-c, whatever) should not affect dropdown.</li>
+<li>Press down arrow to highlight an item, pressing enter selects it and closes dropdown.</li>
+<li>Press down arrow to highlight an item, pressing space selects it and closes dropdown.</li>
+<li>Check that pressing escape undoes the previous action and closes the dropdown</li>
+<li>Check that pressing escape again clears the input box.</li>
+<li>In IE, mouse scroll wheel scrolls through the list. Scrolls by 1 item per click even if user has set mouse to scroll more than 1 in mouse settings. Only scrolls if text input has focus (page scrolling works as normal otherwise)</li>
+<li>In IE, dropdown list does not go behind the second combo (special code to manage this).</li>
+<li>Check dropdown is aligned correctly with bottom of the text input</li>
+<li>Probably should try the combo in a relative div or absolute div and see where the dropdown ends up. (Strongly suspect problems in this area in IE - boo)</li>
+<li>Try repeatably droppingdown and closing the dropdown. Shouldnt get hung [sometimes flicks closed just after opening due to timers, but not a biggie]</li>
+<li>Check that default selection of the text makes sense. e.g. text is selected after picking an item, on tabbing in to text input etc)</li>
+<li>Check that dropdown is smooth [looks uggy on second keypress in FF - hides then shows]</li>
+<li>Clear the field. Type in A and then tab *very quickly* and see if the results make sense (the dropdown is on a timer - searchTimer)</li>
+<li>Clear the field and enter an invalid entry and tab out e.g. Qualude. Does that make sense given the combobox setup options?</li>
+<li>(Add any other tests here)</li>
+</ol>
+<div id="debugbox"></div>
+<!-- maintain state of combo box if user presses back/forward button -->
+<form name="_dojo_form" style="display:none" disabled="true"><textarea name="stabile" cols="80" rows="10"></textarea></form>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_ComboBox_destroy.html b/includes/js/dijit/tests/form/test_ComboBox_destroy.html
new file mode 100644
index 0000000..0713b19
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_ComboBox_destroy.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo ComboBox Widget Destruction Issue</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ dojo.addOnLoad(function(){
+ dojo.connect(dojo.byId("killit"), "onclick", function(){
+ dijit.byId("combo_01").destroy(true);
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>Dojo ComboBox Widget Destruction Issue</h1>
+ <p>
+ <tt>ComboBox</tt> does not destroy itself properly, leading to a
+ JavaScript error. Could it have something to do with not disconnecting
+ events?
+ </p>
+ <p></p>
+ Steps:
+ <ol>
+ <li>Pick a state from the combo box below.</li>
+ <li>Click the "killit" button, which calls <tt>destroy</tt> on the widget.</li>
+ <li>Observe the JavaScript error.</li>
+ </ol>
+ <p></p>
+ <form action="#" method="GET">
+ <input type="button" id="killit" name="killit" value="killit" />
+ <select name="state" searchField="name" keyField="abbreviation"
+ id="combo_01" dojoType="dijit.form.ComboBox" style="width: 300px;"
+ name="foo.bar1" autoComplete="false">
+ <option value="AL">Alabama</option>
+
+ <option value="AK">Alaska</option>
+ <option value="AS">American Samoa</option>
+ <option value="AZ">Arizona</option>
+ <option value="AR">Arkansas</option>
+ <option value="AE">Armed Forces Europe</option>
+ <option value="AP">Armed Forces Pacific</option>
+ </select>
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_DateTextBox.html b/includes/js/dijit/tests/form/test_DateTextBox.html
new file mode 100644
index 0000000..d36ac73
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_DateTextBox.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Test DateTextBox Widget</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ body .medium {
+ width: 10em;
+ }
+
+ .noticeMessage {
+ color:#093669;
+ font-size:0.95em;
+ margin-left:0.5em;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.Form");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+ </head>
+
+ <body>
+ <h1 class="testTitle">Test DateTextBox Widget</h1>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" dojoType='dijit.form.Form' action="" name="example" method="">
+ <div class="dojoTitlePaneLabel">
+ <label for="q1"> Date (local format) </label>
+ <span class="noticeMessage">DateTextBox class, no attributes</span>
+ </div>
+ <div class="testExample">
+ <input id="q1" name="noDOMvalue" type="text" dojoType="dijit.form.DateTextBox"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ >
+ onChange:<input id="oc1" size="34" disabled value="not fired yet!" autocomplete="off">
+ </div>
+ <div class="dojoTitlePaneLabel">
+ <label for="q2"> Date (local format - long) </label>
+ <span class="noticeMessage">DateTextBox class,
+ Attributes: required="true", trim="true", constraints={min:'2004-01-01',max:'2006-12-31',formatLength:'long'}. Works for leap years</span>
+ </div>
+ <div class="testExample">
+ <input id="q2" type="text" name="date1" class="medium" value="2005-12-30"
+ dojoType="dijit.form.DateTextBox"
+ constraints="{min:'2004-01-01',max:'2006-12-31',formatLength:'long'}"
+ required="true"
+ trim="true"
+ onChange="dojo.byId('oc2').value=arguments[0]"
+ invalidMessage="Invalid date." />
+ onChange:<input id="oc2" size="34" disabled value="not fired yet!" autocomplete="off">
+ <input type="button" value="Destroy" onClick="dijit.byId('q2').destroy(); return false;">
+ <input type="button" value="set max to 2007-12-31" onClick="dijit.byId('q2').constraints.max = new Date(2007,11,31); return false;">
+ </div>
+ <div class="dojoTitlePaneLabel">
+ <label for="q3"> Date (American format) </label>
+ <span class="noticeMessage">DateTextBox class,
+ Attributes: lang="en-us", required="true", constraints={min:'2004-01-01',max:'2006-12-31'}. Works for leap years</span>
+ </div>
+ <div class="testExample">
+ <input id="q3" type="text" name="date2" class="medium" value="2005-12-30"
+ dojoType="dijit.form.DateTextBox"
+ constraints="{min:'2004-01-01',max:'2006-12-31'}"
+ lang="en-us"
+ required="true"
+ promptMessage="mm/dd/yyyy"
+ invalidMessage="Invalid date. Use mm/dd/yyyy format." />
+ </div>
+ <div class="dojoTitlePaneLabel">
+ <label for="q4"> Date (German format) </label>
+ <span class="noticeMessage">DateTextBox class,
+ Attributes: lang="de-de", constraints={min:2004-01-01, max:2006-12-31}. Works for leap years</span>
+ </div>
+ <div class="testExample">
+ <input id="q4" class="medium"/>
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q5"> Date, overriding pattern</label>
+ <span class="noticeMessage">Date, overriding pattern with dd-MM-yyyy</span>
+ </div>
+ <div class="testExample">
+ <input id="q5" name="noDOMvalue" type="text" dojoType="dijit.form.DateTextBox" constraints="{datePattern:'dd-MM-yyyy', strict:true}">
+ </div>
+
+ <script>
+ // See if we can make a widget in script and attach it to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var props = {
+ name: "date4",
+ value: new Date(2006,10,29),
+ constraints: {min:new Date(2004,0,1),max:new Date(2006,11,31)},
+ lang: "de-de",
+ promptMessage: "dd.mm.yy",
+ rangeMessage: "Enter a date in the year range 2004-2006.",
+ invalidMessage: "Invalid date. Use dd.mm.yy format."
+ };
+ var w = new dijit.form.DateTextBox(props, "q4");
+ });
+ </script>
+
+ <script>
+ function displayData() {
+ var f = document.getElementById("form1");
+ var s = "";
+ for (var i = 0; i < f.elements.length; i++) {
+ var elem = f.elements[i];
+ if (elem.name == "button") { continue; }
+ s += elem.name + ": " + elem.value + "\n";
+ }
+ alert(s);
+ }
+ </script>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="fromDate"> Date pairs, to/from</label>
+ </div>
+ <div class="testExample">
+ From: <input id="fromDate" type="text" name="fromDate" dojoType="dijit.form.DateTextBox"
+ required="true"
+ onChange="dijit.byId('toDate').constraints.min = this.getValue();" />
+ To: <input id="toDate" type="text" name="toDate" dojoType="dijit.form.DateTextBox"
+ required="true"
+ onChange="dijit.byId('fromDate').constraints.max = this.getValue();" />
+ </div>
+
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ <input type="reset" name="reset" />
+ </div>
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_FilteringSelect.html b/includes/js/dijit/tests/form/test_FilteringSelect.html
new file mode 100644
index 0000000..d40af13
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_FilteringSelect.html
@@ -0,0 +1,296 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo FilteringSelect Widget Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function setValue(id, val){
+ dojo.byId(id).value=val;
+ }
+
+ function myLabelFunc(item, store){
+ var label=store.getValue(item, 'name');
+ // DEMO: uncomment to chop off a character
+ //label=label.substr(0, label.length-1);
+ // DEMO: uncomment to set to lower case
+ label = label.toLowerCase();
+ return label;
+ }
+ </script>
+</head>
+
+<body>
+ <h1 class="testTitle">Dojo FilteringSelect Widget Test</h1>
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="myStore"
+ url="../_data/states.json"></div>
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="myStore2"
+ url="../_data/countries.json"></div>
+ <p>The FilteringSelect widget is an enhanced version of HTML's &lt;select&gt; tag.</p>
+ <p>Similar features:</p>
+ <ul>
+ <li>There is a drop down list of possible values.</li>
+ <li>You can only enter a value from the drop down list. (You can't enter an arbitrary value.)</li>
+ <li>The value submitted with the form is the hidden value (ex: CA),</li>
+ <li>not the displayed value a.k.a. label (ex: California)</li>
+ </ul>
+ <p></p>
+
+
+ <p>Enhancements over plain HTML version:</p>
+ <ul>
+ <li>If you type in some text then it will filter down the list of possible values in the drop down list.</li>
+ <li>List can be specified either as a static list or via a javascript function (that can get the list from a server)</li>
+ </ul>
+ <p></p>
+
+ <hr>
+
+ <form action="#" method="GET">
+ <p>FilteringSelect #1: inlined data, autoComplete=false:</p>
+ <label for="setvaluetest2">state list 1:</label>
+ <select dojoType="dijit.form.FilteringSelect"
+ id="setvaluetest2"
+ name="state1"
+ autoComplete="false"
+ invalidMessage="Invalid state name"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ onFocus="console.log('user focus handler')"
+ onBlur="console.log('user blur handler')"
+ >
+ <option value="blank"></option>
+ <option value="AL">Alabama</option>
+ <option value="AK">Alaska</option>
+ <option value="AS">American Samoa</option>
+ <option value="AZ">Arizona</option>
+ <option value="AR">Arkansas</option>
+ <option value="AE">Armed Forces Europe</option>
+ <option value="AP">Armed Forces Pacific</option>
+ <option value="AA">Armed Forces the Americas</option>
+ <option value="CA" selected>California</option>
+ <option value="CO">Colorado</option>
+ <option value="CT">Connecticut</option>
+ <option value="DE">Delaware</option>
+ <option value="DC">District of Columbia</option>
+ <option value="FM">Federated States of Micronesia</option>
+ <option value="FL">Florida</option>
+ <option value="GA">Georgia</option>
+ <option value="GU">Guam</option>
+ <option value="HI">Hawaii</option>
+ <option value="ID">Idaho</option>
+ <option value="IL">Illinois</option>
+ <option value="IN">Indiana</option>
+ <option value="IA">Iowa</option>
+ <option value="KS">Kansas</option>
+ <option value="KY">Kentucky</option>
+ <option value="LA">Louisiana</option>
+ <option value="ME">Maine</option>
+ <option value="MH">Marshall Islands</option>
+ <option value="MD">Maryland</option>
+ <option value="MA">Massachusetts</option>
+ <option value="MI">Michigan</option>
+ <option value="MN">Minnesota</option>
+ <option value="MS">Mississippi</option>
+ <option value="MO">Missouri</option>
+ <option value="MT">Montana</option>
+ <option value="NE">Nebraska</option>
+ <option value="NV">Nevada</option>
+ <option value="NH">New Hampshire</option>
+ <option value="NJ">New Jersey</option>
+ <option value="NM">New Mexico</option>
+ <option value="NY">New York</option>
+ <option value="NC">North Carolina</option>
+ <option value="ND">North Dakota</option>
+ <option value="MP">Northern Mariana Islands</option>
+ <option value="OH">Ohio</option>
+ <option value="OK">Oklahoma</option>
+ <option value="OR">Oregon</option>
+ <option value="PA">Pennsylvania</option>
+ <option value="PR">Puerto Rico</option>
+ <option value="RI">Rhode Island</option>
+ <option value="SC">South Carolina</option>
+ <option value="SD">South Dakota</option>
+ <option value="TN">Tennessee</option>
+ <option value="TX">Texas</option>
+ <option value="UT">Utah</option>
+ <option value="VT">Vermont</option>
+ <option value="VI">Virgin Islands, U.S.</option>
+ <option value="VA">Virginia</option>
+ <option value="WA">Washington</option>
+ <option value="WV">West Virginia</option>
+ <option value="WI">Wisconsin</option>
+ <option value="WY">Wyoming</option>
+ </select>
+ onChange:<input id="oc1" disabled value="not fired yet!" autocomplete="off">
+ <input type="button" value="Set displayed value to Kentucky (valid)" onClick="dijit.byId('setvaluetest2').setDisplayedValue('Kentucky')">
+ <input type="button" value="Set displayed value to Canada (invalid)" onClick="dijit.byId('setvaluetest2').setDisplayedValue('Canada')">
+ <hr>
+
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../_data/states.json"></div>
+
+ <p>FilteringSelect #2: url, autoComplete=true:</p>
+ <label for="setvaluetest">state list 2:</label>
+ <input searchAttr="name"
+ id="setvaluetest"
+ dojoType="dijit.form.FilteringSelect"
+ store="stateStore"
+ name="state2"
+ autoComplete="true"
+ onChange="setValue('value2', arguments[0]);"
+ invalidMessage="Invalid state name"
+ >
+ <span>Value: <input id="value2" disabled></span>
+
+ <p>FilteringSelect #3: url, autoComplete=false:</p>
+ <label for="state3">state list 3:</label>
+ <input searchAttr="name"
+ id="state3"
+ dojoType="dijit.form.FilteringSelect"
+ value="VI"
+ store="stateStore"
+ name="state3"
+ autoComplete="false"
+ onChange="setValue('value3', arguments[0]);"
+ invalidMessage="Invalid state name."
+ >
+ <span>Value: <input id="value3" disabled value="VI"></span>
+ <hr>
+ <p>FilteringSelect #5: custom labelFunc (value in textbox should be lower case when onChange is called), autoComplete=true:</p>
+ <label for="state5">state list 5:</label>
+ <input searchAttr="name"
+ id="state5"
+ dojoType="dijit.form.FilteringSelect"
+ value="OR"
+ labelFunc="myLabelFunc"
+ store="stateStore"
+ name="state5"
+ autoComplete="true"
+ labelAttr="label"
+ labelType="html"
+ dataProviderClass="dojo.data.ItemFileReadStore"
+ promptMessage="Please enter a state"
+ invalidMessage="Invalid state name."
+ >
+ <br>
+ <hr>
+
+ <p>FilteringSelect #7: Input method editor Chinese characters</p>
+ <p>Using an input method editor (see <a href="http://www.microsoft.com/windows/ie/ie6/downloads/recommended/ime/default.mspx">IME</a> for Windows) try typing &#38463; (a) or &#25226; (ba).</p>
+ <label for="state7">Chinese list:</label>
+ <select dojoType="dijit.form.FilteringSelect"
+ name="state7"
+ id="state7"
+ >
+ <option value="a" selected>&#38463;</option>
+ <option value="ba">&#25226;</option>
+ </select>
+ <br>
+ <hr>
+ <p>FilteringSelect #8: Japanese</p>
+ <p>Try typing 東、西、北、南 (north, south, east west) and a few choices will pop up.</p>
+ <label for="state8">Japanese list:</label>
+ <select name="state8" id="state8" dojoType="dijit.form.FilteringSelect" style="width: 300px;" autoComplete="false"
+ onChange="setValue('value8', arguments[0]);">
+ <option value="nanboku">南北</option>
+ <option value="touzai">東西</option>
+ <option value="toukyou">東京</option>
+ <option value="higashiguchi">東口</option>
+ <option value="nishiguchi">西口</option>
+ <option value="minamiguchi">南口</option>
+ <option value="kitaguchi">北口</option>
+ <option value="higashiku">東区</option>
+ <option value="nishiku">西区</option>
+ <option value="minamiku">南区</option>
+ <option value="kitaku">北区</option>
+ </select>
+ <span>Value: <input id="value8" disabled value="nanboku"></span>
+ <hr>
+ <p>FilteringSelect #9: No data</p>
+ <p>This FilteringSelect has no options to choose from. It should still load.</p>
+ <label for="state9">empty list:</label>
+ <select name="state9" id="state9" dojoType="dijit.form.FilteringSelect" style="width: 300px;" autoComplete="false">
+ </select>
+ <br>
+ <hr>
+ <p>FilteringSelect #10: hasDownArrow=false:</p>
+ <label for="state10">no arrow list:</label>
+ <input searchAttr="name"
+ dojoType="dijit.form.FilteringSelect"
+ value="AL"
+ name="state10"
+ id="state10"
+ autoComplete="false"
+ store="myStore"
+ invalidMessage="Invalid state name."
+ hasDownArrow="false"
+ >
+ <br>
+ <hr>
+ <div >
+ <p>FilteringSelect #11: deep data, initial query of type=country:</p>
+ <label for="state11">query list:</label>
+ <input searchAttr="name"
+ dojoType="dijit.form.FilteringSelect"
+ query={type:'country'}
+ value="United States of America"
+ name="state11"
+ id="state11"
+ autoComplete="false"
+ store="myStore2"
+ invalidMessage="Choose a country from the list."
+ hasDownArrow="false"
+ >
+ <br>
+ <hr>
+ <p>FilteringSelect #12: special characters</p>
+ <p>The drop down list should be:</p>
+ <ul>
+ <li>sticks &amp; stones
+ <li>rags --&gt; riches
+ <li>more\less
+ <li>3 * 5
+ </ul>
+ <label for="filter12">Special chars:</label>
+ <select dojoType="dijit.form.FilteringSelect"
+ name="filter12"
+ id="filter12"
+ >
+ <option value="sticks" selected>sticks &amp; stones</option>
+ <option value="rags">rags --&gt; riches</option>
+ <option value="more">more\less</option>
+ <option value="times">3 * 5</option>
+ </select>
+ <br>
+ <hr>
+ <input type="submit">
+ </form>
+ <p>
+ this is some text below the combo boxes. It shouldn't get pushed out of
+ the way when search results get returned. also: adding a simple combo
+ box to test IE bleed through problem:
+ </p>
+
+ <select>
+ <option>test for</option>
+ <option">IE bleed through</option>
+ <option>problem</option>
+ </select>
+
+ <!-- maintain state of select if user presses back/forward button -->
+ <form name="_dojo_form" style="display:none" disabled="true"><textarea name="stabile" cols="80" rows="10"></textarea></form>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_Form_onsubmit.html b/includes/js/dijit/tests/form/test_Form_onsubmit.html
new file mode 100644
index 0000000..d8b43fa
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_Form_onsubmit.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Form unit test</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+ <script type="text/javascript">
+ dojo.require("dojo.date");
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.layout.LayoutContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.MultiSelect");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.form.SimpleTextarea");
+ dojo.require("dijit.Editor");
+ </script>
+</head>
+<body>
+ <h1>Form Widget Unit Test</h1>
+ <form dojoType="dijit.form.Form" id="myForm1"
+ encType="multipart/form-data" action="" method="GET"
+ onSubmit="dojo.stopEvent(arguments[0]);"
+ onReset="dojo.stopEvent(arguments[0]);">
+ <h3>This form shouldn't submit, nor reset</h3>
+ <select name="plop.combo" dojoType="dijit.form.ComboBox">
+ <option value="one">one</option>
+ <option value="two">two</option>
+ <option value="three">three</option>
+ </select>
+ <button dojoType=dijit.form.Button type="submit">Submit</button>
+ <button dojoType=dijit.form.Button type="reset">Reset</button>
+ </form>
+
+ <form dojoType="dijit.form.Form" id="myForm2"
+ encType="multipart/form-data" action="" method="GET"
+ onSubmit="return false;"
+ onReset="return false;">
+ <h3>This form shouldn't submit, nor reset</h3>
+ <select name="plop.combo" dojoType="dijit.form.ComboBox">
+ <option value="one">one</option>
+ <option value="two">two</option>
+ <option value="three">three</option>
+ </select>
+ <button dojoType=dijit.form.Button type="submit">Submit</button>
+ <button dojoType=dijit.form.Button type="reset">Reset</button>
+ </form>
+
+ <form dojoType="dijit.form.Form" id="myForm3"
+ encType="multipart/form-data" action="" method="GET"
+ onSubmit="return true;"
+ onReset="return true;">
+ <h3>This form <em>should</em> submit and reset</h3>
+ <select name="plop.combo" dojoType="dijit.form.ComboBox">
+ <option value="one">one</option>
+ <option value="two">two</option>
+ <option value="three">three</option>
+ </select>
+ <button dojoType=dijit.form.Button type="submit">Submit</button>
+ <button dojoType=dijit.form.Button type="reset">Reset</button>
+ </form>
+
+ <form dojoType="dijit.form.Form" id="myForm4"
+ encType="multipart/form-data" action="" method="GET"
+ onSubmit="void(0)"
+ onReset="void(0)">
+ <h3>This form <em>should</em> submit and reset</h3>
+ <select name="plop.combo" dojoType="dijit.form.ComboBox">
+ <option value="one">one</option>
+ <option value="two">two</option>
+ <option value="three">three</option>
+ </select>
+ <button dojoType=dijit.form.Button type="submit">Submit</button>
+ <button dojoType=dijit.form.Button type="reset">Reset</button>
+ </form>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_MultiSelect.html b/includes/js/dijit/tests/form/test_MultiSelect.html
new file mode 100644
index 0000000..9f03d80
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_MultiSelect.html
@@ -0,0 +1,138 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Testing MultiSelect form widget | The Dojo Toolkit</title>
+
+ <link rel="stylesheet" type="text/css" media="screen"
+ href="../../../dijit/themes/tundra/tundra.css">
+
+ <style type="text/css">
+ @import "../../../dijit/tests/css/dijitTests.css";
+ #select, #select2 {
+ width:255px;
+ height:300px;
+ overflow:auto;
+ }
+ </style>
+
+ <script type="text/javascript" djConfig="isDebug:true, parseOnLoad: true"
+ src="../../../dojo/dojo.js"></script>
+
+ <script type="text/javascript">
+ var globalVals = null;
+
+ dojo.require("dijit.form.MultiSelect");
+
+ // needed for tests:
+ dojo.require("dijit.form.Form");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.layout.SplitContainer");
+
+ dojo.addOnLoad(function(){
+
+ // ref a clonable node, then split it between two selects
+ var c = dojo.query(".clone")[0];
+ var l = -1;
+ opt = function(){
+ return dojo.byId((++l%2 == 0 ? "select":"select2" ));
+ }
+ // based on the the 'dijit' object
+ for(var i in dijit){
+ var n = opt().appendChild(dojo.clone(c));
+ n.value = n.innerHTML = i;
+ }
+
+ // turn any non-dojoType selects into widgets programatically:
+ dojo.query("select").forEach(function(n){
+ if(!dijit.byNode(n)){
+ var foo = new dijit.form.MultiSelect({
+ },n);
+ }
+ });
+
+ // listen to the "move items" buttons
+ dojo.query("button.switch")
+ .connect("onclick",function(e){
+ switch(e.target.id.toString()){
+ case "left" : dijit.byId("select").addSelected(dijit.byId("select2")); break;
+ case "right" : dijit.byId("select2").addSelected(dijit.byId("select")); break;
+ }
+ });
+
+ // listen to the invert buttons
+ dojo.query("button.invert")
+ .connect("onclick",function(e){
+ switch(e.target.id.toString()){
+ case "i1" : dijit.byId("select").invertSelection(); break;
+ case "i2" : dijit.byId("select2").invertSelection(); break;
+ case "i3" : dijit.byId("select3").invertSelection(); break;
+ }
+ });
+
+ // there is only one debug button
+ dojo.query(".debug").connect("onclick",function(e){
+ console.log('select getValue:',dijit.byId("select").getValue());
+ console.log('select2 getValue:',dijit.byId("select2").getValue());
+ console.log('select3 getValue:',dijit.byId("select3").getValue());
+ });
+
+ // natural form reaction:
+ dojo.connect(dojo.byId("test"),"onsubmit",function(e){
+ e.preventDefault();
+ });
+ dojo.connect(dojo.byId("formSubmit"),"onclick",function(e){
+ // see what the real form says about our widgets:
+ var vals = dojo.formToJson("test");
+ console.log(vals);
+ });
+ });
+ </script>
+</head>
+<body class="tundra" style="padding:20px">
+
+ <h1 class="testTitle">dijit.form.MultiSelect:</h1>
+
+ <form action="null.html" method="get" id="test">
+
+ <select id="select" multiple="true" size="7" name="easing">
+ <option class="clone" value="dojo._defaultEasing">dojo._defaultEasing</option>
+ </select>
+
+ <span>
+ <button class="switch" id="left">&lt;</button>
+ <button class="switch" id="right">&gt;</button>
+ </span>
+
+ <select id="select2" multiple="true" size="7" name="second">
+ </select>
+
+ <br><br>
+
+ <button class='invert' id="i1">invert first list</button>
+ <button class="invert" id="i2">invert second list</button>
+ <button id="formSubmit">Submit</button>
+
+ </form>
+
+ <button class="debug">call getValue()</button>
+
+ <h3>markup:</h3>
+
+ <select id="select3" multiple="true" name="select3"
+ dojoType="dijit.form.MultiSelect"
+ style="height:200px; width:175px; border:5px solid #ededed;">
+
+ <option value="TN" selected="true">Tennessee</option>
+ <option value="VA">Virginia</option>
+ <option value="WA">Washington</option>
+ <option value="FL">Florida</option>
+ <option value="CA">California</option>
+
+ </select>
+
+ <br><br>
+ <button class='invert' id="i3">invert markup list</button>
+ <button class='set' id="s1" onclick="dijit.byId('select3').setValue(['VA', 'WA']);">set markup list to [VA, WA]</button>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_SimpleTextarea.html b/includes/js/dijit/tests/form/test_SimpleTextarea.html
new file mode 100644
index 0000000..9462447
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_SimpleTextarea.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+ <title>Testing SimpleTextArea | The Dojo Toolkit</title>
+
+ <link rel="stylesheet" type="text/css" media="screen"
+ href="../../../dijit/themes/tundra/tundra.css">
+
+ <style type="text/css">
+ @import "../../../dijit/tests/css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" djConfig="isDebug:true, parseOnLoad: true"
+ src="../../../dojo/dojo.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.SimpleTextarea");
+
+ // needed for tests
+ dojo.require("dijit.layout.BorderContainer");
+ </script>
+</head>
+
+<body class="tundra" style="padding:20px">
+
+ <h1 class="testTitle">SimpleTextarea</h1>
+
+ <p>
+ This is a simple text area that doesn't automatically size itself according to it's content.
+ It can be used inside layout containers.
+ </p>
+
+ <h2>Plain textarea (rows=5, cols=50)</h2>
+ <textarea dojoType="dijit.form.SimpleTextarea" name="ta2" rows=5 cols=50
+ onFocus="console.log('user focus handler')"
+ onBlur="console.log('user blur handler')"
+ >
+ shichashaw, textarea text baw.
+ </textarea>
+
+ <h2>In a BorderContainer</h2>
+
+ <div id="container" dojoType="dijit.layout.BorderContainer" style="width:500px; height:400px; border: inset gray 3px;">
+ <textarea name="textAreaN3" dojoType="dijit.form.SimpleTextarea" region="top" splitter="true" style="height: 100px;">
+ This is just some text in the top region.
+ </textarea>
+ <textarea name="textAreaN3" dojoType="dijit.form.SimpleTextarea" region="left" splitter="true" style="width: 200px;">
+ This is just some text in the left region.
+ </textarea>
+ <textarea name="textAreaN3" dojoType="dijit.form.SimpleTextarea" region="center">
+ This is just some text in the center region.
+ </textarea>
+ <textarea name="textAreaN3" dojoType="dijit.form.SimpleTextarea" region="right" splitter="true" style="width: 200px;">
+ This is just some text in the left region.
+ </textarea>
+ <textarea name="textAreaN3" dojoType="dijit.form.SimpleTextarea" region="bottom" splitter="true" style="height: 100px;">
+ This is just some text in the left region.
+ </textarea>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_Slider.html b/includes/js/dijit/tests/form/test_Slider.html
new file mode 100644
index 0000000..f1d0442
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_Slider.html
@@ -0,0 +1,208 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo Slider Widget Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ #slider2 .dijitButtonNode {
+ width:12px;
+ height:12px;
+ border: none;
+ font-size:11px;
+ padding:0px;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.Slider");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets
+
+ // programatic vertical slider and labels
+ var programaticExample = function(){
+
+ var node = dojo.byId("programaticSlider");
+ // or var node = dojo.body().appendChild(document.createElement('div'));
+
+ // our rules are to be children of the slider
+ var rulesNode = document.createElement('div');
+ node.appendChild(rulesNode);
+
+ // setup the rules
+ var sliderRules = new dijit.form.VerticalRule({
+ count:11,
+ style:"width:5px"
+ },rulesNode);
+
+ // and setup the slider
+ var theSlider = new dijit.form.VerticalSlider({
+ value:1400,
+ onChange: function(){
+ console.log(arguments);
+ },
+ name:"programaticSlider",
+ slideDuration:0,
+ onChange:function(val){ dojo.byId('sliderProgInput').value=val; },
+ style:"height:165px",
+ minimum:1000,
+ maximum:3000,
+ discreteValues:11,
+ intermediateChanges:"true",
+ showButtons:"true"
+ },node);
+
+ // and start them both
+ theSlider.startup();
+ sliderRules.startup();
+
+ };
+ dojo.addOnLoad(programaticExample);
+
+ dojo.addOnLoad(function(){
+ dijit.byId("sliderH2").setAttribute('disabled',true);
+ });
+ </script>
+ </head>
+
+ <body>
+ <h1 class="testTitle">Slider</h1>
+ Also try using the arrow keys, buttons, or clicking on the progress bar to move the slider.
+ <br>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" action="" name="example" method="post">
+ <br>initial value=10, min=0, max=100, pageIncrement=100, onChange event triggers input box value change immediately<br>
+
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal1"
+ onChange="dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});"
+ value="10"
+ maximum="100"
+ minimum="0"
+ pageIncrement="100"
+ showButtons="false"
+ intermediateChanges="true"
+ style="width:50%; height: 20px;"
+ id="slider1">
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" count="6" numericMargin="1"></ol>
+ <div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=6 style="height:5px;"></div>
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+ <li>lowest</li>
+ <li>normal</li>
+ <li>highest</li>
+ </ol>
+ </div>
+
+ Slider1 Value:<input readonly id="slider1input" size="4" value="10.0%">
+ <br>
+ <button id="disableButton" dojoType="dijit.form.Button" onClick="dijit.byId('slider1').setAttribute('disabled', true);dijit.byId('disableButton').setAttribute('disabled',true);dijit.byId('enableButton').setAttribute('disabled',false);">Disable previous slider</button>
+ <button id="enableButton" dojoType="dijit.form.Button" onClick="dijit.byId('slider1').setAttribute('disabled',false);dijit.byId('disableButton').setAttribute('disabled',false);dijit.byId('enableButton').setAttribute('disabled', true);" disabled>Enable previous slider</button>
+ <br>
+ <br>initial value=10, min=0, max=100, onChange event triggers input box value change when you mouse up or tab away<br>
+ <div dojoType="dijit.form.VerticalSlider" name="vertical1"
+ onChange="dojo.byId('slider2input').value=arguments[0];"
+ value="10"
+ maximum="100"
+ minimum="0"
+ discreteValues="11"
+ style="height:300px;"
+ id="slider2">
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="leftDecoration" style="width:2em;color:gray;" labelStyle="right:0px;">
+ <li>0</li>
+ <li>100</li>
+ </ol>
+ <div dojoType="dijit.form.VerticalRule" container="leftDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <div dojoType="dijit.form.VerticalRule" container="rightDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="rightDecoration" style="width:2em;color:gray;" count="6" numericMargin="1" maximum="100" constraints={pattern:'#'}></ol>
+ </div>
+ Slider2 Value:<input readonly id="slider2input" size="3" value="10">
+ <h1>Fancy HTML labels (no slide animation):</h1>
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal2"
+ minimum="1"
+ value="2"
+ maximum="3"
+ discreteValues="3"
+ showButtons="false"
+ intermediateChanges="true"
+ slideDuration="0"
+ style="width:300px; height: 40px;"
+ id="slider3">
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=3 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+ <li><img width=10 height=10 src="../images/note.gif"><br><span style="font-size: small">small</span></li>
+ <li><img width=15 height=15 src="../images/note.gif"><br><span style="font-size: medium">medium</span></li>
+ <li><img width=20 height=20 src="../images/note.gif"><br><span style="font-size: large">large</span></li>
+ </ol>
+ </div>
+
+ <p></p><h1>Standalone ruler example:</h1><p></p>
+
+ <div style="width:2in;border-top:1px solid black;">
+ <div dojoType="dijit.form.HorizontalRule" count=17 style="height:.4em;"></div>
+ <div dojoType="dijit.form.HorizontalRule" count=9 style="height:.4em;"></div>
+ <div dojoType="dijit.form.HorizontalRule" count=5 style="height:.4em;"></div>
+ <div dojoType="dijit.form.HorizontalRule" count=3 style="height:.4em;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" labelStyle="font-style:monospace;font-size:.7em;margin:-1em 0px 0px -.35em;">
+ <li></li>
+ <li>1</li>
+ <li>2</li>
+ </ol>
+ </div>
+
+ <h1>horizontal, with buttons, disabled (to show styling):</h1>
+
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontalH2"
+ onChange="dojo.byId('slider1input').value=arguments[0];"
+ value="10"
+ maximum="100"
+ minimum="0"
+ disabled="true"
+ showButtons="true"
+ intermediateChanges="true"
+ style="width:50%; height: 20px;"
+ id="sliderH2">
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" count="7" constraints="{pattern:'#.00%'}"></ol>
+ <div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=7 style="height:5px;"></div>
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+ <li>lowest</li>
+ <li>normal</li>
+ <li>highest</li>
+ </ol>
+ </div>
+
+
+ <h2>Completely Programatic VerticalSlider and VerticalRule</h2>
+ <h3>min:1000, max:3000, 11 discrete values, no animation</h3>
+
+ <div id="programaticSlider"></div>
+ Programmatic Value:<input readonly id="sliderProgInput" size="5" value="1400">
+
+ <script>
+ function displayData() {
+ var f = document.getElementById("form1");
+ var s = "";
+ for (var i = 0; i < f.elements.length; i++) {
+ var elem = f.elements[i];
+ if (elem.name == "button") { continue; }
+ s += elem.name + ": " + elem.value + "\n";
+ }
+ alert(s);
+ }
+ </script>
+
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </div>
+
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_Spinner.html b/includes/js/dijit/tests/form/test_Spinner.html
new file mode 100644
index 0000000..e9af53c
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_Spinner.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo Spinner Widget Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ .dj_ie INPUT#integerspinner2 { font-family: Courier; } /* help IE with font inheritance */
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dojo.parser"); // scan page for widgets
+ </script>
+ </head>
+
+ <body>
+ <h1 class="testTitle">Dijit Spinner Test</h1>
+ Try typing values, and use the up/down arrow keys and/or the arrow push
+ buttons to spin
+ <br>
+ <form id="form1" action="" name="example" method="post">
+ <h1>number spinner</h1>
+ <br>
+ initial value=900, no delta specified, no min specified, max=1550, onChange captured<br>
+ <label for="integerspinner1">Spinbox #1: </label><br>
+ <input dojoType="dijit.form.NumberSpinner"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ value="900"
+ class="medium"
+ constraints="{max:1550,places:0}"
+ name="integerspinner1"
+ id="integerspinner1">
+ onChange:<input id="oc1" disabled value="not fired yet!" autocomplete="off">
+ <br>
+ <br>
+ initial value=1000, delta=10, min=9 max=1550<br>
+ <label for="integerspinner2">Spinbox with custom styling (width=50%, 200% Courier font): </label>
+ <input dojoType="dijit.form.NumberSpinner"
+ style="font-size:200%;font-family:Courier;border:1px solid blue;width:50%;"
+ value="1000"
+ smallDelta="10"
+ constraints="{min:9,max:1550,places:0}"
+ name="integerspinner2"
+ id="integerspinner2">
+ <br>
+ <br>
+ <label for="integertextbox3">Spinner line break test: </label>initial value not specified, delta not specified, min not specified, max not specified, signed not specified, separator not specified<br>
+ [verify no line break just after this text]
+ <input dojoType="dijit.form.NumberSpinner" name="integertextbox3" id="integertextbox3">
+ [verify no line break just before this text]
+ <br>
+ <br>
+ Move the cursor left and right within the input field to see the effect on the spinner.
+ <br>
+ initial value=+1.0, delta=0.1, min=-10.9, max=155, places=1, maxLength=20<br>
+ <label for="realspinner1">Real Number Spinbox #1: </label><br>
+ <input dojoType="dijit.form.NumberSpinner"
+ value="1.0"
+ smallDelta="0.1"
+ constraints={min:-10.9,max:155,places:1,round:true}
+ maxLength="20"
+ name="realspinner1"
+ id="realspinner1">
+ <br>
+
+<script>
+ function displayData() {
+ var f = document.getElementById("form1");
+ var s = "";
+ for (var i = 0; i < f.elements.length; i++) {
+ var elem = f.elements[i];
+ if (elem.name == "button") { continue; }
+ s += elem.name + ": " + elem.value + "\n";
+ }
+ alert(s);
+ }
+</script>
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </div>
+
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_Textarea.html b/includes/js/dijit/tests/form/test_Textarea.html
new file mode 100644
index 0000000..c885aa6
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_Textarea.html
@@ -0,0 +1,106 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Dojo Textarea Widget Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dojo.parser");
+ </script>
+ </head>
+ <body>
+ <h2 class="pageSubContentTitle">Test Auto-sizing Textarea Widget</h2>
+
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" action="" name="example" method="post">
+ <label for="plain">HTML textarea: </label><textarea name="plainTextArea" id="plain" rows=5>
+ this is a plain text area
+ for comparison
+ </textarea>
+ <br><label for="programmatic">programmatically created:</label> <textarea id="programmatic"></textarea>
+ <script type="text/javascript">
+ // See if we can make a widget in script
+ dojo.addOnLoad(function(){
+ var w = new dijit.form.Textarea({
+ name: "programmaticTextArea",
+ style: "width:400px;",
+ value: "test value"
+ }, "programmatic");
+ w.setValue('we will create this one programatically');
+ });
+ </script>
+ <br><label for="simple">Inline:</label><div name="simpleTextArea" dojoType="dijit.form.Textarea" id="simple" style="width:33%;border:20px solid red;"
+ onChange="dojo.byId('ocSimple').value=arguments[0]"
+ onFocus="console.log('user focus handler')"
+ onBlur="console.log('user blur handler')"
+ >this is a very simple resizable text area</div>
+ onChange:<textarea id="ocSimple" readOnly>not fired yet!</textarea>
+ <br>
+ <input type="button" onclick="dijit.byId('simple').setAttribute('readOnly',false);" value="Remove readOnly">
+ <input type="button" onclick="dijit.byId('simple').setAttribute('readOnly',true);" value="Set readOnly">
+ <input type="button" onclick="dijit.byId('simple').setAttribute('disabled',true);" value="Disable">
+ <input type="button" onclick="dijit.byId('simple').setAttribute('disabled',false);" value="Enable">
+ <br>
+ <textarea dojoType="dijit.form.Textarea" name="largeTextArea">
+this is a textarea with a LOT of content
+
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
+ </textarea>
+ <script type="text/javascript">
+ function displayData() {
+ var f = dojo.byId("form1");
+ var s = "";
+ for(var i = 0; i < f.elements.length; i++){
+ var elem = f.elements[i];
+ if(elem.name == "button" || !dojo.isString(elem.value)){ continue; }
+ s += elem.name + ":[" + elem.value + "]\n";
+ }
+ alert(s);
+ }
+ </script>
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </div>
+
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_TimeTextBox.html b/includes/js/dijit/tests/form/test_TimeTextBox.html
new file mode 100644
index 0000000..f68a28d
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_TimeTextBox.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Test TimeTextBox Widget</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ body .medium {
+ width: 10em;
+ }
+
+ .noticeMessage {
+ color:#093669;
+ font-size:0.95em;
+ margin-left:0.5em;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.TimeTextBox");
+ dojo.require("dojo.currency");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+ </head>
+
+ <body>
+ <h1 class="testTitle">Test TimeTextBox Widget</h1>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" action="" name="example" method="">
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q1">Time using local conventions with seconds</label>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {formatLength:'medium'}</span>
+ </div>
+ <div class="testExample">
+ <input id="q1" type="text" name="time1" class="medium" value="T17:45:00"
+ dojoType="dijit.form.TimeTextBox"
+ constraints="{formatLength:'medium'}"
+ required="true"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ invalidMessage="Invalid time." />
+ onChange:<input id="oc1" size="34" disabled value="not fired yet!" autocomplete="off">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q2">Time using local conventions without seconds, required, no invalid message tooltip</label>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {formatLength:'short'}</span>
+ </div>
+ <div class="testExample">
+ <input id="q2" type="text" name="time1a" class="medium" value="T17:45:00"
+ dojoType="dijit.form.TimeTextBox"
+ constraints="{formatLength:'short'}"
+ required="true"
+ invalidMessage="" />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q3"> 12 Hour Time </label>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {timePattern:'h:mm:ss a'}</span>
+ </div>
+ <div class="testExample">
+ <input id="q3" type="text" name="time1b" class="medium" value="T17:45:00"
+ dojoType="dijit.form.TimeTextBox"
+ constraints="{timePattern:'h:mm:ss a'}"
+ required="true"
+ invalidMessage="Invalid time." />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q4"> 24 Hour Time</label>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {timePattern:'HH:mm:ss'}</span>
+ </div>
+ <div class="testExample">
+ <input id="q4" type="text" name="time2" class="medium" value="T17:45:00"
+ dojoType="dijit.form.TimeTextBox"
+ constraints="{timePattern:'HH:mm:ss'}"
+ required="true"
+ invalidMessage="Invalid time. Use HH:mm:ss where HH is 00 - 23 hours.">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q5">24 Hour Time with 1 Hour TimePicker</label>
+ <span class="noticeMessage">TimeTextBox class,
+ Attributes: {timePattern:'HH:mm:ss', clickableIncrement:'T00:15:00', visibleIncrement:'T00:15:00', visibleRange:'T01:00:00'}</span>
+ </div>
+ <div class="testExample">
+ <input id="q5" type="text" name="time2" class="medium" value="T17:45:00"
+ dojoType="dijit.form.TimeTextBox"
+ constraints="{timePattern:'HH:mm:ss', clickableIncrement:'T00:15:00', visibleIncrement:'T00:15:00', visibleRange:'T01:00:00'}"
+ required="true"
+ invalidMessage="Invalid time. Use HH:mm:ss where HH is 00 - 23 hours.">
+ </div>
+
+ <script>
+ function displayData() {
+ var f = document.getElementById("form1");
+ var s = "";
+ for (var i = 0; i < f.elements.length; i++) {
+ var elem = f.elements[i];
+ if (elem.name == "button") { continue; }
+ s += elem.name + ": " + elem.value + "\n";
+ }
+ alert(s);
+ }
+ </script>
+
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </div>
+
+ </form>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/form/test_validate.html b/includes/js/dijit/tests/form/test_validate.html
new file mode 100644
index 0000000..f6d1cde
--- /dev/null
+++ b/includes/js/dijit/tests/form/test_validate.html
@@ -0,0 +1,428 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Test TextBox Validation Widgets</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ body .small {
+ width: 3em;
+ }
+ body .medium {
+ width: 10em;
+ }
+ body .long {
+ width: 20em;
+ }
+ body .verylong {
+ width: 90%;
+ }
+
+ .noticeMessage {
+ color:#093669;
+ font-size:0.95em;
+ margin-left:0.5em;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true, extraLocale: ['de-de', 'en-us']"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dojo.currency");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+ </head>
+
+ <body>
+ <h1 class="testTitle">Dijit Validation Widgets</h1>
+ <!-- to test form submission, you'll need to create an action handler similar to
+ http://www.utexas.edu/teamweb/cgi-bin/generic.cgi -->
+ <form id="form1" action="" name="example" method="">
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q01">First Name: </label>
+ <span class="noticeMessage"> TextBox class, <b>tabIndex=2</b>, Attributes: {trim: true, propercase: true, style: 'width:700px'}, First letter of each word is upper case.</span>
+ </div>
+ <div class="testExample">
+ <input id="q01" type="text" name="firstname" value="testing testing" style="width: 700px;" tabIndex=2
+ dojoType="dijit.form.TextBox"
+ trim="true"
+ onfocus="console.log('user onfocus handler')"
+ onblur="console.log('user onblur handler')"
+ onChange="dojo.byId('oc1').value=arguments[0]"
+ propercase="true" />
+ <br>onChange:<input id="oc1" size="34" disabled value="not fired yet!" autocomplete="off">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q02">Last Name: </label>
+ <span class="noticeMessage"> TextBox class, Attributes: {trim: true, uppercase: true, class: 'verylong'}, all letters converted to upper case. </span>
+ </div>
+ <div class="testExample">
+ <input id="q02" type="text" name="lastname" value="testing testing" class="verylong"
+ dojoType="dijit.form.TextBox"
+ trim="true"
+ uppercase="true" />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q03">Age: </label>
+ <span class="noticeMessage"> NumberTextBox class, <b>tabIndex=1</b>, Attributes: {trim: true}, no initial value specified, tooltipPosition=[above, below]</span>
+ </div>
+ <div class="testExample">
+ <input id="q03" type="text" name="age" tabIndex=1
+ dojoType="dijit.form.NumberTextBox"
+ promptMessage="(optional) Enter an age between 0 and 120"
+ maxLength="3"
+ class="small"
+ constraints="{places:0,min:0,max:120}"
+ onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+ tooltipPosition="above, below"
+ />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q04">Occupation: </label>
+ <span class="noticeMessage">ValidationTextBox class,
+ Attributes: {lowercase: true, required: true, class: verylong, style: font-size: 15pt;}. Displays a prompt message if field is missing.</span>
+ </div>
+ <div class="testExample">
+ <input id="q04" type="text" name="occupation" class="verylong" style="font-size:15pt;"
+ dojoType="dijit.form.ValidationTextBox"
+ lowercase="true"
+ required="true"
+ promptMessage="Enter an occupation" />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q05">Elevation: </label>
+ <span class="noticeMessage">IntegerTextBox class,
+ Attributes: {required: true, min:-20000, max:+20000 }, Enter feet above sea level with a sign.</span>
+ </div>
+ <div class="testExample">
+ <input id="q05" class="small"/>
+ onChange:<input id="oc5" size="10" disabled value="not fired yet!" autocomplete="off">
+ </div>
+<script>
+ // See if we can make a widget in script and attach it to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var props = {
+ name: "elevation",
+ value: 3000,
+ constraints: {min:-20000,max:20000,places:0},
+ promptMessage: "Enter a value between -20000 and +20000",
+ required: "true" ,
+ invalidMessage: "Invalid elevation.",
+ onChange: function(){dojo.byId('oc5').value=arguments[0]},
+ "class": "medium"
+ };
+ var w = new dijit.form.NumberTextBox(props, "q05");
+ });
+</script>
+<!--
+ <div class="dojoTitlePaneLabel">
+ <label for="attach-here">Population: </label>
+ <span class="noticeMessage">IntegerTextBox class,
+ Attributes: {trim: true, required: true, signed: false, separator: ","}. <br><b> This widget was added in script, not markup. </b> </span>
+ </div>
+ <div class="testExample" >
+ <input id="attach-here" type="text" name="population" class="medium" value="1500000"/>
+ </div>
+
+ <script>
+ // See if we can make a widget in script and attach it to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var props = {
+ name: "population",
+ value: "1,500,000",
+ trim: "true",
+ required: "true",
+ regExpGen: dojo.regexp.integer,
+ constraints: {signed:false, separator: ","},
+ invalidMessage: "Invalid population. Be sure to use commas."
+ };
+ var w = new dijit.form.ValidationTextBox(props, "attach-here");
+ });
+ </script>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q06">Real Number: </label>
+ <span class="noticeMessage">RealNumberTextBox class,
+ Attributes: {trim: true, required: true}. Enter any sort of real number.</span>
+ </div>
+ <div class="testExample">
+ <input id="q06" type="text" name="real1" class="medium" value="+0.1234"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.realNumber"
+ trim="true"
+ required="true"
+ invalidMessage="This is not a valid real number." />
+ </div>
+ <div class="dojoTitlePaneLabel">
+ <label for="q07">Exponential Notation: </label>
+ <span class="noticeMessage">RealNumberTextBox class,
+ Attributes: {exponent: true}. Enter a real number in exponential notation.</span>
+ </div>
+ <div class="testExample">
+ <input id="q07" type="text" name="real2" class="medium" value="+0.12"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.realNumber"
+ trim="true"
+ required="true"
+ constraints={exponent:true}
+ invalidMessage="Number must be in exponential notation. Example +5E-28" />
+ </div>
+ -->
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q08">Annual Income: </label>
+ <span class="noticeMessage">CurrencyTextBox class,
+ Attributes: {fractional: true}. Enter whole and cents. Currency symbol is optional.</span>
+ </div>
+
+ <div class="testExample">
+ <input id="q08" type="text" name="income1" class="medium" value="54775.53"
+ dojoType="dijit.form.CurrencyTextBox"
+ required="true"
+ constraints="{fractional:true}"
+ currency="USD"
+ onChange="dojo.byId('oc8').value=arguments[0]"
+ invalidMessage="Invalid amount. Include dollar sign, commas, and cents. Cents are mandatory." />USD
+ &nbsp;onChange:<input id="oc8" size="15" disabled value="not fired yet!" autocomplete="off">
+ </div>
+
+ <div class="testExample">
+ euro currency (local format) fractional part is optional:
+ <input id="q08eur" type="text" name="income2"
+ class="medium" value="54775.53"
+ dojoType="dijit.form.CurrencyTextBox"
+ required="true"
+ currency="EUR"
+ invalidMessage="Invalid amount. Include dollar sign, commas, and cents." />EUR
+ <button onclick="dijit.byId('q08eur').setAttribute('disabled',true);return false">Disable</button>
+ <button onclick="dijit.byId('q08eur').setAttribute('disabled',false);return false">Enable</button>
+ <button onclick="dijit.byId('q08eur').reset();return false">Reset</button>
+ </div>
+
+ <!--
+ It is unusual to override the lang properties on individual
+ widgets. Usually it should be the user's default or set on
+ a page basis by the server. This is for testing purposes
+ -->
+ <div class="testExample">
+ euro currency (fixed lang: de-de) programmatically created, fractional part is optional: <input id="q08eurde" class="medium"/>EUR
+ </div>
+
+ <script>
+ // See if we can make a widget in script and attach it
+ // to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var example = dojo.currency.format(54775.53, {locale: 'de-de', currency: "EUR"});
+ var props = {
+ name: "income3",
+ value: 54775.53,
+ lang: 'de-de',
+ required: "true",
+ currency: "EUR",
+ invalidMessage: "Invalid amount. Example: " + example
+ };
+ var w = new dijit.form.CurrencyTextBox(props, "q08eurde");
+ });
+ </script>
+
+ <!--
+ <div class="dojoTitlePaneLabel">
+ <label for="q08a">Annual Income: </label>
+ <span class="noticeMessage">Old regexp currency textbox,
+ Attributes: {fractional: true}. Enter dollars and cents.</span>
+ </div>
+ <div class="testExample">
+ <input id="q08a" type="text" name="income3" class="medium" value="$54,775.53"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.currency"
+ trim="true"
+ required="true"
+ constraints={fractional:true}
+ invalidMessage="Invalid amount. Include dollar sign, commas, and cents. Example: $12,000.00" />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q09">IPv4 Address: </label>
+ <span class="noticeMessage">IpAddressTextBox class,
+ Attributes: {allowIPv6: false, allowHybrid: false}. Also Dotted Hex works, 0x18.0x11.0x9b.0x28</span>
+ </div>
+ <div class="testExample">
+ <input id="q09" type="text" name="ipv4" class="medium" value="24.17.155.40"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.ipAddress"
+ trim="true"
+ required="true"
+ constraints={allowIPv6:false,allowHybrid:false}
+ invalidMessage="Invalid IPv4 address.">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q10"> IPv6 Address: </label>
+ <span class="noticeMessage">IpAddressTextBox class,
+ Attributes: {allowDottedDecimal: false, allowDottedHex: false}.
+ Also hybrid works, x:x:x:x:x:x:d.d.d.d</span>
+ </div>
+ <div class="testExample">
+ <input id="q10" type="text" name="ipv6" class="long" value="0000:0000:0000:0000:0000:0000:0000:0000"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.ipAddress"
+ trim="true"
+ uppercase = "true"
+ required="true"
+ constraints={allowDottedDecimal:false, allowDottedHex:false, allowDottedOctal:false}
+ invalidMessage="Invalid IPv6 address, please enter eight groups of four hexadecimal digits. x:x:x:x:x:x:x:x">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q11"> URL: </label>
+ <span class="noticeMessage">UrlTextBox class,
+ Attributes: {required: true, trim: true, scheme: true}. </span>
+ </div>
+
+ <div class="testExample">
+ <input id="q11" type="text" name="url" class="long" value="http://www.xyz.com/a/b/c?x=2#p3"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.url"
+ trim="true"
+ required="true"
+ constraints={scheme:true}
+ invalidMessage="Invalid URL. Be sure to include the scheme, http://..." />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q12"> Email Address </label>
+ <span class="noticeMessage">EmailTextBox class,
+ Attributes: {required: true, trim: true}. </span>
+ </div>
+
+ <div class="testExample">
+ <input id="q12" type="text" name="email" class="long" value="fred&barney@stonehenge.com"
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.emailAddress"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid Email Address." />
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q13"> Email Address List </label>
+ <span class="noticeMessage">EmailListTextBox class,
+ Attributes: {required: true, trim: true}. </span>
+ </div>
+
+ <div class="testExample">
+ <input id="q13" type="text" name="email" class="long" value="a@xyz.com; b@xyz.com; c@xyz.com; "
+ dojoType="dijit.form.ValidationTextBox"
+ regExpGen="dojo.regexp.emailAddressList"
+ trim="true"
+ required="true"
+ invalidMessage="Invalid Email Address List." />
+ </div>
+ -->
+ <div class="dojoTitlePaneLabel">
+ <label for="q22">Regular Expression </label>
+ <span class="noticeMessage">RegexpTextBox class,
+ Attributes: {required: true} </span>
+ </div>
+ <div class="testExample">
+ <input id="q22" type="text" name="phone" class="medium" value="someTestString"
+ dojoType="dijit.form.ValidationTextBox"
+ regExp="[\w]+"
+ required="true"
+ invalidMessage="Invalid Non-Space Text.">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q23"> Password </label>
+ <span class="noticeMessage">(just a test that type attribute is obeyed) </span>
+ </div>
+ <div class="testExample">
+ <input id="q23" type="password" name="password" class="medium"
+ dojoType="dijit.form.TextBox">
+ </div>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="ticket1651">Trac ticket 1651: </label>
+ <span class="noticeMessage">value: null should show up as empty</span>
+ </div>
+ <div class="testExample">
+ <input id="ticket1651" class="medium" value="not null"/>
+ </div>
+
+ <script>
+ // See if we can make a widget in script and attach it to the DOM ourselves.
+ dojo.addOnLoad(function(){
+ var props = {
+ name: "ticket1651",
+ id: "mname",
+ value: null
+ };
+ var w = new dijit.form.TextBox(props, "ticket1651");
+ });
+ </script>
+
+ <div class="dojoTitlePaneLabel">
+ <label for="q24">readOnly test</label>
+ <span class="noticeMessage">a test that readOnly is understood</span>
+ </div>
+ <div class="testExample">
+ <input id="q24" type="text" name="readOnly" class="medium" readOnly value="cannot type here"
+ dojoType="dijit.form.TextBox">
+ <input type="button" onclick="dijit.byId('q24').setAttribute('readOnly',false);" value="Remove readOnly">
+ <input type="button" onclick="dijit.byId('q24').setAttribute('readOnly',true);" value="Set readOnly">
+ </div>
+
+ <script>
+ function displayData() {
+ var f = document.getElementById("form1");
+ var s = "";
+ for (var i = 0; i < f.elements.length; i++) {
+ var elem = f.elements[i];
+ if (elem.name == "button") { continue; }
+ s += elem.name+(elem.name && elem.disabled?' (disabled)':'') + ": " + elem.value + "\n";
+ }
+ alert(s);
+ }
+ </script>
+
+ <div>
+ <button name="button" onclick="displayData(); return false;">view data</button>
+ <input type="submit" name="submit" />
+ </div>
+
+ </form>
+ <h2>Tooltip positioning</h2>
+ <p>
+ These buttons switch the positions searched to try to place the validation error tooltips.
+ Note that setting tooltip positioning to "above" or "below" is dangerous if
+ you have a node with a dropdown, but the drop down might overlap the tooltip.
+ </p>
+ <button onclick="dijit.Tooltip.defaultPosition=['above', 'below'];">above, below</button>
+ <button onclick="dijit.Tooltip.defaultPosition=['after', 'before'];">after, before (default)</button>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/i18n/README b/includes/js/dijit/tests/i18n/README
new file mode 100644
index 0000000..a6516b6
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/README
@@ -0,0 +1,4 @@
+Global Verification Tests (GVT)
+
+In order to run these tests, you will need full locale support in Dojo. Dojo only ships with a small subset by default.
+See util/buildscripts/cldr for an ant-based build script.
diff --git a/includes/js/dijit/tests/i18n/currency.html b/includes/js/dijit/tests/i18n/currency.html
new file mode 100644
index 0000000..62108b2
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/currency.html
@@ -0,0 +1,210 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test CurrencyTextBox</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['zh-cn','fr-fr','ja-jp']"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test for Currency</h1>
+
+<!-- <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button> -->
+ <p>
+ Before start this test, make sure the <b>dojo/cldr/nls</b> contains the data for "zh-cn", "fr-fr", and "ja-jp"
+ and currencies CNY, EGP, EUR, JPY. If not, convert these CLDR data and put them there.
+ </p>
+
+ <script>
+ (function() {
+ genFormatTestCases("Currency Format", "dijit.form.CurrencyTextBox", [
+
+ { attrs: {Currency: "CNY", lang: "zh-cn"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>CNY</b>",
+ value: "123456789.46",
+ expValue: "&#xFFE5;123,456,789.46",
+ comment: ""
+ },
+ { attrs: {Currency: "CNY", lang: "zh-cn"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>CNY</b>",
+ value: "-123456789.46",
+ expValue: "-&#xFFE5;123,456,789.46",
+ comment: ""
+ },
+
+ { attrs: {Currency: "EUR", lang: "fr-fr"},
+ desc: "Locale: <b>fr_FR</b> Currency: <b>EUR</b>",
+ value: "123456789.46",
+ expValue: "123&nbsp;456&nbsp;789,46 &euro;",
+ comment: ""
+ },
+ { attrs: {Currency: "EUR", lang: "fr-fr"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>EUR</b>",
+ value: "-123456789.46",
+ expValue: "-123&nbsp;456&nbsp;789,46 &euro;",
+ comment: ""
+ },
+
+ { attrs: {Currency: "JPY", lang: "ja-jp"},
+ desc: "Locale: <b>ja_JP</b> Currency: <b>JPY</b>",
+ value: "123456789.46",
+ expValue: "&#xFFE5;123,456,789",
+ comment: ""
+ },
+ { attrs: {Currency: "JPY", lang: "ja-jp"},
+ desc: "Locale: <b>ja_JP</b> Currency: <b>JPY</b>",
+ value: "-123456789.46",
+ expValue: "-&#xFFE5;123,456,789",
+ comment: ""
+ }
+ ]);
+
+ genValidateTestCases("Currency Validate", "dijit.form.CurrencyTextBox", [
+
+ { attrs: {Currency: "CNY", lang: "zh-cn"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>CNY</b>",
+ value: 123456789.46,
+ expValue: "&#xFFE5;123,456,789.46",
+ comment: ""
+ },
+ { attrs: {Currency: "CNY", lang: "zh-cn"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>CNY</b>",
+ value: -123456789.46,
+ expValue: "-&#xFFE5;123,456,789.46",
+ comment: ""
+ },
+
+ { attrs: {Currency: "EUR", lang: "fr-fr"},
+ desc: "Locale: <b>fr_FR</b> Currency: <b>EUR</b>",
+ value: 123456789.46,
+ expValue: "123&nbsp;456&nbsp;789,46 &euro;",
+ comment: ""
+ },
+ { attrs: {Currency: "EUR", lang: "fr-fr"},
+ desc: "Locale: <b>zh_CN</b> Currency: <b>EUR</b>",
+ value: -123456789.46,
+ expValue: "-123&nbsp;456&nbsp;789,46 &euro;",
+ comment: ""
+ },
+
+ { attrs: {Currency: "JPY", lang: "ja-jp"},
+ desc: "Locale: <b>ja_JP</b> Currency: <b>JPY</b>",
+ value: 123456789,
+ expValue: "&#xFFE5;123,456,789",
+ comment: ""
+ },
+ { attrs: {Currency: "JPY", lang: "ja-jp"},
+ desc: "Locale: <b>ja_JP</b> Currency: <b>JPY</b>",
+ value: -123456789,
+ expValue: "-&#xFFE5;123,456,789",
+ comment: ""
+ }
+ ]);
+
+ dojo.parser.parse();
+
+ })();
+
+ </script>
+
+ <h2 class="testTitle">Issues &amp; Comments</h2>
+ <h3 class="testTitle"><a name="cmt_1">Issue #1<sup style="color:blue">Fixed</sup></a></h3>
+ <p>
+ Some browsers like FireFox have a bug on the non-breaking space character (U+00A0, <b>&amp;nbsp;</b> or <b>&amp;#160;</b> or
+ <b>&amp;#xA0;</b> in HTML).
+ They always convert the NBSP character to a normal space (U+0020, <b>&amp;#x20;</b> in HTML) automatically in the following circumstances:
+ </p>
+ <ul>
+ <li>Copy text from the page</li>
+ <li>Use <b>innerHTML</b> to get the content of a certain element</li>
+ <li>Use <b>value</b> to get an <b>INPUT</b> element's value</li>
+ </ul>
+
+ <p>
+ You cannot read a real NBSP character from an <b>INPUT</b> element on these browsers. It causes issues when some formatting data in CLDR
+ contains an NBSP character. For example,
+ </p>
+ <ul>
+ <li>Many locales like French use an NBSP character as a group separator in numbers</li>
+ <li>French and Finnish use NBSP characters in their percentage and currency format patterns respectively</li>
+ </ul>
+
+ <p>
+ So Dojo may generate formatted data with NBSP characters in it but cannot read NBSP charaters from user's input in some browser.
+ </p>
+
+ <h3 class="testTitle"><a name="cmt_2">Issue #2<sup style="color:blue">Fixed: the CLDR data generator should be fixed by adding code to convert U+200F to "\u200F" in nls JS files.</sup></a></h3>
+ <p>
+ Most Bidi currency symbols contain an LTR-MARK (U+200F) character at the very beginning.
+ But Firefox ignores it when it is not in any escaping form. This should be a bug of Firefox.
+ For example, click <a href="javascript:alert('‏'.indexOf('\u200F'))"><code>alert('‏'.indexOf('\u+200F'))</code></a> (there is a U+200F in the empty-looking string):
+ </p>
+ <ul>
+ <li>In Firefox, shows "-1" -- no U+200F found</li>
+ <li>In IE &amp; Opera, shows "0" -- the U+200F is found</li>
+ </ul>
+ <p>
+ But if the U+200F is in some escaping form, Firefox will work as well as other browsers.
+ Click <a href="javascript:alert('\u200F'.indexOf('\u200F'))"><code>alert('\u200F'.indexOf('\u+200F'))</code></a> to see the same result both in Firefox and IE:
+ </p>
+
+
+ <h3 class="testTitle"><a name="cmt_3">Issue #3<sup style="color:blue">Fixed: added a "localeDigit" to the options</sup></a></h3>
+ <p>
+ Strictly speaking, the data conversion must support non-European number characters in some locales like Arabic and Hindi.
+ For example, ICU formats a number data into Indic number characters by default in the Arabic locale.
+ However, currently Dojo does not support this feature (Dojo uses the default number conversion of the browser).
+ </p>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/i18n/date.html b/includes/js/dijit/tests/i18n/date.html
new file mode 100644
index 0000000..b4aa4cd
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/date.html
@@ -0,0 +1,155 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test DateTextBox</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['zh-cn','fr-fr','ja-jp','ru-ru','en-us','de-de','es-es','it-it','pt-br','ko-kr','zh-tw']"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ <script>
+ function gen4DateFormat(testCases, language, locale, date, short, shortCmt, medium, mediumCmt, long, longCmt, full, fullCmt) {
+ testCases.push({
+ attrs: {constraints: "{formatLength:'short'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Short</b>",
+ value: date,
+ expValue: short,
+ comment: shortCmt
+ });
+ testCases.push({
+ attrs: {constraints: "{formatLength:'medium'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Medium</b>",
+ value: date,
+ expValue: medium,
+ comment: mediumCmt
+ });
+ testCases.push({
+ attrs: {constraints: "{formatLength:'long'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Long</b>",
+ value: date,
+ expValue: long,
+ comment: longCmt
+ });
+ testCases.push({
+ attrs: {constraints: "{formatLength:'full'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Full</b>",
+ value: date,
+ expValue: full,
+ comment: fullCmt
+ });
+ }
+ </script>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test for Date</h1>
+
+<!-- <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button>-->
+ <p>
+ Before start this test, make sure the <b>dojo/cldr/nls</b> contains the data for "zh-cn", "fr-fr", "ja-jp", "ru-ru", "hi-in", "en-us" and "ar-eg". If not, convert these CLDR data and put them there.
+ </p>
+
+ <script>
+ (function() {
+ var testCases = [];
+ gen4DateFormat(testCases, "ru-ru", "ru_RU", "2005-07-31",
+ "31.07.05", "", "31.07.2005", "", "31 июля 2005 г.", "Failed in Firefox. <a href='currency.html#cmt_1'>See #1 (currency.html).</a>", "31 июля 2005 г.", "Failed in Firefox. <a href='currency.html#cmt_1'>See #1 (currency.html).</a>");
+ gen4DateFormat(testCases, "zh-cn", "zh_CN", "2005-07-31",
+ "05-7-31", "", "2005-7-31", "", "2005年7月31日", "", "2005年7月31日星期日", "");
+ gen4DateFormat(testCases, "en-us", "en_US", "2005-07-31",
+ "7/31/05", "", "Jul 31, 2005", "", "July 31, 2005", "", "Sunday, July 31, 2005", "");
+ gen4DateFormat(testCases, "fr-fr", "fr_FR", "2005-07-31",
+ "31/07/05", "", "31 juil. 2005", "", "31 juillet 2005", "", "dimanche 31 juillet 2005", "");
+ gen4DateFormat(testCases, "ja-jp", "ja_JP", "2005-07-31",
+ "05/07/31", "", "2005/07/31", "", "2005年7月31日", "", "2005年7月31日日曜日", "");
+ gen4DateFormat(testCases, "de-de", "de_DE", "2005-07-31",
+ "31.07.05", "", "31.07.2005", "", "31. Juli 2005", "", "Sonntag, 31. Juli 2005", "");
+ gen4DateFormat(testCases, "es-es", "es_ES", "2005-07-31",
+ "31/07/05", "", "31/07/2005", "", "31 de julio de 2005", "", "domingo 31 de julio de 2005", "");
+ gen4DateFormat(testCases, "pt-br", "pt-BR", "2005-07-31",
+ "31/07/05", "", "31/07/2005", "", "31 de julho de 2005", "", "domingo, 31 de julho de 2005", "");
+ gen4DateFormat(testCases, "it-it", "it-IT", "2005-07-31",
+ "31/07/05", "", "31/lug/2005", "", "31 luglio 2005", "", "domenica 31 luglio 2005", "");
+ gen4DateFormat(testCases, "ko-kr", "ko-KR", "2005-07-31",
+ "05. 7. 31.", "", "2005. 7. 31.", "", "2005년 7월 31일", "", "2005년 7월 31일 일요일", "");
+ gen4DateFormat(testCases, "zh-tw", "zh-TW", "2005-07-31",
+ "2005/7/31", "", "2005/7/31", "", "2005年7月31日", "", "2005年7月31日星期日", "");
+ genFormatTestCases("Date Format", "dijit.form.DateTextBox", testCases);
+
+ testCases = [];
+ gen4DateFormat(testCases, "ru-ru", "ru_RU", new Date(2005, 6, 31),
+ "31.07.05", "", "31.07.2005", "", "31 июля 2005&nbsp;г.", "Failed in Firefox. <a href='currency.html#cmt_1'>See #1 (currency.html).</a>", "31 июля 2005&nbsp;г.", "Failed in Firefox. <a href='currency.html#cmt_1'>See #1 (currency.html).</a>");
+ gen4DateFormat(testCases, "zh-cn", "zh_CN", new Date(2005, 6, 31),
+ "05-7-31", "", "2005-7-31", "", "2005年7月31日", "", "2005年7月31日星期日", "");
+ gen4DateFormat(testCases, "en-us", "en_US", new Date(2005, 6, 31),
+ "7/31/05", "", "Jul 31, 2005", "", "July 31, 2005", "", "Sunday, July 31, 2005", "");
+ gen4DateFormat(testCases, "fr-fr", "fr_FR", new Date(2005, 6, 31),
+ "31/07/05", "", "31 juil. 2005", "", "31 juillet 2005", "", "dimanche 31 juillet 2005", "");
+ gen4DateFormat(testCases, "ja-jp", "ja_JP", new Date(2005, 6, 31),
+ "05/07/31", "", "2005/07/31", "", "2005年7月31日", "", "2005年7月31日日曜日", "");
+ gen4DateFormat(testCases, "de-de", "de_DE", new Date(2005, 6, 31),
+ "31.07.05", "", "31.07.2005", "", "31. Juli 2005", "", "Sonntag, 31. Juli 2005", "");
+ gen4DateFormat(testCases, "es-es", "es_ES", new Date(2005, 6, 31),
+ "31/07/05", "", "31/07/2005", "", "31 de julio de 2005", "", "domingo 31 de julio de 2005", "");
+ gen4DateFormat(testCases, "pt-br", "pt-BR", new Date(2005, 6, 31),
+ "31/07/05", "", "31/07/2005", "", "31 de julho de 2005", "", "domingo, 31 de julho de 2005", "");
+ gen4DateFormat(testCases, "it-it", "it-IT", new Date(2005, 6, 31),
+ "31/07/05", "", "31/lug/2005", "", "31 luglio 2005", "", "domenica 31 luglio 2005", "");
+ gen4DateFormat(testCases, "ko-kr", "ko-KR", new Date(2005, 6, 31),
+ "05. 7. 31.", "", "2005. 7. 31.", "", "2005년 7월 31일", "", "2005년 7월 31일 일요일", "");
+ gen4DateFormat(testCases, "zh-tw", "zh-TW", new Date(2005, 6, 31),
+ "2005/7/31", "", "2005/7/31", "", "2005年7月31日", "", "2005年7月31日星期日", "");
+ genValidateTestCases("Date Validate", "dijit.form.DateTextBox", testCases);
+
+ dojo.parser.parse();
+ })();
+ </script>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/i18n/digit.html b/includes/js/dijit/tests/i18n/digit.html
new file mode 100644
index 0000000..dc3ed7a
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/digit.html
@@ -0,0 +1,294 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test Hindi/Arabic numerals</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['ar-eg','hi-in']"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <script>
+ function gen4DateFormat(testCases, language, locale, date, short, shortCmt, medium, mediumCmt, long, longCmt, full, fullCmt) {
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'short', localeDigit: true}" : "{formatLength:'short'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Short</b>",
+ value: date,
+ expValue: short,
+ comment: shortCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'medium', localeDigit: true}" : "{formatLength:'medium'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Medium</b>",
+ value: date,
+ expValue: medium,
+ comment: mediumCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'long', localeDigit: true}" : "{formatLength:'long'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Long</b>",
+ value: date,
+ expValue: long,
+ comment: longCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'full', localeDigit: true}" : "{formatLength:'full'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Full</b>",
+ value: date,
+ expValue: full,
+ comment: fullCmt
+ });
+ }
+ </script>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test for Number</h1>
+
+<!-- <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button>-->
+ <p>
+ Before start this test, make sure the <b>dojo/cldr/nls</b> contains the data for "ar-eg" and "hi-in". If not, convert these CLDR data and put them there.
+ </p>
+
+ <script>
+ (function() {
+
+ genFormatTestCases("Number Format", "dijit.form.NumberTextBox", [
+ { attrs: {lang: "ar-eg"},
+ desc: "Locale: ar_EG",
+ value: "12345.067",
+ expValue: "12٬345٫067",
+ comment: ""
+ },
+ { attrs: {lang: "ar-eg"},
+ desc: "Locale: ar_EG",
+ value: "-12345.067",
+ expValue: "12٬345٫067-",
+ comment: ""
+ },
+
+ { attrs: {lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: ar_EG",
+ value: "12345.067",
+ expValue: "١٢\u066C٣٤٥\u066B٠٦٧",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+ { attrs: {lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: ar_EG",
+ value: "-12345.067",
+ expValue: "١٢\u066C٣٤٥\u066B٠٦٧-",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+
+ { attrs: {lang: "hi-in", constraints: "{localeDigit: true}"},
+ desc: "Locale: hi_IN",
+ value: "123456789.068",
+ expValue: "१२,३४,५६,७८९.०६८",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+ { attrs: {lang: "hi-in", constraints: "{localeDigit: true}"},
+ desc: "Locale: hi_IN",
+ value: "-123456789.068",
+ expValue: "-१२,३४,५६,७८९.०६८",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ }
+ ]);
+
+ genValidateTestCases("Number Validate", "dijit.form.NumberTextBox", [
+
+ { attrs: {lang: "ar-eg"},
+ desc: "Locale: ar_EG",
+ value: 12345.067,
+ expValue: "12٬345٫067",
+ comment: ""
+ },
+ { attrs: {lang: "ar-eg"},
+ desc: "Locale: ar_EG",
+ value: -12345.067,
+ expValue: "12٬345٫067-",
+ comment: ""
+ },
+
+ { attrs: {lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: ar_EG",
+ value: 12345.067,
+ expValue: "١٢\u066C٣٤٥\u066B٠٦٧",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+ { attrs: {lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: ar_EG",
+ value: -12345.067,
+ expValue: "١٢\u066C٣٤٥\u066B٠٦٧-",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+
+ { attrs: {lang: "hi-in", constraints: "{localeDigit: true}"},
+ desc: "Locale: hi_IN",
+ value: 123456789.068,
+ expValue: "१२,३४,५६,७८९.०६८",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ },
+ { attrs: {lang: "hi-in", constraints: "{localeDigit: true}"},
+ desc: "Locale: hi_IN",
+ value: -123456789.068,
+ expValue: "-१२,३४,५६,७८९.०६८",
+ comment: "<a href='currency.html#cmt_2'>See #2 (currency.html).</a>"
+ }
+ ]);
+
+ genFormatTestCases("Currency Format", "dijit.form.CurrencyTextBox", [
+
+ { attrs: {Currency: "EGP", lang: "ar-eg"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: "123456789.46",
+ expValue: "&#x062C;.&#x0645;.\u200F 123&#x066C;456&#x066C;789&#x066B;46",
+ comment: ""
+ },
+ { attrs: {Currency: "EGP", lang: "ar-eg"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: "-123456789.46",
+ expValue: "&#x062C;.&#x0645;.\u200F 123&#x066C;456&#x066C;789&#x066B;46-",
+ comment: ""
+ },
+
+ { attrs: {Currency: "EGP", lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: "123456789.46",
+ expValue: "&#x062C;.&#x0645;.\u200F ١٢٣\u066C٤٥٦\u066C٧٨٩\u066B٤٦",
+ comment: "<a href='#cmt_3'>See #3.</a> Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ },
+ { attrs: {Currency: "EGP", lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: "-123456789.46",
+ expValue: "&#x062C;.&#x0645;.\u200F ١٢٣\u066C٤٥٦\u066C٧٨٩\u066B٤٦-",
+ comment: "<a href='#cmt_3'>See #3.</a> Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ }
+ ]);
+
+ genValidateTestCases("Currency Validate", "dijit.form.CurrencyTextBox", [
+
+ { attrs: {Currency: "EGP", lang: "ar-eg"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: 123456789.46,
+ expValue: "&#x062C;.&#x0645;.\u200F 123&#x066C;456&#x066C;789&#x066B;46",
+ comment: "Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ },
+ { attrs: {Currency: "EGP", lang: "ar-eg"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: -123456789.46,
+ expValue: "&#x062C;.&#x0645;.\u200F 123&#x066C;456&#x066C;789&#x066B;46-",
+ comment: "Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ },
+
+ { attrs: {Currency: "EGP", lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: 123456789.46,
+ expValue: "&#x062C;.&#x0645;.\u200F ١٢٣\u066C٤٥٦\u066C٧٨٩\u066B٤٦",
+ comment: "<a href='#cmt_3'>See #3.</a> Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ },
+ { attrs: {Currency: "EGP", lang: "ar-eg", constraints: "{localeDigit: true}"},
+ desc: "Locale: <b>ar_EG</b> Currency: <b>EGP</b>",
+ value: -123456789.46,
+ expValue: "&#x062C;.&#x0645;.\u200F ١٢٣\u066C٤٥٦\u066C٧٨٩\u066B٤٦-",
+ comment: "<a href='#cmt_3'>See #3.</a> Failed in Firefox. <a href='#cmt_2'>See #2.</a>"
+ }
+ ]);
+
+ var testCases = [];
+ gen4DateFormat(testCases, "ar-eg", "ar_EG", "2005-07-31",
+ "31/7/2005", "", "31/07/2005", "", "31 &#x064A;&#x0648;&#x0644;&#x064A;&#x0648;&#x2C; 2005", "", "&#x0627;&#x0644;&#x0623;&#x062D;&#x062F;&#x2C; 31 &#x064A;&#x0648;&#x0644;&#x064A;&#x0648;&#x2C; 2005", "");
+ gen4DateFormat(testCases, "hi-in", "hi_IN", "2005-07-31",
+ "२००५-०७-३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "२००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "२००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "रविवार, २००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>");
+ genFormatTestCases("Date Format", "dijit.form.DateTextBox", testCases);
+
+ testCases = [];
+ gen4DateFormat(testCases, "ar-eg", "ar_EG", new Date(2005, 6, 31),
+ "31/7/2005", "", "31/07/2005", "", "31 &#x064A;&#x0648;&#x0644;&#x064A;&#x0648;&#x2C; 2005", "", "&#x0627;&#x0644;&#x0623;&#x062D;&#x062F;&#x2C; 31 &#x064A;&#x0648;&#x0644;&#x064A;&#x0648;&#x2C; 2005", "");
+ gen4DateFormat(testCases, "hi-in", "hi_IN", new Date(2005, 6, 31),
+ "२००५-०७-३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "२००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "२००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>", "रविवार, २००५ जुलाई ३१", "<a href='currency.html#cmt_3'>See #3 (currency.html).</a>");
+ genValidateTestCases("Date Validate", "dijit.form.DateTextBox", testCases);
+
+ dojo.parser.parse();
+
+ })();
+
+ </script>
+ </body>
+</html>
+
+<!--
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'short', localeDigit: true}" : "{formatLength:'short'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Short</b>",
+ value: date,
+ expValue: short,
+ comment: shortCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'medium', localeDigit: true}" : "{formatLength:'medium'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Medium</b>",
+ value: date,
+ expValue: medium,
+ comment: mediumCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'long', localeDigit: true}" : "{formatLength:'long'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Long</b>",
+ value: date,
+ expValue: long,
+ comment: longCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'full', localeDigit: true}" : "{formatLength:'full'}", lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Full</b>",
+ value: date,
+ expValue: full,
+ comment: fullCmt
+-->
+
diff --git a/includes/js/dijit/tests/i18n/module.js b/includes/js/dijit/tests/i18n/module.js
new file mode 100644
index 0000000..b484737
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/module.js
@@ -0,0 +1,18 @@
+if(!dojo._hasResource["dijit.tests.i18n.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.i18n.module"] = true;
+dojo.provide("dijit.tests.i18n.module");
+
+try{
+ if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.i18n.currency", dojo.moduleUrl("dijit", "tests/i18n/currency.html"));
+ doh.registerUrl("dijit.tests.i18n.date", dojo.moduleUrl("dijit", "tests/i18n/date.html"));
+ doh.registerUrl("dijit.tests.i18n.number", dojo.moduleUrl("dijit", "tests/i18n/number.html"));
+ doh.registerUrl("dijit.tests.i18n.textbox", dojo.moduleUrl("dijit", "tests/i18n/textbox.html"));
+ doh.registerUrl("dijit.tests.i18n.time", dojo.moduleUrl("dijit", "tests/i18n/time.html"));
+ doh.registerUrl("dijit.tests.i18n.digit", dojo.moduleUrl("dijit", "tests/i18n/digit.html"));
+ }
+}catch(e){
+ doh.debug(e);
+}
+
+}
diff --git a/includes/js/dijit/tests/i18n/number.html b/includes/js/dijit/tests/i18n/number.html
new file mode 100644
index 0000000..0a1b717
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/number.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test NumberTextBox</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['zh-cn','fr-fr']"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test for Number</h1>
+
+<!-- <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button>-->
+ <p>
+ Before start this test, make sure the <b>dojo/cldr/nls</b> contains the data for "zh-cn", "fr-fr". If not, convert these CLDR data and put them there.
+ </p>
+
+ <script>
+ (function() {
+
+ genFormatTestCases("Number Format", "dijit.form.NumberTextBox", [
+
+ { attrs: {lang: "zh-cn"},
+ desc: "Locale: zh_CN",
+ value: "12345.067",
+ expValue: "12,345.067",
+ comment: ""
+ },
+ { attrs: {lang: "zh-cn"},
+ desc: "Locale: zh_CN",
+ value: "-12345.067",
+ expValue: "-12,345.067",
+ comment: ""
+ },
+
+ { attrs: {lang: "fr-fr"},
+ desc: "Locale: fr_FR",
+ value: "12345.067",
+ expValue: "12&nbsp;345,067",
+ comment: ""
+ },
+ { attrs: {lang: "fr-fr"},
+ desc: "Locale: zh_CN",
+ value: "-12345.067",
+ expValue: "-12&nbsp;345,067",
+ comment: ""
+ }
+ ]);
+
+ genValidateTestCases("Number Validate", "dijit.form.NumberTextBox", [
+
+ { attrs: {lang: "zh-cn"},
+ desc: "Locale: zh_CN",
+ value: 12345.067,
+ expValue: "12,345.067",
+ comment: ""
+ },
+ { attrs: {lang: "zh-cn"},
+ desc: "Locale: zh_CN",
+ value: -12345.067,
+ expValue: "-12,345.067",
+ comment: ""
+ },
+
+ { attrs: {lang: "fr-fr"},
+ desc: "Locale: fr_FR",
+ value: 12345.067,
+ expValue: "12&nbsp;345,067",
+ comment: ""
+ },
+ { attrs: {lang: "fr-fr"},
+ desc: "Locale: zh_CN",
+ value: -12345.067,
+ expValue: "-12&nbsp;345,067",
+ comment: ""
+ }
+ ]);
+
+ dojo.parser.parse();
+
+ })();
+
+ </script>
+ </body>
+</html>
+
+
diff --git a/includes/js/dijit/tests/i18n/test_i18n.js b/includes/js/dijit/tests/i18n/test_i18n.js
new file mode 100644
index 0000000..bc44e63
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/test_i18n.js
@@ -0,0 +1,206 @@
+var validateValues = [];
+var formatWidgetCount = 0;
+var validateWidgetCount = 0;
+
+function getElementsById(id){
+ var result = [];
+
+ if(!id || typeof(id) != "string"){
+ return result;
+ }
+
+ var ae = document.getElementsByTagName(dojo.byId(id).tagName);
+ for(var i = 0; i < ae.length; i++){
+ if(ae[i].id == id){
+ result.push(ae[i]);
+ }
+ }
+ return result;
+}
+
+function getString(n){
+ return n && n.toString();
+}
+
+function startTest(t){
+ startTestFormat(t);
+ startTestValidate(t);
+}
+
+function escapeEx(s){
+ var result = "";
+ for(var i = 0; i < s.length; i++){
+ var c = s.charAt(i);
+ switch (c){
+ case '"':
+ result += '\\"';
+ break;
+ case "'":
+ result += "\\'";
+ break;
+ default:
+ result += escape(c);
+ break;
+ }
+ }
+ return result;
+}
+
+function getAllTestCases(){
+ var allTestCases = [];
+ for(var i = 0; i < formatWidgetCount; i++){
+ allTestCases.push({
+ name: "format-" + i,
+ runTest: new Function("t", "startTestFormat(" + i + ", t)")
+ });
+ }
+ for(var i = 0; i < validateWidgetCount; i++){
+ allTestCases.push({
+ name: "validate-" + i,
+ runTest: new Function("t", "startTestValidate(" + i + ", t)")
+ });
+ }
+ return allTestCases;
+}
+
+function startTestFormat(i, t){
+ var test_node = dojo.doc.getElementById("test_display_" + i);
+ var exp = dojo.doc.getElementById("test_display_expected_" + i).value;
+ var res_node = dojo.doc.getElementById("test_display_result_" + i);
+ res_node.innerHTML = test_node.value;
+ res_node.style.backgroundColor = (test_node.value == exp) ? "#AFA" : "#FAA";
+ res_node.innerHTML += " <a style='font-size:0.8em' href='javascript:alert(\"Expected: " + escapeEx(exp) + "\\n Result: " + escapeEx(test_node.value) + "\")'>Compare (Escaped)</a>";
+ t.is(exp, test_node.value);
+}
+
+function startTestValidate(i, t){
+ /*
+ * The dijit.byNode has an issue: cannot handle same id.
+ */
+ var test_node = dojo.doc.getElementById("test_validate_" + i);
+ var inp_node = dojo.doc.getElementById("test_validate_input_" + i);
+ var exp = dojo.doc.getElementById("test_validate_expected_" + i).innerHTML;
+ var res_node = dojo.doc.getElementById("test_validate_result_" + i);
+ var val_node = dojo.doc.getElementById("test_display_value_" + i);
+
+ test_node.value = inp_node.value;
+ /*
+ * The dijit.byNode has an issue.
+ */
+ var widget = null;
+ var node = test_node;
+ while ((widget = dijit.byNode(node)) == null){
+ node = node.parentNode;
+ if(!node){
+ break;
+ }
+ }
+
+ if(widget){
+ widget.focus();
+
+ var expected = validateValues[i];
+ var result = widget.getValue();
+ if(validateValues[i].processValue){
+ expected = validateValues[i].processValue(expected);
+ result = validateValues[i].processValue(result);
+ }
+ var parseCorrect = getString(expected) == getString(result);
+ val_node.style.backgroundColor = parseCorrect ? "#AFA" : "#FAA";
+ val_node.innerHTML = getString(result) + (parseCorrect ? "" : "<br>Expected: " + getString(expected));
+
+ res_node.innerHTML = widget.isValid && !widget.isValid() ? "Wrong" : "Correct";
+ res_node.style.backgroundColor = res_node.innerHTML == exp ? "#AFA" : "#FAA";
+
+ t.is(getString(expected), getString(result));
+ }
+}
+
+function genFormatTestCase(desc, dojoType, dojoAttrs, value, expValue, comment){
+ dojo.doc.write("<tr>");
+ dojo.doc.write("<td>" + desc + "</td>");
+ dojo.doc.write("<td>");
+ dojo.doc.write("<input id='test_display_" + formatWidgetCount + "' type='text' value='" + value + "' ");
+ dojo.doc.write("dojoType='" + dojoType + "' ");
+ for(var attr in dojoAttrs){
+ dojo.doc.write(attr + "=\"" + dojoAttrs[attr] + "\" ");
+ }
+ dojo.doc.write("/>");
+ dojo.doc.write("</td>");
+ dojo.doc.write("<td><input id='test_display_expected_" + formatWidgetCount + "' value='" + expValue + "'></td>");
+ dojo.doc.write("<td id='test_display_result_" + formatWidgetCount + "'></td>");
+ dojo.doc.write("<td style='white-space:normal'>" + comment + "</td>");
+ dojo.doc.write("</tr>");
+ formatWidgetCount++;
+}
+/*
+[
+ {attrs: {currency: "CNY", lang: "zh-cn"}, desc: "", value:"-123456789.46", expValue: "", comment: ""},
+ ...
+]
+*/
+function genFormatTestCases(title, dojoType, testCases){
+ dojo.doc.write("<h2 class=testTitle>" + title + "</h2>");
+ dojo.doc.write("<table border=1>");
+ dojo.doc.write("<tr>");
+ dojo.doc.write("<td class=title><b>Test Description</b></td>");
+ dojo.doc.write("<td class=title><b>Test</b></td>");
+ dojo.doc.write("<td class=title><b>Expected</b></td>");
+ dojo.doc.write("<td class=title><b>Result</b></td>");
+ dojo.doc.write("<td class=title><b>Comment</b></td>");
+ dojo.doc.write("</tr>");
+
+ for(var i = 0; i < testCases.length; i++){
+ var testCase = testCases[i];
+ genFormatTestCase(testCase.desc, dojoType, testCase.attrs, testCase.value, testCase.expValue, testCase.comment);
+ }
+
+ dojo.doc.write("</table>");
+}
+
+function genValidateTestCase(desc, dojoType, dojoAttrs, input, value, comment, isWrong){
+ dojo.doc.write("<tr>");
+ dojo.doc.write("<td>" + desc + "</td>");
+ dojo.doc.write("<td>");
+ dojo.doc.write("<input id='test_validate_" + validateWidgetCount + "' type='text' ");
+ dojo.doc.write("dojoType='" + dojoType + "' ");
+ for(var attr in dojoAttrs){
+ dojo.doc.write(attr + "=\"" + dojoAttrs[attr] + "\" ");
+ }
+ dojo.doc.write("/>");
+ dojo.doc.write("</td>");
+ dojo.doc.write("<td><input id='test_validate_input_" + validateWidgetCount + "' value='" + input + "'></td>");
+ dojo.doc.write("<td id='test_display_value_" + validateWidgetCount + "'></td>");
+ dojo.doc.write("<td id='test_validate_expected_" + validateWidgetCount + "'>" + (isWrong ? "Wrong" : "Correct") + "</td>");
+ dojo.doc.write("<td id='test_validate_result_" + validateWidgetCount + "'></td>");
+ dojo.doc.write("<td style='white-space:normal'>" + comment + "</td>");
+ dojo.doc.write("</tr>");
+ validateValues.push(value);
+ validateWidgetCount++;
+}
+/*
+[
+ {attrs: {currency: "CNY", lang: "zh-cn"}, desc: "", value:false, expValue: "-123456789.46", comment: ""},
+ ...
+]
+*/
+function genValidateTestCases(title, dojoType, testCases){
+ dojo.doc.write("<h2 class=testTitle>" + title + "</h2>");
+ dojo.doc.write("<table border=1>");
+ dojo.doc.write("<tr>");
+ dojo.doc.write("<td class=title><b>Test Description</b></td>");
+ dojo.doc.write("<td class=title><b>Test</b></td>");
+ dojo.doc.write("<td class=title><b>Input</b></td>");
+ dojo.doc.write("<td class=title><b>Parsed Value</b></td>");
+ dojo.doc.write("<td class=title><b>Expected</b></td>");
+ dojo.doc.write("<td class=title><b>Result</b></td>");
+ dojo.doc.write("<td class=title><b>Comment</b></td>");
+ dojo.doc.write("</tr>");
+
+ for(var i = 0; i < testCases.length; i++){
+ var testCase = testCases[i];
+ genValidateTestCase(testCase.desc, dojoType, testCase.attrs, testCase.expValue, testCase.value, testCase.comment, testCase.isWrong);
+ }
+
+ dojo.doc.write("</table>");
+}
diff --git a/includes/js/dijit/tests/i18n/textbox.html b/includes/js/dijit/tests/i18n/textbox.html
new file mode 100644
index 0000000..573496e
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/textbox.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test TextBox</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.NumberTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test</h1>
+
+<!-- <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button>-->
+
+ <script>
+ (function() {
+ genFormatTestCases("Natural Language Casing Mapping", "dijit.form.TextBox", [
+
+ { attrs: {uppercase: "true"},
+ desc: "Upper casing: Basic Latin",
+ value: "abcdefghijklmnopqrstuvwxyz",
+ expValue: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ comment: ""
+ },
+
+ { attrs: {uppercase: "true"},
+ desc: "Upper casing: Latin with accents",
+ value: "àáâãäåæçèéêëìíîïðñòóôõö",
+ expValue: "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ",
+ comment: ""
+ },
+
+ { attrs: {uppercase: "true"},
+ desc: "Upper casing: Turkish",
+ value: "ıi",
+ expValue: "Iİ",
+ comment: "<a href='#cmt_1'>See #1.</a>"
+ },
+
+ { attrs: {uppercase: "true"},
+ desc: "Upper casing: Russian",
+ value: "абвгдежз",
+ expValue: "АБВГДЕЖЗ",
+ comment: ""
+ },
+
+ { attrs: {uppercase: "true"},
+ desc: "Upper casing: German",
+ value: "ß",
+ expValue: "SS",
+ comment: "<a href='#cmt_1'>See #1.</a>"
+ },
+
+ { attrs: {lowercase: "true"},
+ desc: "Lower casing: Turkish",
+ value: "Iİ",
+ expValue: "ıi",
+ comment: "<a href='#cmt_1'>See #1.</a>"
+ },
+
+ { attrs: {propercase: "true"},
+ desc: "Title/Proper casing: Latin",
+ value: "\u01F1abc",
+ expValue: "\u01F2abc",
+ comment: "<a href='#cmt_1'>See #1.</a>"
+ }
+ ]);
+
+ genFormatTestCases("White-space Detecting", "dijit.form.TextBox", [
+
+ { attrs: {trim: "true"},
+ desc: "Normal space & tab",
+ value: " abc\t\t\t",
+ expValue: "abc",
+ comment: ""
+ },
+
+ { attrs: {trim: "true"},
+ desc: "NO-BREAK SPACE",
+ value: "\u00A0abc\u00A0",
+ expValue: "abc",
+ comment: "Failed in IE. <a href='#cmt_2'>See #2.</a>"
+ },
+
+ { attrs: {trim: "true"},
+ desc: "EN QUAD",
+ value: "\u2000abc\u2000",
+ expValue: "abc",
+ comment: "Failed in IE. <a href='#cmt_2'>See #2.</a>"
+ },
+
+ { attrs: {trim: "true"},
+ desc: "IDEOGRAPHIC SPACE",
+ value: "\u3000abc\u3000",
+ expValue: "abc",
+ comment: "Failed in IE. <a href='#cmt_2'>See #2.</a>"
+ }
+
+
+ ]);
+
+ dojo.parser.parse();
+
+ })();
+ </script>
+
+ <h2 class="testTitle">Issues &amp; Comments </h2>
+ <a name="cmt_1"><h3 class="testTitle">Issue #1 <sup style="color:red">Not fixed. Avoid using this function of TextBox.</sup></h3></a>
+ <p>
+ Strictly speaking, all casing manipulation must use ICU case mapping rules (routine). However, the default JavaScript routines used by Dojo
+ do not support ICU case mapping rules in all browsers.
+ </p>
+
+ <a name="cmt_2"><h3 class="testTitle">Issue #2 <sup style="color:red">Not fixed. Avoid using this function of TextBox.</sup></h3></a>
+ <p>
+ Trimming must get rid of all Unicode characters with the white space property. However, the default JavaScript routines used by Dojo
+ do not support get character properties in some browsers like IE. Other browsers like Firefox might support trimming more white space
+ characters.
+ </p>
+
+ </body>
+</html>
+
+
diff --git a/includes/js/dijit/tests/i18n/time.html b/includes/js/dijit/tests/i18n/time.html
new file mode 100644
index 0000000..0a972b9
--- /dev/null
+++ b/includes/js/dijit/tests/i18n/time.html
@@ -0,0 +1,207 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>Test TextBox for Time</title>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, extraLocale: ['zh-cn','fr-fr','ja-jp','ar-eg','ru-ru','hi-in','en-us']"></script>
+ <script type="text/javascript" src="../../../dojo/currency.js"></script>
+ <script type="text/javascript" src="../../../dojo/number.js"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.form.ValidationTextBox");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.date.stamp");
+ dojo.require("dojo.date");
+ dojo.require("dojo.string");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ dojo.require("doh.runner");
+ </script>
+ <script src="test_i18n.js"></script>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ doh.register("t", getAllTestCases());
+ doh.run();
+ });
+ </script>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .title {
+ background-color:#ddd;
+ }
+
+ .hint {
+ background-color:#eee;
+ }
+
+ .testExample {
+ background-color:#fbfbfb;
+ padding:1em;
+ margin-bottom:1em;
+ border:1px solid #bfbfbf;
+ }
+
+ .dojoTitlePaneLabel label {
+ font-weight:bold;
+ }
+
+ td {white-space:nowrap}
+ </style>
+ <script>
+ dojo.declare(
+ "dijit.form.TimeTextBox",
+ dijit.form.ValidationTextBox,
+ {
+ regExpGen: dojo.date.locale.regexp,
+ format: dojo.date.locale.format,
+ parse: dojo.date.locale.parse,
+ value: new Date()
+ }
+ );
+
+ var tz_s = dojo.date.getTimezoneName(new Date());
+ if (!tz_s) {
+ var offset = new Date().getTimezoneOffset();
+ var tz = [
+ (offset <= 0 ? "+" : "-"),
+ dojo.string.pad(Math.floor(Math.abs(offset) / 60), 2),
+ dojo.string.pad(Math.abs(offset) % 60, 2)
+ ];
+ tz.splice(0, 0, "GMT");
+ tz.splice(3, 0, ":");
+ tz_s = tz.join("");
+ }
+
+ function gen4DateFormat(testCases, language, locale, date, short, shortCmt, medium, mediumCmt, long, longCmt, full, fullCmt) {
+ var tz_l = language.indexOf("hi") == 0 && dojo.number.normalizeDigitChars ?
+ dojo.number.normalizeDigitChars(tz_s, language) : tz_s;
+
+ short = short.replace(/UTC/, tz_l);
+ medium = medium.replace(/UTC/, tz_l);
+ long = long.replace(/UTC/g, tz_l);
+ full = full.replace(/UTC/, tz_l);
+
+ var shortDate = null;
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'short', selector:'time', localeDigit:true}" : "{formatLength:'short', selector:'time'}",
+ lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Short</b>",
+ value: typeof(date) == "string" ? date : shortDate = new Date(date.getYear(), date.getMonth(), date.getDay() - 5, date.getHours(), date.getMinutes()),
+ expValue: short,
+ comment: shortCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'medium', selector:'time', localeDigit:true}" : "{formatLength:'medium', selector:'time'}",
+ lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Medium</b>",
+ value: date,
+ expValue: medium,
+ comment: mediumCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'long', selector:'time', localeDigit:true}" : "{formatLength:'long', selector:'time'}",
+ lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Long</b>",
+ value: date,
+ expValue: long,
+ comment: longCmt
+ });
+ testCases.push({
+ attrs: {constraints: language.indexOf("hi") == 0 ? "{formatLength:'full', selector:'time', localeDigit:true}" : "{formatLength:'full', selector:'time'}",
+ lang: language},
+ desc: "Locale: <b>" + locale + "</b> Format: <b>Full</b>",
+ //value: typeof(date) == "string" || language.indexOf("fr") ? date : shortDate,
+ value: date,
+ expValue: full,
+ comment: fullCmt
+ });
+
+ date.processValue = function (value) {
+ return value ? new Date(1970, 0, 1, value.getHours(), value.getMinutes(), value.getSeconds()) : value;
+ };
+ if (shortDate) {
+ shortDate.processValue = date.processValue;
+ }
+ }
+ </script>
+ </head>
+
+ <body class="tundra">
+ <h1 class="testTitle">Dijit TextBox Globalization Test for Time</h1>
+
+ <h2 class="testTitle">Press the following button to start all test after this page is loaded.</h2>
+ <button id="startButton" onclick="startTest()">Start Test</button>
+ <p>
+ Before start this test, make sure the <b>dojo/cldr/nls</b> contains the data for "zh-cn", "fr-fr", "ja-jp", "ru-ru", "hi-in", "en-us" and "ar-eg". If not, convert these CLDR data and put them there.
+ </p>
+
+ <script>
+ (function() {
+ var testCases = [];
+ gen4DateFormat(testCases, "ru-ru", "ru_RU", "1970-01-01T15:25:35",
+ "15:25", "", "15:25:35", "", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "zh-cn", "zh_CN", "1970-01-01T15:25:35",
+ "下午3:25", "", "下午03:25:35", "", "下午03时25分35秒", "", "下午03时25分35秒 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "en-us", "en_US", "1970-01-01T15:25:35",
+ "3:25 PM", "", "3:25:35 PM", "", "3:25:35 PM UTC", "<a href='#cmt_1'>See #1.</a>", "3:25:35 PM UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "fr-fr", "fr_FR", "1970-01-01T15:25:35",
+ "15:25", "", "15:25:35", "", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "ja-jp", "ja_JP", "1970-01-01T15:25:35",
+ "15:25", "", "15:25:35", "", "15:25:35:UTC", "<a href='#cmt_1'>See #1.</a>", "15時25分35秒UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "ar-eg", "ar_EG", "1970-01-01T15:25:35",
+ "3:25 \u0645", "", "3:25:35 \u0645", "", "UTC 3:25:35 \u0645", "", "UTC 3:25:35 \u0645", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "hi-in", "hi_IN", "1970-01-01T15:25:35",
+ "१५:२५", "<a href='#cmt_2'>See #2.</a>", "१५:२५:३५", "<a href='#cmt_2'>See #2.</a>", "१५:२५:३५ UTC", "<a href='#cmt_1'>See #1.</a> <a href='#cmt_2'>See #2.</a>", "१५:२५:३५ UTC", "<a href='#cmt_1'>See #1.</a> <a href='#cmt_2'>See #2.</a>");
+ genFormatTestCases("Time Format", "dijit.form.TimeTextBox", testCases);
+
+ testCases = [];
+ gen4DateFormat(testCases, "ru-ru", "ru_RU", new Date(1970, 0, 1, 15, 25, 35),
+ "15:25", "", "15:25:35", "", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "zh-cn", "zh_CN", new Date(1970, 0, 1, 15, 25, 35),
+ "下午3:25", "<a href='#cmt_3'>See #3.</a>", "下午03:25:35", "<a href='#cmt_3'>See #3.</a>", "下午03时25分35秒", "<a href='#cmt_3'>See #3.</a>", "下午03时25分35秒 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "en-us", "en_US", new Date(1970, 0, 1, 15, 25, 35),
+ "3:25 PM", "", "3:25:35 PM", "", "3:25:35 PM UTC", "<a href='#cmt_1'>See #1.</a>", "3:25:35 PM UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "fr-fr", "fr_FR", new Date(1970, 0, 1, 15, 25, 35),
+ "15:25", "", "15:25:35", "", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>", "15:25:35 UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "ja-jp", "ja_JP", new Date(1970, 0, 1, 15, 25, 35),
+ "15:25", "", "15:25:35", "", "15:25:35:UTC", "<a href='#cmt_1'>See #1.</a>", "15時25分35秒UTC", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "ar-eg", "ar_EG", new Date(1970, 0, 1, 15, 25, 35),
+ "3:25 \u0645", "", "3:25:35 \u0645", "", "UTC 3:25:35 \u0645", "", "UTC 3:25:35 \u0645", "<a href='#cmt_1'>See #1.</a>");
+ gen4DateFormat(testCases, "hi-in", "hi_IN", new Date(1970, 0, 1, 15, 25, 35),
+ "१५:२५", "<a href='#cmt_2'>See #2.</a>", "१५:२५:३५", "<a href='#cmt_2'>See #2.</a>", "१५:२५:३५ UTC", "<a href='#cmt_1'>See #1.</a> <a href='#cmt_2'>See #2.</a>", "१५:२५:३५ UTC", "<a href='#cmt_1'>See #1.</a> <a href='#cmt_2'>See #2.</a>");
+ genValidateTestCases("Time Validate", "dijit.form.TimeTextBox", testCases);
+
+ dojo.parser.parse();
+ })();
+ </script>
+
+ <h2 class="testTitle">Issues &amp; Comments</h2>
+ <h3 class="testTitle"><a name="cmt_1">Issue #1 <sup style="color:blue">Fixed</sup></a></h3>
+ <p>
+ Currently Dojo do not support parsing for most "long" and "full" time format which have a timezone mark in it.
+ </p>
+
+ <h3 class="testTitle"><a name="cmt_2">Issue #2 <sup style="color:blue">Fixed: added a "localeDigit" to the options</sup></a></h3>
+ <p>
+ Strictly speaking, the data conversion must support non-European number characters in some locales like Arabic and Hindi.
+ For example, ICU formats a number data into Indic number characters by default in the Arabic locale.
+ However, currently Dojo does not support this feature (Dojo uses the default number conversion of the browser).
+ </p>
+
+ <h3 class="testTitle"><a name="cmt_3">Issue #3 <sup style="color:blue">Fixed</sup></a></h3>
+ <p>
+ This defect only occurs on the "zh-cn" locale. Dojo accepts "下午"(pm) in the textbox, but it automatically changes it to
+ "上午"(am) after the focus changed. The date value of the textbox is also changed.
+ </p>
+ <p>
+ The root cause of this issue is that the parser method's code assumes am/pm symbol always appears after the hour value.
+ But this is not true, for example, the pattern for "zh-cn" puts am/pm field before all the other fields.
+ </p>
+ </body>
+</html>
+
diff --git a/includes/js/dijit/tests/images/arrowSmall.gif b/includes/js/dijit/tests/images/arrowSmall.gif
new file mode 100644
index 0000000..8459ffa
--- /dev/null
+++ b/includes/js/dijit/tests/images/arrowSmall.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/copy.gif b/includes/js/dijit/tests/images/copy.gif
new file mode 100644
index 0000000..4df29cc
--- /dev/null
+++ b/includes/js/dijit/tests/images/copy.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/cut.gif b/includes/js/dijit/tests/images/cut.gif
new file mode 100644
index 0000000..9bdbf4a
--- /dev/null
+++ b/includes/js/dijit/tests/images/cut.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/flatScreen.gif b/includes/js/dijit/tests/images/flatScreen.gif
new file mode 100644
index 0000000..05edd72
--- /dev/null
+++ b/includes/js/dijit/tests/images/flatScreen.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/note.gif b/includes/js/dijit/tests/images/note.gif
new file mode 100644
index 0000000..0f921be
--- /dev/null
+++ b/includes/js/dijit/tests/images/note.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/paste.gif b/includes/js/dijit/tests/images/paste.gif
new file mode 100644
index 0000000..f236cbe
--- /dev/null
+++ b/includes/js/dijit/tests/images/paste.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/plus.gif b/includes/js/dijit/tests/images/plus.gif
new file mode 100644
index 0000000..97e7265
--- /dev/null
+++ b/includes/js/dijit/tests/images/plus.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/testsBodyBg.gif b/includes/js/dijit/tests/images/testsBodyBg.gif
new file mode 100644
index 0000000..4e0b4a7
--- /dev/null
+++ b/includes/js/dijit/tests/images/testsBodyBg.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/tube.gif b/includes/js/dijit/tests/images/tube.gif
new file mode 100644
index 0000000..b506513
--- /dev/null
+++ b/includes/js/dijit/tests/images/tube.gif
Binary files differ
diff --git a/includes/js/dijit/tests/images/tubeTall.gif b/includes/js/dijit/tests/images/tubeTall.gif
new file mode 100644
index 0000000..e4fdb8b
--- /dev/null
+++ b/includes/js/dijit/tests/images/tubeTall.gif
Binary files differ
diff --git a/includes/js/dijit/tests/layout/ContentPane.html b/includes/js/dijit/tests/layout/ContentPane.html
new file mode 100644
index 0000000..8853a3e
--- /dev/null
+++ b/includes/js/dijit/tests/layout/ContentPane.html
@@ -0,0 +1,577 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Test ContentPane</title>
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../css/dijitTests.css";
+
+ .box {
+ border: 1px solid black;
+ padding: 8px;
+ }
+
+ .dijitTestWidget {
+ border: 1px dashed red;
+ background-color: #C0E209 ;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit._Container");
+ dojo.require("dijit._Templated");
+ dojo.require("dijit.layout.StackContainer");
+
+ // create a do nothing, only for test widget
+ dojo.declare("dijit.TestWidget",
+ [dijit._Widget, dijit._Templated], {
+ templateString: "<span class='dijitTestWidget'></span>"
+ });
+
+
+ dojo.addOnLoad(function(){
+ doh.register("pane1",
+ [
+ {
+ name: "no_autoparse",
+ runTest: function(t){
+ if(dijit.byId("pane1")){
+ throw doh._AssertFailure("Page got autoparsed when it shouldn't");
+ }
+ }
+ }
+ ]
+ );
+
+ var pane2;
+
+ doh.registerGroup("pane2",
+ [
+ {
+ name: "clear_content",
+ setUp: function(t){
+ pane2 = new dijit.layout.ContentPane({
+ preventCache: true
+ }, dojo.byId("pane2"));
+ pane2.setContent();// pass undefined on purpose
+ },
+ runTest: function(t){
+ t.assertEqual(0, dijit._Container.prototype.getChildren.call(pane2).length);
+ t.assertEqual("", pane2.domNode.innerHTML)
+ }
+ },
+ {
+ name: "setContent_String",
+ setUp: function(){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ var msg = "<h3>a simple html string</h3>";
+ pane2.setContent(msg);
+ t.assertEqual(msg, pane2.domNode.innerHTML.toLowerCase());
+ }
+ },
+ {
+ name: "setContent_DOMNode",
+ setUp: function(t){
+ var div = dojo.doc.createElement('div');
+ div.innerHTML = "setContent( [DOMNode] )";
+ div.setAttribute('dojoType', 'dijit.TestWidget');
+ pane2.setContent(div);
+ },
+ runTest: function(t){
+ t.assertEqual(1, dijit._Container.prototype.getChildren.call(pane2).length);
+ },
+ tearDown: function(t){
+ pane2.setContent(); // clear content for next test
+ }
+ },
+ {
+ name: "setContent_NodeList",
+ setUp: function(t){
+ var div = dojo.doc.createElement('div');
+ div.innerHTML = "<div dojotype='dijit.TestWidget'>above</div>"
+ +"Testing!<div><p><span><b>Deep nested</b></span></p></div>"
+ +"<div dojotype='dijit.TestWidget'>below</div>";
+
+ var list = div.childNodes;
+ pane2.setContent(div.childNodes);
+ },
+ runTest: function(t){
+ t.assertEqual(2, dijit._Container.prototype.getChildren.call(pane2).length);
+
+ //regular DOM check
+ var children = pane2.domNode.childNodes;
+ t.assertEqual(4, children.length);
+ t.assertEqual("Testing!", children[1].nodeValue);
+ t.assertEqual("div", children[2].nodeName.toLowerCase());
+ t.assertEqual("<p><span><b>deep nested</b></span></p>", children[2].innerHTML.toLowerCase());
+ }
+ },
+ {
+ name: "setContent_dojo_NodeList",
+ setUp: function(t){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ var div = dojo.doc.createElement('div');
+ div.innerHTML = "<div dojotype='dijit.TestWidget'>above</div>"
+ +"Testing!<div><p><span><b>Deep nested</b></span></p></div>"
+ +"<div dojotype='dijit.TestWidget'>below</div>";
+
+ var list = new dojo.NodeList();
+ dojo.forEach(div.childNodes, function(n){
+ list.push(n.cloneNode(true));
+ });
+
+ pane2.setContent(list);
+ t.assertEqual(4, pane2.domNode.childNodes.length);
+ }
+ },
+ {
+ name: "extractContent",
+ runTest: function(t){
+ var def = pane2.extractContent;
+ t.assertFalse(def);
+
+ // test that it's actually working
+ pane2.extractContent = true;
+ pane2.setContent('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
+ +'"http://www.w3.org/TR/html4/strict.dtd">'
+ +'<html><head><style>body{font-weight:bold;}</style></head>'
+ +'<body>extractContent test</body></html>');
+
+ t.assertEqual("extractContent test", pane2.domNode.innerHTML);
+
+ // reset back to default
+ pane2.extractContent = def;
+ }
+ },
+
+ /////////////////////////////////////////////////////////////////////////
+ // We assume that our network connection has a maximum of 1.5 sec latency
+ /////////////////////////////////////////////////////////////////////////
+ {
+ name: "setHref_loading",
+ timeout: 1800,
+ setUp: function(t){
+ pane2.setHref('getResponse.php?messId=1');
+ },
+ runTest: function(t){
+ var d = new tests.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertEqual(1, dijit._Container.prototype.getChildren.call(pane2).length);
+ })
+ , 1500);
+ return d;
+ }
+ },
+ {
+ name: "setHref_then_cancel",
+ timeout: 2800,
+ setUp: function(t){
+ pane2.setContent();// clear previous
+ },
+ runTest: function(t){
+ var msg = "This should NEVER be seen!";
+ pane2.setHref('getResponse.php?delay=1000&message='+encodeURI(msg));
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertFalse(pane2.domNode.innerHTML == msg);
+ }
+ ), 2500);
+
+ pane2.cancel();
+
+ return d;
+ }
+ },
+ {
+ // test that setHref cancels a inflight setHref
+ name: "setHref_cancels_previous_setHref",
+ timeout: 2800,
+ setUp: function(t){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ var msgCanceled = "This should be canceled";
+ pane2.setHref("getResponse.php?delay=1000&message="+encodeURI(msgCanceled));
+
+ var msg = "This message should win over the previous";
+ setTimeout(function(){
+ pane2.setHref("getResponse.php?message="+encodeURI(msg));
+ }, 900);
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertEqual(msg, pane2.domNode.innerHTML);
+ }
+ ), 2500);
+ return d;
+ }
+ },
+ {
+ name: "setContent_cancels_setHref",
+ timeout: 2800,
+ setUp: function(t){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ var msgCanceled = "This message be canceled";
+ pane2.setHref("getResponse.php?delay=1000&message="+encodeURI(msgCanceled));
+
+ var msg = "This message should win over the inflight one";
+ setTimeout(function(){
+ pane2.setContent(msg);
+ }, 900);
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertEqual(msg, pane2.domNode.innerHTML);
+ }
+ ), 2500);
+ return d;
+ }
+ },
+ {
+ name: "refresh",
+ timeout: 1900,
+ setUp: function(t){
+ pane2.setHref("getResponse.php?message="+encodeURI('initial load'));
+ },
+ runTest: function(t){
+ var msg = 'refreshed load'
+ setTimeout(function(){
+ pane2.href = "getResponse.php?message="+encodeURI(msg);
+ pane2.refresh();
+ }, 100);
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertEqual(msg, pane2.domNode.innerHTML);
+ }
+ ), 1600);
+ return d;
+
+ }
+ },
+ {
+ name: "isLoaded",
+ timeout: 1800,
+ setUp: function(t){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ t.assertTrue(pane2.isLoaded);
+
+ pane2.setHref("getResponse.php?delay=300&message=test");
+
+ t.assertFalse(pane2.isLoaded);
+
+ var ilObj = {}; // a object to get a reference instead of copy
+
+ // probe after 200ms
+ setTimeout(function(){
+ ilObj.probed = pane2.isLoaded;
+ }, 200);
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertTrue(pane2.isLoaded);
+ t.assertFalse(ilObj.probed);
+ }
+ ), 1500);
+ return d;
+ }
+ },
+ {
+ // test that we does'nt load a response if we are hidden
+ name: "wait_with_load_when_domNode_hidden",
+ timeout: 1800,
+ setUp: function(t){
+ pane2.domNode.style.display = 'none';
+ pane2.setContent();
+ },
+ runTest: function(t){
+ pane2._msg = "This text should not be loaded until after widget is shown";
+ pane2.setHref("getResponse.php?message="+encodeURI(pane2._msg));
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertFalse(pane2.domNode.innerHTML == pane2._msg);
+ }
+ ), 1500);
+ return d;
+ },
+ tearDown: function(t){
+ pane2.domNode.style.display = "";
+ }
+ },
+ {
+ name: "onDownloadError",
+ timeout: 1800,
+ setUp: function(t){
+ pane2.setContent();
+ },
+ runTest: function(t){
+ var res = {};
+ var msg = "Error downloading modified message";
+ var orig = pane2.onDownloadError;
+
+
+ pane2.onDownloadError = function(){
+ return msg;
+ }
+
+ this.onError = function(e){
+ res.onError = true;
+ res.onError_Arg = !!e;
+ return "This message should be ignored as it gets invoked by dojo.connect";
+ }
+
+ var evtHandle = dojo.connect(pane2, 'onDownloadError', this, 'onError');
+
+ // test onDownloadError
+ pane2.setHref('nonexistant');
+
+ // do the test
+ var d = new t.Deferred();
+ setTimeout(function(){
+ try{
+ if(!res.onError){
+ d.errback(new doh._AssertFailure("onDownloadError was never invoked"));
+ }
+ if(!res.onError_Arg){
+ d.errback(new doh._AssertFailure("onDownloadError did'nt get any argument on invokation"));
+ }
+ if(pane2.domNode.innerHTML != msg){
+ d.errback(new doh._AssertFailure("custom errortext not set"));
+ }
+ d.callback(true);
+ }catch(e){
+ d.errback(e);
+ }finally{
+ // reset to default
+ dojo.disconnect(evtHandle);
+ pane2.onDownloadError = orig;
+ }
+ }, 1500);
+
+ return d;
+ }
+ },
+ {
+ name: "onLoad|Unload_onDownloadStart|End",
+ timeout: 2400,
+ setUp:function(t){
+ pane2.setContent();
+ },
+ runTest:function(t){
+ var obj = {
+ start:function(){
+ this.start_called = 1;
+ // check that custom message gets set
+ setTimeout(function(){
+ obj.start_msg = (pane2.domNode.innerHTML == msg);
+ }, 20);
+ },
+ end: function(){ this.end_called = 1; },
+ load: function(){ this.load_called = 1; },
+ unload: function(){ this.unload_called = 1; }
+ };
+
+ //set custom message
+ var origStart = pane2.onDownloadStart;
+ var msg = "custom downloadstart message";
+ pane2.onDownloadStart = function(){ return msg; };
+
+ var startHandler = dojo.connect(pane2, 'onDownloadStart', obj, 'start');
+ var endHandler = dojo.connect(pane2, 'onDownloadEnd', obj, 'end');
+ var loadHandler = dojo.connect(pane2, 'onLoad', obj, 'load');
+ var unloadHandler = dojo.connect(pane2, 'onUnload', obj, 'unload');
+
+ pane2.setHref('getResponse.php?delay=400');
+
+ var d = new t.Deferred();
+ setTimeout(function(){
+ try{
+ if(!obj.start_called){
+ d.errback(new doh._AssertFailure('onDownloadStart not called'));
+ }
+ if(!obj.start_msg){
+ d.errback(new doh._AssertFailure('custom download message not set'));
+ }
+ if(!obj.end_called){
+ d.errback(new doh._AssertFailure('onDownloadEnd not called'));
+ }
+ if(!obj.unload_called){
+ d.errback(new doh._AssertFailure('onUnload not called'));
+ }
+ if(!obj.load_called){
+ d.errback(new doh._AssertFailure('onLoad not called'));
+ }
+ d.callback(true);
+ }catch(e){
+ d.errback(e);
+ }finally{
+ dojo.disconnect(endHandler);
+ dojo.disconnect(startHandler);
+ dojo.disconnect(unloadHandler);
+ dojo.disconnect(loadHandler);
+
+ pane2.onDownloadStart = origStart;
+ }
+ }, 1900);
+
+ return d;
+ }
+ }
+
+ ]
+ );
+
+ var pane3, st, tmp;
+
+ doh.registerGroup("child_to_StackContainer",
+ [
+ {
+ // TODO: this test should be moved to registerGroup setUp when #3504 is fixed
+ // We actually dont need to test anything here, just setUp
+ name: "setUp_StackContainer",
+ setUp:function(t){
+ st = dojo.byId('stackcontainer');
+ dojo.addClass(st, 'box');
+ st = new dijit.layout.StackContainer({}, st);
+
+ st.addChild(new dijit.TestWidget());
+ pane3 = new dijit.layout.ContentPane({
+ href:'getResponse.php?delay=300&message=Loaded!',
+ preventCache: true
+ }, dojo.doc.createElement('div'));
+ st.addChild(pane3);
+
+ pane3.startup(); // starts the ContentPane
+ },
+ runTest:function(t){
+ t.assertTrue(st);
+ t.assertEqual(2, st.getChildren().length);
+ }
+ },
+ {
+ name: "preload_false_by_default",
+ runTest: function(t){
+ t.assertFalse(pane3.isLoaded);
+ t.assertEqual('', pane3.domNode.innerHTML);
+ }
+ },
+ {
+ name: "startLoad when selected",
+ timeout: 2100,
+ runTest: function(t){
+ st.selectChild(pane3);
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(
+ function(){
+ t.assertTrue(pane3.isLoaded);
+ t.assertEqual('Loaded!', pane3.domNode.innerHTML);
+ }
+ ), 1800);
+
+ return d;
+ }
+ },
+ {
+ name: "refreshOnShow",
+ timeout: 2100,
+ setUp: function(t){
+ tmp = {
+ onUnload: function(){ this._unload_fired = 1; },
+ onLoad: function(){ this._load_fired = 1; }
+ };
+ tmp.unload = dojo.connect(pane3, 'onUnload', tmp, 'onUnload');
+ tmp.load = dojo.connect(pane3, 'onLoad', tmp, 'onLoad');
+
+ pane3.refreshOnShow = true;
+ },
+ runTest: function(t){
+ var d = new t.Deferred();
+ st.back();
+ st.forward();
+
+ setTimeout(d.getTestCallback(function(){
+ t.assertTrue(tmp._unload_fired);
+ t.assertTrue(tmp._load_fired);
+ t.assertEqual('Loaded!', pane3.domNode.innerHTML);
+ }), 1800);
+
+ return d;
+ },
+ tearDown: function(){
+ dojo.disconnect(tmp.unload);
+ dojo.disconnect(tmp.load);
+ pane3.refreshOnShow = pane3.constructor.prototype.refreshOnShow;
+ }
+ },
+ {
+ name: "downloadTriggeredOnStartup",
+ timeout: 1800,
+ runTest: function(t){
+ var href = 'getResponse.php?message=Loaded!'
+ var pane4 = new dijit.layout.ContentPane({
+ href:href,
+ preventCache: true
+ }, dojo.doc.createElement('div'));
+
+ dojo.place(pane4.domNode, pane3.domNode, 'after');
+
+ pane4.startup(); // parser should call startup when djConfig.parseOnLoad=true
+
+ var d = new t.Deferred();
+ setTimeout(d.getTestCallback(function(){
+ t.assertEqual('Loaded!', pane4.domNode.innerHTML);
+ pane4.destroy();
+ }), 1500);
+ return d;
+ }
+ }
+ ]
+ );
+
+ doh.run();
+ });
+ </script>
+</head>
+<body class="tundra">
+ <h2>dijit.layout.ContentPane test</h2>
+ <h3>Test designed to run on localhost (minimize impact from network latency)</h3>
+
+ <h4>This should NOT be parsed automatically</h4>
+ <div dojoType="dijit.layout.ContentPane" class="box" hasShadow="true" id="pane1">
+ <div dojoType='dijit.TestWidget'>If this has a different background and a red border, the page parsed when it shouldn't</div>
+ </div>
+ <br/><h3>Testing ContentPane</h3>
+ <div id='pane2' class='box'>
+ Even tough the entire page isn't scanned for widgets,
+ any sub widgets of a ContentPane will be created when a ContentPane is created<br/>
+ <span id="zero" dojoType='dijit.TestWidget'>This should have a backgroundcolor and a border</span>
+ <div id="one" dojoType="dijit._Widget"></div>
+ <div id="two" dojoType="dijit._Widget"></div>
+ <div id="three" dojoType="dijit._Widget"></div>
+ </div>
+ <br/><br/>
+ <div id='stackcontainer'></div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/ContentPane.js b/includes/js/dijit/tests/layout/ContentPane.js
new file mode 100644
index 0000000..c0b53bc
--- /dev/null
+++ b/includes/js/dijit/tests/layout/ContentPane.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.layout.ContentPane"] = true;
+dojo.provide("dijit.tests.layout.ContentPane");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.layout.ContentPane", dojo.moduleUrl("dijit", "tests/layout/ContentPane.html"), 30000);
+}
+
+}
diff --git a/includes/js/dijit/tests/layout/combotab.html b/includes/js/dijit/tests/layout/combotab.html
new file mode 100644
index 0000000..c881761
--- /dev/null
+++ b/includes/js/dijit/tests/layout/combotab.html
@@ -0,0 +1,11 @@
+<div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../_data/states.json"></div>
+State:
+<span id="editable" dojoType="dijit.InlineEditBox" editor="dijit.form.ComboBox"
+ editorParams="{value: 'California', store: stateStore, searchAttr: 'name', promptMessage: 'Please enter a state'}">
+ <script type="dojo/connect" event="onChange">
+ // connect to editable onChange event, Note that we dont need to disconnect
+ console.log('User selected:'+this.getValue());
+ </script>
+</span>
+
diff --git a/includes/js/dijit/tests/layout/doc0.html b/includes/js/dijit/tests/layout/doc0.html
new file mode 100644
index 0000000..4c3f252
--- /dev/null
+++ b/includes/js/dijit/tests/layout/doc0.html
@@ -0,0 +1,12 @@
+<h1>Document 0</h1>
+This document has <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+(to check we're copying children around properly).<br />
+Also it's got a widget, a combo box:<br>
+<select dojoType="dijit.form.ComboBox">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+</select>
+And a button too:
+<button dojoType="dijit.form.Button">hello!</button>
+Here's some text that comes AFTER the button.
diff --git a/includes/js/dijit/tests/layout/doc1.html b/includes/js/dijit/tests/layout/doc1.html
new file mode 100644
index 0000000..2bff8c5
--- /dev/null
+++ b/includes/js/dijit/tests/layout/doc1.html
@@ -0,0 +1,13 @@
+<!-- Used from test_RemotePane.html -->
+
+<h1> Document 1</h1>
+
+<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus risus. Praesent eu lacus et enim laoreet sollicitudin. Quisque mollis mi a lectus. Cras ante. Aliquam tempus justo laoreet justo. Vestibulum egestas feugiat nisi. Nulla ultrices consequat felis. Curabitur dignissim augue vel enim. Fusce tempus tempor mauris. Praesent suscipit pede in nunc. Duis mi neque, malesuada non, volutpat et, nonummy et, ante. Aliquam neque. Nulla rhoncus, turpis eget mattis molestie, magna nulla dictum ligula, quis tempor odio justo vel pede. Donec sit amet tellus. Phasellus sapien. Nulla id massa at nunc condimentum fringilla. Fusce suscipit ipsum et lorem consequat pulvinar. Quisque lacinia sollicitudin tellus.</p>
+
+<p>Nulla massa lectus, porttitor vitae, dignissim vel, iaculis eget, mi. Vestibulum sed lorem. Nullam convallis elit id leo. Aliquam est purus, rutrum at, sodales non, nonummy a, justo. Proin at diam vel nibh dictum rhoncus. Duis nisl. Etiam orci. Integer hendrerit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In ac erat. Sed velit orci, sodales quis, commodo ut, elementum sed, nibh. Cras mattis vulputate nisl. Mauris eu nulla sed orci dignissim laoreet. Morbi commodo, est vitae pharetra ullamcorper, ante nisl ultrices velit, sit amet vulputate turpis elit id lacus. Vestibulum diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
+
+<p>Praesent rutrum nunc quis felis. Morbi tempor. Quisque porta magna imperdiet magna. Ut gravida, ipsum eu euismod consectetuer, nisl lectus posuere diam, vel dignissim elit nisi sit amet lorem. Curabitur non nunc. Morbi metus. Nulla facilisi. Sed et ante. Etiam ac lectus. Duis tristique molestie sem. Pellentesque nec quam. Nullam pellentesque ullamcorper sem.</p>
+
+<p>Duis ut massa eget arcu porttitor pharetra. Curabitur malesuada nisi id eros. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Vivamus massa. Donec quis justo ut tortor faucibus suscipit. Vivamus commodo neque eget nulla. Donec imperdiet lacus condimentum justo. In sollicitudin magna vitae libero. Curabitur scelerisque libero et eros imperdiet cursus. Maecenas adipiscing. Integer imperdiet, neque ut fringilla semper, leo nisi tincidunt enim, id accumsan leo nisi a libero. Morbi rutrum hendrerit eros. Vestibulum eget augue vel urna congue faucibus.</p>
+
+<p>Morbi ante sapien, consequat non, consectetuer vitae, pharetra non, dui. Cras tempus posuere quam. Vestibulum quis neque. Duis lobortis urna in elit. Aliquam non tellus. Etiam nisi eros, posuere vel, congue id, fringilla in, risus. Duis semper rutrum risus. Nullam felis massa, lobortis sit amet, posuere tempor, mattis id, tellus. Nulla id arcu interdum risus commodo tincidunt. Vivamus pretium pulvinar pede. Vivamus eget erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam bibendum, enim eu venenatis tempor, nunc elit convallis tortor, sit amet vulputate turpis arcu eu pede. Praesent molestie, lacus sed vehicula convallis, enim pede fringilla nunc, at porttitor justo ante a diam. Nunc magna eros, interdum vel, varius eget, volutpat eu, orci. Nunc nec mauris. Nulla facilisi. Vivamus dictum elementum risus. Nam placerat arcu.</p>
diff --git a/includes/js/dijit/tests/layout/doc2.html b/includes/js/dijit/tests/layout/doc2.html
new file mode 100644
index 0000000..1173b29
--- /dev/null
+++ b/includes/js/dijit/tests/layout/doc2.html
@@ -0,0 +1,13 @@
+<!-- Used from test_RemotePane.html -->
+
+<h1> Document 2</h1>
+
+<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus risus. Praesent eu lacus et enim laoreet sollicitudin. Quisque mollis mi a lectus. Cras ante. Aliquam tempus justo laoreet justo. Vestibulum egestas feugiat nisi. Nulla ultrices consequat felis. Curabitur dignissim augue vel enim. Fusce tempus tempor mauris. Praesent suscipit pede in nunc. Duis mi neque, malesuada non, volutpat et, nonummy et, ante. Aliquam neque. Nulla rhoncus, turpis eget mattis molestie, magna nulla dictum ligula, quis tempor odio justo vel pede. Donec sit amet tellus. Phasellus sapien. Nulla id massa at nunc condimentum fringilla. Fusce suscipit ipsum et lorem consequat pulvinar. Quisque lacinia sollicitudin tellus.</p>
+
+<p>Nulla massa lectus, porttitor vitae, dignissim vel, iaculis eget, mi. Vestibulum sed lorem. Nullam convallis elit id leo. Aliquam est purus, rutrum at, sodales non, nonummy a, justo. Proin at diam vel nibh dictum rhoncus. Duis nisl. Etiam orci. Integer hendrerit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In ac erat. Sed velit orci, sodales quis, commodo ut, elementum sed, nibh. Cras mattis vulputate nisl. Mauris eu nulla sed orci dignissim laoreet. Morbi commodo, est vitae pharetra ullamcorper, ante nisl ultrices velit, sit amet vulputate turpis elit id lacus. Vestibulum diam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
+
+<p>Praesent rutrum nunc quis felis. Morbi tempor. Quisque porta magna imperdiet magna. Ut gravida, ipsum eu euismod consectetuer, nisl lectus posuere diam, vel dignissim elit nisi sit amet lorem. Curabitur non nunc. Morbi metus. Nulla facilisi. Sed et ante. Etiam ac lectus. Duis tristique molestie sem. Pellentesque nec quam. Nullam pellentesque ullamcorper sem.</p>
+
+<p>Duis ut massa eget arcu porttitor pharetra. Curabitur malesuada nisi id eros. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Vivamus massa. Donec quis justo ut tortor faucibus suscipit. Vivamus commodo neque eget nulla. Donec imperdiet lacus condimentum justo. In sollicitudin magna vitae libero. Curabitur scelerisque libero et eros imperdiet cursus. Maecenas adipiscing. Integer imperdiet, neque ut fringilla semper, leo nisi tincidunt enim, id accumsan leo nisi a libero. Morbi rutrum hendrerit eros. Vestibulum eget augue vel urna congue faucibus.</p>
+
+<p>Morbi ante sapien, consequat non, consectetuer vitae, pharetra non, dui. Cras tempus posuere quam. Vestibulum quis neque. Duis lobortis urna in elit. Aliquam non tellus. Etiam nisi eros, posuere vel, congue id, fringilla in, risus. Duis semper rutrum risus. Nullam felis massa, lobortis sit amet, posuere tempor, mattis id, tellus. Nulla id arcu interdum risus commodo tincidunt. Vivamus pretium pulvinar pede. Vivamus eget erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam bibendum, enim eu venenatis tempor, nunc elit convallis tortor, sit amet vulputate turpis arcu eu pede. Praesent molestie, lacus sed vehicula convallis, enim pede fringilla nunc, at porttitor justo ante a diam. Nunc magna eros, interdum vel, varius eget, volutpat eu, orci. Nunc nec mauris. Nulla facilisi. Vivamus dictum elementum risus. Nam placerat arcu.</p>
diff --git a/includes/js/dijit/tests/layout/getResponse.php b/includes/js/dijit/tests/layout/getResponse.php
new file mode 100644
index 0000000..d695a4b
--- /dev/null
+++ b/includes/js/dijit/tests/layout/getResponse.php
@@ -0,0 +1,57 @@
+<?php
+ // this just bounces a message as a response, and optionally emulates network latency.
+
+ // default delay is 0 sec, to change:
+ // getResponse.php?delay=[Int milliseconds]
+
+ // to change the message returned
+ // getResponse.php?mess=whatever%20string%20you%20want.
+
+ // to select a predefined message
+ // getResponse.php?messId=0
+
+ error_reporting(E_ALL ^ E_NOTICE);
+
+ $delay = 1; // 1 micro second to avoid zero division in messId 2
+ if(isset($_GET['delay']) && is_numeric($_GET['delay'])){
+ $delay = (intval($_GET['delay']) * 1000);
+ }
+
+ if(isset($_GET['messId']) && is_numeric($_GET['messId'])){
+ switch($_GET['messId']){
+ case 0:
+ echo "<h3>WARNING This should NEVER be seen, delayed by 2 sec!</h3>";
+ $delay = 2;
+ break;
+ case 1:
+ echo "<div dojotype='dijit.TestWidget'>Testing setHref</div>";
+ break;
+ case 2:
+ echo "<div dojotype='dijit.TestWidget'>Delayed setHref test</div>
+ <div dojotype='dijit.TestWidget'>Delayed by " . ($delay/1000000) . " sec.</div>";
+ break;
+ case 3:
+ echo "IT WAS the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way -- in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only";
+ break;
+ case 4:
+ echo "There were a king with a large jaw and a queen with a plain face, on the throne of England; there were a king with a large jaw and a queen with a fair face, on the throne of France. In both countries it was clearer than crystal to the lords of the State preserves of loaves and fishes, that things in general were settled for ever.";
+ break;
+ case 5:
+ echo "It was the year of Our Lord one thousand seven hundred and seventy- five. Spiritual revelations were conceded to England at that favoured period, as at this. Mrs. Southcott had recently attained her five-and- twentieth blessed birthday, of whom a prophetic private in the Life Guards had heralded the sublime appearance by announcing that arrangements were made for the swallowing up of London and Westminster. Even the Cock-lane ghost had been laid only a round dozen of years, after rapping out its messages, as the spirits of this very year last past (supernaturally deficient in originality) rapped out theirs. Mere messages in the earthly order of events had lately come to the English Crown and People, from a congress of British subjects in America:";
+ break;
+ default:
+ echo "unknown messId:{$_GET['messId']}";
+ }
+ }
+
+ if(isset($_GET['bounceGetStr']) && $_GET['bounceGetStr']){
+ echo "<div id='bouncedGetStr'>{$_SERVER["QUERY_STRING"]}</div>";
+ }
+
+ if(isset($_GET['message']) && $_GET['message']){
+ echo $_GET['message'];
+ }
+
+ usleep($delay);
+
+?>
diff --git a/includes/js/dijit/tests/layout/tab1.html b/includes/js/dijit/tests/layout/tab1.html
new file mode 100644
index 0000000..a37b927
--- /dev/null
+++ b/includes/js/dijit/tests/layout/tab1.html
@@ -0,0 +1,6 @@
+
+<h1>Tab 1</h1>
+
+<p>I am tab 1. I was loaded externally. <a href="http://www.weba11y.com">WebA11y</a>(something to get focus)</p>
+
+<div label="foo!">blah</div>
diff --git a/includes/js/dijit/tests/layout/tab2.html b/includes/js/dijit/tests/layout/tab2.html
new file mode 100644
index 0000000..ed1ad76
--- /dev/null
+++ b/includes/js/dijit/tests/layout/tab2.html
@@ -0,0 +1,3 @@
+<h1>Tab 2</h1>
+
+<p>I am tab 2. I was loaded externally as well.</p>
diff --git a/includes/js/dijit/tests/layout/tab3.html b/includes/js/dijit/tests/layout/tab3.html
new file mode 100644
index 0000000..68dca6c
--- /dev/null
+++ b/includes/js/dijit/tests/layout/tab3.html
@@ -0,0 +1,39 @@
+<div dojoType="dijit.layout.TabContainer">
+ <div dojoType="dijit.layout.ContentPane" title="Subtab #1">
+ <p>This is a nested tab container BUT loaded via an href.</p>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" title="Subtab #2">
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+ imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+ nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+ massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+ pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+ quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+ felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+ quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+ rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+ semper velit ante id metus. Praesent massa dolor, porttitor sed,
+ pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+ tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ <p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+ nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+ lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+ est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+ dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+ nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+ pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+ sociosqu ad litora torquent per conubia nostra, per inceptos
+ hymenaeos.
+ </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/includes/js/dijit/tests/layout/tab4.html b/includes/js/dijit/tests/layout/tab4.html
new file mode 100644
index 0000000..de9cd3c
--- /dev/null
+++ b/includes/js/dijit/tests/layout/tab4.html
@@ -0,0 +1,40 @@
+<div dojoType="dijit.layout.SplitContainer" orientation="vertical">
+ <div dojoType="dijit.layout.ContentPane" title="split #1">
+ <p>Top of split container loaded via an href.</p>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" title="split #2">
+ <p>Bottom of split container loaded via an href.</p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+ imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+ nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+ massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+ pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+ quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+ felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+ quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+ rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+ semper velit ante id metus. Praesent massa dolor, porttitor sed,
+ pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+ tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ <p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+ nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+ lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+ est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+ dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+ nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+ pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+ sociosqu ad litora torquent per conubia nostra, per inceptos
+ hymenaeos.
+ </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/includes/js/dijit/tests/layout/test_AccordionContainer.html b/includes/js/dijit/tests/layout/test_AccordionContainer.html
new file mode 100644
index 0000000..d8351e7
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_AccordionContainer.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Accordion Widget Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <!-- uncomment for profiling
+ <script type="text/javascript"
+ src="../../../dojo/_base/html.js"></script>
+ <script type="text/javascript"
+ src="../../base/Layout.js"></script>
+ -->
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ var accordion, pane4;
+
+ function init(){
+ accordion = new dijit.layout.AccordionContainer({}, dojo.byId("accordionShell"));
+ dojo.forEach([ "pane 1", "pane 2", "pane 3" ], function(title, i){
+ // add a node that will be promoted to the content widget
+ var refNode = document.createElement("span");
+ refNode.innerHTML = "this is " + title;
+ document.body.appendChild(refNode);
+ var content = new dijit.layout.AccordionPane({title: title, selected: i==1}, refNode);
+ console.debug("adding content pane " + content.id);
+ accordion.addChild(content);
+ });
+ accordion.startup();
+ var refNode = document.createElement("span");
+ var title = "pane 4";
+ refNode.innerHTML = "this is " + title;
+ accordion.addChild(pane4=new dijit.layout.AccordionPane({title: title}, refNode));
+ }
+
+ dojo.addOnLoad(init);
+
+ function destroyChildren(){
+ accordion.destroyDescendants();
+ }
+ function selectPane4(){
+ accordion.selectChild(pane4);
+ }
+ </script>
+</head>
+<body style="padding: 50px;">
+
+ <h1 class="testTitle">AccordionContainer Tests</h1>
+
+ <h2>Accordion from markup:</h2>
+ <p>HTML before</p>
+ <p>HTML before</p>
+ <p>HTML before</p>
+
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ style="float: left; margin-right: 30px; width: 400px; height: 300px; overflow: hidden">
+ <div dojoType="dijit.layout.AccordionPane" title="a">
+ Hello World
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="b">
+ <p>
+ Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin
+ suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh.
+ Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris,
+ bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam
+ aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia
+ ac, vehicula laoreet, elit. Sed interdum augue sit amet quam
+ dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec
+ quam.
+ </p>
+ <p>
+ Sed arcu magna, molestie at, <input value="fringilla in, sodales"/> eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </p>
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="c">
+ <p>The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.</p>
+ </div>
+ </div>
+
+ <p style="clear: both;">HTML after</p>
+ <p>HTML after</p>
+ <p>HTML after</p>
+ <p></p>
+ <p>Accordion with widgets</p>
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ style="float: left; margin-right: 30px; width: 400px; height: 300px; overflow: hidden">
+ <div dojoType="dijit.layout.AccordionPane" selected="true"
+ title="Pane 1" >
+ <select>
+ <option>red</option>
+ <option>blue</option>
+ <option>green</option>
+ </select>
+ <p>
+ Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin
+ suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh.
+ Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris,
+ bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam
+ aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia
+ ac, vehicula laoreet, elit. Sed interdum augue sit amet quam
+ dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec
+ quam.
+ </p>
+ <p>
+ Sed arcu magna, molestie at, fringilla in, sodales eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </p>
+ </div>
+
+ <!-- test lazy loading -->
+ <div dojoType="dijit.layout.AccordionPane" id="lazyLoadPane" title="Pane 2 (lazy load)" href="tab1.html"></div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Pane 3 (split pane)">
+ <div dojoType="dijit.layout.BorderContainer" style="height:100%; width:100%">
+ <div dojoType="dijit.layout.ContentPane" region="left" style="width:50%" splitter="true">
+ 1Sed arcu magna, molestie at, fringilla in, sodales eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ 2Sed arcu magna, molestie at, fringilla in, sodales eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <h2>Programatically created:</h2>
+ <button onclick="destroyChildren();">destroy children</button>
+ <button onclick="selectPane4();">select pane 4</button>
+ <br>
+
+ <div id="accordionShell" style="width: 400px; height: 400px;"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_BorderContainer.html b/includes/js/dijit/tests/layout/test_BorderContainer.html
new file mode 100644
index 0000000..29fae01
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_BorderContainer.html
@@ -0,0 +1,163 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.layout.BorderContainer Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ .dijitContentPane:focus { color: cyan; font-weight: bold }
+ body { margin-left: 20px }
+
+ #mondrian .dijitSplitter { border: 0; background: black !important }
+ #mondrian .dijitSplitterH { height: 10px }
+ #mondrian .dijitSplitterV { width: 10px }
+ #mondrian .dijitSplitterThumb { display: none }
+ #mondrian .dijitSplitterActive { background-color: blue }
+ #mondrian SPAN { display: none }
+ #mondrian:hover SPAN { display: inline }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.FilteringSelect");
+
+ function togglePanel(button, id){
+ var leftPanel = dijit.byId(id);
+ if(leftPanel){
+ dijit.byId('border1').removeChild(leftPanel);
+ leftPanel.destroy();
+ button.innerHTML='Add left panel';
+ }else{
+ var container = dijit.byId('border1');
+ var div = dojo.doc.createElement('div');
+ div.innerHTML='left';
+ container.domNode.appendChild(div);
+ leftPanel = new dijit.layout.ContentPane({id: id, region:'left', style:'background-color: #acb386; width:100px', splitter:true, minSize:50, maxSize:150}, div);
+ dijit.byId('border1').addChild(leftPanel);
+ button.innerHTML='Remove left panel';
+ }
+ }
+ </script>
+</head>
+<body>
+
+ <h2 class="testTitle">dijit.layout.BorderContainer tests</h2>
+ <p>Headline layout (default), left is constrained - min:50, max:150</p>
+
+ <div id="border1" dojoType="dijit.layout.BorderContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;">
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; border: 15px black solid; height: 100px;" splitter="true">
+ top bar
+ </div>
+ <div id="border1-left" dojoType="dijit.layout.ContentPane" region="left" style="background-color: #acb386; border: 10px green solid; width: 100px;" splitter="true" minSize="50" maxSize="150">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 30px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="right" style="background-color: #acb386; width: 100px;">
+ right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;" splitter="true">
+ bottom bar
+ </div>
+ </div>
+
+ <button onClick="togglePanel(this, 'border1-left')">Remove left panel</button>
+ <br />
+
+ <p>Sidebar layout, BiDi sensitive, liveSplitters: false</p>
+
+ <div dojoType="dijit.layout.BorderContainer" design="sidebar" liveSplitters="false"
+ style="border: 20px solid black; width: 90%; height: 300px; padding: 10px;">
+ <div dojoType="dijit.layout.ContentPane" region="leading" style="background-color: #acb386; width: 100px;">
+ leading
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;" splitter="true">
+ bottom bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="trailing" style="background-color: #acb386; width: 100px;" splitter="true">
+ trailing
+ </div>
+ </div>
+
+ <br />
+ <p>Vertical panels only with splitters</p>
+
+ <div dojoType="dijit.layout.BorderContainer" design="sidebar"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;">
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;" splitter="true">
+ top bar
+ </div>
+
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;" splitter="true">
+ bottom bar
+ </div>
+ </div>
+
+ <br />
+ <p>More fun with layouts</p>
+
+ <div id="mondrian" dojoType="dijit.layout.BorderContainer" design="sidebar" persist="true" style="height: 300px; width: 400px">
+ <div dojoType="dijit.layout.ContentPane" region="top" style="height: 100px" splitter="true">
+ <div dojoType="dijit.layout.BorderContainer" persist="true" style="height: 100px; width: 100%">
+ <div dojoType="dijit.layout.ContentPane" region="leading" style="width: 125px" splitter="true"><span>top a</span></div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: yellow" splitter="true"><span>top b</span></div>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="height: 100px" splitter="true">
+ <div dojoType="dijit.layout.BorderContainer" persist="true" style="height: 100px; width: 100%">
+ <div dojoType="dijit.layout.ContentPane" region="top" style="height: 40px" splitter="true"><span>bottom c</span></div>
+ <div dojoType="dijit.layout.ContentPane" region="center"><span>bottom d</span></div>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="leading" style="width: 100px" splitter="true">
+ <div dojoType="dijit.layout.BorderContainer" persist="true" style="height: 300px; width: 100%">
+ <div dojoType="dijit.layout.ContentPane" region="center"><span>leading e</span></div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="height: 100px; background-color: red" splitter="true"><span>leading f</span></div>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="trailing" style="width: 100px" splitter="true"><span>trailing g</span></div>
+ </div>
+
+ <br />
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_BorderContainer_complex.html b/includes/js/dijit/tests/layout/test_BorderContainer_complex.html
new file mode 100644
index 0000000..784171c
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_BorderContainer_complex.html
@@ -0,0 +1,178 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.layout.BorderContainer Test - complex layout</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Editor");
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.LinkPane");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.SplitContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.FilteringSelect");
+ </script>
+</head>
+<body>
+
+ <h2 class="testTitle">dijit.layout.BorderContainer tests</h2>
+
+ <p>Complex layout:</p>
+
+<div dojoType="dijit.layout.BorderContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;">
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ region="left" style="background-color: #acb386; width: 400px;" splitter="true"
+ style="float: left; width: 400px; height: 300px; overflow: hidden">
+ <div dojoType="dijit.layout.AccordionPane" title="a">
+ left bar
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="b">
+ <p>
+ Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin
+ suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh.
+ Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris,
+ bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam
+ aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia
+ ac, vehicula laoreet, elit. Sed interdum augue sit amet quam
+ dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec
+ quam.
+ </p>
+ <p>
+ Sed arcu magna, molestie at, fringilla in, sodales eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </p>
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="c">
+ <p>The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.</p>
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ region="right" style="background-color: #acb386; width: 200px;"
+ style="float: left; width: 200px; height: 300px; overflow: hidden">
+ <div dojoType="dijit.layout.AccordionPane" title="a">
+ right bar
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="b">
+ <p>
+ Nunc consequat nisi vitae quam. Suspendisse sed nunc. Proin
+ suscipit porta magna. Duis accumsan nunc in velit. Nam et nibh.
+ Nulla facilisi. Cras venenatis urna et magna. Aenean magna mauris,
+ bibendum sit amet, semper quis, aliquet nec, sapien. Aliquam
+ aliquam odio quis erat. Etiam est nisi, condimentum non, lacinia
+ ac, vehicula laoreet, elit. Sed interdum augue sit amet quam
+ dapibus semper. Nulla facilisi. Pellentesque lobortis erat nec
+ quam.
+ </p>
+ <p>
+ Sed arcu magna, molestie at, fringilla in, sodales eu, elit.
+ Curabitur mattis lorem et est. Quisque et tortor. Integer bibendum
+ vulputate odio. Nam nec ipsum. Vestibulum mollis eros feugiat
+ augue. Integer fermentum odio lobortis odio. Nullam mollis nisl non
+ metus. Maecenas nec nunc eget pede ultrices blandit. Ut non purus
+ ut elit convallis eleifend. Fusce tincidunt, justo quis tempus
+ euismod, magna nulla viverra libero, sit amet lacinia odio diam id
+ risus. Ut varius viverra turpis. Morbi urna elit, imperdiet eu,
+ porta ac, pharetra sed, nisi. Etiam ante libero, ultrices ac,
+ faucibus ac, cursus sodales, nisl. Praesent nisl sem, fermentum eu,
+ consequat quis, varius interdum, nulla. Donec neque tortor,
+ sollicitudin sed, consequat nec, facilisis sit amet, orci. Aenean
+ ut eros sit amet ante pharetra interdum.
+ </p>
+ </div>
+ <div dojoType="dijit.layout.AccordionPane" title="c">
+ <p>The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.</p>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;" splitter="true">
+
+ <div id="mainTabContainer" dojoType="dijit.layout.TabContainer" style="width: 100%; height: 20em;">
+
+ <div id="tab1" dojoType="dijit.layout.ContentPane" href="../../../dijit/tests/layout/tab1.html" title="Tab 1"></div>
+
+ <div id="tab2" dojoType="dijit.layout.ContentPane" href="../../../dijit/tests/layout/tab2.html" refreshOnShow="true" title="Tab 2" selected="true"></div>
+
+ <div dojoType="dijit.layout.ContentPane" title="Tab 3">
+ <h1>I am tab 3</h1>
+ <p>And I was already part of the page! That's cool, no?</p>
+ <p id="foo">tooltip on this paragraph</p>
+ <div dojoType="dijit.Tooltip" connectId="foo">I'm a tooltip!</div>
+ <button dojoType="dijit.form.Button">I'm a button </button>
+ <br>
+ <button dojoType="dijit.form.Button">So am I!</button>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+ imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+ nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+ massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+ pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+ quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+ felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+ quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+ rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+ semper velit ante id metus. Praesent massa dolor, porttitor sed,
+ pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+ tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ </div>
+
+ <div dojoType="dijit.layout.TabContainer" title="Inlined Sub TabContainer">
+ <a dojoType="dijit.layout.LinkPane" href="../../../dijit/tests/layout/tab1.html">SubTab 1</a>
+ <a dojoType="dijit.layout.LinkPane" href="../../../dijit/tests/layout/tab2.html" selected="true">SubTab 2</a>
+ </div>
+
+ <a dojoType="dijit.layout.LinkPane" href="../../../dijit/tests/layout/tab3.html">Sub TabContainer from href</a>
+
+ <a dojoType="dijit.layout.LinkPane" href="../../../dijit/tests/layout/tab4.html">SplitContainer from href</a>
+
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;">
+ <div style="border: 1px solid black;">
+ <div dojoType="dijit.Editor" id="editor1"><p>bottom bar (edit me)</p></div>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_BorderContainer_experimental.html b/includes/js/dijit/tests/layout/test_BorderContainer_experimental.html
new file mode 100644
index 0000000..46483d9
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_BorderContainer_experimental.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+
+ <title>BorderContainer Experiments | The Dojo Toolkit</title>
+
+ <link rel="stylesheet" href="../../themes/tundra/tundra.css" />
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ #pane1 { background-color:red;
+ }
+ #pane2{
+ background-color:green;
+ }
+ #pane3 {
+ background-color:blue;
+ }
+ #pane0 {
+ background-color:#ededed;
+ }
+ .wrapper { padding:25px; }
+ .bc { margin:10px; border:2px solid #ededed; }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad:true, isDebug:true"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.declare("my.BorderContainer",dijit.layout.BorderContainer,{
+
+ opts: {
+ // single pane view
+ "a":{
+ panes: [
+ { id: "pane0", sizeable:false, region:"center", style: { width:"100%", height:"100%" } },
+ { id: "pane1", hidden:true },
+ { id: "pane2", hidden:true },
+ { id: "pane3", hidden:true }
+ ]
+ },
+ // top / bottom view
+ "ah":{
+ panes: [
+ { id: "pane0", sizeable:false, region:"center", style: { width:"100%", height:"50%" } },
+ { id: "pane1", sizeable:true, region:"bottom", style: { width:"100%", height:"50%" } },
+ { id: "pane2", hidden:true },
+ { id: "pane3", hidden:true }
+ ]
+ },
+ // left / right view
+ "av":{
+ panes: [
+ { id: "pane0", sizeable:true, region:"left", style: { width:"50%", height:"100%" } },
+ { id: "pane1", sizeable:false, region:"center", style: { width:"50%", height:"100%" } },
+ { id: "pane2", hidden:true },
+ { id: "pane3", hidden:true }
+ ]
+ }
+
+ },
+
+ _clearSplitters: function(){
+ // cleanup all splitters on the page
+ dojo.query(".dijitSplitter",this.domNode).forEach(function(n){
+ dijit.byNode(n).destroy();
+ });
+ dojo.query(".dijitSplitterCover").forEach(function(n){
+ dojo._destroyElement(n);
+ })
+ delete this._splitters;
+ this._splitters = {};
+ },
+
+ setLayoutENUM: function(lay){
+ // set the layout to a predefined setup
+ if(this._layoutSetting != lay){
+
+ this._layoutSetting = lay;
+ var struct = this.opts[lay] || false;
+ this._clearSplitters();
+
+ dojo.forEach(struct.panes,function(pane,i){
+ // setup each pane
+ var d = dijit.byId(pane.id);
+ d.region = pane.region || "center";
+ d.splitter = pane.sizeable;
+ if(pane.minSize){ d.minSize = pane.minSize; }
+ if(pane.maxSize){ d.maxSize = pane.maxSize; }
+ if(pane.hidden){
+ // reset this widget to our hidden holder node
+ this.extractChild(d,dojo.byId("holder"));
+ d.splitter = null;
+ d.region = null;
+ d.maxSize = null;
+ d.minSize = null;
+ }else{
+ if(pane.style){
+ // object setter via style only in trunk:
+ dojo.style(d.domNode,pane.style);
+ }
+ this.addChild(d,i);
+ }
+ },this);
+ }
+ this.layout();
+ },
+
+ extractChild: function(/*Widget*/ child, /* DomNode */node){
+ // a non-destructive cleanup for the bordercontainer.
+ // cleanup a widget, and append it's domNode to some
+ // other node in the dom
+ var region = child.region;
+ var splitter = this._splitters[region];
+ if(splitter){
+ dijit.byNode(splitter).destroy();
+ delete this._splitters[region];
+ }
+ delete this["_"+region];
+ node.appendChild(child.domNode);
+ if(this._started){
+ this._layoutChildren();
+ }
+ return child.domNode;
+ }
+ });
+
+ var open = false;
+
+ dojo.addOnLoad(function(){
+ // make buttons
+ dojo.forEach(["a","av","ah"],function(n){
+
+ var but = new dijit.form.Button({
+ label: "Set "+n,
+ onClick: function(){
+ console.log(n);
+ layout.setLayoutENUM(n);
+ }
+ });
+ dojo.byId("buttons").appendChild(but.domNode);
+ but.startup();
+ })
+
+ });
+ </script>
+
+ </head>
+ <body class="tundra">
+
+ <h1>This is a test</h1>
+ <p>This is only a test. An experiment in dynamically altering a BorderContainer's layout
+ (a seemingly unsupported feature just yet). It Demonstrates how to programatically alter/animate
+ the size of non-center regions though, and several simple layout configurations
+ </p>
+
+ <div>
+ <h3>Layouts:</h3>
+ <div id="buttons"></div>
+ </div>
+
+ <div jsId="layout" id="container" dojoType="my.BorderContainer" style="width:600px; height:300px; border:3px solid #333;">
+ <div dojoType="dijit.layout.ContentPane" region="center" id="pane0">
+ pane0
+ </div>
+ </div>
+
+ <div class="bc" dojoType="dijit.layout.BorderContainer" style="height:200px">
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ Sinlge pane - l1
+ </div>
+ </div>
+
+ <div class="wrapper">
+ <h3>two panes, vertical split:</h3>
+
+
+ <div class="bc" id="animBC" dojoType="dijit.layout.BorderContainer" style="height:200px">
+ <div dojoType="dijit.layout.ContentPane" id="sizing1" style="background-color:red" region="left" splitter="true">
+ Sinlge pane - left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ Sinlge pane - center
+ <button dojoType="dijit.form.Button">
+ Size Me
+ <script type="dojo/method" event="onClick">
+ var n = dijit.byId("sizing1").domNode;
+ dojo.animateProperty({
+ node:n,
+ duration:1000,
+ properties: { width: { end: (open ? "100" : "400"), unit:"px" } },
+ onEnd: function(){
+ open = !open;
+ dijit.byId("animBC").layout();
+ }
+ }).play(1);
+ </script>
+ </button>
+ </div>
+ </div>
+
+ <div class="bc" dojoType="dijit.layout.BorderContainer" style="height:200px">
+ <div dojoType="dijit.layout.ContentPane" region="center" splitter="true">
+ Sinlge pane - center (splitter) (this is unsupported, and does not work)
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="right">
+ Sinlge pane - right (no splitter)
+ </div>
+ </div>
+
+ <div class="bc" dojoType="dijit.layout.BorderContainer" style="height:200px">
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ Sinlge pane - center (no splitter)
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="right" splitter="true">
+ Sinlge pane - right (splitter)
+ </div>
+ </div>
+ </div>
+
+ <div class="bc" dojoType="dijit.layout.BorderContainer" style="width:200px; height:400px;">
+ <div dojoType="dijit.layout.ContentPane" region="top" splitter="true">
+ Sinlge pane - top (splitter)
+
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ Sinlge pane - center
+ </div>
+ </div>
+
+ <div class="bc" dojoType="dijit.layout.BorderContainer" style="width:200px; height:400px;">
+ <div dojoType="dijit.layout.ContentPane" region="center">
+ Sinlge pane - center
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" splitter="true">
+ Single Pane Bottom (splitter)
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" splitter="true">
+ Single Pane Top (splitter)
+ </div>
+ </div>
+
+ <div id="holder" style="visibility:hidden">
+ <div dojoType="dijit.layout.ContentPane" id="pane1">pane 1</div>
+ <div dojoType="dijit.layout.ContentPane" id="pane2">pane 2</div>
+ <div dojoType="dijit.layout.ContentPane" id="pane3">pane 3</div>
+ </div>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_BorderContainer_full.html b/includes/js/dijit/tests/layout/test_BorderContainer_full.html
new file mode 100644
index 0000000..65386c2
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_BorderContainer_full.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.layout.BorderContainer Test - Full Screen</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ html, body, #main{
+ width: 100%; /* make the body expand to fill the visible window */
+ height: 100%;
+ overflow: hidden; /* erase window level scrollbars */
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+ font: 10pt Arial,Myriad,Tahoma,Verdana,sans-serif;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.FilteringSelect");
+ </script>
+</head>
+<body>
+ <div dojoType="dijit.layout.BorderContainer" design="sidebar" id="main">
+ <div dojoType="dijit.layout.ContentPane" region="leading" style="background-color: #acb386; width: 100px;">
+ leading
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;" splitter="true">
+ bottom bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="trailing" style="background-color: #acb386; width: 100px;" splitter="true">
+ trailing
+ </div>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_BorderContainer_nested.html b/includes/js/dijit/tests/layout/test_BorderContainer_nested.html
new file mode 100644
index 0000000..72bdf53
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_BorderContainer_nested.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.layout.BorderContainer Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.FilteringSelect");
+ </script>
+</head>
+<body>
+
+ <h2 class="testTitle">dijit.layout.BorderContainer tests</h2>
+ <p>Basic layout</p>
+
+ <div dojoType="dijit.layout.BorderContainer"
+ style="border: 2px solid black; width: 90%; height: 500px; padding: 10px;">
+ <div dojoType="dijit.layout.ContentPane" region="left" style="background-color: #acb386; width: 100px;">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="right" style="background-color: #acb386; width: 100px;">
+ right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;">
+ bottom bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 0px;">
+
+ <div dojoType="dijit.layout.BorderContainer" design="sidebar"
+ style="border: 2px solid black; height: 300px;">
+ <div dojoType="dijit.layout.ContentPane" region="left" style="background-color: #acb386; width: 100px;">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="right" style="background-color: #acb386; width: 100px;">
+ right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="top" style="background-color: #b39b86; height: 100px;">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="bottom" style="background-color: #b39b86; height: 100px;">
+ bottom bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" region="center" style="background-color: #f5ffbf; padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_ContentPane.html b/includes/js/dijit/tests/layout/test_ContentPane.html
new file mode 100644
index 0000000..4557bef
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_ContentPane.html
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>ContentPane Test</title>
+
+ <style>
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ margin: 1em;
+ padding: 1em;
+ }
+
+ .box {
+ position: relative;
+ background-color: white;
+ border: 2px solid black;
+ padding: 8px;
+ margin: 4px;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Dijit layout.ContentPane tests</h1>
+ <p>pre-container paragraph</p>
+
+ <div dojoType="dijit.layout.ContentPane" class="box">
+ some text (top-level container)
+
+ <div dojoType="dijit.layout.ContentPane" class="box">
+
+ text in the inner container (1)
+
+ <div dojoType="dijit.layout.ContentPane" class="box" href="tab2.html" hasShadow="true">
+ hi
+ </div>
+
+ text in the inner container (2)
+
+ <div dojoType="dijit.layout.ContentPane" class="box">
+ inner-inner 2
+ </div>
+
+ text in the inner container (3)
+
+ <div dojoType="dijit.layout.ContentPane" class="box">
+ inner-inner 3
+ </div>
+
+ text in the inner container (4)
+
+ </div>
+
+ some more text (top-level container)
+ </div>
+
+ <p>mid-container paragraph</p>
+
+ <div dojoType="dijit.layout.ContentPane" class="box" hasShadow="true">
+ 2nd top-level container
+ </div>
+
+ <p>post-container paragraph</p>
+
+ <div id="ContentPane3" class="box" hasShadow="true">
+ some content pane blah blah blah
+ </div>
+ <div dojoType="dijit.layout.ContentPane" class="box" href="combotab.html" hasShadow="true" id="test">
+ <p style='background-color:yellow;border:1px solid red;text-align:center;'>This text should automatically be replaced by downloaded content from combotab.html</p>
+ </div>
+ <input type="button" value="Change pane in 3 seconds" onClick='setTimeout(function(){dijit.byId("test").setHref("tab2.html");}, 3000);'>
+ <script type="text/javascript">
+ dojo.addOnLoad(function(){
+ var tmp = new dijit.layout.ContentPane({}, dojo.byId("ContentPane3"));
+ tmp.startup();
+ console.debug('created ' + tmp);
+ });
+ </script>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_LayoutCode.html b/includes/js/dijit/tests/layout/test_LayoutCode.html
new file mode 100644
index 0000000..9cec35e
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_LayoutCode.html
@@ -0,0 +1,383 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Programmatic Layout Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ html, body{
+ width: 100%; /* make the body expand to fill the visible window */
+ height: 100%;
+ overflow: hidden; /* erase window level scrollbars */
+ padding: 0 0 0 0;
+ margin: 0 0 0 0;
+ }
+ .dijitSplitPane{
+ margin: 5px;
+ }
+ #rightPane {
+ margin: 0;
+ }
+ #creator, #current {
+ border: 3px solid blue;
+ padding: 10px;
+ margin: 10px;
+ }
+ #wrapper {
+ border: 3px solid green;
+ padding: 10px;
+ margin: 10px;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.LayoutContainer");
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.SplitContainer");
+ dojo.require("dijit.layout.TabContainer");
+
+ // Used in doc0.html
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.Button");
+
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // Simple layout container layout
+ var simpleLayout = {
+ widgetType: "LayoutContainer",
+ params: { id: "rootWidget" },
+ style: "border: 3px solid grey; width: 95%; height: 400px;",
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "left", layoutAlign: "left"},
+ style: "width: 100px; background: #ffeeff;",
+ innerHTML: "this is the left"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "right", layoutAlign: "right"},
+ style: "width: 100px; background: #ffeeff;",
+ innerHTML: "this is the right"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "top", layoutAlign: "top"},
+ style: "height: 100px; background: #eeeeee;",
+ innerHTML: "this is the top"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "bottom", layoutAlign: "bottom"},
+ style: "height: 100px; background: #eeeeee;",
+ innerHTML: "this is the bottom"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "client", layoutAlign: "client"},
+ style: "height: 100px; background: #ffffee;",
+ innerHTML: "this is the client"
+ }
+ ]
+ };
+
+ // split container layout
+ var splitLayout = {
+ widgetType: "SplitContainer",
+ params: {id: "rootWidget", orientation: "horizontal"},
+ style: "border: 3px solid grey; width: 95%; height: 400px;",
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "left"},
+ style: "background: #ffeeff;",
+ innerHTML: "left pane of split container"
+ },
+ {
+ widgetType: "SplitContainer",
+ params: {
+ id: "nested", orientation: "vertical"},
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "top"},
+ style: "background: #eeffee;",
+ innerHTML: "center-top pane of nested split container"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "bottom"},
+ style: "background: #eeffee;",
+ innerHTML: "center-bottom pane of nested split container"
+ }
+ ]
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "right"},
+ style: "background: #ffeeff;",
+ innerHTML: "right pane of split container"
+ }
+ ]
+ };
+
+ // tab container layout
+ var tabLayout = {
+ widgetType: "TabContainer",
+ params: {id: "rootWidget"},
+ style: "width: 95%; height: 400px;",
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "content", title: "Content tab", href: "doc0.html", executeScripts: true},
+ style: "background: #ffeeff;"
+ },
+ {
+ widgetType: "SplitContainer",
+ params: {id: "nestedSplit", title: "Split pane tab", orientation: "vertical"},
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "top"},
+ style: "background: #eeffee;",
+ innerHTML: "top pane of nested split container"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "bottom"},
+ style: "background: #eeffee;",
+ innerHTML: "bottom pane of nested split container"
+ }
+ ]
+ },
+ {
+ widgetType: "TabContainer",
+ params: {id: "nestedTab", title: "Nested tabs"},
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "left", title: "Nested Tab #1"},
+ style: "background: #eeffee;",
+ innerHTML: "tab 1 of nested tabs"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {
+ id: "right", title: "Nested Tab #2"},
+ style: "background: #eeffee;",
+ innerHTML: "tab 2 of nested tabs"
+ }
+ ]
+ }
+ ]
+ };
+
+/*
+ // tab container layout
+ var tabNoLayout = {
+ widgetType: "TabContainer",
+ params: {id: "rootWidget", doLayout: false},
+ children: [
+ {
+ widgetType: "ContentPane",
+ params: {id: "doc0", title: "Doc 0", href: "doc0.html", executeScripts: true},
+ style: "background: #ffeeff;"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "doc1", title: "Doc 1", href: "doc1.html", executeScripts: true},
+ style: "background: #eeffee;"
+ },
+ {
+ widgetType: "ContentPane",
+ params: {id: "doc2", title: "Doc 2", href: "doc2.html", executeScripts: true},
+ style: "background: #ffffee;"
+ }
+ ]
+ };
+*/
+
+ // accordion container layout
+ var accordionLayout = {
+ widgetType: "AccordionContainer",
+ params: {id: "rootWidget"},
+ style: "border: 3px solid grey; width: 95%; height: 400px;",
+ children: [
+ {
+ widgetType: "AccordionPane",
+ params: {id: "one", title: "Pane #1"},
+ style: "background: #ffeeff;",
+ innerHTML: "first pane contents"
+ },
+ {
+ widgetType: "AccordionPane",
+ params: {id: "two", title: "Pane #2"},
+ style: "background: #ffeeff;",
+ innerHTML: "second pane contents"
+ },
+ {
+ widgetType: "AccordionPane",
+ params: {id: "three", title: "Pane #3"},
+ style: "background: #ffeeff;",
+ innerHTML: "third pane contents"
+ }
+ ]
+ };
+
+ // Create a widget hierarchy from a JSON structure like
+ // {widgetType: "LayoutContainer", params: { ... }, children: { ... } }
+ function createWidgetHierarchy(widgetJson){
+ // setup input node
+ var node = document.createElement("div");
+ document.body.appendChild(node); // necessary for tab contianer ???
+ if(widgetJson.style){
+ node.style.cssText = widgetJson.style;
+ }
+ if(widgetJson.innerHTML){
+ node.innerHTML=widgetJson.innerHTML;
+ }
+
+ // create the widget
+ var widget = new dijit.layout[widgetJson.widgetType](widgetJson.params, node);
+
+ // add its children (recursively)
+ if(widgetJson.children){
+ dojo.forEach(widgetJson.children,
+ function(child){ widget.addChild(createWidgetHierarchy(child)); });
+ }
+ widget.startup(); //TODO: this is required now, right?
+
+ return widget;
+ }
+
+ // create the widgets specified in layout and add them to widget "rootWidget"
+ function create(layout){
+
+ // erase old widget hierarchy (if it exists)
+ var rootWidget = dijit.byId("rootWidget");
+ if(rootWidget){
+ rootWidget.destroyRecursive();
+ }
+
+ // create new widget
+ rootWidget = createWidgetHierarchy(layout);
+
+ // and display it
+ var wrapper = dojo.byId("wrapper");
+ wrapper.innerHTML=""; // just to erase the initial HTML message
+ wrapper.appendChild(rootWidget.domNode);
+ // rootWidget.onResized();
+
+ // make/update the menu of operations on each widget
+ makeOperationTable();
+ }
+
+ // write out a menu of operations on each widget
+ function makeOperationTable(){
+ var html = "<table border=1>";
+ dijit.registry.forEach(function(widget){
+ html += "<tr><td>" + widget.id + "</td><td>";
+ html += "<button onclick='removeFromParent(\"" + widget.id + "\");'> destroy </button> ";
+ if(/Container/.test(widget.declaredClass)){
+ html += "<button onclick='addChild(\"" + widget.id + "\");'> add a child </button> ";
+ }
+ html += "</td></tr>";
+ });
+ html += "</table>";
+ dojo.byId("operations").innerHTML = html;
+ }
+
+ // remove a widget from it's parent and destroy it
+ function removeFromParent(widget){
+ widget = dijit.byId(widget);
+ if(widget.parent){
+ widget.parent.removeChild(widget);
+ }
+ widget.destroy();
+
+ // reset the operation table so this widget is no longer shown
+ makeOperationTable();
+ }
+
+ // add a child to given widget
+ function addChild(widget){
+ widget = dijit.byId(widget);
+
+ // setup input node
+ var node = document.createElement("div");
+ node.style.cssText = "height: 70px; width: 150px; overflow: auto; background: #cccccc; border: dotted black 2px;"; // necessary if parent is LayoutContainer
+ // create the widget
+ var alignments = ["top","bottom","left","right"];
+ var hrefs = ["doc0.html", "doc1.html", "doc2.html"];
+ var child = new dijit.layout.ContentPane(
+ {
+ title: "Widget " + cnt, // necessary if parent is tab
+ layoutAlign: alignments[cnt%4], // necessary if parent is LayoutContainer
+ executeScripts: true,
+ href: hrefs[cnt%3]
+ },
+ node);
+ cnt++;
+
+ if(/AccordionContainer/.test(widget.declaredClass)){
+ var pane = new dijit.layout.AccordionPane({
+ title: "AccordionWidget " + cnt
+ });
+ pane.setContent(child);
+ child = pane;
+ }
+ // add it to the parent
+ widget.addChild(child);
+
+ // reset the operation table so the new widget is shown
+ makeOperationTable();
+ }
+ var cnt=1;
+
+ // show a widget
+ function show(widget){
+ widget = dijit.byId(widget);
+ widget.show();
+ }
+
+ // hide a widget
+ function hide(widget){
+ widget = dijit.byId(widget);
+ widget.hide();
+ }
+ </script>
+</head>
+<body>
+ <h1>Test of layout code programmatic creation</h1>
+ <table width="100%">
+ <tr>
+ <td id="creator" valign="top">
+ <h4>Creator</h4>
+ <p>Pressing a button will programatically add a hierarchy of widgets</p>
+ <button onClick="create(simpleLayout);">Simple Layout</button>
+ <button onClick="create(splitLayout);">Split Layout</button>
+ <button onClick="create(tabLayout);">Tab Layout</button>
+<!-- <button onClick="create(tabNoLayout);">Tab Non-Layout</button> -->
+ <button onClick="create(accordionLayout);">Accordion Layout</button>
+ </td>
+ <td id="current">
+ <h4>Current widgets</h4>
+ This pane will let you try certain operations on each of the widgets.
+ <div id="operations" style="height: 200px; overflow: auto;"></div>
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <div id="wrapper">
+ When you press a button, this will be filled in with the generated widgets
+ </div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_LayoutContainer.html b/includes/js/dijit/tests/layout/test_LayoutContainer.html
new file mode 100644
index 0000000..cbe08f6
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_LayoutContainer.html
@@ -0,0 +1,174 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>dijit.layout.LayoutContainer Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.LayoutContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+
+</head>
+<body class="tundra">
+<h2>Dijit layout.LayoutContainer tests</h2>
+<p>Basic layout. Tabindex=&quot;0&quot; added to each pane to test for tab order matching source code order. Tab order
+should be: left, right, top, middle/main, bottom</p>
+
+<div dojoType="dijit.layout.LayoutContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;"
+>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #acb386; width: 100px;" tabindex="0">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="right" style="background-color: #acb386;" tabindex="0">
+ right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" style="background-color: #b39b86; " tabindex="0">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="background-color: #f5ffbf; padding: 10px;" tabindex="0">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="bottom" style="background-color: #b39b86;" tabindex="0">
+ bottom bar
+ </div>
+
+</div>
+
+<p>Advanced layout. Tabindex=&quot;0&quot; added to each pane to test for tab order matching source code order. Tab order
+should be: left, top, bottom, inner left, inner middle, inner right. This is not an ideal tab order. See below to use nested
+layout containers to achieve a tab order which matches presentation and source code order.</p>
+<div dojoType="dijit.layout.LayoutContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;"
+>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #acb386; width: 100px; margin: 5px;" tabindex="0">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" style="background-color: #b39b86; margin: 5px;" tabindex="0">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="bottom" style="background-color: #b39b86; margin: 5px;" tabindex="0">
+
+ bottom bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #eeeeee; width: 100px; margin: 5px;" tabindex="0">
+ inner left
+ </div>
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="background-color: #f5ffbf; padding: 10px; margin: 5px;" tabindex="0">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="right" style="background-color: #eeeeee; width: 100px; margin: 5px;" tabindex="0">
+ inner right
+ </div>
+</div>
+
+<p>Advanced layout with nested containers. Tabindex=&quot;0&quot; added to content panes to show tab order. Order should be:
+left, top, inner left, inner middle, inner right, bottom. This is the preferred tab order for this type of layout.</p>
+<div dojoType="dijit.layout.LayoutContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;"
+>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #acb386; width: 100px; margin: 5px;" tabindex="0">
+ left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="margin: 5px;" >
+ <div dojoType="dijit.layout.LayoutContainer" style="height:90%;border: 2px solid black;padding: 10px;">
+
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" style="background-color: #b39b86; margin: 5px;" tabindex="0">
+ top bar
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="margin: 5px;">
+ <div dojoType="dijit.layout.LayoutContainer" style="height:80%;border: 2px solid black;padding: 10px;">
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #eeeeee; width: 100px; margin: 5px;" tabindex="0">
+ inner left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="background-color: #f5ffbf; padding: 10px; margin: 5px;" tabindex="0">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="right" style="background-color: #eeeeee; width: 100px; margin: 5px;" tabindex="0">
+ inner right
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="bottom" style="background-color: #b39b86; margin: 5px;" tabindex="0" >
+ bottom bar
+ </div>
+ </div>
+ </div>
+</div>
+
+<p>Goofy spiral layout. Match of source code order to tab order can not be achieved with this type of layout.</p>
+<div dojoType="dijit.layout.LayoutContainer"
+ style="border: 2px solid black; width: 90%; height: 300px; padding: 10px;"
+>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #663333; color: white; width: 100px;">
+ outer left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" style="background-color: #333366; color: white; height: 50px;">
+ outer top
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="right" style="background-color: #663333; color: white; width: 100px;">
+ outer right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="bottom" style="background-color: #333366; color: white; height: 50px;">
+ outer bottom
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="background-color: #99CC99; width: 100px;">
+ inner left
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="top" style="background-color: #999966; height: 50px;">
+ inner top
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="right" style="background-color: #99CC99; width: 100px;">
+ inner right
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="bottom" style="background-color: #999966; height: 50px;">
+ inner bottom
+ </div>
+ <div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="padding: 10px;">
+ main panel with <a href="http://www.dojotoolkit.org/">a link</a>.<br />
+ (to check we're copying children around properly).<br />
+ <select dojoType="dijit.form.FilteringSelect">
+ <option value="1">foo</option>
+ <option value="2">bar</option>
+ <option value="3">baz</option>
+ </select>
+ Here's some text that comes AFTER the combo box.
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_SplitContainer.html b/includes/js/dijit/tests/layout/test_SplitContainer.html
new file mode 100644
index 0000000..f71d2dd
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_SplitContainer.html
@@ -0,0 +1,116 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>SplitContainer Widget Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ .dojoContentPane {
+ padding:1em;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.SplitContainer");
+ dojo.require("dijit.layout.ContentPane");
+
+ // these exist inside our href splitcontainer
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.ComboBox");
+ var programaticExample = function(){
+
+ var rootNode = dojo.byId("holderNode");
+ // add two children
+ var pane1 = rootNode.appendChild(document.createElement('div'));
+ var pane2 = rootNode.appendChild(document.createElement('div'));
+ var pane3 = rootNode.appendChild(document.createElement('div'));
+
+ // set the content. can use xhrGet, also
+ pane1.innerHTML = "Pane one test"; pane2.innerHTML = "Pane two test";
+
+ // should use css, but this works:
+ dojo.style(rootNode,"height","150px");
+ dojo.style(rootNode,"border","1px solid #333");
+
+ // make them contentpanes
+ var cp1 = new dijit.layout.ContentPane({ sizeShare:20 },pane1);
+ var cp2 = new dijit.layout.ContentPane({ sizeShare:30 },pane2);
+ var cp3 = new dijit.layout.ContentPane({
+ href: "doc0.html",
+ sizeShare:30
+ },pane3).startup();
+
+ // init the splitcontainer
+ var split = new dijit.layout.SplitContainer({
+ orientation:"horizontal",
+ sizerWidth:7
+ },rootNode).startup();
+
+ };
+ dojo.addOnLoad(programaticExample);
+
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Dijit Split Container Test</h1>
+ <p>HTML before</p>
+
+ <div dojoType="dijit.layout.SplitContainer"
+ orientation="vertical"
+ sizerWidth="7"
+ activeSizing="false"
+ style="border: 1px solid #bfbfbf; float: left; margin-right: 30px; width: 400px; height: 300px;"
+ >
+ <div dojoType="dijit.layout.ContentPane" sizeMin="10" sizeShare="50">
+ this box has three split panes
+ </div>
+ <div dojoType="dijit.layout.ContentPane" sizeMin="20" sizeShare="50"
+ style="background-color: yellow; border: 3px solid purple;">
+ in vertical mode
+ </div>
+ <div dojoType="dijit.layout.ContentPane" sizeMin="10" sizeShare="50">
+ without active resizing
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.SplitContainer"
+ orientation="horizontal"
+ sizerWidth="7"
+ activeSizing="true"
+ style="border: 1px solid #bfbfbf; float: left; width: 400px; height: 300px;">
+ <div dojoType="dijit.layout.ContentPane" sizeMin="20" sizeShare="20">
+ this box has two horizontal panes
+ </div>
+ <div dojoType="dijit.layout.ContentPane" sizeMin="50" sizeShare="50">
+ with active resizing, a smaller sizer, different starting sizes and minimum sizes
+ </div>
+ </div>
+
+ <p style="clear: both;">HTML after</p>
+
+the following splitter contains two iframes, see whether the resizer works ok in this situation
+<div dojoType="dijit.layout.SplitContainer"
+ orientation="horizontal"
+ sizerWidth="5"
+ activeSizing="false"
+ style="border: 2px solid black; float: left; width: 100%; height: 300px;"
+>
+ <div dojoType="dijit.layout.ContentPane" sizeMin="20" sizeShare="20">
+ <iframe style="width: 100%; height: 100%"></iframe>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" sizeMin="50" sizeShare="50">
+ <iframe style="width: 100%; height: 100%"></iframe>
+ </div>
+</div>
+
+<h3>Programatic Example:</h3>
+<div id="holderNode"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_StackContainer.html b/includes/js/dijit/tests/layout/test_StackContainer.html
new file mode 100644
index 0000000..834b874
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_StackContainer.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>StackContainer Demo</title>
+
+ <style>
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ .dijitStackController .dijitToggleButtonChecked button {
+ background-color: white;
+ background-image: none;
+ }
+ .dijit_a11y .dijitStackController .dijitToggleButtonChecked button {
+ border-style: dashed !important;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.StackContainer");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function selected(page){
+ console.debug("page selected " + page.id);
+ var widget=dijit.byId("myStackContainer");
+ dijit.byId("previous").setAttribute("disabled", page.isFirstChild);
+ dijit.byId("next").setAttribute("disabled", page.isLastChild);
+ dijit.byId("previous2").setAttribute("disabled", page.isFirstChild);
+ dijit.byId("next2").setAttribute("disabled", page.isLastChild);
+ }
+ dojo.subscribe("myStackContainer-selectChild", selected);
+ </script>
+</head>
+
+<body>
+ <h1 class="testTitle">A Tale Of Two Cities</h1>
+
+ <button dojoType="dijit.form.Button" id="previous"
+ onClick="dijit.byId('myStackContainer').back()">&lt;</button>
+ <span dojoType="dijit.layout.StackController" containerId="myStackContainer"></span>
+ <button dojoType="dijit.form.Button" id="next"
+ onClick="dijit.byId('myStackContainer').forward()">&gt;</button>
+
+ <div id="myStackContainer" dojoType="dijit.layout.StackContainer"
+ style="width: 90%; border: 1px solid #9b9b9b; height: 20em; margin: 0.5em 0 0.5em 0; padding: 0.5em;">
+ <p id="page1" dojoType="dijit.layout.ContentPane" title="page 1">IT WAS the best of times, it <input value="was the worst" /> of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way -- in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only</p>
+ <p id="page2" dojoType="dijit.layout.ContentPane" title="page 2">There were a king with a large jaw and a queen with a plain face, on the throne of England; there were a king with a large jaw and a queen with a fair face, on the throne of <a href="http://www.france.com">France</a>. In both countries it was clearer than crystal to the lords of the State preserves of loaves and fishes, that things in general were settled for ever.</p>
+ <p id="page3" dojoType="dijit.layout.ContentPane" title="page 3">It was the year of Our Lord one thousand seven hundred and seventy- five. Spiritual revelations were conceded to England at that favoured period, as at this. Mrs. Southcott had recently attained her five-and- twentieth blessed birthday, of whom a prophetic private in the Life Guards had heralded the sublime appearance by announcing that arrangements were made for the swallowing up of London and Westminster. Even the Cock-lane ghost had been laid only a round dozen of years, after rapping out its messages, as the spirits of this very year last past (supernaturally deficient in originality) rapped out theirs. Mere messages in the earthly order of events had lately come to the English Crown and People, from a congress of British subjects in America:</p>
+ </div>
+
+ <button dojoType="dijit.form.Button" id="previous2" onClick="dijit.byId('myStackContainer').back()">&lt;</button>
+ <span dojoType="dijit.layout.StackController" containerId="myStackContainer"></span>
+ <button dojoType="dijit.form.Button" id="next2" onClick="dijit.byId('myStackContainer').forward()">&gt;</button>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_StackContainer_code.html b/includes/js/dijit/tests/layout/test_StackContainer_code.html
new file mode 100644
index 0000000..137cc6e
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_StackContainer_code.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>StackContainer Demo</title>
+
+ <style>
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ .dijitStackController .dijitToggleButtonChecked button {
+ background-color: white;
+ background-image: none;
+ }
+ .dijit_a11y .dijitStackController .dijitToggleButtonChecked button {
+ border-style: dashed !important;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.StackContainer");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ var i = 1;
+ var codeExample = function(){
+ // make the container
+ var stack = new dijit.layout.StackContainer({ },"myStackContainer");
+ // make each paragraph a ContentPane, and add a button to select this child
+ dojo.query("p","myStackContainer").forEach(function(n){
+ var cp = new dijit.layout.ContentPane({},n);
+ var tmpNode = dojo.byId("holder").appendChild(dojo.doc.createElement('div'));
+ var butt = new dijit.form.Button({
+ label: "Page "+(i++),
+ onClick: function(e){
+ stack.selectChild(cp);
+ }
+ },tmpNode);
+ });
+ // startup stack + children
+ stack.startup();
+ };
+ dojo.addOnLoad(codeExample);
+ </script>
+</head>
+
+<body>
+ <h1 class="testTitle">A Tale Of Two Cities</h1>
+
+ <div id="holder">Links: </div>
+
+ <div id="myStackContainer" style="width: 90%; border: 1px solid #9b9b9b; height: 20em; margin: 0.5em 0 0.5em 0; padding: 0.5em;">
+ <p id="page1">IT WAS the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way -- in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only</p>
+ <p id="page2">There were a king with a large jaw and a queen with a plain face, on the throne of England; there were a king with a large jaw and a queen with a fair face, on the throne of <a href="http://www.france.com">France</a>. In both countries it was clearer than crystal to the lords of the State preserves of loaves and fishes, that things in general were settled for ever.</p>
+ <p id="page3">It was the year of Our Lord one thousand seven hundred and seventy- five. Spiritual revelations were conceded to England at that favoured period, as at this. Mrs. Southcott had recently attained her five-and- twentieth blessed birthday, of whom a prophetic private in the Life Guards had heralded the sublime appearance by announcing that arrangements were made for the swallowing up of London and Westminster. Even the Cock-lane ghost had been laid only a round dozen of years, after rapping out its messages, as the spirits of this very year last past (supernaturally deficient in originality) rapped out theirs. Mere messages in the earthly order of events had lately come to the English Crown and People, from a congress of British subjects in America:</p>
+ </div>
+
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_TabContainer.html b/includes/js/dijit/tests/layout/test_TabContainer.html
new file mode 100644
index 0000000..5d51a8a
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_TabContainer.html
@@ -0,0 +1,183 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TabContainer Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ font-family : sans-serif;
+ margin:20px;
+ }
+
+ /* add padding to each contentpane inside the tab container, and scrollbar if necessary */
+ .dojoTabPane {
+ padding : 10px 10px 10px 10px;
+ overflow: auto;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.SplitContainer");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.layout.LinkPane");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function testClose(pane,tab){
+ return confirm("Please confirm that you want tab "+tab.title+" closed");
+ }
+
+ startTime = new Date();
+ dojo.addOnLoad(function(){
+ var elapsed = new Date().getTime() - startTime;
+ var p = document.createElement("p");
+ p.appendChild(document.createTextNode("Widgets loaded in " + elapsed + "ms"));
+ document.body.appendChild(p);
+ // dojo.parser.parse(dojo.body());
+ });
+
+ dojo.addOnLoad(function(){
+ var tc = dijit.byId("mainTabContainer");
+ var cp = new dijit.layout.ContentPane({ title: 'Programmatically created tab' });
+ cp.domNode.innerHTML = "I was created programmatically!";
+ tc.addChild(cp, 3);
+ });
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit layout.TabContainer tests</h1>
+
+ <p>These tabs are made up of local and external content. Tab 1 and Tab 2 are loading
+ files tab1.html and tab2.html. Tab 3 and Another Tab are using content that is already
+ part of this page. Tab2 is initially selected.
+ </p>
+
+ <div id="mainTabContainer" dojoType="dijit.layout.TabContainer" style="width: 100%; height: 20em;">
+
+ <div id="tab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 1"></div>
+
+ <div id="tab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Tab 2" selected="true"></div>
+
+ <div dojoType="dijit.layout.ContentPane" title="Tab 3">
+ <h1>I am tab 3</h1>
+ <p>And I was already part of the page! That's cool, no?</p>
+ <p id="foo">tooltip on this paragraph</p>
+ <div dojoType="dijit.Tooltip" connectId="foo">I'm a tooltip!</div>
+ <button dojoType="dijit.form.Button">I'm a button </button>
+ <br>
+ <button dojoType="dijit.form.Button">So am I!</button>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+ imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+ nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+ massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+ pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+ quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+ felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+ quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+ rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+ semper velit ante id metus. Praesent massa dolor, porttitor sed,
+ pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+ tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ </div>
+
+ <div dojoType="dijit.layout.TabContainer" title="Inlined Sub TabContainer">
+ <a dojoType="dijit.layout.LinkPane" href="tab1.html">SubTab 1</a>
+ <a dojoType="dijit.layout.LinkPane" href="tab2.html" selected="true">SubTab 2</a>
+ </div>
+
+ <a dojoType="dijit.layout.LinkPane" href="tab3.html">Sub TabContainer from href</a>
+
+ <a dojoType="dijit.layout.LinkPane" href="tab4.html">SplitContainer from href</a>
+
+ </div>
+
+ <p>
+ The next example is with closable tabs.
+ Tab 1 and Tab 3 can be closed; Tab 3 has a confirm box.
+ </p>
+
+ <div id="ttabs" dojoType="dijit.layout.TabContainer" tabPosition="top" style="width: 100%; height: 10em;"
+ onfocus="console.log('user focus handler')"
+ onblur="console.log('user blur handler')"
+ >
+ <div id="ttab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="First" closable="true"></div>
+ <div id="ttab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Second"></div>
+ <div dojoType="dijit.layout.ContentPane" title="Third" onClose="testClose" closable="true">
+ <h1>I am tab 3</h1>
+ <p>And I was already part of the page! That's cool, no?</p>
+ <p>If you try to close me there should be a confirm dialog.</p>
+ </div>
+ </div>
+
+ <p>Tabs with titles on the bottom:</p>
+
+ <div id="btabs" dojoType="dijit.layout.TabContainer" tabPosition="bottom" style="width: 100%; height: 10em;">
+ <div id="btab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 1" closable="true"></div>
+ <div id="btab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" onLoad="console.debug('Tab2 onLoad');" title="Tab 2"></div>
+ </div>
+
+ <p>Tabs with titles on the left:</p>
+
+ <div id="lhtabs" dojoType="dijit.layout.TabContainer" tabPosition="left-h" style="width: 100%; height: 10em;">
+ <div id="lhtab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 1"></div>
+ <div id="lhtab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Tab 2" closable="true"></div>
+ </div>
+
+ <p>Tabs with titles on the right:</p>
+
+ <div id="lrtabs" dojoType="dijit.layout.TabContainer" tabPosition="right-h" style="width: 100%; height: 10em;">
+ <div id="rhtab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 1"></div>
+ <div id="rhtab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Tab 2" closable="true"></div>
+ </div>
+
+<p></p>
+ <div dojoType="dijit.layout.TabContainer" style="width:500px;height:100px" tabPosition="left-h">
+ <div id="LittleRed" dojoType="dijit.layout.ContentPane" title="Little Red Cap">
+ Once upon a time there was a dear little girl who was loved by
+ every one who looked at her, but most of all by her grandmother,
+ and there was nothing that she would not have given to the child.
+ </div>
+ <div id="HanselGretel" dojoType="dijit.layout.ContentPane"
+ title="Hansel and Gretel" closable="true" selected="true">
+ Hard by a great forest dwelt a poor wood-cutter with his wife
+ and his two children. The boy was called Hansel and the girl Gretel.
+ He had little to bite and to break, and once when great dearth fell
+ on the land, he could no longer procure even daily bread.
+ </div>
+ <div id="GreenTwigs" dojoType="dijit.layout.ContentPane"
+ title="The Three Green Twigs">
+ There was once upon a time a hermit who lived in a forest at the foot
+ of a mountain, and passed his time in prayer and good works,
+ and every evening he carried, to the glory of God, two pails of water
+ up the mountain.
+ </div>
+
+ <h3>Typical rendering time</h3>
+ <table border=1>
+ <tr><th>IE</th><th>Firefox (mac)</th></tr>
+ <tr><td>1719</td><td>922</td></tr>
+ </table>
+ <h3>Rendering time</h3>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_TabContainerTitlePane.html b/includes/js/dijit/tests/layout/test_TabContainerTitlePane.html
new file mode 100644
index 0000000..139eb2b
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_TabContainerTitlePane.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TabContainer Nested TitlePane Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ font-family : sans-serif;
+ margin:20px;
+ }
+
+ /* add padding to each contentpane inside the tab container, and scrollbar if necessary */
+ .dojoTabPane {
+ padding : 10px 10px 10px 10px;
+ overflow: auto;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.TitlePane");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ startTime = new Date();
+ dojo.addOnLoad(function(){
+ var elapsed = new Date().getTime() - startTime;
+ var p = document.createElement("p");
+ p.appendChild(document.createTextNode("Widgets loaded in " + elapsed + "ms"));
+ document.body.appendChild(p);
+ // dojo.parser.parse(dojo.body());
+ });
+
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit layout.TabContainer nested TitlePane tests</h1>
+
+ <div id="mainTabContainer" dojoType="dijit.layout.TabContainer" style="width: 100%; height: 20em;">
+
+ <div dojoType="dijit.layout.ContentPane" title="Tab 1">
+ <h1>I am tab 1</h1>
+ <div dojoType="dijit.TitlePane" title="Title pane" width="300">
+ <p>This is a title pane, containing another tab container ...</p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque iaculis, nulla id semper faucibus, pede tellus nonummy magna, vitae adipiscing orci arcu ut augue. Nunc condimentum, magna a vestibulum convallis, libero purus pulvinar orci, sed vestibulum urna sem ut pede. More Ipsum...
+ </p>
+ <div id="subTabContainer" dojoType="dijit.layout.TabContainer" style="width: 100%; height: 20em;">
+ <div id="tab3" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 3"></div>
+ <div id="tab4" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Tab 4" selected="true"></div>
+ </div>
+ </div>
+ </div>
+ <div id="tab2" dojoType="dijit.layout.ContentPane" href="tab2.html" title="Tab 2"></div>
+
+ </div>
+
+
+ <h3>Typical rendering time</h3>
+ <table border=1>
+ <tr><th>IE</th><th>Firefox (mac)</th></tr>
+ <tr><td>1719</td><td>922</td></tr>
+ </table>
+ <h3>Rendering time</h3>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_TabContainer_noLayout.html b/includes/js/dijit/tests/layout/test_TabContainer_noLayout.html
new file mode 100644
index 0000000..3fb8d15
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_TabContainer_noLayout.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TabContainer doLayout=false Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ font-family : sans-serif;
+ margin:20px;
+ }
+
+ /* add padding to each contentpane inside the tab container, and scrollbar if necessary */
+ .dojoTabPane {
+ padding : 10px 10px 10px 10px;
+ overflow: auto;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.layout.LinkPane");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function testClose(pane,tab){
+ return confirm("Please confirm that you want tab "+tab.title+" closed");
+ }
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit layout.TabContainer doLayout=false tests</h1>
+
+ <p>
+ This tests tabs in doLayout=false mode, in which case the tab container's height ==
+ the height of the currently selected tab.
+ </p>
+ <p>With doLayout=false mode tabs to the left or right are not supported and tabs at the bottom are a bit buggy in FireFox.
+ </p>
+
+
+ <!-- 1ST TABCONTAINER -->
+
+ <div id="mainTabContainer" dojoType="dijit.layout.TabContainer" doLayout="false">
+
+ <div id="tab1" dojoType="dijit.layout.ContentPane" href="tab1.html" title="Tab 1"></div>
+
+ <div id="tab2" dojoType="dijit.layout.ContentPane" href="tab2.html" refreshOnShow="true" title="Tab 2" selected="true"></div>
+
+ <div dojoType="dijit.layout.ContentPane" title="Tab 3">
+ <h1>I am tab 3</h1>
+ <p>And I was already part of the page! That's cool, no?</p>
+ <span id="foo">tooltip on this span</span>
+ <div dojoType="dijit.Tooltip" connectId="foo">I'm a tooltip!</div>
+ <button dojoType="dijit.form.Button">I'm a button </button>
+ <br>
+ <button dojoType="dijit.form.Button">So am I!</button>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+ imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+ nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+ massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+ pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+ quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+ felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+ quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+ rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+ semper velit ante id metus. Praesent massa dolor, porttitor sed,
+ pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+ tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ </div>
+
+ <div dojoType="dijit.layout.TabContainer" title="Inlined Sub TabContainer">
+ <a dojoType="dijit.layout.LinkPane" href="tab1.html">SubTab 1</a>
+ <a dojoType="dijit.layout.LinkPane" href="tab2.html" selected="true">SubTab 2</a>
+ </div>
+
+ <a dojoType="dijit.layout.LinkPane" href="tab3.html">Sub TabContainer from href</a>
+ </div>
+
+ <p>
+ Some text here. This should appear directly below the TabContainer,
+ and the position will change based on the current height of the TabContainer.
+ </p>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/layout/test_TabContainer_remote.html b/includes/js/dijit/tests/layout/test_TabContainer_remote.html
new file mode 100644
index 0000000..19515a9
--- /dev/null
+++ b/includes/js/dijit/tests/layout/test_TabContainer_remote.html
@@ -0,0 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TabContainer Demo</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+
+ body {
+ font-family : sans-serif;
+ margin:20px;
+ }
+
+ /* add padding to each contentpane inside the tab container, and scrollbar if necessary */
+ .dojoTabPane {
+ padding : 10px 10px 10px 10px;
+ overflow: auto;
+ }
+ </style>
+
+ <script type="text/javascript" djConfig="isDebug: true,parseOnLoad:true"
+ src="../../../dojo/dojo.js"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.layout.LinkPane");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ var tabCounter;
+ function testClose(pane, tab){
+ // remove html from title
+ var title = dojo.trim(tab.title.replace(/<\/?[a-z][a-z0-9]*[^>]*>/ig, ""));
+ return confirm("Please confirm that you want tab "+title+" closed");
+ }
+
+ function randomMessageId(){
+ return Math.floor(Math.random() * 3) + 3;
+ }
+
+ function createTab(){
+ if(!tabCounter){ tabCounter = 3; }
+
+ var title = '<img src="../images/plus.gif" style="background-color:#95B7D3;"/> Tab ' +(++tabCounter);
+ var refreshOnShow = !!(tabCounter % 2);
+
+ var newTab = new dijit.layout.ContentPane({
+ title: title + (refreshOnShow ? ' <i>refreshOnShow</i>': ''),
+ closable:true,
+ refreshOnShow: refreshOnShow,
+ href: 'getResponse.php?delay=1000&messId='+randomMessageId()
+ +"&message="+encodeURI("<h1>Programmatically created Tab "+tabCounter+"</h1>")
+ }, dojo.doc.createElement('div'));
+
+ dijit.byId('ttabs').addChild(newTab);
+
+ newTab.startup(); // find parent TabContainer and subscribe to selectChild event
+ }
+
+ startTime = new Date();
+ dojo.addOnLoad(function(){
+ var elapsed = new Date().getTime() - startTime;
+ var p = document.createElement("p");
+ p.appendChild(document.createTextNode("Widgets loaded in " + elapsed + "ms"));
+ document.body.appendChild(p);
+ });
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit layout.TabContainer (delayed) remote tests</h1>
+
+ <p>These tabs are made up of external content. Loading is delayed to make it easier to see if refreshOnShow and preload = 'false' is working.<br/>
+ The tabs also tests to insert html in the Tab title
+ </p>
+
+ <div dojoType='dijit.form.Button' onClick='createTab()'>Create a Tab</div>
+ <div id="ttabs" dojoType="dijit.layout.TabContainer" tabPosition="top" style="width: 100%; height: 20em;">
+ <a id="ttab1" dojoType="dijit.layout.LinkPane"
+ href="getResponse.php?messId=3&delay=1000"
+ closable="true"
+ ><img src='../images/copy.gif'/> Tab1</a>
+ <a id="ttab2" dojoType="dijit.layout.LinkPane"
+ href="getResponse.php?messId=4&delay=1000"
+ refreshOnShow="true" title="Tab 2 "
+ selected='true'
+ closable='true'
+ ><i>refreshOnShow</i>
+ <img src='../images/cut.gif'/>
+ </a>
+ <a dojoType="dijit.layout.LinkPane"
+ href="getResponse.php?messId=5&delay=1000"
+ onClose="testClose"
+ closable="true"
+ >
+ <b>Tab 3</b>
+ <img src='../images/paste.gif'/>
+ </a>
+ </div>
+
+ <h3>Rendering time</h3>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/manualTests.html b/includes/js/dijit/tests/manualTests.html
new file mode 100644
index 0000000..7f8b1c1
--- /dev/null
+++ b/includes/js/dijit/tests/manualTests.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+ <head>
+ <title>Dijit Manual Test Runner</title>
+ </head>
+ <body>
+ Redirecting to D.O.H runner
+ <script>
+ window.location.replace("../../util/doh/runner.html?testModule=dijit.tests.manualTests"+window.location.search.replace(/^\?/,"&"));
+ </script>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/manualTests.js b/includes/js/dijit/tests/manualTests.js
new file mode 100644
index 0000000..f4f09e1
--- /dev/null
+++ b/includes/js/dijit/tests/manualTests.js
@@ -0,0 +1,85 @@
+if(!dojo._hasResource["dijit.tests.manualTests"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.manualTests"] = true;
+dojo.provide("dijit.tests.manualTests");
+
+try{
+if(dojo.isBrowser){
+ var userArgs = window.location.search.replace(/[\?&](dojoUrl|testUrl|testModule)=[^&]*/g,"").replace(/^&/,"?");
+ doh.registerUrl("dijit/demos/chat.html", dojo.moduleUrl("dijit","demos/chat.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/form.html", dojo.moduleUrl("dijit","demos/form.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/i18n.html", dojo.moduleUrl("dijit","demos/i18n.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/mail.html", dojo.moduleUrl("dijit","demos/mail.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/nihao.html", dojo.moduleUrl("dijit","demos/nihao.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/chat/client.html", dojo.moduleUrl("dijit","demos/chat/client.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/chat/community.html", dojo.moduleUrl("dijit","demos/chat/community.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/chat/operator.html", dojo.moduleUrl("dijit","demos/chat/operator.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/i18n/generate.html", dojo.moduleUrl("dijit","demos/i18n/generate.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/demos/i18n/sprite.html", dojo.moduleUrl("dijit","demos/i18n/sprite.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test.html", dojo.moduleUrl("dijit","tests/test.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Calendar.html", dojo.moduleUrl("dijit","tests/test_Calendar.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_ColorPalette.html", dojo.moduleUrl("dijit","tests/test_ColorPalette.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Declaration.html", dojo.moduleUrl("dijit","tests/test_Declaration.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Dialog.html", dojo.moduleUrl("dijit","tests/test_Dialog.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Dialog_focusDestroy.html", dojo.moduleUrl("dijit","tests/test_Dialog_focusDestroy.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Editor.html", dojo.moduleUrl("dijit","tests/test_Editor.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_InlineEditBox.html", dojo.moduleUrl("dijit","tests/test_InlineEditBox.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_instantiate.html", dojo.moduleUrl("dijit","tests/test_instantiate.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Menu.html", dojo.moduleUrl("dijit","tests/test_Menu.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_ProgressBar.html", dojo.moduleUrl("dijit","tests/test_ProgressBar.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_TitlePane.html", dojo.moduleUrl("dijit","tests/test_TitlePane.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_ToolBar.html", dojo.moduleUrl("dijit","tests/test_ToolBar.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Tooltip.html", dojo.moduleUrl("dijit","tests/test_Tooltip.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_TooltipDialog.html", dojo.moduleUrl("dijit","tests/test_TooltipDialog.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Tree.html", dojo.moduleUrl("dijit","tests/test_Tree.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/test_Tree_Notification_API_Support.html", dojo.moduleUrl("dijit","tests/test_Tree_Notification_API_Support.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_programaticTest.html", dojo.moduleUrl("dijit","tests/_programaticTest.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_Button.html", dojo.moduleUrl("dijit","tests/form/test_Button.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_CheckBox.html", dojo.moduleUrl("dijit","tests/form/test_CheckBox.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_ComboBox.html", dojo.moduleUrl("dijit","tests/form/test_ComboBox.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_ComboBox_destroy.html", dojo.moduleUrl("dijit","tests/form/test_ComboBox_destroy.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_DateTextBox.html", dojo.moduleUrl("dijit","tests/form/test_DateTextBox.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_FilteringSelect.html", dojo.moduleUrl("dijit","tests/form/test_FilteringSelect.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_MultiSelect.html", dojo.moduleUrl("dijit","tests/form/test_MultiSelect.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_SimpleTextarea.html", dojo.moduleUrl("dijit","tests/form/test_SimpleTextarea.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_Slider.html", dojo.moduleUrl("dijit","tests/form/test_Slider.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_Spinner.html", dojo.moduleUrl("dijit","tests/form/test_Spinner.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_Textarea.html", dojo.moduleUrl("dijit","tests/form/test_Textarea.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_TimeTextBox.html", dojo.moduleUrl("dijit","tests/form/test_TimeTextBox.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/form/test_validate.html", dojo.moduleUrl("dijit","tests/form/test_validate.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_AccordionContainer.html", dojo.moduleUrl("dijit","tests/layout/test_AccordionContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_BorderContainer.html", dojo.moduleUrl("dijit","tests/layout/test_BorderContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_BorderContainer_complex.html", dojo.moduleUrl("dijit","tests/layout/test_BorderContainer_complex.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_BorderContainer_experimental.html", dojo.moduleUrl("dijit","tests/layout/test_BorderContainer_experimental.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_BorderContainer_full.html", dojo.moduleUrl("dijit","tests/layout/test_BorderContainer_full.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_BorderContainer_nested.html", dojo.moduleUrl("dijit","tests/layout/test_BorderContainer_nested.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_ContentPane.html", dojo.moduleUrl("dijit","tests/layout/test_ContentPane.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_LayoutCode.html", dojo.moduleUrl("dijit","tests/layout/test_LayoutCode.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_LayoutContainer.html", dojo.moduleUrl("dijit","tests/layout/test_LayoutContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_SplitContainer.html", dojo.moduleUrl("dijit","tests/layout/test_SplitContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_StackContainer.html", dojo.moduleUrl("dijit","tests/layout/test_StackContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_StackContainer_code.html", dojo.moduleUrl("dijit","tests/layout/test_StackContainer_code.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_TabContainer.html", dojo.moduleUrl("dijit","tests/layout/test_TabContainer.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_TabContainerTitlePane.html", dojo.moduleUrl("dijit","tests/layout/test_TabContainerTitlePane.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_TabContainer_noLayout.html", dojo.moduleUrl("dijit","tests/layout/test_TabContainer_noLayout.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/layout/test_TabContainer_remote.html", dojo.moduleUrl("dijit","tests/layout/test_TabContainer_remote.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/tree/test_Tree_DnD.html", dojo.moduleUrl("dijit","tests/tree/test_Tree_DnD.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/tree/test_Tree_Programmatic.html", dojo.moduleUrl("dijit","tests/tree/test_Tree_Programmatic.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/tree/test_Tree_v1.html", dojo.moduleUrl("dijit","tests/tree/test_Tree_v1.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_base/test_FocusManager.html", dojo.moduleUrl("dijit","tests/_base/test_FocusManager.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_base/test_focusWidget.html", dojo.moduleUrl("dijit","tests/_base/test_focusWidget.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_base/test_placeStrict.html", dojo.moduleUrl("dijit","tests/_base/test_placeStrict.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_base/test_typematic.html", dojo.moduleUrl("dijit","tests/_base/test_typematic.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_editor/test_CustomPlugin.html", dojo.moduleUrl("dijit","tests/_editor/test_CustomPlugin.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_editor/test_RichText.html", dojo.moduleUrl("dijit","tests/_editor/test_RichText.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/tests/_editor/test_ToggleDir.html", dojo.moduleUrl("dijit","tests/_editor/test_ToggleDir.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/themes/templateThemeTest.html", dojo.moduleUrl("dijit","themes/templateThemeTest.html"+userArgs), 99999999);
+ doh.registerUrl("dijit/themes/themeTester.html", dojo.moduleUrl("dijit","themes/themeTester.html"+userArgs), 99999999);
+ if(dojo.isIE){
+ doh.registerUrl("dijit/themes/themeTesterQuirk.html", dojo.moduleUrl("dijit","themes/themeTesterQuirk.html"+userArgs), 99999999);
+ }
+}
+}catch(e){
+ doh.debug(e);
+}
+
+}
diff --git a/includes/js/dijit/tests/module.js b/includes/js/dijit/tests/module.js
new file mode 100644
index 0000000..f8a736c
--- /dev/null
+++ b/includes/js/dijit/tests/module.js
@@ -0,0 +1,21 @@
+if(!dojo._hasResource["dijit.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.module"] = true;
+dojo.provide("dijit.tests.module");
+
+try{
+ dojo.require("dijit.tests._base.manager");
+ dojo.require("dijit.tests._base.viewport");
+ dojo.require("dijit.tests._base.wai");
+ dojo.require("dijit.tests._Templated");
+ dojo.require("dijit.tests.widgetsInTemplate");
+ dojo.require("dijit.tests.Container");
+ dojo.require("dijit.tests.layout.ContentPane");
+ dojo.require("dijit.tests.ondijitclick");
+ dojo.require("dijit.tests.form.Form");
+}catch(e){
+ doh.debug(e);
+}
+
+
+
+}
diff --git a/includes/js/dijit/tests/ondijitclick.html b/includes/js/dijit/tests/ondijitclick.html
new file mode 100644
index 0000000..36de0e0
--- /dev/null
+++ b/includes/js/dijit/tests/ondijitclick.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Test Dijit Internal Event: "ondijitclick"</title>
+
+ <script type="text/javascript" src="../../dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+ dojo.require("dijit._Widget");
+ dojo.require("dojo.parser");
+
+ dojo.declare("dijit.WidgetWithOndijitclick",
+ dijit._Widget,
+ {
+ clickCount: 0,
+ _onClick: function() {
+ this.clickCount++;
+ },
+ postCreate: function() {
+ this.connect(this.domNode, "ondijitclick", "_onClick");
+ }
+ }
+ );
+
+ dojo.addOnLoad(function(){
+ doh.register("ondijitclick",
+ [
+ {
+ name: "ondijitclick fires once on a space-key-up",
+ runTest: function(t){
+ var w = dijit.byId("widget1");
+ if (dojo.isSafari){ // safari has error
+ this.name += " * SKIPPED *";
+ return;
+ }
+
+ // simulate space up
+ if (document.createEvent){
+ var e = document.createEvent("KeyboardEvent");
+ e.initKeyEvent("keyup",true,true,null,false,false,false,false,32,0);
+ w.domNode.focus();
+ w.clickCount = 0;
+ w.domNode.dispatchEvent(e);
+ t.is(1, w.clickCount);
+ }
+ }
+ },
+ {
+ name: "ondijitclick fires once on an enter-key-down",
+ runTest: function(t){
+ var w = dijit.byId("widget1");
+ if (dojo.isSafari){ // safari has error
+ this.name += " * SKIPPED *";
+ return;
+ }
+
+ // simulate enter down
+ if (document.createEvent && !dojo.isSafari){
+ var e = document.createEvent("KeyboardEvent");
+ e.initKeyEvent("keydown",true,true,null,false,false,false,false,13,0);
+ w.domNode.focus();
+ w.clickCount = 0;
+ w.domNode.dispatchEvent(e);
+ t.is(1, w.clickCount);
+ }
+ }
+ },
+ {
+ name: "ondijitclick fires once on a mouse click",
+ runTest: function(t){
+ var w = dijit.byId("widget1");
+
+ // simulate enter up
+ if (document.createEvent){
+ var e = document.createEvent("MouseEvents");
+ e.initMouseEvent('click', true, true, document.defaultView, 1, 0, 0, 3, 3, false, false, false, false, 0, w.domNode);
+ w.clickCount = 0;
+ w.domNode.dispatchEvent(e);
+ t.is(1, w.clickCount);
+ }
+ }
+ }
+ ]
+ );
+ doh.run();
+ });
+
+ </script>
+</head>
+<body class="tundra">
+ <div id="widget1" dojoType="dijit.WidgetWithOndijitclick"></div>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/ondijitclick.js b/includes/js/dijit/tests/ondijitclick.js
new file mode 100644
index 0000000..6fd67ea
--- /dev/null
+++ b/includes/js/dijit/tests/ondijitclick.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests.ondijitclick"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.ondijitclick"] = true;
+dojo.provide("dijit.tests.ondijitclick");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.ondijitclick", dojo.moduleUrl("dijit", "tests/ondijitclick.html"));
+}
+
+}
diff --git a/includes/js/dijit/tests/runTests.html b/includes/js/dijit/tests/runTests.html
new file mode 100644
index 0000000..9395bd0
--- /dev/null
+++ b/includes/js/dijit/tests/runTests.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+ <head>
+ <title>Dijit Unit Test Runner</title>
+ <meta http-equiv="REFRESH" content="0;url=../../util/doh/runner.html?testModule=dijit.tests.module"></HEAD>
+ <BODY>
+ Redirecting to D.O.H runner.
+ </BODY>
+</HTML>
diff --git a/includes/js/dijit/tests/test.html b/includes/js/dijit/tests/test.html
new file mode 100644
index 0000000..c793092
--- /dev/null
+++ b/includes/js/dijit/tests/test.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>widget infrastructure test</title>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: true"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.Button");
+
+ dojo.addOnLoad(function(){
+ for(var i=1; i<=3; i++){
+ var node = dojo.byId("b"+i);
+ var myButton = new dijit.form.Button(null, node);
+ }
+ });
+
+ </script>
+
+ <style type="text/css">
+
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ @import "css/dijitTests.css";
+
+ body { padding: 5em; }
+ </style>
+</head>
+
+<body class="tundra">
+ <button id="b1" style="background: yellow;">button #1</button>
+ <button id="b2" style="background: orange;">button #2</button>
+ <button id="b3" style="background: violet;">button #3</button>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_Calendar.html b/includes/js/dijit/tests/test_Calendar.html
new file mode 100644
index 0000000..df86ba0
--- /dev/null
+++ b/includes/js/dijit/tests/test_Calendar.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Calendar Widget Test</title>
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true, extraLocale: ['en-us', 'ar-sy', 'es-es', 'zh-cn']"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit._Calendar");
+ dojo.require("dojo.date.locale");
+ dojo.require("dojo.parser"); // scan page for widgets
+
+ dojo.addOnLoad(function(){
+ //Need to declare BigCalendar here in an addOnLoad block so that it works
+ //with xdomain loading, where the dojo.require for dijit._Calendar
+ //may load asynchronously. This also means we cannot have HTML
+ //markup in the body tag for BigCalendar, but instead inject it in this
+ //onload handler after BigCalendar is defined.
+ dojo.declare("BigCalendar", dijit._Calendar, {
+ templatePath: "../../dijit/tests/_altCalendar.html"
+ });
+
+ var bigCalendar = dojo.byId("calendar5");
+ bigCalendar.setAttribute("dojoType", "BigCalendar");
+ dojo.parser.parse(bigCalendar.parentNode);
+ });
+
+ function myHandler(id,newValue){
+ console.debug("onChange for id = " + id + ", value: " + newValue);
+ }
+ </script>
+ </head>
+ <body>
+ <h1 class="testTitle">Dijit Calendar Test</h1>
+
+ before
+ <input id="calendar1" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])" lang="en-us">
+ <input id="calendar2" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])" lang="es-es">
+ <input id="calendar3" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])" lang="zh-cn">
+ <input id="calendar4" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])" lang="ar-sy">
+ after
+ <p>
+ <a href="#"
+ onClick="for(var i=1; i!=5; i++){
+ var c = dijit.byId('calendar'+i);
+ c.isDisabledDate=dojo.date.locale.isWeekend;
+ c._populateGrid();
+ }
+ ">disable weekends</a>
+ </p>
+
+ <p>Customized template with "today" button</p>
+ <style>
+ #calendar5 .dijitCalendarDateTemplate { height: 50px; width: 50px; border: 1px solid #ccc; vertical-align: top }
+ #calendar5 .dijitCalendarDateLabel, #calendar5 .dijitCalendarDateTemplate { text-align: inherit }
+ #calendar5 .dijitCalendarDayLabel { font-weight: bold }
+ #calendar5 .dijitCalendarSelectedYear { font-size: 1.5em }
+ #calendar5 .dijitCalendarMonth { font-family: serif; letter-spacing: 0.2em; font-size: 2em }
+ </style>
+ <script>
+ dojo.declare("BigCalendar", dijit._Calendar, {
+ templatePath: "../../dijit/tests/_altCalendar.html"
+ });
+ </script>
+ <div>
+ <!-- Parent div used so we have a handle to use for dojo.parser.parse after BigCalendar gets defined. -->
+ <!-- The input below will be replaced by BigCalendar which is defined in a dojo.addOnLoad block. -->
+ <input id="calendar5" dayWidth="abbr" value="2008-03-15">
+ </div>
+<!--
+ <input id="calendar5" dojoType="dijit._Calendar" dayWidth="abbr" templatePath="../dijit/tests/_altCalendar.html" value="2008-03-15">
+ -->
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/test_ColorPalette.html b/includes/js/dijit/tests/test_ColorPalette.html
new file mode 100644
index 0000000..38675ea
--- /dev/null
+++ b/includes/js/dijit/tests/test_ColorPalette.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>ColorPalette Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ var palette;
+ function init(){
+ var date0 = new Date();
+ palette = new dijit.ColorPalette({palette: "7x10", id: "progPalette"}, dojo.byId("programPalette"));
+ console.log("creation time: " + (new Date() - date0) );
+ }
+
+ dojo.addOnLoad(init);
+
+ function setColor(color){
+ var theSpan = dojo.byId("outputSpan");
+ theSpan.style.color = color;
+ theSpan.innerHTML = color;
+ }
+ </script>
+</head>
+
+<body>
+
+ <h1 class="testTitle">dijit.ColorPalette test:</h1>
+
+ <p>Default color palette (7x10):</p>
+ <div dojoType="dijit.ColorPalette" onChange="setColor(this.value);"></div>
+
+ Test color is: <span id="outputSpan"></span>.
+
+ <p>Small color palette (3x4):</p>
+ <div dojoType="dijit.ColorPalette" palette="3x4"></div>
+
+ <p>Default color palette (7x10) created via createWidget:</p>
+ <div id="programPalette"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_Declaration.html b/includes/js/dijit/tests/test_Declaration.html
new file mode 100644
index 0000000..4e909b9
--- /dev/null
+++ b/includes/js/dijit/tests/test_Declaration.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo Toolkit - Declaration test</title>
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../themes/tundra/tundra.css";
+ @import "css/dijitTests.css";
+ </style>
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("dijit.Declaration");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+</head>
+<body class="tundra">
+ <h3>Simple macro:</h3>
+ <p>(Check to make sure that links contain employee number)
+ <div dojoType="dijit.Declaration" widgetClass="Employee" defaults="{ empid: 123, name: '' }">
+ <span>${name}</span>
+ <a href="update.php?id=${empid}">update</a>
+ <a href="delete.php?id=${empid}">delete</a>
+ </div>
+ <div dojoType="Employee" empid="100" name="Alan Allen"></div>
+ <div dojoType="Employee" empid="101" name="Bob Brown"></div>
+ <div dojoType="Employee" empid="102" name="Cathy Cameron"></div>
+
+ <h3>Using dojoAttachEvent, dojoAttachPoint</h3>
+ <div dojoType="dijit.Declaration" widgetClass="HideButton">
+ XXX<button dojoAttachEvent="onclick" dojoAttachPoint="containerNode"></button>XXX
+ <script type='dojo/method' event='onclick'>
+ this.domNode.style.display="none";
+ </script>
+ </div>
+ <button dojoType="HideButton">Click to hide</button>
+ <button dojoType="HideButton">Click to hide #2</button>
+
+ <h3>Extending another widget</h3>
+ <p>HideButton2 extends HideButton (above) and changes the template (but keeps the onclick handler).</p>
+ <span dojoType="dijit.Declaration" widgetClass="HideButton2" mixins="HideButton">
+ YYY<button dojoAttachEvent="onclick" dojoAttachPoint="containerNode"></button>YYY
+ </span>
+ <button dojoType="HideButton2">Hide me extended</button>
+ <button dojoType="HideButton2">Hide me extended #2</button>
+
+ <h3>Something more complicated:</h3>
+ <div dojoType="dijit.Declaration" widgetClass="foo" defaults="{ foo: 'thud', progress: 10 }">
+ <script type='dojo/connect' event='startup'>
+ this.baz.innerHTML += " (modified by dojo/connect event=startup) ";
+ </script>
+
+ <p>thinger blah stuff ${foo}</p>
+
+ <div style="width:400px" annotate="true" maximum="200"
+ progress="${progress}" dojoType="dijit.ProgressBar"></div>
+ <p dojoAttachPoint='baz'>baz thud</p>
+ </div>
+
+ <div dojoType="foo" foo="blah" progress="50"></div>
+ <div dojoType="foo" foo="thinger" progress="73"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_Dialog.html b/includes/js/dijit/tests/test_Dialog.html
new file mode 100644
index 0000000..0eabc76
--- /dev/null
+++ b/includes/js/dijit/tests/test_Dialog.html
@@ -0,0 +1,408 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dialog Widget Dojo Tests</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ body { font-family : sans-serif; }
+ form { margin-bottom : 0; }
+ table { border: none; }
+ #dialog3_underlay { background-color: #027 }
+ </style>
+
+ <script type="text/javascript"
+ djConfig="parseOnLoad: true, isDebug: true"
+ src="../../dojo/dojo.js"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.TimeTextBox");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // create a do nothing, only for test widget
+ dojo.declare("dijit.TestWidget",
+ [dijit._Widget, dijit._Templated], {
+ templateString: "<div style='margin: 10px; border: inset #700 4px; padding: 5px;' dojoAttachPoint='containerNode'></div>"
+ });
+
+ // make dojo.toJson() print dates correctly (this feels a bit dirty)
+ Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
+
+ var thirdDlg;
+ function createDialog() {
+ if(!thirdDlg){
+ var pane = dojo.byId('thirdDialog');
+ pane.style.width = "300px";
+ thirdDlg = new dijit.Dialog({
+ id: "dialog3",
+ refocus:false,
+ title: "Programatic Dialog Creation"
+ },pane);
+ }
+ setTimeout(function(){thirdDlg.show();},"3000");
+ }
+ </script>
+</head>
+<body>
+<h1 class="testTitle">Dijit layout.Dialog tests</h1>
+<button dojoType="dijit.form.Button" onclick="dijit.byId('dialog1').show()">Show Dialog</button> |
+
+<div dojoType="dijit.Dialog" id="dialog1" title="First Dialog"
+ onfocus="console.log('user focus handler')"
+ onblur="console.log('user blur handler')"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+ <table>
+ <tr>
+ <td><label for="name">Name: </label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" name="name" id="name"></td>
+ </tr>
+ <tr>
+ <td><label for="loc">Location: </label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" name="loc" id="loc"></td>
+ </tr>
+ <tr>
+ <td><label for="date">Date: </label></td>
+ <td><input dojoType=dijit.form.DateTextBox type="text" name="date" id="date"></td>
+ </tr>
+ <tr>
+ <td><label for="date">Time: </label></td>
+ <td><input dojoType=dijit.form.TimeTextBox type="text" name="time" id="time"></td>
+ </tr>
+ <tr>
+ <td><label for="desc">Description: </label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" name="desc" id="desc"></td>
+ </tr>
+ <tr>
+ <td colspan="2" align="center">
+ <button dojoType=dijit.form.Button type="submit">OK</button></td>
+ </tr>
+ </table>
+</div>
+
+
+<button dojoType="dijit.form.Button" onclick="createDialog()" title="shows after 3 second delay, with blue background">Programatic Dialog (3 second delay)</button> |
+
+
+<div id="thirdDialog" style="display: none;">
+ <form>
+ <input>
+ <br>
+ <button>hello</button>
+ <br>
+ <select>
+ <option>Lorem</option>
+ <option>ipsum</option>
+ <option>dolor</option>
+ <option>sit</option>
+ <option>amet</option>
+ </select>
+ </form>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+</div>
+
+<button dojoType="dijit.form.Button" onclick="dijit.byId('tabDialog').show()">Show TabContainer Dialog</button> |
+
+<div dojoType="dijit.Dialog" id="tabDialog" title="TabContainer Dialog">
+ <div dojoType="dijit.layout.TabContainer" style="width: 400px; height: 400px;">
+ <div dojoType="dijit.layout.ContentPane" title="First tab">
+ <p>
+ This is the first tab.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" title="Second tab">
+ <p>
+ This is the second tab.
+ </p>
+ <p>
+ Make it overflow. <a href="http://www.lipsum.com/">ipsum dolor sit amet</a>, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ </div>
+ </div>
+</div>
+
+<button dojoType="dijit.form.Button" onclick="dijit.byId('fifthDlg').show();">Test slow loading HREF Dialog</button> |
+
+<div dojoType="dijit.Dialog" id="fifthDlg" href="layout/getResponse.php?delay=3000&messId=3"
+ style="width: 300px" title="From HREF (slow network simulated)"></div>
+
+<button dojoType="dijit.form.Button" onclick="dijit.byId('dialog6').show()">Show File Dialog</button>
+
+<div dojoType="dijit.Dialog" id="dialog6" title="File Dialog"
+ onfocus="console.log('user focus handler')"
+ onblur="console.log('user blur handler')"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));" style="width: 350px">
+ <!-- note: style="width: 350px" to workaround FF bug where width is too short, see http://trac.dojotoolkit.org/ticket/5976 -->
+ <label for="afile">ID File: </label>
+ <input dojoType=dijit.form.TextBox type="file" name="afile" id="afile">
+</div>
+
+<p>Test refocus="false", click programatic dialog, focus input below, wait. close dialog.</p>
+
+<p><b><i>(scroll down to see more links to click, for testing positioning / scroll handling)</i></b></p>
+
+<p>
+Here's a form. Try clicking the programatic dialog link, then focusing on the form.
+After the dialog closes focus should be returned to the form
+</p>
+
+<form>
+<input>
+<br>
+<button>hello</button>
+<br>
+<select>
+ <option>Lorem</option>
+ <option>ipsum</option>
+ <option>dolor</option>
+ <option>sit</option>
+ <option>amet</option>
+</select>
+</form>
+
+
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<form>
+ <center>
+ <select>
+ <option>1</option>
+ <option>2</option>
+ </select>
+ </center>
+</form>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<form>
+ <center>
+ <select>
+ <option>1</option>
+ <option>2</option>
+ </select>
+ </center>
+</form>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+
+<a href="javascript:dijit.byId('dialog1').show()">Show Dialog</a>
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+
+</body>
+</html>
+
diff --git a/includes/js/dijit/tests/test_Dialog_focusDestroy.html b/includes/js/dijit/tests/test_Dialog_focusDestroy.html
new file mode 100644
index 0000000..187a5d4
--- /dev/null
+++ b/includes/js/dijit/tests/test_Dialog_focusDestroy.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dialog Widget Dojo Tests</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ body { font-family : sans-serif; }
+ form { margin-bottom : 0; }
+ table { border: none; }
+ #dialog3_underlay { background-color: #027 }
+ </style>
+
+ <script type="text/javascript"
+ djConfig="parseOnLoad: true, isDebug: true"
+ src="../../dojo/dojo.js"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+
+ // make dojo.toJson() print dates correctly (this feels a bit dirty)
+ function createAndShow() {
+ var node = document.createElement("div");
+ dojo.body().appendChild(node);
+ var dlg = new dijit.Dialog({ title: "test input focus" }, node);
+
+ var input = document.createElement("input");
+ dojo.attr(input,"tabIndex","0");
+ dlg.containerNode.appendChild(input);
+
+ var btn = new dijit.form.Button({ label: "Close" });
+ dlg.containerNode.appendChild(btn.domNode);
+
+ dojo.connect(btn, "onClick", function(){
+ console.log("destroying, while visible");
+ dlg.destroy();
+
+ });
+ dlg.show();
+ }
+ </script>
+</head>
+<body>
+<h1 class="testTitle">Dijit layout.Dialog tests</h1>
+
+<p>If you input this box, you can type. You should be able to type and use backspace/etc
+when you destroy the visible dialog. refs <a href="http://trac.dojotoolkit.org/ticket/5351">#5351</a>
+</p>
+
+<input id="testInput" name="foo" value="bar" />
+
+<button dojoType="dijit.form.Button" onclick="createAndShow()">Show Dialog</button>
+
+</body>
+</html>
+
diff --git a/includes/js/dijit/tests/test_Editor.html b/includes/js/dijit/tests/test_Editor.html
new file mode 100644
index 0000000..b73ecea
--- /dev/null
+++ b/includes/js/dijit/tests/test_Editor.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Editor Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Editor");
+ dojo.require("dijit._editor.plugins.AlwaysShowToolbar");
+ dojo.require("dijit._editor.plugins.EnterKeyHandling");
+ dojo.require("dijit._editor.plugins.FontChoice"); // 'fontName','fontSize','formatBlock'
+ dojo.require("dijit._editor.plugins.TextColor");
+ dojo.require("dijit._editor.plugins.LinkDialog");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+</head>
+<body>
+ <div dojoType="dijit.Editor" id="automated" height="1.5em" plugins="[]" focusOnLoad="true" style="border:0px;"
+ >Automated Test - all check boxes should be checked<script type='dojo/method' event='onFocus'>
+ if(!document.getElementById('onFocusFired').checked){
+ document.getElementById('onFocusFired').checked=true;
+ document.getElementById('initialValueOK').checked = (dijit.byId('automated').getValue() == 'Automated Test - all check boxes should be checked');
+ dijit.byId('automated').document.execCommand('selectall', false, false);
+ document.getElementById('onChangeOKnow').checked=true;
+ dijit.byId('automated').document.execCommand('underline', false, false);
+ setTimeout(function(){dijit.byId('editor1').focus();}, 0);
+ }
+ </script
+ ><script type='dojo/method' event='onBlur'>
+ if(!document.getElementById('onBlurFired').checked){
+ document.getElementById('onBlurFired').checked=true;
+ dijit.byId('automated').setDisabled(true);
+ setTimeout(function(){ try {
+ dijit.byId('automated').document.execCommand('bold', false, false);
+ document.getElementById('disabledOK').checked = (dijit.byId('automated').document.queryCommandState('bold') == false);
+ } catch(e) { document.getElementById('disabledOK').checked = true; }}, 0);
+ }
+ </script
+ ><script type='dojo/method' event='onChange'>
+ if(document.getElementById('onChangeOKnow').checked && !document.getElementById('onChangeFired').checked){
+ document.getElementById('onChangeFired').checked=true;
+ }
+ </script
+ ></div>
+ Focus:<input type="checkbox" id="onFocusFired" disabled autoComplete="off">
+ Value:<input type="checkbox" id="initialValueOK" disabled autoComplete="off">
+ <input type="checkbox" id="onChangeOKnow" disabled autoComplete="off" style="display:none;">
+ Change:<input type="checkbox" id="onChangeFired" disabled autoComplete="off">
+ Blur:<input type="checkbox" id="onBlurFired" disabled autoComplete="off">
+ Disabled:<input type="checkbox" id="disabledOK" disabled autoComplete="off">
+ <br>
+ <br>
+
+ <h1 class="testTitle"><label for="editor1">Editor + Plugins Test</label></h1>
+ <h2>Created from div</h2>
+ <div style="border: 1px solid black;">
+ <div dojoType="dijit.Editor" id="editor1"
+ onChange="console.log('editor1 onChange handler: ' + arguments[0])"
+ ><p>This instance is created from a div directly with default toolbar and plugins</p></div>
+ </div>
+ <button onClick="dijit.byId('editor1').destroy()">destroy</button>
+ <button onclick="console.log(dijit.byId('editor1').getValue().length)">getValue</button>
+ <hr/>
+
+ <h2>Created from textarea,auto-expanding</h2>
+ <div style="border: 1px dotted black;">
+ <h3><label for="thud">thud - from textarea</label></h3>
+ <textarea dojoType="dijit.Editor" height=""
+ onChange="console.log('thud onChange handler: ' + arguments[0])"
+ extraPlugins="['dijit._editor.plugins.AlwaysShowToolbar']"
+ styleSheets="../../dojo/resources/dojo.css" id="thud">
+ <p>
+ This editor is created from a textarea with AlwaysShowToolbar plugin (do not forget to set height="").
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ </textarea>
+ <h3>..after</h3>
+ </div>
+ <hr/>
+
+ <h2>Optional toolbar buttons</h2>
+ <div style="border: 1px dotted black;">
+ <h3><label for="blah">blah entry</label></h3>
+ <textarea dojoType="dijit.Editor"
+ plugins="['bold','italic','|','createLink','foreColor','hiliteColor',{name:'dijit._editor.plugins.FontChoice', command:'fontName', generic:true},'fontSize','formatBlock','insertImage']"
+ styleSheets="../../dojo/resources/dojo.css" id="blah">
+ This instance includes optional toolbar buttons which pull in additional ui (dijit) code.
+ Note the dojo.require() statements required to pull in the associated editor plugins to make
+ this work.
+ <br>
+ <span style="font-family: serif">This is serif.</span>
+ <br>
+ <span style="font-family: sans-serif">This is sans-serif.</span>
+ <br>
+ <span style="font-family: monospace">This is monospace.</span>
+ <br>
+ <span style="font-family: cursive">This is cursive.</span>
+ <br>
+ <span style="font-family: fantasy">This is fantasy.</span>
+ <br>
+ </textarea>
+ <h3>..after</h3>
+ <button onclick="alert(dijit.byId('blah').getValue());">getValue</button>
+ </div>
+ <hr/>
+
+ <h2>Plugins specified</h2>
+ <div style="border: 1px dotted black;">
+ <h3><label for="blah2">Another blah entry</label></h3>
+ <textarea dojoType="dijit.Editor"
+ plugins="['bold','italic','|',{name:'dijit._editor.plugins.EnterKeyHandling'},{name:'dijit._editor.plugins.FontChoice', command:'fontName', custom:['Verdana','Myriad','Garamond','Apple Chancery','Hiragino Mincho Pro']}, {name:'dijit._editor.plugins.FontChoice', command:'fontSize', custom:[3,4,5]}]"
+ styleSheets="../../dojo/resources/dojo.css" id="blah2">
+ This instance demos how to:
+ <ol>
+ <li>specify which plugins to load (see the plugins property): this instance loads EnterKeyHandling plugin, among others;</li>
+ <li>specify options for a plugin (see the last item in the plugins array)</li>
+ </ol>
+ </textarea>
+ <h3>..after</h3>
+ </div>
+ <hr/>
+
+ <h2>Programmatic creation</h2>
+ <div id="programmatic">This div will become an editor.</div>
+ <button
+ id="create"
+ onclick="new dijit.Editor({}, dojo.byId('programmatic')); dojo.query('#create').orphan();">
+ create static editor
+ </button>
+ <div id="programmatic2">This div will become an auto-expanding editor.</div>
+ <button
+ id="create2"
+ onclick="new dijit.Editor({height: '', extraPlugins: ['dijit._editor.plugins.AlwaysShowToolbar']}, dojo.byId('programmatic2')); dojo.query('#create2').orphan();">
+ create expanding editor
+ </button>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_InlineEditBox.html b/includes/js/dijit/tests/test_InlineEditBox.html
new file mode 100644
index 0000000..ea8d7a8
--- /dev/null
+++ b/includes/js/dijit/tests/test_InlineEditBox.html
@@ -0,0 +1,231 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Inline Edit Box Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ .inlineEdit { background-color: #CCC76A; }
+
+ /* some style rules on nodes just to test that style gets copied to the edit widget */
+ p { font-family: cursive; }
+ .letter p { font-family: monospace; }
+ h3 { font-family: helvetica; font-style: italic; }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="isDebug: true, parseOnLoad: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.CurrencyTextBox");
+ dojo.require("dojo.currency");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.Slider");
+
+ dojo.require("dijit.Editor");
+ dojo.require("dijit._editor.plugins.AlwaysShowToolbar");
+
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ function myHandler(id,newValue){
+ console.debug("onChange for id = " + id + ", value: " + newValue);
+ };
+ /*
+ dojo.addOnLoad(function(){
+ dojo.subscribe("widgetFocus", function(widget){
+ console.log("focused on widget " + (widget?widget:"nothing"));
+ });
+ dojo.subscribe("widgetBlur", function(widget){
+ console.log("blurred widget " + (widget?widget:"nothing"));
+ });
+ dojo.subscribe("focusNode", function(node){ console.log("focused on node " + (node?(node.id||node.tagName):"nothing"));});
+ });
+ */
+ </script>
+ </head>
+ <body>
+ <h1 class="testTitle">Dijit InlineEditBox Test</h1>
+
+ <span dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="_data/states.json"></span>
+ <span dojoType="dojo.data.ItemFileReadStore" jsId="productStore">
+ <script type="dojo/method">
+ this._jsonData =
+ { identifier: 'name',
+ label: 'name',
+ items: [
+ { name: "refrigerator" },
+ { name: "freezer" },
+ { name: "stove" },
+ { name: "heater" },
+ ]};
+ </script>
+ </span>
+
+ <h2>Form Letter with blanks</h2>
+ <div class="letter">
+ <h3 id="editable" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])" autoSave="true" title="company name"></h3>
+ <p>
+ Dear <span dojoType="dijit.InlineEditBox" width="200px" title="recipient name"></span>,
+ </p>
+ <p class="letter">
+ Thank you for your recent order.
+ Please remit
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.CurrencyTextBox" editorParams="{currency: 'USD'}" width="100px" title="dollar amount"></span>&nbsp;for
+ your purchase of
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.NumberSpinner" editorParams="{constraints: {places:0} }" width="70px" title="quantity"></span>&nbsp;deluxe
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.ComboBox" title="item name"
+ editorParams="{searchAttr: 'name', store: productStore, autocomplete: false, hasDownArrow: false}"
+ width="200px"></span>&nbsp;on
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="200px" title="purchase date as mm/dd/yy"></span>&nbsp;in
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+ editorParams="{searchAttr: 'name', keyAttr: 'abbreviation', store: stateStore, autocomplete: true, hasDownArrow: true}"
+ width="200px" title="state of purchase"></span>.
+ </p>
+ <p dojoType="dijit.InlineEditBox" autoSave="false" editor="dijit.form.Textarea" title="additional details"></p>
+ <p>
+ Sincerely,
+ </p>
+ <span style="margin-left: 2em; font-family: cursive;" dojoType="dijit.InlineEditBox" width="400px" title="sender name" ></span>
+ </div>
+ <hr style="margin-bottom: 1em;">
+
+ <h2>Form Letter with predefined values, and no auto-save</h2>
+ <div class="letter">
+ <h3 id="editable2" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])" autoSave="false" title="company name">
+ Bob Vance Refrigeration
+ </h3>
+ <p>
+ Dear <span dojoType="dijit.InlineEditBox" width="200px" autoSave="false" title="recipient name">John</span>,
+ </p>
+ <p class="letter">
+ Thank you for your recent order.
+ Please remit
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.CurrencyTextBox" editorParams="{currency: 'USD'}" width="100px" autoSave="false" title="dollar amount">$2,000</span>
+ for your purchase of
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.NumberSpinner" editorParams="{constraints: {places:0} }" width="70px" autoSave="false" title="quantity">3</span>
+ deluxe
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.ComboBox"
+ editorParams="{searchAttr: 'name', store: productStore, autocomplete: false, hasDownArrow: false}"
+ width="200px" autoSave="false" title="item name">refrigerators</span>
+ on
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="200px" autoSave="false" title="purchase date as mm/dd/yy">01/01/2007</span>
+ in
+ <span dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+ editorParams="{searchAttr: 'name', keyAttr: 'abbreviation', store: stateStore, autocomplete: true, hasDownArrow: false}"
+ width="200px" autoSave="false" title="state of purchase">
+ Pennsylvania
+ </span>.
+ </p>
+ <p dojoType="dijit.InlineEditBox" autoSave="false" editor="dijit.form.Textarea" title="additional details">
+ We sincerely appreciate your business and hope we can do business again.
+ </p>
+ <p>
+ Sincerely,
+ </p>
+ <span style="margin-left: 2em; font-family: cursive;" dojoType="dijit.InlineEditBox" width="400px" autoSave="false" title="sender name">Bob Vance</span>
+ </div>
+ <hr style="margin-bottom: 1em;">
+
+
+ <h2>Inline-block Text (of 400px width)</h2>
+ <div>
+ The following section uses inline block text of 400px.
+ When clicking the editable text it should bring up an editor which is also 400px wide.
+ </div>
+ (before plain inline) <fieldset class="dijitInline"><div style="width: 400px;">hello world</div></fieldset> (after plain inline)
+ <br>
+ (before editable inline)
+ <fieldset class="dijitInline"><div dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])" width="400px" style="width: 400px;">
+ hello world
+ </div></fieldset>
+ (after editable inline)
+ <hr style="width:100%;">
+
+ <h2>Pararagraph</h2>
+ (before plain paragraph)
+ <p>
+ Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ (before editable paragraph. the editable paragraph has Save/Cancel buttons when open.)
+ <p id="areaEditable" dojoType="dijit.InlineEditBox" autoSave="false" editor="dijit.form.Textarea">
+ Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+ These buttons will
+ <button onClick="dijit.byId('areaEditable').setDisabled(true)">disable</button> /
+ <button onClick="dijit.byId('areaEditable').setDisabled(false)">enable</button>
+ the InlineEditBox above.
+ <hr style="width:100%;">
+
+ <h2>Editor</h2>
+ <p id="inlineRTE" dojoType="dijit.InlineEditBox" editor="dijit.Editor"
+ autoSave="false" renderAsHtml="true"
+ editorParams="{height: '', extraPlugins: ['dijit._editor.plugins.AlwaysShowToolbar']}">
+ <b>Aliquam</b> vitae enim. <i>Duis</i> scelerisque metus auctor est venenatis
+imperdiet. <u>Fusce</u> dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+ </p>
+
+ <h2>FilteringSelect (no down arrow, and save/cancel buttons):</h2>
+ before
+ <span id="filteringSelect2" dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+ editorParams="{searchAttr: 'name', keyAttr: 'abbreviation', store: stateStore, autocomplete: true, hasDownArrow: false}"
+ width="200px" autoSave="false">
+ Indiana
+ </span>
+ after
+ <hr style="width:100%;">
+
+ <h2>Programmatically created:</h2>
+ before block<div style="display:block;" id="programmatic">Click here to edit a block programmatically created inline edit region</div>after
+ <script type="text/javascript">
+ // See if we can make a widget in script
+ dojo.addOnLoad(function(){
+ var inlineWidget = new dijit.InlineEditBox({renderAsHtml: true}, 'programmatic');
+ });
+ </script>
+ <hr style="width:100%;">
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/test_Menu.html b/includes/js/dijit/tests/test_Menu.html
new file mode 100644
index 0000000..a0bed27
--- /dev/null
+++ b/includes/js/dijit/tests/test_Menu.html
@@ -0,0 +1,270 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+
+ <title>Menu System Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit._Calendar");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+
+ <script language="Javascript" type="text/javascript">
+ function createMenu() {
+ // create a menu programmatically
+ function fClick() {alert("clicked!")};
+
+ pMenu = new dijit.Menu({targetNodeIds:["prog_menu"], id:"progMenu"});
+ pMenu.addChild(new dijit.MenuItem({label:"Programmatic Context Menu", disabled:true}));
+ pMenu.addChild(new dijit.MenuSeparator());
+ pMenu.addChild(new dijit.MenuItem({label:"Simple menu item", onClick:fClick}));
+ pMenu.addChild(new dijit.MenuItem({label:"Another menu item", onClick:fClick}));
+ pMenu.addChild(new dijit.MenuItem({label:"With an icon", iconClass:"dijitEditorIcon dijitEditorIconCut", onClick:fClick}));
+ var mItem = new dijit.MenuItem({label:"dojo.event clicking"});
+ dojo.connect(mItem, "onClick", function(){alert("click! handler created via dojo.connect()")});
+ pMenu.addChild(mItem);
+
+ var pSubMenu = new dijit.Menu({parentMenu:pMenu, id:"progSubMenu"});
+ pSubMenu.addChild(new dijit.MenuItem({label:"Submenu item", onClick:fClick}));
+ pSubMenu.addChild(new dijit.MenuItem({label:"Submenu item", onClick:fClick}));
+ pMenu.addChild(new dijit.PopupMenuItem({label:"Submenu", popup:pSubMenu, id:"progPopupMenuItem"}));
+
+ pMenu.startup();
+
+ dojo.byId("prog_menu").innerHTML="This div has a programmatic context menu on it that's different to the page menu."
+ dojo.byId("createButton").disabled = true;
+ dojo.byId("destroyButton").disabled = false;
+ }
+
+ function destroyMenu(){
+ pMenu.destroyRecursive();
+ dojo.byId("prog_menu").innerHTML="No programmatic menu on this div, should get page level menu.";
+ dojo.byId("createButton").disabled = false;
+ dojo.byId("destroyButton").disabled = true;
+ }
+ </script>
+</head>
+<body>
+
+<div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+ <div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu2">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu4"">
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu3" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit.ColorPalette"></div>
+ </div>
+</div>
+
+<div dojoType="dijit.Menu" id="leftClick" leftClickToOpen="true" targetNodeIds="input2" style="display: none;">
+ <div dojoType="dijit.MenuItem" disabled="true">Left Click Menu</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+ <div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <div dojoType="dijit.Menu" id="leftsubmenu2">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <div dojoType="dijit.Menu" id="leftsubmenu4"">
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <div dojoType="dijit.Menu" id="leftsubmenu3" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit.ColorPalette"></div>
+ </div>
+</div>
+
+<!--
+<div dojoType="dijit.MenuBar">
+ <div dojoType="dijit.MenuBarItem" submenuId="submenu1">File</div>
+ <div dojoType="dijit.MenuBarItem" submenuId="submenu">Edit</div>
+ <div dojoType="dijit.MenuBarItem" disabled="true">View</div>
+ <div dojoType="dijit.MenuBarItem" submenuId="submenu">Help</div>
+ <div dojoType="dijit.MenuBarItem" onClick="alert('you clicked a menu bar button');">Click Me</div>
+</div>
+-->
+<div style="padding: 1em">
+ <h1 class="testTitle">Dijit Menu System Test</h1>
+
+ <h3>Form</h3>
+
+ <form>
+ <input id=input1 value="top-left">
+ <p style="text-align:right">left click to open the menu for this input:<br/>Note: because of the window contextMenu, make sure you get<br/> the right menu by verifying the left<br/>click one starts with "Left Click Menu"<br/> at the very top. <input id=input2 value="top-right"></p>
+ <textarea id=textarea>hello there!</textarea><br>
+ <select>
+ <option>check if i</option>
+ <option>bleed through</option>
+ <option>on IE6</option>
+ </select>
+ <button id=button>push me</button>
+ </form>
+
+ <div id="prog_menu" style="border:1px solid blue; padding:10px; margin:20px 0;">
+ Click button below to create special menu on this div.
+ </div>
+ <button id="createButton" onclick="createMenu();">create programmatic menu</button>
+ <button id="destroyButton" onclick="destroyMenu();" disabled>destroy programmatic menu</button>
+
+ <div style="height:500px"></div>
+ <p>(this space intentionally left blank to aid testing with controls
+ at the bottom of the browser window)</p>
+ <div style="height:500px"></div>
+ <input id=input3 value="bottom-left">
+ <p style="text-align:right"><input id=input4 value="bottom-right"></p>
+
+ <p>See also: <a href="form/test_Button.html">form/test_Button</a>
+ (PopupMenu is used with DropDownButton and ComboButton)</p>
+
+ <h3>Mouse opening tests</h3>
+
+ <ul>
+ <li>Right click on the client area of the page (ctrl-click for Macintosh). Menu should open.</li>
+ <li>Right click on each of the form controls above. Menu should open.</li>
+ <li>Right click near the righthand window border. Menu should open to the left of the pointer.</li>
+ <li>Right click near the bottom window border. Menu should open above the pointer.</li>
+ </ul>
+
+
+ <h3>Mouse hover tests</h3>
+
+ <ul>
+ <li>Hover over the first item with the pointer. Item should highlight and get focus.</li>
+ <li>Hover over the second (disabled) item. Item should highlight and get focus.</li>
+ <li>Seperator items should not highlight on hover - no items should highlight in this case.</li>
+ </ul>
+
+
+ <h3>Mouse click tests</h3>
+
+ <ul>
+ <li>Click on the first menu item. Alert should open with the message "Hello world". The menu should dissapear.</li>
+ <li>Click on the second menu item (disabled). Should not do anything - focus should remain on the disabled item.</li>
+ <li>Click anywhere outside the menu. Menu should close. Focus will be set by the browser based on where the user clicks.</li>
+ </ul>
+
+
+ <h3>Mouse submenu tests</h3>
+
+ <ul>
+ <li>Hover over the "Enabled Submenu" item. Item should highlight and then pop open a submenu after a short (500ms) delay.</li>
+ <li>Hover over any of the other menu items. Submenu should close immediately and deselect the submenu parent item. The newly hovered item should become selected.</li>
+ <li>Hover over the "Disabled Submenu" item. Item should highlight, but no submenu should appear.</li>
+ <li>Clicking on the "Enabled Submenu" item before the submenu has opened (you'll have to be quick!) should immediatley open the submenu.</li>
+ <li>Clicking on the "Enabled Submenu" item <i>after</i> the submenu has opened should have no effect - the item is still selected and the submenu still open.</li>
+ <li>Hover over submenu item 1. Should select it - the parent menu item should stay selected also.</li>
+ <li>Hover over submenu item 2. Should select it - the parent menu item should stay selected also.</li>
+ </ul>
+
+
+ <h3>Keyboard opening tests</h3>
+
+ <ul>
+ <li>On Windows: press shift-f10 with focus on any of the form controls. Should open the menu.</li>
+ <li>On Windows: press the context menu key (located on the right of the space bar on North American keyboards) with focus on any of the form controls. Should open the menu.</li>
+ <li>On Firefox on the Mac: press ctrl-space with focus on any of the form controls. Should open the menu.</li>
+ </ul>
+
+
+ <h3>Keyboard closing tests</h3>
+
+ <ul>
+ <li>Open the menu.</li>
+ <li>Press tab. Should close the menu and return focus to where it was before the menu was opened.</li>
+ <li>Open the menu.</li>
+ <li>Press escape. Should close the menu and return focus to where it was before the menu was opened.</li>
+ </ul>
+
+
+ <h3>Keyboard navigation tests</h3>
+
+ <ul>
+ <li>Open the menu.</li>
+ <li>Pressing up or down arrow should cycle focus through the items in that menu.</li>
+ <li>Pressing enter or space should invoke the menu item.</li>
+ <li>Disabled items receive focus but no action is taken upon pressing enter or space.</li>
+ </ul>
+
+
+ <h3>Keyboard submenu tests</h3>
+
+ <ul>
+ <li>Open the menu.</li>
+ <li>The first item should become selected.</li>
+ <li>Press the right arrow key. Nothing should happen.</li>
+ <li>Press the left arrow key. Nothing should happen.</li>
+ <li>Press the down arrow until "Enabled Submenu" is selected. The submenu should not appear.</li>
+ <li>Press enter. The submenu should appear with the first item selected.</li>
+ <li>Press escape. The submenu should vanish - "Enabled Submenu" should remain selected.</li>
+ <li>Press the right arrow key. The submenu should appear with the first item selected.</li>
+ <li>Press the right arrow key. Nothing should happen.</li>
+ <li>Press the left arrow key. The submenu should close - "Enabled Submenu" should remain selected.</li>
+ <li>Press the left arrow key. The menu should <i>not</i> close and "Enabled Submenu" should remain selected.</li>
+ <li>Press escape. The menu should close and focus should be returned to where it was before the menu was opened.</li>
+ </ul>
+
+</div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_ProgressBar.html b/includes/js/dijit/tests/test_ProgressBar.html
new file mode 100644
index 0000000..7df8119
--- /dev/null
+++ b/includes/js/dijit/tests/test_ProgressBar.html
@@ -0,0 +1,165 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo Toolkit - ProgressBar test</title>
+
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ body {
+ margin: 1em;
+ }
+ .smallred .dijitProgressBarTile {
+ background:red;
+ }
+ .smallred .dijitProgressBarLabel {
+ display:none;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dojo.parser"); // scan page for widgets
+ dojo.require("dojo.string");
+
+ dojo.addOnLoad(go);
+
+ function go(){
+ //TODO: it's a little strange that id must be specified again?
+ var theBar = new dijit.ProgressBar({id: "testBar", width: 400, annotate: true, maximum: 256, duration: 2000,
+ report:function(percent){
+ return dojo.string.substitute("${0} out of ${1} max chars", [this.progress, this.maximum]);
+ }
+ }, dojo.byId("testBar"));
+
+ dojo.byId("test").value="";
+ dojo.byId("progressValue").focus();
+ dojo.byId("progressValue").value = dijit.byId("setTestBar").progress;
+ dojo.byId("maximum").value = dijit.byId("setTestBar").maximum;
+ dojo.connect(dojo.byId("test"), "onkeyup", null, keyUpHandler);
+ dojo.connect(dojo.byId("set"), "onclick", null, setParameters);
+ dojo.connect(dojo.byId("startTimer"), "onclick", null,
+ function(){ remoteProgress(dijit.byId("timerBar")); } );
+
+ function indeterminateSetter(id, value){
+ return function(){
+ dijit.byId(id).update({'indeterminate': value});
+ }
+ }
+ dojo.connect(dojo.byId("setIndeterminate1True"), "onclick", null,
+ indeterminateSetter("indeterminateBar1", true));
+ dojo.connect(dojo.byId("setIndeterminate1False"), "onclick", null,
+ indeterminateSetter("indeterminateBar1", false));
+ dojo.connect(dojo.byId("setIndeterminate2True"), "onclick", null,
+ indeterminateSetter("indeterminateBar2", true));
+ dojo.connect(dojo.byId("setIndeterminate2False"), "onclick", null,
+ indeterminateSetter("indeterminateBar2", false));
+ }
+
+ // An example of polling on a separate (heartbeat) server thread. This is useful when the progress
+ // is entirely server bound and there is no existing interaction with the server to determine status.
+
+ // We don't have a server to run against, but a simple heartbeat implementation might look something
+ // like this:
+
+ // function getProgressReport(){
+ // var dataSource = "http://dojotoolkit.org";
+ // return dojo.xhrGet({url: dataSource, handleAs: "json", content: {key: "progress"}});
+ // }
+
+ // Instead, we'll just tick off intervals of 10
+
+ var fakeProgress = 0;
+ function getProgressReport(){
+ var deferred = new dojo.Deferred();
+ fakeProgress = Math.min(fakeProgress + 10, 100);
+ deferred.callback(fakeProgress+"%");
+ return deferred;
+ }
+
+ function remoteProgress(bar){
+ var _timer = setInterval(function(){
+ var report = getProgressReport();
+ report.addCallback(function(response){
+ bar.update({progress: response});
+ if(response == "100%"){
+ clearInterval(_timer);
+ _timer = null;
+ return;
+ }
+ });
+ }, 3000); // on 3 second intervals
+ }
+
+ function setParameters(){
+ dijit.byId("setTestBar").update({maximum: dojo.byId("maximum").value, progress: dojo.byId("progressValue").value});
+ }
+
+ function keyUpHandler(){
+ dijit.byId("testBar").update({progress:dojo.byId("test").value.length});
+ dijit.byId("testBarInt").update({progress:dojo.byId("test").value.length});
+ dijit.byId("smallTestBar").update({progress:dojo.byId("test").value.length});
+ }
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit ProgressBar Tests</h1>
+
+ <h3>Test 1</h3>
+ Progress Value <input type="text" name="progressValue" id="progressValue" />
+ <br>
+ Max Progress Value <input type="text" name="maximum" id="maximum" />
+ <br>
+ <input type="button" name="set" id="set" value="set!" />
+ <br>
+ <div style="width:400px" annotate="true"
+ maximum="200" id="setTestBar" progress="20" dojoType="dijit.ProgressBar"></div>
+
+ <h3>Test 2</h3>
+ Write here: <input type="text" value="" name="test" maxLength="256" id="test" style="width:300"/>
+ <br />
+ <br />
+ <div id="testBar" style='width:300px'></div>
+ <br />
+ Small, without text and background image:
+ <br />
+ <div style="width:400px; height:10px" class="smallred"
+ maximum="256" id="smallTestBar" dojoType="dijit.ProgressBar"></div>
+ <br />
+ Show decimal place:
+ <div places="1" style="width:400px" annotate="true"
+ maximum="256" id="testBarInt" dojoType="dijit.ProgressBar"></div>
+
+ <h3>Test 3</h3>
+ No explicit maximum (both 50%)
+ <div style="width:400px" annotate="true"
+ id="implied1" progress="50" dojoType="dijit.ProgressBar"></div>
+ <br />
+ <div style="width:400px" annotate="true"
+ id="implied2" progress="50%" dojoType="dijit.ProgressBar"></div>
+
+ <h3>Test 4</h3>
+ <input type="button" name="startTimer" id="startTimer" value="Start Timer" />
+ <div style="width:400px" id="timerBar" annotate="true"
+ maximum="100" progress="0" dojoType="dijit.ProgressBar"></div>
+
+ <h3>Test 5 - indeterminate progess</h3>
+ <input type="button" name="setIndeterminate1True" id="setIndeterminate1True" value="Make Indeterminate" />
+ <input type="button" name="setIndeterminate1False" id="setIndeterminate1False" value="Make Determinate" />
+ <div style="width:400px" indeterminate="true" id="indeterminateBar1"
+ dojoType="dijit.ProgressBar"></div>
+ <input type="button" name="setIndeterminate2True" id="setIndeterminate2True" value="Make Indeterminate" />
+ <input type="button" name="setIndeterminate2False" id="setIndeterminate2False" value="Make Determinate" />
+ <div style="width:400px" progress="50" id="indeterminateBar2"
+ dojoType="dijit.ProgressBar"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_TitlePane.html b/includes/js/dijit/tests/test_TitlePane.html
new file mode 100644
index 0000000..d0096c0
--- /dev/null
+++ b/includes/js/dijit/tests/test_TitlePane.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TitlePane Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dijit.TitlePane");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // widgets used inside subpage loaded via href=
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.ComboBox");
+
+ function randomMessageId(){
+ return Math.floor(Math.random() * 3) + 3;
+ }
+
+ dojo.declare("dijit.TestTitlePane", dijit.TitlePane, {
+ templateString: '<div class="dijitTitlePane">' +
+ ' <div class="dijitTitlePaneTitle" dojoAttachPoint="titleBarNode" style="cursor: default;">' +
+ ' <div dojoAttachEvent="onclick:toggle,onkeypress: _onTitleKey,onfocus:_handleFocus,onblur:_handleFocus" tabindex="0"' +
+ ' waiRole="button" dojoAttachPoint="focusNode,arrowNode" class="dijitInline dijitArrowNode" style="cursor: pointer;"><span dojoAttachPoint="arrowNodeInner" class="dijitArrowNodeInner"></span></div>' +
+ ' <div dojoAttachPoint="titleNode" class="dijitTitlePaneTextNode"></div>' +
+ ' </div>' +
+ ' <div class="dijitTitlePaneContentOuter" dojoAttachPoint="hideNode">' +
+ ' <div class="dijitReset" dojoAttachPoint="wipeNode">' +
+ ' <div class="dijitTitlePaneContentInner" dojoAttachPoint="containerNode" waiRole="region" tabindex="-1">' +
+ ' </div>' +
+ ' </div>' +
+ ' </div>' +
+ '</div>'
+ });
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Dijit TitlePane Test</h1>
+
+ <h1>Test #1: plain title pane, width=300px</h1>
+ <div dojoType="dijit.TitlePane" title="Title Pane #1" style="width: 300px;">
+ Lorem Ipsum Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque
+ iaculis, nulla id semper faucibus, pede tellus nonummy magna, vitae adipiscing
+ orci arcu ut augue. Nunc condimentum, magna a vestibulum convallis, libero purus
+ pulvinar orci, sed vestibulum urna sem ut pede. More Ipsum...
+ Sed sollicitudin suscipit risus. Nam ullamcorper. Sed nisl lectus, pellentesque
+ nec, malesuada eget, ornare a, libero. Lorem ipsum dolor sit amet,
+ consectetuer adipiscing elit.
+ </div>
+
+ <h1>Test #2: title pane with form, width=300px</h1>
+
+ <div dojoType="dijit.TitlePane" title="Title Pane #2" id="pane_2" style="width: 300px;">
+ <form>
+ Age: <input><br>
+ Discount card <input type=checkbox><br>
+ <button>Submit</button><br>
+ </form>
+ </div>
+ <br>
+
+ <h1>Test #3: initially closed pane</h1>
+ <div id="closed" dojoType="dijit.TitlePane" title="Initially closed pane" open="false" width="200">
+ <form>
+ <title for="age">Age: </title><input id="age"><br>
+ <title for="discount">Discount card </title><input type=checkbox id="discount"><br>
+ <button>Submit</button><br>
+ </form>
+ </div>
+ <button onclick="dijit.byId('closed').setContent('hello world! (' + new Date() + ')');">reset content</button>
+
+ <h1>Test #4: title pane with href (initially closed)</h1>
+ <p>The pane should open to "Loading..." message and then 2 seconds later it should slide open more to show loaded data.</p>
+ <div dojoType="dijit.TitlePane" duration=1000 title="Pane from href" href="layout/getResponse.php?delay=3000&messId=3" open="false">
+ Loading...
+ </div>
+
+ <h1>Test #5: title pane with href (initially closed)</h1>
+ <p>The pane should start to open to "Loading..." but halfway through href data will be loaded, and it should expand correctly.</p>
+ <div dojoType="dijit.TitlePane" duration=1000 title="Pane from href" href="layout/getResponse.php?delay=500&messId=3" open="false">
+ Loading...
+ </div>
+
+ <h1>Test #6: nested title pane</h1>
+ <div dojoType="dijit.TitlePane" title="Outer pane" width="300">
+ <p>This is a title pane, containing another title pane ...
+ <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque iaculis, nulla id semper faucibus, pede tellus nonummy magna, vitae adipiscing orci arcu ut augue. Nunc condimentum, magna a vestibulum convallis, libero purus pulvinar orci, sed vestibulum urna sem ut pede.
+More Ipsum...
+
+ <div dojoType="dijit.TitlePane" title="Inner pane" width="250">
+ <p>And this is the inner title pane...
+ <p>Sed sollicitudin suscipit risus. Nam ullamcorper. Sed nisl lectus, pellentesque nec, malesuada eget, ornare a, libero. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ </div>
+
+ <p>And this is the closing line for the outer title pane.
+ </div>
+
+ <h1>Test #7: subclassed title pane (only arrow is selectable and focusable)</h1>
+ <div dojoType="dijit.TestTitlePane" title="Title Pane #7" style="width: 300px;">
+ Lorem Ipsum Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque
+ iaculis, nulla id semper faucibus, pede tellus nonummy magna, vitae adipiscing
+ orci arcu ut augue. Nunc condimentum, magna a vestibulum convallis, libero purus
+ pulvinar orci, sed vestibulum urna sem ut pede. More Ipsum...
+ Sed sollicitudin suscipit risus. Nam ullamcorper. Sed nisl lectus, pellentesque
+ nec, malesuada eget, ornare a, libero. Lorem ipsum dolor sit amet,
+ consectetuer adipiscing elit.
+ </div>
+
+ <table style="border: solid blue 2px; margin-top: 1em;">
+ <tr>
+ <td>
+ Here's some text below the title panes (to make sure that closing a title pane releases the space that the content was taking up)
+ </td>
+ </tr>
+ </table>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_Toolbar.html b/includes/js/dijit/tests/test_Toolbar.html
new file mode 100644
index 0000000..6634e2d
--- /dev/null
+++ b/includes/js/dijit/tests/test_Toolbar.html
@@ -0,0 +1,186 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo Toolbar Widget Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ .dijitToolbar .dijitButton, .dijitToolbar .dijitDropDownButton { margin: 0px; }
+ .dijitToolbar .dijitToggleButtonSelected BUTTON, .dijitToolbar .dijitToggleButtonSelectedHover BUTTON { border-width: 3px; }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.Toolbar");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser");
+
+ <!-- programatic creation -->
+ function init(){
+ dojo.forEach(["toolbar2", "toolbar3", "toolbar4"], function(toolbarId){
+ var toolbar = new dijit.Toolbar({}, dojo.byId(toolbarId));
+ dojo.forEach(["Cut", "Copy", "Paste"], function(label){
+ var button = new dijit.form.Button({
+ id: toolbarId+"."+label,
+ // note: should always specify a label, for accessibility reasons.
+ // Just set showLabel=false if you don't want it to be displayed normally
+ label: label,
+ showLabel: (toolbarId == "toolbar2" ? false : true),
+ iconClass: toolbarId == "toolbar4" ? "" : "dijitEditorIcon dijitEditorIcon"+label
+ });
+ toolbar.addChild(button);
+ });
+ });
+ }
+
+ dojo.addOnLoad(init);
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Toolbar test</h1>
+
+ <h2>Toolbar from markup</h2>
+
+ <div id="toolbar1" dojoType="dijit.Toolbar"
+ ><div dojoType="dijit.form.Button" id="toolbar1.cut" iconClass="dijitEditorIcon dijitEditorIconCut" showLabel="false">Cut</div
+ ><div dojoType="dijit.form.Button" id="toolbar1.copy" iconClass="dijitEditorIcon dijitEditorIconCopy" showLabel="false">Copy</div
+ ><div dojoType="dijit.form.Button" id="toolbar1.paste" iconClass="dijitEditorIcon dijitEditorIconPaste" showLabel="false">Paste</div
+
+ ><span dojoType="dijit.ToolbarSeparator"></span
+
+ ><div dojoType="dijit.form.ToggleButton" id="toolbar1.bold" iconClass="dijitEditorIcon dijitEditorIconBold" showLabel="false">Bold</div
+ ><div dojoType="dijit.form.ToggleButton" id="toolbar1.italic" iconClass="dijitEditorIcon dijitEditorIconItalic" showLabel="false">Italic</div
+ ><div dojoType="dijit.form.ToggleButton" id="toolbar1.underline" iconClass="dijitEditorIcon dijitEditorIconUnderline" showLabel="false">Underline</div
+ ><div dojoType="dijit.form.ToggleButton" id="toolbar1.strikethrough" iconClass="dijitEditorIcon dijitEditorIconStrikethrough" showLabel="false">Strikethrough</div
+
+><!--
+ <span dojoType="dijit.ToolbarSeparator">&nbsp;</span>
+
+ <span dojo:type="ToolbarButtonGroup" name="justify" defaultButton="justifyleft" preventDeselect="true" showLabel="false">
+ <div dojoType="dijit.form.ToggleButton" iconClass="dijitEditorIcon dijitEditorIconJustifyLeft" name="justify" showLabel="false">Left</div>
+ <div dojoType="dijit.form.ToggleButton" iconClass="dijitEditorIcon dijitEditorIconJustifyRight" name="justify" showLabel="false">Right</div>
+ <div dojoType="dijit.form.ToggleButton" iconClass="dijitEditorIcon dijitEditorIconJustifyCenter" name="justify" showLabel="false">Center</div>
+ </span>
+
+ --><span dojoType="dijit.ToolbarSeparator">&nbsp;</span
+
+ ><div dojoType="dijit.form.Button" id="toolbar1.insertorderedlist" iconClass="dijitEditorIcon dijitEditorIconInsertOrderedList" showLabel="false">Ordered list</div
+ ><div dojoType="dijit.form.Button" id="toolbar1.insertunorderedlist" iconClass="dijitEditorIcon dijitEditorIconInsertUnorderedList" showLabel="false">Unordered list</div
+ ><div dojoType="dijit.form.Button" id="toolbar1.indent" iconClass="dijitEditorIcon dijitEditorIconIndent" showLabel="false">Indent</div
+ ><div dojoType="dijit.form.Button" id="toolbar1.outdent" iconClass="dijitEditorIcon dijitEditorIconOutdent" showLabel="false">Outdent</div
+
+ ><span dojoType="dijit.ToolbarSeparator"></span
+ ><div dojoType="dijit.form.DropDownButton" id="toolbar1.dialog">
+ <span>Login</span>
+ <div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+ <table>
+ <tr>
+ <td><label for="user">User:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" name="user" ></td>
+ </tr>
+ <tr>
+ <td><label for="pwd">Password:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="password" name="pwd"></td>
+ </tr>
+ <tr>
+ <td colspan="2" align="center">
+ <button dojoType=dijit.form.Button type="submit" name="submit">Login</button></td>
+ </tr>
+ </table>
+ </div
+ ></div
+ ><div dojoType="dijit.form.DropDownButton" id="toolbar1.backcolor" iconClass="dijitEditorIcon dijitEditorIconBackColor" showLabel="false">
+ <span>Background</span>
+ <div dojoType="dijit.ColorPalette" id="toolbar1.colorPalette" style="display: none" palette="3x4" onChange="console.log(this.value);"></div>
+ </div
+ ><div dojoType="dijit.form.DropDownButton" id="toolbar1.forecolor" iconClass="dijitEditorIcon dijitEditorIconForeColor" showLabel="false">
+ <span>Foreground</span>
+ <div dojoType="dijit.ColorPalette" id="toolbar1.colorPalette2" style="display: none" palette="3x4" onChange="console.log(this.value);"></div>
+ </div
+
+ ><span dojoType="dijit.ToolbarSeparator"></span
+ ><div dojoType="dijit.form.ComboButton" optionsTitle='save options' onClick='console.log("clicked combo save")'>
+ <span>Save</span>
+ <div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconSave"
+ onClick="console.log('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem"
+ onClick="console.log('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </div
+ ></div>
+
+ <h2>Toolbar that looks like MenuBar</h2>
+ <div id="menubar" dojoType="dijit.Toolbar" class="menuBar">
+ <div dojoType="dijit.form.DropDownButton">
+ <span>File</span>
+ <div dojoType="dijit.Menu">
+ <div dojoType="dijit.MenuItem">New</div>
+ <div dojoType="dijit.MenuItem">Open</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconSave">Save</div>
+ <div dojoType="dijit.MenuItem">Save As...</div>
+ </div>
+ </div>
+ <div dojoType="dijit.form.DropDownButton">
+ <span>Edit</span>
+ <div dojoType="dijit.Menu">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="console.log('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="console.log('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="console.log('not actually pasting anything, just a test!')">Paste</div>
+ </div>
+ </div>
+ <div dojoType="dijit.form.DropDownButton">
+ <span>View</span>
+ <div dojoType="dijit.Menu">
+ <div dojoType="dijit.MenuItem">Normal</div>
+ <div dojoType="dijit.MenuItem">Outline</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Zoom</span>
+ <div dojoType="dijit.Menu" id="submenu2">
+ <div dojoType="dijit.MenuItem">50%</div>
+ <div dojoType="dijit.MenuItem">75%</div>
+ <div dojoType="dijit.MenuItem">100%</div>
+ <div dojoType="dijit.MenuItem">150%</div>
+ <div dojoType="dijit.MenuItem">200%</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.form.DropDownButton">
+ <span>Help</span>
+ <div dojoType="dijit.Menu">
+ <div dojoType="dijit.MenuItem">Help Topics</div>
+ <div dojoType="dijit.MenuItem">About Dijit</div>
+ </div>
+ </div>
+ </div>
+
+ <h2>Toolbar from script with icons only</h2>
+ <div id="toolbar2"></div>
+
+ <h2>Toolbar from script with text and icons</h2>
+ <div id="toolbar3"></div>
+
+ <h2>Toolbar from script with text only</h2>
+ <div id="toolbar4"></div>
+
+ <!-- leave some space before the console window -->
+ <br><br>
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/test_Tooltip.html b/includes/js/dijit/tests/test_Tooltip.html
new file mode 100644
index 0000000..56553b6
--- /dev/null
+++ b/includes/js/dijit/tests/test_Tooltip.html
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dojo Tooltip Widget Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Tooltip");
+ dojo.require("dojo.parser"); // find widgets
+ dojo.addOnLoad(function(){
+ console.log("on load func");
+ var tt = new dijit.Tooltip({label:"programmatically created tooltip", connectId:["programmaticTest"]});
+ console.log("created", tt, tt.id);
+ });
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Tooltip test</h1>
+ <p>Mouse-over or focus the items below to test tooltips.</p>
+ <p>
+ Change tooltip positioning search list:
+ <button onclick="dijit.Tooltip.defaultPosition=['above', 'below'];">above, below</button>
+ <button onclick="dijit.Tooltip.defaultPosition=['after', 'before'];">after, before (default)</button>
+ </p>
+ <div><span id="one" class="tt" tabindex="0"> focusable text </span>
+ <span dojoType="dijit.Tooltip" connectId="one">
+ <b>
+ <span style="color: blue;">rich formatting</span>
+ <span style="color: red; font-size: x-large;"><i>!</i></span>
+ </b>
+ </span>
+ </div>
+ <span id="oneA" class="tt"> plain text (not focusable) </span>
+ <span dojoType="dijit.Tooltip" connectId="oneA">
+ <span> keyboard users can not access this tooltip</span>
+ </span>
+ <a id="three" href="#bogus">anchor</a>
+ <span dojoType="dijit.Tooltip" connectId="three">tooltip on a link </span>
+ <p></p>
+
+ <span id="programmaticTest">this text has a programmatically created tooltip</span>
+ <br>
+
+ <button id="four">button w/tooltip</button>
+ <span id="btnTt" dojoType="dijit.Tooltip" connectId="four">tooltip on a button</span>
+ <button onclick="dijit.byId('btnTt').destroy()">Remove</button> tooltip from "button w/tooltip".
+
+ <span style="float: right">
+ Test tooltip on right aligned element. Tooltip should flow to the left --&gt;
+ <select id="seven">
+ <option value="alpha">Alpha</option>
+ <option value="beta">Beta</option>
+ <option value="gamma">Gamma</option>
+ <option value="delta">Delta</option>
+ </select>
+
+ <span dojoType="dijit.Tooltip" connectId="seven">
+ tooltip on a select<br>
+ two line tooltip.
+ </span>
+ </span>
+
+ <p></p>
+
+ <form>
+ <input type="input" id="id1" value="#1"><br>
+ <input type="input" id="id2" value="#2"><br>
+ <input type="input" id="id3" value="#3"><br>
+ <input type="input" id="id4" value="#4"><br>
+ <input type="input" id="id5" value="#5"><br>
+ <input type="input" id="id6" value="#6"><br>
+ </form>
+ <br>
+
+ <div style="overflow: auto; height: 100px; position: relative; border: solid blue 3px;">
+ <span id="s1">s1 text</span><br><br><br>
+ <span id="s2">s2 text</span><br><br><br>
+ <span id="s3">s3 text</span><br><br><br>
+ <span id="s4">s4 text</span><br><br><br>
+ <span id="s5">s5 text</span><br><br><br>
+ </div>
+
+ <span dojoType="dijit.Tooltip" connectId="id1">
+
+ tooltip for #1<br>
+ long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;long&nbsp;text<br>
+ make sure that this works properly with a really narrow window
+ </span>
+
+ <span dojoType="dijit.Tooltip" connectId="id2">tooltip for #2</span>
+ <span dojoType="dijit.Tooltip" connectId="id3">tooltip for #3</span>
+ <span dojoType="dijit.Tooltip" connectId="id4">tooltip for #4</span>
+ <span dojoType="dijit.Tooltip" connectId="id5">tooltip for #5</span>
+ <span dojoType="dijit.Tooltip" connectId="id6">tooltip for #6</span>
+
+ <span dojoType="dijit.Tooltip" connectId="s1">s1 tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="s2">s2 tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="s3">s3 tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="s4">s4 tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="s5">s5 tooltip</span>
+
+ <h3>One Tooltip for multiple connect nodes</h3>
+ <span dojoType="dijit.Tooltip" connectId="multi1,multi2" style="display:none;">multi tooltip</span>
+ <a id="multi1" href="#bogus">multi1</a><br><a id="multi2" href="#bogus">multi2</a>
+
+</body>
+</html>
+
diff --git a/includes/js/dijit/tests/test_TooltipDialog.html b/includes/js/dijit/tests/test_TooltipDialog.html
new file mode 100644
index 0000000..62a5000
--- /dev/null
+++ b/includes/js/dijit/tests/test_TooltipDialog.html
@@ -0,0 +1,349 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>TooltipDialog Widget Tests</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+
+ body { font-family : sans-serif; }
+ form { margin-bottom : 0; }
+ table { border: none; }
+ </style>
+
+ <script type="text/javascript"
+ djConfig="parseOnLoad: true, isDebug: true"
+ src="../../dojo/dojo.js"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Dialog");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.TimeTextBox");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // create a do nothing, only for test widget
+ dojo.declare("dijit.TestWidget",
+ [dijit._Widget, dijit._Templated], {
+ templateString: "<div style='margin: 10px; border: inset #700 4px; padding: 5px;' dojoAttachPoint='containerNode'></div>"
+ });
+
+ // make dojo.toJson() print dates correctly (this feels a bit dirty)
+ Date.prototype.json = function(){ return dojo.date.stamp.toISOString(this, {selector: 'date'});};
+ </script>
+</head>
+<body>
+<h1 class="testTitle">Dijit layout.TooltipDialog tests</h1>
+
+<div dojoType="dijit.form.DropDownButton">
+ <span>Show Tooltip Dialog</span>
+ <div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+ <table>
+ <tr>
+ <td><label for="user">User:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" name="user" id="user"></td>
+ </tr>
+ <tr>
+ <td><label for="pwd">Password:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="password" name="pwd" id="pwd"></td>
+ </tr>
+ <tr>
+ <td><label for="date2">Date:</label></td>
+ <td><input dojoType=dijit.form.DateTextBox name="date" id="date2"></td>
+ </tr>
+ <tr>
+ <td><label for="time2">Time:</label></td>
+ <td><input dojoType=dijit.form.TimeTextBox name="time" id="time2"></td>
+ </tr>
+ <tr>
+ <td><label for="combo">Pizza:</label></td>
+ <td>
+ <select dojoType=dijit.form.FilteringSelect name="combo" id="combo" hasDownArrow="true">
+ <option value="cheese">cheese</option>
+ <option value="pepperoni">pepperoni</option>
+ <option value="sausage">sausage</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" align="center">
+ <button dojoType=dijit.form.Button type="submit" name="submit">Order</button>
+ </td>
+ </tr>
+ </table>
+ <div style="width: 300px;">Note: This tooltip dialog has a bunch of nested drop downs for testing keyboard and click handling</div>
+ </div>
+</div> |
+
+<div dojoType="dijit.form.DropDownButton">
+ <span>Show Tooltip Dialog with TabContainer</span>
+ <div dojoType="dijit.TooltipDialog" id="tabTooltip" title="Tab Container Tooltip">
+ <div dojoType="dijit.layout.TabContainer" style="width: 400px; height: 300px;">
+ <div dojoType="dijit.layout.ContentPane" title="First tab">
+ <p>
+ This is the first tab.
+ </p>
+ <p>
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ </div>
+ <div dojoType="dijit.layout.ContentPane" title="Second tab">
+ <p>
+ This is the second tab.
+ </p>
+ <p>
+ <a href="http://www.lipsum.com/">ipsum dolor sit amet</a>, consectetuer adipiscing elit. Aenean
+ semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+ porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+ Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+ Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+ risus.
+ </p>
+ </div>
+ </div>
+ </div>
+</div> |
+
+<div dojoType="dijit.form.DropDownButton">
+ <span>Test slowloading HREF Tooltip Dialog</span>
+ <div dojoType="dijit.TooltipDialog" id="slowLoad" href="layout/getResponse.php?delay=500&messId=2"
+ title="tooltip dialog with no focusable items"></div>
+</div> |
+
+<p><b><i>(scroll down to see more links to click, for testing positioning / scroll handling)</i></b></p>
+
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<form>
+ <center>
+ <select>
+ <option>1</option>
+ <option>2</option>
+ </select>
+ </center>
+</form>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+<div style="float:right;clear:right;" dojoType="dijit.form.DropDownButton">
+ <span>dropdown at right</span>
+<div dojoType="dijit.TooltipDialog" id="dialogright">
+ <div style="white-space:nowrap;">Aliquam vitae enim. Duis scelerisque metus auctor est venenatis</div>
+</div>
+</div>
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+
+<div dojoType="dijit.form.DropDownButton" title="Enter Login information2">
+ <span>Show Tooltip Dialog pointing upwards, with links</span>
+ <div dojoType="dijit.TooltipDialog" title="General Information Dialog">
+ <p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+ nonummy mollis. <a href="http://www.lipsum.com/">Vestibulum</a> vel purus ac pede semper accumsan. Vivamus
+ lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+ est quam sed urna. Phasellus adipiscing justo in <a href="http://www.lipsum.com/">ipsum</a>. Duis sagittis
+ dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+ nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+ pretium sollicitudin sapien. <a href="http://www.lipsum.com/">Suspendisse imperdiet</a>. Class aptent taciti
+ sociosqu ad litora torquent per conubia nostra, per inceptos
+ hymenaeos.
+ </p>
+ </div>
+</div>
+(will go up if there isn't enough space on the bottom of the screen)
+
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<form>
+ <center>
+ <select>
+ <option>1</option>
+ <option>2</option>
+ </select>
+ </center>
+</form>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+
+<p>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. Proin
+porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi.
+Maecenas luctus venenatis nulla. In sit amet dui non mi semper iaculis.
+Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae
+risus.
+</p>
+<p>Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
+imperdiet. Fusce dignissim porta augue. Nulla vestibulum. Integer lorem
+nunc, ullamcorper a, commodo ac, malesuada sed, dolor. Aenean id mi in
+massa bibendum suscipit. Integer eros. Nullam suscipit mauris. In
+pellentesque. Mauris ipsum est, pharetra semper, pharetra in, viverra
+quis, tellus. Etiam purus. Quisque egestas, tortor ac cursus lacinia,
+felis leo adipiscing nisi, et rhoncus elit dolor eget eros. Fusce ut
+quam. Suspendisse eleifend leo vitae ligula. Nulla facilisi. Nulla
+rutrum, erat vitae lacinia dictum, pede purus imperdiet lacus, ut
+semper velit ante id metus. Praesent massa dolor, porttitor sed,
+pulvinar in, consequat ut, leo. Nullam nec est. Aenean id risus blandit
+tortor pharetra congue. Suspendisse pulvinar.
+</p>
+<p>Vestibulum convallis eros ac justo. Proin dolor. Etiam aliquam. Nam
+ornare elit vel augue. Suspendisse potenti. Etiam sed mauris eu neque
+nonummy mollis. Vestibulum vel purus ac pede semper accumsan. Vivamus
+lobortis, sem vitae nonummy lacinia, nisl est gravida magna, non cursus
+est quam sed urna. Phasellus adipiscing justo in ipsum. Duis sagittis
+dolor sit amet magna. Suspendisse suscipit, neque eu dictum auctor,
+nisi augue tincidunt arcu, non lacinia magna purus nec magna. Praesent
+pretium sollicitudin sapien. Suspendisse imperdiet. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+hymenaeos.
+</p>
+<p>Mauris pharetra lorem sit amet sapien. Nulla libero metus, tristique
+et, dignissim a, tempus et, metus. Ut libero. Vivamus tempus purus vel
+ipsum. Quisque mauris urna, vestibulum commodo, rutrum vitae, ultrices
+vitae, nisl. Class aptent taciti sociosqu ad litora torquent per
+conubia nostra, per inceptos hymenaeos. Nulla id erat sit amet odio
+luctus eleifend. Proin massa libero, ultricies non, tincidunt a,
+vestibulum non, tellus. Nunc nunc purus, lobortis a, pulvinar at,
+egestas a, mi. Cras adipiscing velit a mauris. Morbi felis. Etiam at
+felis. Cras eget eros et justo mattis pulvinar. Nullam at justo id
+risus porttitor dignissim. Vestibulum sed velit vel metus tincidunt
+tempus. Nunc euismod nisl id dolor tristique tincidunt. Nullam placerat
+turpis sed odio. Curabitur in est id nibh tempus ultrices. Aliquam
+consectetuer dapibus eros. Aliquam nisl.
+</p>
+
+</body>
+</html>
+
diff --git a/includes/js/dijit/tests/test_Tree.html b/includes/js/dijit/tests/test_Tree.html
new file mode 100644
index 0000000..fc88fc1
--- /dev/null
+++ b/includes/js/dijit/tests/test_Tree.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Tree Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit Tree Test</h1>
+
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+ url="_data/countries.json"></div>
+ <div dojoType="dijit.tree.ForestStoreModel" jsId="continentModel"
+ store="continentStore" query="{type:'continent'}"
+ rootId="continentRoot" rootLabel="Continents" childrenAttrs="children"></div>
+
+ <h3>Tree with hardcoded root node (not corresponding to any item in the store)</h3>
+ <p>Clicking a folder node will open/close it (openOnclick==true), and clicking a leaf node will popup an alert.</p>
+ <div dojoType="dijit.Tree" id="mytree"
+ model="continentModel" openOnClick="true">
+ <script type="dojo/method" event="onClick" args="item">
+ alert("Execute of node " + continentStore.getLabel(item)
+ +", population=" + continentStore.getValue(item, "population"));
+ </script>
+ </div>
+
+ <button onclick="dijit.byId('mytree').destroyRecursive();">destroy</button>
+
+ <h2>A rootless tree (no "continents" node) with context menus, and custom icons</h2>
+
+ <ul dojoType="dijit.Menu" id="tree_menu" style="display: none;">
+ <li dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</li>
+ <li dojoType="dijit.MenuItem" disabled="true">Disabled Item</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</li>
+ <li dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu2">
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</li>
+ <li dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu4">
+ <li dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu3" style="display: none;">
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</li>
+ </ul>
+ </li>
+ </ul>
+
+ <div dojoType="dijit.Tree" id="tree2"
+ model="continentModel" showRoot="false" openOnClick="true">
+
+ <script type="dojo/connect">
+ var menu = dijit.byId("tree_menu");
+ // when we right-click anywhere on the tree, make sure we open the menu
+ menu.bindDomNode(this.domNode);
+
+ dojo.connect(menu, "_openMyself", this, function(e){
+ // get a hold of, and log out, the tree node that was the source of this open event
+ var tn = dijit.getEnclosingWidget(e.target);
+ console.debug(tn);
+
+ // now inspect the data store item that backs the tree node:
+ console.debug(tn.item);
+
+ // contrived condition: if this tree node doesn't have any children, disable all of the menu items
+ menu.getChildren().forEach(function(i){ i.setDisabled(!tn.item.children); });
+
+ // IMPLEMENT CUSTOM MENU BEHAVIOR HERE
+ });
+ </script>
+ <script type="dojo/method" event="getIconClass" args="item, opened">
+ return (item == this.model.root || continentStore.getValue(item, "type") == "continent") ?
+ (opened ? "customFolderOpenedIcon" : "customFolderClosedIcon") :
+ "noteIcon";
+ </script>
+ <script type="dojo/method" event="onClick" args="item">
+ alert("Execute of node " + this.model.getLabel(item)
+ +", population=" + continentStore.getValue(item, "population"));
+ </script>
+</div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/test_Tree_Notification_API_Support.html b/includes/js/dijit/tests/test_Tree_Notification_API_Support.html
new file mode 100644
index 0000000..07f7509
--- /dev/null
+++ b/includes/js/dijit/tests/test_Tree_Notification_API_Support.html
@@ -0,0 +1,287 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Tree Test</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../../dojo/resources/dnd.css";
+ @import "../../dojo/tests/dnd/dndDefault.css";
+ @import "css/dijitTests.css";
+
+ .clear {
+ clear: both;
+ }
+
+ .box {
+ border: #ccc 3px solid;
+ padding: 1em;
+ -moz-border-radius: 8px 8px;
+ radius: 8px;
+ }
+
+ label {
+ display: inline-block;
+ min-width: 8em;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.dnd.Source");
+ dojo.require("dojo.data.ItemFileWriteStore");
+ dojo.require("dijit.Declaration");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ // Hash of id-->item for all the items (including children) in the data store.
+ var items = {};
+
+ function deleteItem(){
+ store.deleteItem(selectedItem);
+
+ resetForms();
+ loadItemsTable();
+ }
+
+ function newItem(){
+ var pInfo = selectedItem ? {parent: selectedItem, attribute:"children"} : null;
+ console.debug(pInfo);
+
+ store.newItem({
+ id: dojo.byId('nId').value,
+ name: dojo.byId("nLabel").value,
+ someProperty: dojo.byId("nSomeProperty").value,
+ children: dojo.query("> *", "nChildren").map( function(child){
+ var id = child.id;
+ return items[id];
+ })
+ },pInfo);
+
+ resetForms();
+ loadItemsTable();
+ }
+
+ function resetForms() {
+ selectedItem=null;
+
+ // Update item form
+ dojo.byId("uLabel").value = "";
+ dojo.byId("uSomeProperty").value = "";
+
+ dojo.byId("uChildren").innerHTML = "";
+ uChildrenDragSource.clearItems();
+
+ dojo.byId("uPotentialChildren").innerHTML = "";
+ uPotentialChildrenDragSource.clearItems();
+
+ // New item form
+ dojo.byId("nChildren").innerHTML = "";
+ nChildrenDragSource.clearItems();
+
+ dojo.byId("nPotentialChildren").innerHTML = "";
+ nPotentialChildrenDragSource.clearItems();
+ for(var id in items){
+ var item = items[id],
+ label = store.getLabel(item);
+ dojo.byId("nPotentialChildren").innerHTML +=
+ "<div class='dojoDndItem' id='" + id + "'>" +
+ label +
+ "</div>";
+ nPotentialChildrenDragSource.setItem(id, {
+ data: label,
+ type: ["text"]
+ });
+ }
+ }
+
+ function updateItem(){
+ if (selectedItem!=null){
+ if (dojo.byId("uLabel").value != store.getValue(selectedItem, "name")){
+ store.setValue(selectedItem, "name", dojo.byId("uLabel").value);
+ }
+
+ if (dojo.byId("uSomeProperty").value != store.getValue(selectedItem, "someProperty")){
+ store.setValue(selectedItem, "someProperty", dojo.byId("uSomeProperty").value);
+ }
+
+ var children = dojo.query("> *", "uChildren").map( function(child){
+ var id = child.id;
+ return items[id];
+ });
+ store.setValues(selectedItem, "children", children);
+
+ resetForms();
+ loadItemsTable();
+ }else{
+ console.error("Can't update the tree root");
+ }
+ }
+
+ dojo.addOnLoad(function(){
+ resetForms();
+ loadItemsTable();
+ });
+
+ function loadItemsTable(){
+ // summary: for each item in the datastore generate a row in the table
+
+ function processItem(item){
+ items[store.getIdentity(item)] = item;
+
+ var vals = {
+ itemId: store.getIdentity(item),
+ label: store.getLabel(item),
+ someProperty: store.getValue(item, "someProperty"),
+ children: store.getValues(item, "children")
+ };
+
+ // add this item to children list in "new item" form
+ dojo.byId("nPotentialChildren").innerHTML +=
+ "<div class='dojoDndItem' id='" + vals.itemId + "'>" +
+ vals.label +
+ "</div>";
+ nPotentialChildrenDragSource.setItem(vals.itemId, {
+ data: vals.label,
+ type: ["text"]
+ });
+
+ // update table listing items
+ var row = new ItemRow(vals);
+ dojo.byId("itemsTable").appendChild(row.domNode);
+
+ //dojo.forEach(vals.children, processItem);
+ }
+
+ items = {};
+ dijit.registry.byClass("ItemRow").forEach(function(widget){ widget.destroy(); });
+ store.fetch({onItem: processItem});
+ }
+
+ function onSelectItem(item){
+ resetForms();
+
+ selectedItem = item;
+
+ if(item){
+ // Display basic attribute values
+ dojo.byId('uLabel').value = item ? store.getLabel(item) : "";
+ dojo.byId('uSomeProperty').value = item ? store.getValue(item,"someProperty") : "";
+
+ // Fill in info about children
+ var children = store.getValues(item, "children");
+ dojo.forEach(children, function(item){
+ var id = store.getIdentity(item),
+ label = store.getLabel(item);
+ dojo.byId("uChildren").innerHTML +=
+ "<div class='dojoDndItem' id='" + id + "'>" +
+ label +
+ "</div>";
+ uChildrenDragSource.setItem(id, {
+ data: label,
+ type: ["text"]
+ });
+
+ dojo.byId('nParent').value = item ? store.getLabel(item) : "";
+ });
+
+ // and the items that could be children but aren't currently
+ // (including items that would cause cycles, because i'm lazy)
+ for(var id in items){
+ var item = items[id];
+ if(dojo.indexOf(children, item) == -1){
+ var label = store.getLabel(item);
+ dojo.byId("uPotentialChildren").innerHTML +=
+ "<div class='dojoDndItem' id='" + id + "'>" +
+ label +
+ "</div>";
+ uPotentialChildrenDragSource.setItem(id, {
+ data: label,
+ type: ["text"]
+ });
+ }
+ }
+ }
+ }
+ </script>
+
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit Tree Test - dojo.data.Notification API support</h1>
+
+ <div dojoType="dojo.data.ItemFileWriteStore" jsId="store"
+ url="../tests/_data/treeTest.json"></div>
+ <div dojoType="dijit.tree.TreeStoreModel" jsId="model"
+ store="store" query="{id:'root'}"></div>
+ <div dojoType="dijit.Tree" id="myTree" model="model" onClick="onSelectItem"></div>
+
+ <br />
+ <h2>Selected Item:</h2>
+ <div class="box">
+ <label for="uLabel">Name:</label> <input id="uLabel" width="50" value="Enter Node Label" /><br />
+ <label for="uSomeProperty">Description:</label> <input id="uSomeProperty" width="50" value="Some Test Property" /><br /><br />
+ <div style="float:left; margin-right: 2em;">
+ <label for="uChildren">Children (in order):</label>
+ <div dojoType="dojo.dnd.Source" class="container" id="uChildren" jsId="uChildrenDragSource"></div>
+ </div>
+ <div style="float:left">
+ <label for="uPotentialChildren">Potential Children:</label>
+ <div dojoType="dojo.dnd.Source" class="container" id="uPotentialChildren" jsId="uPotentialChildrenDragSource"></div>
+ </div>
+ <div class="clear">(drag and drop items to adjust list of children, and order of those children)</div>
+ </div>
+ <div dojoType="dijit.form.Button" iconClass="noteIcon" onClick="updateItem();">Update Item</div>
+ <div dojoType="dijit.form.Button" iconClass="noteIcon" onClick="deleteItem();">Delete Item</div>
+
+ <h2>New Item</h2>
+ <p>Enter an Id, Name, and optionally a description to be added as a new item to the store. Upon successful addition, the tree will recieve notification of this event and respond accordingly. If you select a node the item will be added to that node, otherwise the item will be added to the tree root. "Id" is the identifer here and as such must be unique for all items in the store.</p>
+ <div class="box">
+ <label for="nId">Id:</label> <input id="nId" width="50" value="Enter Item Id" /><br />
+ <label for="nLabel">Name:</label> <input id="nLabel" width="50" value="Enter Item Name" /><br />
+ <label for="nSomeProperty">Description:</label> <input id="nSomeProperty" width="50" value="Enter Some Property Value" /><br /><br />
+ <label for="nParent">Parent:</label> <input id="nParent" readonly /><br /><br />
+ <div style="float:left; margin-right: 2em;">
+ Children (in order):
+ <div dojoType="dojo.dnd.Source" class="container" id="nChildren" jsId="nChildrenDragSource"></div>
+ </div>
+ <div style="float:left">
+ <label for="nPotentialChildren">Potential Children:</label>
+ <div dojoType="dojo.dnd.Source" class="container" id="nPotentialChildren" jsId="nPotentialChildrenDragSource"></div>
+ </div>
+ <div class="clear">(drag and drop items to adjust list of children, and order of those children)</div>
+ </div>
+
+ <div dojoType="dijit.form.Button" iconClass="noteIcon" onClick="newItem();">Add Item to Store</div>
+ <br />
+
+ <h2>Data in flat form</h2>
+ <!--
+ flat view of the items in the data store.
+ TODO: use the table widget from the mail demo, or dojox.Grid
+ -->
+ <div dojoType="dijit.Declaration" widgetClass="ItemRow" defaults="{ item: {}, itemId: 'thud', name: 10, someProperty: 'foo', children: {} }">
+ Id: ${itemId}, Name: ${name}
+
+ Children:
+ <span class="dijitInline" dojoAttachPoint="childrenContainerNode"></span>
+
+ <script type='dojo/connect' event='postCreate'>
+ dojo.forEach(this.children, function(childItem){
+ this.childrenContainerNode.innerHTML += "<span class='itemReference'>" + store.getLabel(childItem) + "</span>";
+ }, this);
+ </script>
+ </div>
+ <div id="itemsTable"></div>
+ </body>
+</html>
+
+
+
+
diff --git a/includes/js/dijit/tests/test_instantiate.html b/includes/js/dijit/tests/test_instantiate.html
new file mode 100644
index 0000000..ffc39a4
--- /dev/null
+++ b/includes/js/dijit/tests/test_instantiate.html
@@ -0,0 +1,111 @@
+<html>
+ <head>
+ <title>dojo.NodeList.instantiate() tests</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "css/dijitTests.css";
+ #container { height:200px; }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit._Widget");
+ dojo.require("dojo.parser");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.LinkPane");
+
+ // declare a simple widget to use as a base test:
+ dojo.declare("test._Widget",dijit._Widget,{
+ message:"",
+ postCreate:function(){
+ this.inherited(arguments);
+ this.connect(this.domNode,"onclick","workit");
+ dojo.style(this.domNode,{
+ cursor:"pointer",
+ color:"#333"
+ });
+ this.domNode.innerHTML += this.message +" ("+this.id +")";
+ console.log('created',this.id);
+ },
+ workit:function(){
+ dojo.place(this.domNode,this.domNode.parentNode,"end");
+ }
+ });
+
+ var init = function(){
+ dojo.byId("status").innerHTML = "after.";
+
+ // test widgeting
+ dojo.query("#testList li").instantiate(test._Widget,{}).connect("onclick",console.log);
+
+ // make a tab container from some div, and all it's children div's
+ dojo.query("#container")
+ .forEach(function(n){
+ dojo.query("div",n)
+ // create contentpanes from the children and style them
+ .instantiate(dijit.layout.ContentPane,{})
+ .forEach(function(wn,idx){
+ dojo.mixin(dijit.byNode(wn),{ title:"tab" + (idx + 1) })
+ })
+ ;
+ })
+ .instantiate(dijit.layout.TabContainer,{})
+ ;
+ // should we add auto-startup calling?
+ dijit.byId("container").startup();
+ //dijit.byId("container").layout();
+
+ // another test widget example
+ dojo.query("#altList li").instantiate(test._Widget,{ message:"woot" });
+
+ // bunches of buttons, use you imagination on how to relate them to something
+ dojo.query("#buttonTest").forEach(function(n){
+ dojo.query("button",n).instantiate(dijit.form.Button,{
+ onClick:function(){
+ console.log('clicked:',this.domNode);
+ }
+ });
+ });
+ };
+ dojo.addOnLoad(init)
+ //dojo.addOnLoad(function(){
+ // setTimeout(init,25);
+ //});
+ </script>
+ </head>
+ <body>
+
+ <h1>dojo.NodeList.instantiate() tests: <span id="status">before</span></h1>
+
+ <h2>Some simple widgets:</h2>
+ <ul id="testList">
+ <li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li>
+ </ul>
+ <ul id="altList">
+ <li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li><li>inner</li>
+ </ul>
+
+ <h2>A TabContainer:</h2>
+ <div id="container">
+ <div>pane1</div>
+ <div>pane2</div>
+ <div>pane3</div>
+ </div>
+
+ <h2>Some Buttons</h2>
+ <div id="buttonTest">
+ <button>button 1</button>
+ <button>button 2</button>
+ <button>button 3</button>
+ <button>button 4</button>
+ <button>button 5</button>
+ </div>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/tree/test_Tree_DnD.html b/includes/js/dijit/tests/tree/test_Tree_DnD.html
new file mode 100644
index 0000000..2602573
--- /dev/null
+++ b/includes/js/dijit/tests/tree/test_Tree_DnD.html
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Tree Test</title>
+
+ <style someProperty="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../themes/tundra/tundra.css";
+ @import "../../themes/tundra/tundra_rtl.css";
+ @import "../css/dijitTests.css";
+ @import "../dndDefault.css";
+ @import "../../../dojo/resources/dojo.css";
+ @import "../../../dojo/resources/dnd.css";
+ @import "../../../dojo/tests/dnd/dndDefault.css";
+ </style>
+
+ <script someProperty="text/javascript" src="testBidi.js"></script>
+
+ <script someProperty="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+
+ <script language="JavaScript" someProperty="text/javascript">
+ dojo.require("dojo.data.ItemFileWriteStore");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit._tree.dndSource");
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.form.Button");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+
+ dojo.require("dojo.dnd.common");
+ dojo.require("dojo.dnd.Source");
+
+ selected=[];
+
+ globalId=1000;
+ lastSelected=null;
+
+ dojo.addOnLoad(function(){
+
+ //record the selection from tree 1
+ dojo.subscribe("myTree", null, function(message){
+ if(message.event=="execute"){
+ console.log("Tree1 Select: ",dijit.byId("myTree").store.getLabel(message.item));
+ lastSelected=selected["myTree"]=message.item;
+ }
+ });
+
+ //record the selection from tree 2
+ dojo.subscribe("myTree2", null, function(message){
+ if(message.event=="execute"){
+ console.log("Tree2 Select: ",dijit.byId("myTree2").store.getLabel(message.item));
+ lastSelected=selected["myTree2"]=message.item;
+ }
+ });
+
+ //connect to the add button and have it add a new container to the store as necessary
+ dojo.connect(dijit.byId("addButton"), "onClick", function(){
+ var pInfo = {
+ parent: lastSelected,
+ attribute: "children"
+ };
+
+ //store.newItem({name: dojo.byId('newCat').value, id:globalId++, numberOfItems:dojo.byId('numItems').value}, pInfo);
+ catStore.newItem({name: dojo.byId('newCat').value, numberOfItems:0,id:globalId++}, pInfo);
+ });
+
+ //since we don't have a server, we're going to connect to the store and do a few things the server/store combination would normal be taking care of for us
+ dojo.connect(catStore, "onNew", function(item, pInfo){
+ var p = pInfo && pInfo.item;
+ if (p) {
+ var currentTotal = catStore.getValues(p, "numberOfItems")[0];
+ catStore.setValue(p, "numberOfItems", ++currentTotal);
+ }
+
+ });
+ });
+
+
+ //create a custom label for tree one consisting of the label property pluss the value of the numberOfItems Column
+ function catTreeCustomLabel(item){
+ var label = catStore.getLabel(item);
+ var num = catStore.hasAttribute(item, "numberOfItems") ? catStore.getValues(item,"numberOfItems") : "?";
+ return label + ' (' + num+ ')';
+ }
+
+ //on item tree , we only want to drop on containers, or the root node itself, not on items in the containers
+ function itemTreeCheckItemAcceptance(node,source) {
+ var item = dijit.getEnclosingWidget(node).item;
+ if (item && (item.root || catStore.hasAttribute(item,"numberOfItems"))){
+ return true;
+ }
+ return false;
+ }
+
+ function dndAccept(source,nodes){
+ if (this.tree.id=="myTree"){
+ return false;
+ }
+ return true;
+ }
+
+ function getIcon(item) {
+ if (!item || catStore.hasAttribute(item, "numberOfItems")) {
+ return "myFolder";
+ }
+ return "myItem"
+ }
+ </script>
+
+ <style>
+ .myFolder{
+ display: "block";
+ width: 16px;
+ height: 16px;
+ background: blue;
+ }
+
+ .myItem{
+ display: "block";
+ width: 16px;
+ height: 16px;
+ background: green;
+
+ }
+ </style>
+
+</head>
+<body class="tundra">
+ <h1 class="testTitle">Dijit Tree Test - Drag And Drop Support</h1>
+
+ <div dojoType="dojo.data.ItemFileWriteStore" jsId="catStore"
+ url="../_data/categories.json"></div>
+
+ <table width="100%" style="margin:5px solid gray" >
+
+ <tr style="width:100%">
+ <td style="width: 50%">
+ <h2>Custom</h2>
+ <p>Should add this category to the store. The second parameter is the value for numberOfItems.</p>
+ <div class="container">
+ <input id="newCat" type="text" value="Pottedmeat" /><input id="numItems" type="text" value="0" size="3"/><div id="addButton" dojoType="dijit.form.Button">Add Category</div>
+ </div>
+ </td>
+ <td>
+ <h2>Items: </h2>
+ <p>List of Items to be categorized<p>
+ <div dojoType="dojo.dnd.Source" jsId="c2" class="container" style="height: 100px; overflow: auto">
+ <div class="dojoDndItem" id="1001">Apple</div>
+ <div class="dojoDndItem" id="1002">Orange</div>
+ <div class="dojoDndItem" id="1003">Banana</div>
+ <div class="dojoDndItem" id="1004">Tomato</div>
+ <div class="dojoDndItem" id="1005">Pepper</div>
+ <div class="dojoDndItem" id="1006">Wheat</div>
+ <div class="dojoDndItem" id="1007">Corn</div>
+ <div class="dojoDndItem" id="1008">Spinach</div>
+ <div class="dojoDndItem" id="1009">Cucumber</div>
+ <div class="dojoDndItem" id="1010">Carrot</div>
+ <div class="dojoDndItem" id="1011">Potato</div>
+ <div class="dojoDndItem" id="1012">Grape</div>
+ <div class="dojoDndItem" id="1013">Lemon</div>
+ <div class="dojoDndItem" id="1010">Lettuce</div>
+ <div class="dojoDndItem" id="1010">Peanut</div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <h2>Collection Count Summary</h2>
+ <p>You can't drop items onto this tree.</p>
+ <div dojoType="dijit.tree.TreeStoreModel" jsId="catModel"
+ store="catStore" query="{id: '0'}"></div>
+ <div class="container" dojoType="dijit.Tree" id="collectionsTree" model="catModel"
+ getLabel="catTreeCustomLabel" dndController="dijit._tree.dndSource"
+ checkAcceptance="dndAccept" getIconClass="getIcon"></div>
+ </td>
+ <td>
+ <h2>Collection</h2>
+ <p>
+ Drop items onto this tree, but only onto categories; should fail to let you drop on other items.
+ Can also move items within this tree.
+ </p>
+ <div dojoType="dijit.tree.TreeStoreModel" jsId="itemModel"
+ store="catStore" query="{id: '0'}" childrenAttrs="items, children"></div>
+ <div class="container" dojoType="dijit.Tree" id="itemTree"
+ model="itemModel"
+ dndController="dijit._tree.dndSource" checkAcceptance="dndAccept" checkItemAcceptance="itemTreeCheckItemAcceptance"
+ getIconClass="getIcon"></div>
+ </td>
+ </tr>
+ </table>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/tests/tree/test_Tree_Programmatic.html b/includes/js/dijit/tests/tree/test_Tree_Programmatic.html
new file mode 100644
index 0000000..b32b50f
--- /dev/null
+++ b/includes/js/dijit/tests/tree/test_Tree_Programmatic.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Tree Programmatic Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: false, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script language="JavaScript" someProperty="text/javascript">
+ dojo.require("dojo.data.ItemFileWriteStore");
+ dojo.require("dijit.Tree");
+
+ dojo.addOnLoad(function(){
+ var myStore = new dojo.data.ItemFileWriteStore({url:'../_data/countries.json'});
+ var myModel = new dijit.tree.ForestStoreModel({
+ store: myStore,
+ query: {type:'continent'},
+ rootId: "earth",
+ rootLabel: "Earth",
+ childrenAttrs: ["children"]
+ });
+ var tree = new dijit.Tree({
+ model: myModel
+ });
+ dojo.body().appendChild(tree.domNode);
+ tree.startup();
+ });
+ </script>
+</head>
+<body>
+ <h1 class="testTitle">Dijit Forest Store Programmatic Test</h1>
+</body>
+</html>
diff --git a/includes/js/dijit/tests/tree/test_Tree_v1.html b/includes/js/dijit/tests/tree/test_Tree_v1.html
new file mode 100644
index 0000000..bf2b800
--- /dev/null
+++ b/includes/js/dijit/tests/tree/test_Tree_v1.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Tree Test</title>
+
+ <style type="text/css">
+ @import "../../../dojo/resources/dojo.css";
+ @import "../css/dijitTests.css";
+ </style>
+
+ <script type="text/javascript" src="../../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../_testCommon.js"></script>
+
+ <script language="JavaScript" type="text/javascript">
+ dojo.require("dojo.data.ItemFileReadStore");
+ dojo.require("dijit.Tree");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.Menu");
+ dojo.require("dojo.parser"); // scan page for widgets and instantiate them
+ </script>
+</head>
+<body>
+
+ <h1 class="testTitle">Dijit Tree Test</h1>
+
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+ url="../../tests/_data/countries.json"></div>
+
+ <h3>Tree with hardcoded root node (not corresponding to any item in the store)</h3>
+ <p>Clicking a folder node will open/close it (openOnclick==true), and clicking a leaf node will popup an alert.</p>
+ <div dojoType="dijit.Tree" id="mytree" store="continentStore" query="{type:'continent'}"
+ onfocus="console.log('user focus handler')"
+ onblur="console.log('user blur handler')"
+ label="Continents" openOnClick="true">
+ <script type="dojo/method" event="onClick" args="item">
+ alert("Execute of node " + continentStore.getLabel(item)
+ +", population=" + continentStore.getValue(item, "population"));
+ </script>
+ </div>
+
+ <button onclick="dijit.byId('mytree').destroyRecursive();">destroy</button>
+
+ <h2>A rootless tree (no "continents" node) with context menus, and custom icons</h2>
+
+ <ul dojoType="dijit.Menu" id="tree_menu" style="display: none;">
+ <li dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</li>
+ <li dojoType="dijit.MenuItem" disabled="true">Disabled Item</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</li>
+ <li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</li>
+ <li dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu2">
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</li>
+ <li dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu4">
+ <li dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <ul dojoType="dijit.Menu" id="submenu3" style="display: none;">
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</li>
+ <li dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</li>
+ </ul>
+ </li>
+ </ul>
+
+ <div dojoType="dijit.Tree" id="tree2" store="continentStore" query="{type:'continent'}">
+ <script type="dojo/connect">
+ var menu = dijit.byId("tree_menu");
+ // when we right-click anywhere on the tree, make sure we open the menu
+ menu.bindDomNode(this.domNode);
+
+ dojo.connect(menu, "_openMyself", this, function(e){
+ // get a hold of, and log out, the tree node that was the source of this open event
+ var tn = dijit.getEnclosingWidget(e.target);
+ console.debug(tn);
+
+ // now inspect the data store item that backs the tree node:
+ console.debug(tn.item);
+
+ // contrived condition: if this tree node doesn't have any children, disable all of the menu items
+ menu.getChildren().forEach(function(i){ i.setDisabled(!tn.item.children); });
+
+ // IMPLEMENT CUSTOM MENU BEHAVIOR HERE
+ });
+ </script>
+ <script type="dojo/method" event="getIconClass" args="item, opened">
+ return (!item || continentStore.getValue(item, "type") == "continent") ?
+ (opened ? "customFolderOpenedIcon" : "customFolderClosedIcon") :
+ "noteIcon";
+ </script>
+ <script type="dojo/method" event="onClick" args="item">
+ alert("Execute of node " + continentStore.getLabel(item)
+ +", population=" + continentStore.getValue(item, "population"));
+ </script>
+</div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/tests/widgetsInTemplate.html b/includes/js/dijit/tests/widgetsInTemplate.html
new file mode 100644
index 0000000..ae3b6f9
--- /dev/null
+++ b/includes/js/dijit/tests/widgetsInTemplate.html
@@ -0,0 +1,112 @@
+<html>
+ <head>
+ <title>testing widgetsInTemplate support</title>
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript">
+ dojo.require("doh.runner");
+
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.ProgressBar");
+
+ dojo.addOnLoad(function(){
+ var testW;
+ doh.register("t",
+ [
+ {
+ name: "dojoAttachPoint",
+ runTest: function(t){
+ var testW = dijit.byId("test1Widget");
+ t.t(testW.normalNode);
+ t.f(isNaN(testW.normalNode.nodeType));
+ t.t(testW.buttonWidget instanceof dijit.form.Button);
+ t.t(testW.checkboxWidget instanceof dijit.form.CheckBox);
+ t.t(testW.progressBarWidget instanceof dijit.ProgressBar);
+// alert((testW.buttonWidget instanceof dijit.form.Button)+(testW.checkboxWidget instanceof dijit.form.CheckBox)+(testW.progressBarWidget instanceof dijit.ProgressBar)+
+// (testW.buttonWidget._counter==1)+(testW.checkboxWidget._counter==1)+(testW.progressBarWidget._counter==1));
+ testW = dijit.byId("test2Widget");
+ t.t(testW.containerNode);
+ t.f(isNaN(testW.containerNode.nodeType));
+ t.is(undefined,testW.buttonWidget);
+ t.t(testW.checkboxWidget instanceof dijit.form.CheckBox);
+ }
+ },
+ {
+ name: "dojoAttachEvent",
+ runTest: function(t){
+ var testW = dijit.byId("test1Widget");
+ testW.buttonWidget._counter=0;
+ testW.buttonWidget.onClick(testW.buttonWidget);
+ testW.checkboxWidget._counter=0;
+ testW.checkboxWidget.onClick(testW.checkboxWidget);
+ testW.progressBarWidget._counter=0;
+ testW.progressBarWidget.onChange(testW.progressBarWidget);
+ t.is(1,testW.buttonWidget._counter);
+ t.is(1,testW.checkboxWidget._counter);
+ t.is(1,testW.progressBarWidget._counter);
+ }
+ }
+ ]
+ );
+ doh.run();
+ });
+ </script>
+ <style type="text/css">
+ @import "../themes/tundra/tundra.css";
+ </style>
+ </head>
+ <body>
+ <h1>testing widgetsInTemplate support</h1>
+ <xmp id="Test1Template" style="display:none;">
+ <div>
+ <div dojoAttachPoint="normalNode" >normal node</div>
+ <button dojoAttachPoint="buttonWidget" dojoAttachEvent="onClick:onClick" dojoType="dijit.form.Button">button #1</button>
+ <div dojoAttachPoint="checkboxWidget" dojoAttachEvent="onClick:onClick" dojoType="dijit.form.CheckBox"></div> checkbox #1
+ <div dojoAttachPoint="progressBarWidget" dojoAttachEvent="onChange:onClick" style="width:400px" annotate="true"
+ maximum="200" progress="20" dojoType="dijit.ProgressBar"></div>
+ </div>
+ </xmp>
+ <script>
+ dojo.declare('Test1Widget',
+ [dijit._Widget, dijit._Templated],
+ {
+ widgetsInTemplate: true,
+ // isContainer: true,
+
+ templateString: dojo.byId('Test1Template').textContent || dojo.byId('Test1Template').innerText,
+ onClick: function(e){
+ if(e.target){
+ alert('onClick widgetId='+e.target.id);
+ }else{
+ if(e._counter == undefined){
+ e._counter = 1;
+ }else{
+ e._counter++;
+ }
+ }
+ }
+ });
+ </script>
+ <!-- can use widget immediately in markup - no parsing occurs until document loaded and scripts run -->
+ <div dojoType="Test1Widget" id="test1Widget" ></div>
+
+
+ <xmp id="Test2Template" style="display:none;">
+ <div>
+ <div dojoAttachPoint="containerNode" ><div dojoAttachPoint="checkboxWidget" dojoType="dijit.form.CheckBox"></div> checkbox #2</div>
+ </div>
+ </xmp>
+ <script>
+ dojo.declare('Test2Widget',
+ [dijit._Widget, dijit._Templated],
+ {
+ widgetsInTemplate: true,
+
+ templateString: dojo.byId('Test2Template').textContent || dojo.byId('Test2Template').innerText
+ });
+ </script>
+ <div dojoType="Test2Widget" id="test2Widget" ><button dojoAttachPoint="buttonWidget" dojoType="dijit.form.Button">button #2</button></div>
+ </body>
+</html>
+
diff --git a/includes/js/dijit/tests/widgetsInTemplate.js b/includes/js/dijit/tests/widgetsInTemplate.js
new file mode 100644
index 0000000..18b25ea
--- /dev/null
+++ b/includes/js/dijit/tests/widgetsInTemplate.js
@@ -0,0 +1,9 @@
+if(!dojo._hasResource["dijit.tests.widgetsInTemplate"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.tests.widgetsInTemplate"] = true;
+dojo.provide("dijit.tests.widgetsInTemplate");
+
+if(dojo.isBrowser){
+ doh.registerUrl("dijit.tests.widgetsInTemplate", dojo.moduleUrl("dijit", "tests/widgetsInTemplate.html"));
+}
+
+}
diff --git a/includes/js/dijit/themes/a11y/README.txt b/includes/js/dijit/themes/a11y/README.txt
new file mode 100644
index 0000000..a809354
--- /dev/null
+++ b/includes/js/dijit/themes/a11y/README.txt
@@ -0,0 +1,3 @@
+This folder contains images used by all themes when in "high-contrast" mode.
+
+If you think you need to put something here, please talk to Becky or Bill first. \ No newline at end of file
diff --git a/includes/js/dijit/themes/a11y/indeterminate_progress.gif b/includes/js/dijit/themes/a11y/indeterminate_progress.gif
new file mode 100644
index 0000000..66f535c
--- /dev/null
+++ b/includes/js/dijit/themes/a11y/indeterminate_progress.gif
Binary files differ
diff --git a/includes/js/dijit/themes/dijit.css b/includes/js/dijit/themes/dijit.css
new file mode 100644
index 0000000..fa689ae
--- /dev/null
+++ b/includes/js/dijit/themes/dijit.css
@@ -0,0 +1,1205 @@
+
+.dijitReset {
+
+ margin:0;
+ border:0;
+ padding:0;
+ line-height:normal;
+ font: inherit;
+ color: inherit;
+}
+.dijitInline {
+
+ display:-moz-inline-box;
+ display:inline-block;
+ #zoom: 1;
+ #display:inline;
+ border:0;
+ padding:0;
+ vertical-align:middle;
+}
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+ font-size: 100%;
+ font-family: inherit;
+ behavior: expression(
+ function(self){
+ var cs, e;
+ try{
+ if(self.currentStyle.fontFamily=='inherit'){
+ cs = self.parentNode.currentStyle || document.documentElement.currentStyle;
+ self.style.fontFamily = cs.fontFamily;
+ }
+ self.style.behavior = null;
+ }catch(e){}
+ }(this)
+ );
+}
+.dj_ie .dijitInputField INPUT {
+ margin: -1px 0 !important;
+}
+.dj_iequirks .dijitInputField INPUT {
+ margin-top: -3px !important;
+}
+.dijitInlineTable {
+
+ display: -moz-inline-stack;
+ 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;
+}
+.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 {
+ opacity: 1 !important;
+ background-color: white !important;
+}
+.dj_ie .dijit_a11y .dijitPopup * {
+ filter: none;
+}
+.dijitInputField {
+ overflow:hidden;
+ #zoom:1;
+}
+.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;
+}
+.dijitClickableRegion {
+
+ cursor: pointer;
+}
+.dijitDisplayNone {
+
+ display:none !important;
+}
+.dijitContainer {
+
+ overflow: hidden;
+}
+.dijit_a11y * {
+ background-image:none !important;
+}
+.dijit_a11y .dijitCalendarIncrementControl .dijitA11ySideArrow {
+ padding-left:.2em;
+ visibility:visible !important;
+}
+.dj_ie6 .dijit_a11y .dijitCalendarIncrementControl {
+ font-size:.75em !important;
+}
+.dijit_a11y .dijitCalendarSelectedDate {
+ text-decoration:overline !important;
+}
+.dijitA11ySideArrow {
+ vertical-align:top;
+ margin-right:0em;
+ margin-left:.2em;
+ line-height:2em;
+ text-align:center;
+}
+.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 .dijitButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitDropDownButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboBoxDisabled .dijitInputField,
+.dijit_a11y .dijitComboBoxDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitInputField {
+ border-style: outset!important;
+ border-width: medium!important;
+ border-color: #999 !important;
+ color:#999 !important;
+}
+.dijitButtonNode * {
+ vertical-align: middle;
+}
+.dijit_a11y .dijitArrowButtonInner {
+ width: 1.0em;
+ display: none !important;
+}
+.dijitButtonNode .dijitArrowButtonInner {
+ background:no-repeat center;
+ width: 16px;
+}
+.dijitComboBox .dijitArrowButtonInner {
+ display: block;
+}
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+ display: inline !important;
+}
+
+.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;
+}
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+
+ margin: 0.2em;
+}
+.dj_safari .dijitToolbar .dijitDropDownButton {
+ padding-left: 0.3em;
+}
+.dijitButtonNode {
+
+ border:1px solid gray;
+ margin:0;
+ padding:.2em .2em .1em;
+ line-height:normal;
+ cursor:pointer;
+ vertical-align:middle;
+ text-align:center;
+ white-space: nowrap;
+}
+.dijitArrowButton {
+
+
+ padding: 0 .4em;
+}
+DIV.dijitArrowButton {
+ float: right;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ border-style: solid;
+ border-width: 0 0 0 1px !important;
+ padding: 0;
+ position: absolute;
+ right: 0;
+ float: none;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ position: absolute;
+ height: 50%;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitDownArrowButton {
+ top: none;
+ bottom: 0;
+ border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+ top: 0;
+ bottom: none;
+}
+.dijitComboButton TABLE {
+
+ border-collapse: separate;
+ border:0;
+ padding:0;
+ margin:0;
+}
+.dijitComboButton .dijitButtonContents {
+ border-right-width:0 !important;
+}
+.dj_ie BUTTON.dijitButtonNode {
+ overflow: visible;
+}
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+ #overflow:hidden;
+}
+.dijitButtonNode IMG {
+
+ vertical-align:middle;
+ margin-bottom:.2em;
+}
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+ border: solid black 1px;
+ #overflow: hidden;
+ width: 15em;
+}
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+ outline: none;
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused {
+
+ outline: auto 5px -webkit-focus-ring-color;
+}
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+ padding:0;
+ border-left: solid black 1px;
+ display:inline;
+ position:static !important;
+ border:0 !important;
+ margin:0 !important;
+ vertical-align:0em !important;
+ visibility:visible !important;
+ background-color:transparent !important;
+ background-image:none !important;
+ width:100% !important;
+}
+.dijitValidationIcon {
+ visibility: hidden;
+ display: block;
+ padding: 0 2px;
+ float: right;
+ height: auto;
+}
+.dijitValidationIconText {
+ visibility: hidden;
+ display: none;
+ float:right;
+ font-family: sans-serif;
+ font-style:italic;
+ font-size: 0.45em;
+ line-height: 190%;
+}
+.dijit_a11y .dijitValidationIcon { display: none !important; }
+.dijit_a11y .dijitValidationIconText { display: block !important; }
+.dijitError .dijitValidationIcon,
+.dijitError .dijitValidationIconText {
+ visibility: visible;
+}
+.dijitTextBox .dijitArrowButton {
+
+ display:none;
+}
+.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;
+ height: auto;
+}
+.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%;
+ height:100%;
+}
+.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:4px;
+ border-style:solid;
+ background-color:transparent !important;
+}
+.dj_iequirks .dijitProgressBarTile{
+ width:100%;
+ height:100%;
+}
+.dj_ie6 .dijitProgressBarTile{
+
+ position:static;
+
+ height:100%;
+}
+.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;
+}
+.dijitProgressBarV .dijitProgressBarFull{
+ bottom:0;
+}
+.dj_ie6 .dijitProgressBarV .dijitProgressBarTile{
+ position:absolute;
+
+ width:100%;
+}
+.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;
+}
+.dijitLayoutContainer{
+ position: relative;
+ display: block;
+ overflow: hidden;
+}
+body .dijitAlignTop,
+body .dijitAlignBottom,
+body .dijitAlignLeft,
+body .dijitAlignRight {
+ position: absolute;
+ overflow: hidden;
+}
+body .dijitAlignClient { position: absolute; }
+.dijitBorderContainer {
+ position:relative;
+ overflow: hidden;
+}
+.dijitBorderContainer > .dijitTextArea {
+
+ resize: none;
+}
+.dijitSplitter {
+ position: absolute;
+ overflow: hidden;
+ z-index: 9999;
+ background-color: #fff;
+ border-color: gray;
+ border-style: solid;
+ border-width: 0;
+ z-index: 10 !important;
+}
+.dijitSplitterCover{
+ position:absolute;
+ z-index:1;
+ top:0;
+ left:0;
+ width:100%;
+ height:100%;
+}
+.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;
+}
+.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;
+}
+.dijitTitlePane {
+ display: block;
+ overflow: hidden;
+}
+.dj_ie7 .dijitTitlePaneTextNode {
+ display:inline;
+}
+.dijitColorPalette {
+ border:1px solid #999;
+ background:#fff;
+ -moz-border-radius:3pt;
+}
+img.dijitColorPaletteUnder {
+ border-style:none;
+ position:absolute;
+ left:0;
+ top:0;
+}
+.dijitColorPaletteInner {
+ position: relative;
+ overflow:hidden;
+ outline:0;
+}
+.dijitPaletteCell {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ overflow: hidden;
+ z-index: 10;
+ outline-width: 0;
+}
+.dijitPaletteImg {
+ width: 16px;
+ height: 14px;
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ overflow: hidden;
+ cursor: default;
+ border:1px solid #999;
+
+}
+.dijitPaletteCellHighlight img {
+ width: 14px;
+ height: 12px;
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ overflow: hidden;
+ cursor: default;
+ border:2px solid #000;
+ outline:1px solid #dedede;
+
+}
+.dijit_a11y .dijitPaletteCell {
+ background-color:transparent !important;
+}
+.dijit_a11y .dijitPaletteImg {
+ background-color:transparent !important;
+}
+.dijitAccordionPane {
+ overflow: hidden !important;
+}
+.dijitAccordionPane .dijitAccordionBody {
+ overflow: auto;
+}
+.dijitAccordionContainer {
+ border:1px solid #b7b7b7;
+ border-top:0 !important;
+}
+.dijitAccordionTitle:hover {
+ cursor: pointer;
+}
+.dijitAccordionTitle .dijitAccordionArrow {
+ float: right;
+}
+.dijitAccordionPane .dijitAccordionTitle .arrowTextUp,
+.dijitAccordionPane .dijitAccordionTitle .arrowTextDown {
+ display: none;
+ float: right;
+ font-size: 0.65em;
+ font-weight: normal !important;
+}
+.dijit_a11y .dijitAccordionPane .dijitAccordionTitle .arrowTextUp {
+ display: inline;
+}
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextDown {
+ display: inline;
+}
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextUp {
+ display: none;
+}
+.dijitCalendarContainer thead tr th, .dijitCalendarContainer thead tr td, .dijitCalendarContainer tbody tr td, .dijitCalendarContainer tfoot tr td {
+ padding: 0;
+}
+.dijitCalendarNextYear {
+ margin:0 0 0 0.55em;
+}
+.dijitCalendarPreviousYear {
+ margin:0 0.55em 0 0;
+}
+.dijitCalendarIncrementControl {
+ cursor:pointer;
+ cursor:hand;
+ width:1em;
+}
+.dijitCalendarDisabledDate {
+ color:gray !important;
+}
+.dijitCalendarBodyContainer tbody tr td {
+ cursor:pointer;
+ cursor:hand;
+}
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+ cursor:default !important
+}
+.dijitCalendarDateTemplate,
+.dijitCalendarSelectedYear,
+.dijitCalendarNextYear,
+.dijitCalendarPreviousYear {
+ cursor:pointer;
+}
+.dijitCalendarMonthLabelSpacer {
+
+ position: relative;
+ height: 1px;
+ overflow: hidden;
+ visibility: hidden;
+}
+.dijitMenu {
+ border:1px solid black;
+ background-color:white;
+}
+.dijitMenuTable {
+ margin:1px 0;
+ border-collapse:collapse;
+ border-width:0;
+ background-color:white;
+}
+.dijitMenuItem{
+ white-space: nowrap;
+ padding:.1em .2em;
+}
+.dijitMenuItemHover {
+ cursor:pointer;
+ cursor:hand;
+ background-color:black;
+ color:white;
+}
+.dijitMenuItemIcon {
+ position: relative;
+ background-repeat: no-repeat;
+}
+.dijitMenuItemDisabled * {
+
+ opacity:0.3;
+ cursor:default;
+}
+.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 .dijitMenuItemHover .dijitMenuItemLabel {
+ border-width: 1px;
+ border-style: solid;
+}
+.dijit_a11y .dijitMenuItemHover {
+ border: 1px #fff dotted !important;
+}
+.dijit_a11y .dijitMenuExpandInner {
+ display:block !important;
+}
+.dijitMenuSeparatorTop {
+ height: 50%;
+ margin: 0;
+ margin-top:3px;
+ font-size: 1px;
+}
+.dijitMenuSeparatorBottom {
+ height: 50%;
+ margin: 0;
+ margin-bottom:3px;
+ font-size: 1px;
+}
+.dijitTabLabels-top {
+ top:1px !important;
+ z-index:10;
+}
+.dijitTabLabels-bottom {
+ margin-top:-1px !important;
+ z-index:10;
+}
+.dijitTabLabels-left-h {
+ margin-right:-1px !important;
+ z-index:10;
+}
+.dijitTabLabels-right-h {
+ margin-left:-1px !important;
+ z-index:10;
+}
+.dijitTabPaneWrapper {
+ z-index:0;
+ overflow: hidden;
+ clear: both;
+}
+.dijitTab {
+ position:relative;
+ float:left;
+ cursor:pointer;
+ white-space:nowrap;
+ z-index:3;
+}
+.dijitTabContainer .dijitAlignLeft .dijitTab,
+.dijitTabContainer .dijitAlignRight .dijitTab {
+ float:none;
+}
+.dijitTabInnerDiv {
+ position:relative;
+}
+.dijitTab .close {
+ display: inline-block;
+ cursor: default;
+ font-size: small;
+}
+.dijitTab .closeText {
+ display:none;
+ padding: 0 2px;
+ margin: 0 2px;
+}
+.dijit_a11y .dijitTab .closeImage {
+ padding: 0 !important;
+ margin: 0 !important;
+ top: 0 !important;
+ bottom: 0 !important;
+}
+.dijit_a11y .closeText {
+ display:inline;
+ margin-left:6px;
+}
+.dijit_a11y .closeText:hover {
+ border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+ border-style:dashed !important;
+}
+.dijit_a11y .dijitTabInnerDiv {
+ border-left:none !important;
+ }
+.dijitInlineEditor {
+
+ position:relative;
+ vertical-align:bottom;
+}
+.dj_ie .dijitInlineEditor {
+ vertical-align:middle;
+}
+.dijitInlineValue {
+
+}
+.dijitInlineEditor .dijitButtonContainer {
+
+ position:absolute;
+ right:0;
+ overflow:visible;
+}
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+}
+.dijitTreeExpando, .dijitTreeExpand {
+ float:left;
+ display:inline;
+}
+.dijitTreeExpando {
+ clear:both;
+}
+.dijitTreeContent {
+ cursor: default;
+
+}
+.dijitExpandoText {
+ display: none;
+}
+.dijit_a11y .dijitExpandoText {
+ float: left;
+ display: inline;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-family: monospace;
+ border-style: solid;
+ border-width: thin;
+ cursor: pointer;
+}
+.dijitDialog {
+ position: absolute;
+ z-index: 999;
+ padding: 1px;
+}
+.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 .dijitInputLayoutContainer,
+.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;
+}
+.dijit_a11y div.dijitSliderImageHandle,
+.dijitSliderImageHandle {
+ margin:0;
+ padding:0;
+ position:absolute !important;
+ border:8px solid gray;
+ width:0;
+ height:0;
+}
+.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
+ border:4px solid #000;
+ height:8px;
+ width:8px;
+}
+.dijitSliderImageHandleV {
+ top:-8px;
+ left:-6px;
+}
+.dijitSliderImageHandleH {
+ left:-8px;
+ top:-5px;
+ vertical-align:top;
+}
+.dijitSliderBar {
+ border-style:solid;
+ border-color:black;
+}
+.dijitSliderBarH {
+ height:4px;
+ border-width:1px 0;
+}
+.dijitSliderBarV {
+ width:4px;
+ border-width:0 1px;
+}
+.dijitSliderProgressBar {
+ background-color:red;
+ #z-index:0;
+}
+.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;
+}
+.dijitSliderDecorationH {
+ text-align:center;
+}
+.dijitSlider .dijitSliderButton {
+ font-family:monospace;
+ margin:0;
+ padding:0;
+ display:block;
+}
+.dijit_a11y .dijitSliderButtonInner {
+ visibility:visible !important;
+}
+.dijitSliderButtonContainer {
+ text-align:center;
+ height:0;
+}
+.dijitSlider .dijitButtonNode {
+ padding:0;
+ display:block;
+}
+.dj_ie .dijitRuleContainer {
+ z-index: -1;
+}
+.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%;
+}
+.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 .dijitButtonContents .dijitButtonText {
+ display: inline !important;
+}
+.dijitTextArea {
+ width:100%;
+ overflow: auto;
+}
+.dj_ie .dijitTextArea p {
+ margin-top:0;
+ margin-bottom:0;
+ line-height: normal !important;
+}
+.dijitToolbarSeparator {
+ height: 18px;
+ width: 5px;
+ padding: 0 1px;
+ margin: 0;
+}
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.dijitTimePickerItemInner {
+ text-align:center;
+ border:0;
+ padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick {
+
+ color:#dedede;
+ border-bottom:1px solid #dedede;
+ border-top:1px solid #dedede;
+ position:relative;
+}
+.dijitTimePickerTick .dijitTimePickerItemInner {
+ font-size:0.25em;
+}
+.dijitTimePickerMarker {
+ background-color:#ededed;
+ border-top:1px solid #999;
+ border-bottom:1px solid #999;
+}
+.dijitTimePickerItemHover {
+ opacity:1 !important;
+ background-color:#808080;
+ color:#fff;
+ border-top:1px solid #333;
+ border-bottom:1px solid #333;
+ cursor:pointer;
+}
+.dijitTimePickerMarker.dijitTimePickerItemHover {
+ font-size:1.3em;
+}
+.dijitTimePickerItemHover .dijitTimePickerItemInner {
+ display:block;
+ overflow:visible;
+ background-color:#808080;
+ font-size:1em;
+}
+.dijitTimePickerItemSelected {
+ font-weight:bold;
+ color:#333;
+ background-color:#b7cdee !important;
+}
+.dijit_a11y .dijitTimePickerItem {
+ border-bottom:1px solid #333;
+}
+.dijitToggleButtonIconChar {
+ display:none !important;
+}
+.dijit_a11y .dijitToggleButtonIconChar {
+ display:inline !important;
+}
+.dijit_a11y .dijitToggleButtonIconChar {
+ visibility:hidden;
+}
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+ visibility:visible !important;
+}
+.dijitArrowButtonChar {
+ display:none !important;
+}
+.dijit_a11y .dijitArrowButtonChar {
+ display:inline !important;
+}
+.dijitInputLayoutContainer {
+ position: relative;
+ overflow: hidden;
+}
+.dijitSpinnerButtonContainer {
+ float: right;
+ width: 18px;
+ position: relative;
+ overflow: hidden;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ height: 50%;
+ width: 16px;
+ overflow: hidden;
+}
+.dj_ie .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ behavior: expression(
+ function(self){
+ var e;
+ try{
+ var h = self.parentNode.offsetHeight/2;
+ if(h > 1){
+ self.style.height = h;
+ self.style.behavior = null;
+ }
+ }catch(e){}
+ }(this)
+ );
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButtonInner {
+ overflow: hidden;
+ line-height: 50%;
+}
+.dijit_a11y .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ width: 100%;
+}
+.dijit_a11y .dijitSpinner .dijitArrowButton .dijitArrowButtonChar {
+ font-size: 0.4em;
+ vertical-align: top;
+}
+.dijit_a11y .dijitSpinnerButtonContainer {
+ width: 0.5em;
+ margin-left: 2px;
+ overflow: visible;
+}
+.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
+ border-width: 1px 0px 0px 1px;
+ border-style: solid !important;
+}
diff --git a/includes/js/dijit/themes/dijit.css.commented.css b/includes/js/dijit/themes/dijit.css.commented.css
new file mode 100644
index 0000000..7aec64f
--- /dev/null
+++ b/includes/js/dijit/themes/dijit.css.commented.css
@@ -0,0 +1,1535 @@
+/*
+ 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.
+ - If there is more than one class on the tag, place this first so other classes override.
+ */
+ margin:0;
+ border:0;
+ padding:0;
+ line-height:normal;
+ font: inherit;
+ color: inherit;
+}
+
+.dijitInline {
+ /* 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:-moz-inline-box; /* FF2 */
+ 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;
+}
+
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+ font-size: 100%;
+ font-family: inherit; /* trigger pseudo font-family inheritance */
+ behavior: expression( /* if the font-family = inherit, then get the parent's font-family */
+ function(self){
+ var cs, e;
+ try{
+ if(self.currentStyle.fontFamily=='inherit'){
+ cs = self.parentNode.currentStyle || document.documentElement.currentStyle;
+ self.style.fontFamily = cs.fontFamily;
+ }
+ self.style.behavior = null; /* #5562: prevent re-eval of css expression */
+ }catch(e){} /* #6024: random exceptions thrown during init */
+ }(this)
+ );
+}
+
+.dj_ie .dijitInputField INPUT { /* try to get rid of IE implicit margin around INPUT */
+ margin: -1px 0 !important;
+}
+.dj_iequirks .dijitInputField INPUT { /* try to get rid of IE implicit margin around INPUT */
+ margin-top: -3px !important;
+}
+
+.dijitInlineTable {
+ /* To inline tables with a given width set (otherwise, use dijitInline above)
+ * Must also put style="-moz-inline-stack" on the node itself to workaround FF2 bugs
+ */
+ display: -moz-inline-stack; /* FF2 */
+ display:inline-table;
+ display:inline-block; /* webkit and FF3 */
+ #zoom: 1; /* set hasLayout:true to mimic inline-block */
+ #display:inline; /* don't use .dj_ie since that increases the priority */
+ box-sizing: content-box; -moz-box-sizing: content-box;
+ border:0;
+ padding:0;
+}
+
+.dijitTeeny {
+ font-size:1px;
+ line-height:1px;
+}
+
+/*
+ * Popup items have a wrapper div (dijitPopup)
+ * with the real popup inside, and maybe an iframe too
+ */
+.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 {
+ opacity: 1 !important;
+ background-color: white !important;
+}
+.dj_ie .dijit_a11y .dijitPopup * {
+ filter: none;
+}
+
+.dijitInputField {
+ overflow:hidden;
+ #zoom:1;
+}
+
+.dijitPositionOnly {
+ /* Null out all position-related properties */
+ padding: 0 !important;
+ border: 0 !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ 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 for FF2 in high-contrast mode to prevent menu
+ * being transparent
+ */
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ border: 0;
+ padding: 0;
+ margin: 0;
+}
+
+.dijitClickableRegion {
+ /* a region we expect the user to click on */
+ cursor: pointer;
+}
+
+
+.dijitDisplayNone {
+ /* hide something. Use this as a class rather than element.style so another class can override */
+ display:none !important;
+}
+
+.dijitContainer {
+ /* 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 * {
+ background-image:none !important;
+}
+
+.dijit_a11y .dijitCalendarIncrementControl .dijitA11ySideArrow {
+ padding-left:.2em;
+ visibility:visible !important;
+}
+.dj_ie6 .dijit_a11y .dijitCalendarIncrementControl {
+ font-size:.75em !important;
+}
+
+.dijit_a11y .dijitCalendarSelectedDate {
+ text-decoration:overline !important;
+}
+
+.dijitA11ySideArrow {
+ vertical-align:top;
+ margin-right:0em;
+ margin-left:.2em;
+ line-height:2em;
+ text-align:center;
+}
+
+.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 .dijitButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitDropDownButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboButtonDisabled .dijitButtonNode,
+.dijit_a11y .dijitComboBoxDisabled .dijitInputField,
+.dijit_a11y .dijitComboBoxDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitButtonNode,
+.dijit_a11y .dijitSpinnerDisabled .dijitInputField {
+ border-style: outset!important;
+ border-width: medium!important;
+ border-color: #999 !important;
+ color:#999 !important;
+}
+
+/* button inner contents - labels, icons etc. */
+.dijitButtonNode * {
+ vertical-align: middle;
+}
+.dijit_a11y .dijitArrowButtonInner {
+ width: 1.0em;
+ display: none !important;
+}
+.dijitButtonNode .dijitArrowButtonInner {
+ background:no-repeat center;
+ width: 16px;
+}
+.dijitComboBox .dijitArrowButtonInner {
+ display: block;
+}
+
+/* In high contrast mode, display the check symbol */
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+ display: inline !important;
+}
+
+
+/****
+ 3-element borders: ( dijitLeft + dijitStretch + dijitRight )
+ ****/
+
+.dijitLeft {
+ /* Left part of a 3-element border */
+ background-position:left top;
+ background-repeat:no-repeat;
+}
+
+.dijitStretch {
+ /* Middle (stretchy) part of a 3-element border */
+ white-space:nowrap; /* MOW: move somewhere else */
+ background-repeat:repeat-x;
+}
+
+.dijitRight {
+ /* 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;
+}
+
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+ /* outside of button */
+ margin: 0.2em;
+}
+
+.dj_safari .dijitToolbar .dijitDropDownButton {
+ padding-left: 0.3em;
+}
+
+.dijitButtonNode {
+ /* Node that is acting as a button -- may or may not be a BUTTON element */
+ border:1px solid gray;
+ margin:0;
+ padding:.2em .2em .1em;
+ line-height:normal;
+ cursor:pointer;
+ vertical-align:middle;
+ text-align:center;
+ white-space: nowrap;
+}
+
+.dijitArrowButton {
+ /* Node that is acting as a arrow button -- drop down (spinner has its own treatment). Also gets dijitButtonNode */
+ /* place AFTER dijitButtonNode so it overrides */
+ padding: 0 .4em;
+}
+DIV.dijitArrowButton {
+ float: right;
+}
+
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ border-style: solid;
+ border-width: 0 0 0 1px !important;
+ padding: 0;
+ position: absolute;
+ right: 0;
+ float: none;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ position: absolute;
+ height: 50%;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitDownArrowButton {
+ top: none;
+ bottom: 0;
+ border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+ top: 0;
+ bottom: none;
+}
+
+.dijitComboButton TABLE {
+ /* each cell in a combo-table should have its own separate border */
+ border-collapse: separate;
+ border:0;
+ padding:0;
+ margin:0;
+}
+
+.dijitComboButton .dijitButtonContents {
+ border-right-width:0 !important;
+}
+
+
+.dj_ie BUTTON.dijitButtonNode {
+ overflow: visible; /* eliminates arbitrary left and right padding on buttons */
+}
+
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+ #overflow:hidden; /* visible messes up if the button is inside a table on IE */
+}
+
+
+
+.dijitButtonNode IMG {
+ /* make text and images line up cleanly */
+ vertical-align:middle;
+ margin-bottom:.2em;
+}
+
+/******
+ TextBox related.
+ Everything that has an <input>
+*******/
+
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+ border: solid black 1px;
+ #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 */
+}
+
+/* rules for safari to deal with fuzzy blue focus border */
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+ outline: none; /* blue fuzzy line looks wrong on combobox or something w/validation icon showing */
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused {
+ /* should we display focus like we do on other browsers, or use the safari standard focus indicator?? */
+ outline: auto 5px -webkit-focus-ring-color;
+}
+
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+ padding:0;
+ border-left: solid black 1px; /* TODO: for RTL mode should be border-right */
+ display:inline;
+ position:static !important;
+ border:0 !important;
+ margin:0 !important;
+ vertical-align:0em !important;
+ visibility:visible !important;
+ background-color:transparent !important;
+ background-image:none !important;
+ width:100% !important;
+}
+
+/* Display an "X" for invalid input. Themes will override these rules to display an icon instead.
+*/
+.dijitValidationIcon {
+ visibility: hidden;
+ display: block;
+ padding: 0 2px;
+ float: right;
+ height: auto;
+}
+.dijitValidationIconText {
+ visibility: hidden;
+ display: none;
+ float:right;
+ font-family: sans-serif;
+ font-style:italic;
+ font-size: 0.45em;
+ line-height: 190%;
+}
+.dijit_a11y .dijitValidationIcon { display: none !important; }
+.dijit_a11y .dijitValidationIconText { display: block !important; }
+
+.dijitError .dijitValidationIcon,
+.dijitError .dijitValidationIconText {
+ visibility: visible;
+}
+
+.dijitTextBox .dijitArrowButton {
+ /* this is for a combo box with no arrow displayed; we set baseClass=TextBox */
+ display:none;
+}
+
+/****
+ dijit.form.CheckBox
+ &
+ dijit.form.RadioButton
+ ****/
+
+.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 {
+ /* 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 {
+ width: auto;
+ height: auto;
+}
+.dijit_a11y .dijitCheckBoxInput {
+ opacity: 1;
+ filter: none;
+ 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; /* 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;
+ top:0;
+ width:100%;
+ height:100%;
+}
+
+.dijitProgressBarTile{
+ /* inner container for finished portion */
+ 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{
+ /* a11y: The border provides visibility in high-contrast mode */
+ border-width:4px;
+ border-style:solid;
+ background-color:transparent !important;
+}
+
+.dj_iequirks .dijitProgressBarTile{
+ width:100%;
+ height:100%;
+}
+
+.dj_ie6 .dijitProgressBarTile{
+ /* width:auto works in IE6 with position:static but not position:absolute */
+ position:static;
+ /* height:auto does not work in IE6 */
+ height:100%;
+}
+
+.dijitProgressBarIndeterminate .dijitProgressBarLabel{
+ visibility:hidden;
+}
+
+.dijitProgressBarIndeterminate .dijitProgressBarTile{
+ /* animated gif for 'indeterminate' mode */
+}
+
+.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;
+}
+
+/* progress bar in vertical mode - TODO: remove? no longer supported? */
+.dijitProgressBarV .dijitProgressBarFull{
+ bottom:0; /* start at the bottom */
+}
+
+.dj_ie6 .dijitProgressBarV .dijitProgressBarTile{
+ position:absolute;
+ /* can't use position:static here -- need absolute positioning to place
+ the bar at the bottom of a vertical progressbar */
+ width:100%;
+}
+
+
+/****
+ dijit.Tooltip
+ ****/
+
+.dijitTooltip {
+ position: absolute;
+ z-index: 2000;
+ display: block;
+ /* make visible but off screen */
+ 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;
+}
+
+/* MOW: using actual images at this time
+/* draw an arrow with CSS only * /
+.dijitTooltipConnector {
+ /* the border on the triangle * /
+ font-size: 0; line-height: 0%; width: 0;
+ border-top: none;
+ border-bottom: 14px solid black;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ top: -14px;
+ left: 3px;
+ z-index: 2;
+}
+
+.dijitTooltipConnector div {
+ /* the background of the triangle * /
+ font-size: 0; line-height: 0%; width: 0;
+ position: absolute;
+ border-bottom: 10px solid #b8b5b5;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+ top: 6px;
+ left: -5px;
+ z-index: 3;
+}
+
+*/
+
+
+
+/* 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,
+body .dijitAlignRight {
+ position: absolute;
+ overflow: hidden;
+}
+
+body .dijitAlignClient { position: absolute; }
+
+.dijitBorderContainer {
+ position:relative;
+ overflow: hidden;
+}
+
+.dijitBorderContainer > .dijitTextArea {
+ /* On Safari, for SimpleTextArea inside a BorderContainer,
+ don't want to display the grip to resize */
+ resize: none;
+}
+
+/* SplitContainer
+
+ 'V' == container that splits vertically (up/down)
+ 'H' = horizontal (left/right)
+*/
+
+.dijitSplitter {
+ position: absolute;
+ overflow: hidden;
+ z-index: 9999;
+ background-color: #fff;
+ border-color: gray;
+ border-style: solid;
+ border-width: 0;
+ z-index: 10 !important;
+}
+.dijitSplitterCover{
+ position:absolute;
+ z-index:1;
+ top:0;
+ left:0;
+ width:100%;
+ height:100%;
+}
+.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;
+}
+
+.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;
+}
+
+/* ContentPane */
+
+.dijitContentPane {
+ display: block;
+ overflow: auto; /* if we don't have this (or overflow:hidden), then Widget.resizeTo() doesn't make sense for ContentPane */
+}
+/* TitlePane */
+.dijitTitlePane {
+ display: block;
+ overflow: hidden;
+}
+.dj_ie7 .dijitTitlePaneTextNode {
+ display:inline;
+}
+
+/* Color Palette */
+
+.dijitColorPalette {
+ border:1px solid #999;
+ background:#fff;
+ -moz-border-radius:3pt;
+}
+
+img.dijitColorPaletteUnder {
+ border-style:none;
+ position:absolute;
+ left:0;
+ top:0;
+}
+.dijitColorPaletteInner {
+ position: relative;
+ overflow:hidden;
+ outline:0;
+}
+.dijitPaletteCell {
+ width: 20px;
+ height: 20px;
+ position: absolute;
+ overflow: hidden;
+ z-index: 10;
+ outline-width: 0;
+}
+.dijitPaletteImg {
+ width: 16px; /*This is the width of one color in the provided palettes. */
+ height: 14px; /* Height of one color in the provided palettes. */
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ overflow: hidden;
+ cursor: default;
+ border:1px solid #999;
+ /* -moz-border-radius:2pt; */
+}
+
+.dijitPaletteCellHighlight img {
+ width: 14px; /*This is the width of one color in the provided palettes. */
+ height: 12px; /* Height of one color in the provided palettes. */
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ overflow: hidden;
+ cursor: default;
+ border:2px solid #000;
+ outline:1px solid #dedede;
+ /* -moz-border-radius:0; */
+}
+
+.dijit_a11y .dijitPaletteCell {
+ background-color:transparent !important;
+}
+.dijit_a11y .dijitPaletteImg {
+ background-color:transparent !important;
+}
+
+/* Accordion */
+
+.dijitAccordionPane {
+ overflow: hidden !important; /* prevent spurious scrollbars */
+}
+
+.dijitAccordionPane .dijitAccordionBody {
+ overflow: auto;
+}
+
+
+.dijitAccordionContainer {
+ border:1px solid #b7b7b7;
+ border-top:0 !important;
+}
+
+.dijitAccordionTitle:hover {
+ cursor: pointer;
+}
+
+.dijitAccordionTitle .dijitAccordionArrow {
+ float: right;
+}
+
+/* images off, high-contrast mode styles */
+.dijitAccordionPane .dijitAccordionTitle .arrowTextUp,
+.dijitAccordionPane .dijitAccordionTitle .arrowTextDown {
+ display: none;
+ float: right;
+ font-size: 0.65em;
+ font-weight: normal !important;
+}
+
+.dijit_a11y .dijitAccordionPane .dijitAccordionTitle .arrowTextUp {
+ display: inline;
+}
+
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextDown {
+ display: inline;
+}
+
+.dijit_a11y .dijitAccordionTitle-selected .arrowTextUp {
+ display: none;
+}
+
+/* Calendar */
+
+.dijitCalendarContainer thead tr th, .dijitCalendarContainer thead tr td, .dijitCalendarContainer tbody tr td, .dijitCalendarContainer tfoot tr td {
+ padding: 0;
+}
+
+.dijitCalendarNextYear {
+ margin:0 0 0 0.55em;
+}
+
+.dijitCalendarPreviousYear {
+ margin:0 0.55em 0 0;
+}
+
+.dijitCalendarIncrementControl {
+ cursor:pointer;
+ cursor:hand;
+ width:1em;
+}
+
+.dijitCalendarDisabledDate {
+ color:gray !important;
+}
+
+.dijitCalendarBodyContainer tbody tr td {
+ cursor:pointer;
+ cursor:hand;
+}
+
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+ cursor:default !important
+}
+
+.dijitCalendarDateTemplate,
+.dijitCalendarSelectedYear,
+.dijitCalendarNextYear,
+.dijitCalendarPreviousYear {
+ cursor:pointer;
+}
+
+.dijitCalendarMonthLabelSpacer {
+ /* don't display it, but make it affect the width */
+ position: relative;
+ height: 1px;
+ overflow: hidden;
+ visibility: hidden;
+}
+
+
+/* Menu */
+
+.dijitMenu {
+ border:1px solid black;
+ background-color:white;
+}
+.dijitMenuTable {
+ margin:1px 0;
+ border-collapse:collapse;
+ border-width:0;
+ background-color:white;
+}
+
+.dijitMenuItem{
+ white-space: nowrap;
+ padding:.1em .2em;
+}
+
+.dijitMenuItemHover {
+ cursor:pointer;
+ cursor:hand;
+ background-color:black;
+ color:white;
+}
+
+.dijitMenuItemIcon {
+ position: relative;
+ background-repeat: no-repeat;
+}
+
+.dijitMenuItemDisabled * {
+ /* for a disabled menu item, just set it to mostly transparent */
+ opacity:0.3;
+ cursor:default;
+}
+.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 .dijitMenuItemHover .dijitMenuItemLabel {
+ border-width: 1px;
+ border-style: solid;
+}
+.dijit_a11y .dijitMenuItemHover {
+ border: 1px #fff dotted !important;
+}
+
+.dijit_a11y .dijitMenuExpandInner {
+ display:block !important;
+}
+
+/* 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;
+}
+
+
+
+/* Tab */
+
+
+.dijitTabLabels-top {
+/* position the tab labels row down by 1 px, and on top of the dijitTabPaneWrapper
+ so the buttons can overlay the tab pane properly */
+ top:1px !important;
+ z-index:10;
+}
+
+.dijitTabLabels-bottom {
+/* position the tab labels row up by 1 px so they overlap */
+ margin-top:-1px !important;
+ z-index:10;
+}
+
+.dijitTabLabels-left-h {
+/* position the tab labels left by 1 px so they overlap */
+ margin-right:-1px !important;
+ z-index:10;
+}
+
+.dijitTabLabels-right-h {
+/* position the tab labels right by 1 px, on top of the dijitTabPaneWrapper
+ so the buttons can overlay the tab pane properly */
+ margin-left:-1px !important;
+ z-index:10;
+}
+
+.dijitTabPaneWrapper {
+ z-index:0;
+ overflow: hidden;
+ clear: both; /* needed for doLayout=false mode */
+}
+
+.dijitTab {
+ position:relative;
+ float:left;
+ cursor:pointer;
+ white-space:nowrap;
+ z-index:3;
+}
+
+.dijitTabContainer .dijitAlignLeft .dijitTab,
+.dijitTabContainer .dijitAlignRight .dijitTab {
+ float:none;
+}
+
+.dijitTabInnerDiv {
+ position:relative;
+}
+
+.dijitTab .close {
+ display: inline-block;
+ cursor: default;
+ font-size: small;
+}
+
+/* images off, high-contrast mode styles */
+.dijitTab .closeText {
+ display:none;
+ padding: 0 2px;
+ margin: 0 2px;
+}
+.dijit_a11y .dijitTab .closeImage {
+ padding: 0 !important;
+ margin: 0 !important;
+ top: 0 !important;
+ bottom: 0 !important;
+}
+.dijit_a11y .closeText {
+ display:inline;
+ margin-left:6px;
+}
+.dijit_a11y .closeText:hover {
+ border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+ border-style:dashed !important;
+}
+
+.dijit_a11y .dijitTabInnerDiv {
+ border-left:none !important;
+ }
+
+
+.dijitInlineEditor {
+ /* span around an inline-editable value when in edit mode */
+ position:relative;
+ vertical-align:bottom;
+}
+.dj_ie .dijitInlineEditor {
+ vertical-align:middle;
+}
+
+.dijitInlineValue {
+ /* span around an inline-editable value when NOT in edit mode */
+}
+
+.dijitInlineEditor .dijitButtonContainer {
+ /* div around the buttons -- makes them float below the field */
+ position:absolute;
+ right:0;
+ overflow:visible;
+}
+
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+}
+
+/* Tree */
+
+.dijitTreeExpando, .dijitTreeExpand {
+ float:left;
+ display:inline;
+}
+
+.dijitTreeExpando {
+ clear:both;
+}
+
+.dijitTreeContent {
+ cursor: default;
+ /* can't make inline - multiline bugs */
+}
+
+.dijitExpandoText {
+ display: none;
+}
+
+.dijit_a11y .dijitExpandoText {
+ float: left;
+ display: inline;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-family: monospace;
+ border-style: solid;
+ border-width: thin;
+ cursor: pointer;
+}
+
+/* Dialog */
+
+.dijitDialog {
+ position: absolute;
+ z-index: 999;
+ padding: 1px;
+}
+
+.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);
+}
+
+/* images off, high-contrast mode styles */
+.dijit_a11y .dijitInputLayoutContainer,
+.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;
+}
+
+.dijitSliderMoveable {
+ z-index:99;
+ position:absolute !important;
+ display:block;
+ vertical-align:middle;
+}
+
+.dijitSliderMoveableH {
+ right:0;
+}
+
+.dijit_a11y div.dijitSliderImageHandle,
+.dijitSliderImageHandle {
+ margin:0;
+ padding:0;
+ position:absolute !important;
+ border:8px solid gray;
+ width:0;
+ height:0;
+}
+.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
+ border:4px solid #000;
+ height:8px;
+ width:8px;
+}
+
+.dijitSliderImageHandleV {
+ top:-8px;
+ left:-6px;
+}
+
+.dijitSliderImageHandleH {
+ left:-8px;
+ top:-5px;
+ vertical-align:top;
+}
+
+.dijitSliderBar {
+ border-style:solid;
+ border-color:black;
+}
+
+.dijitSliderBarH {
+ height:4px;
+ border-width:1px 0;
+}
+
+.dijitSliderBarV {
+ width:4px;
+ border-width:0 1px;
+}
+
+.dijitSliderProgressBar {
+ background-color:red;
+ #z-index:0;
+}
+
+.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;
+}
+
+/* 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;
+}
+
+.dijitSliderDecorationH {
+ text-align:center;
+}
+
+.dijitSlider .dijitSliderButton {
+ font-family:monospace;
+ margin:0;
+ padding:0;
+ display:block;
+}
+
+.dijit_a11y .dijitSliderButtonInner {
+ visibility:visible !important;
+}
+
+.dijitSliderButtonContainer {
+ text-align:center;
+ height:0;
+}
+
+.dijitSlider .dijitButtonNode {
+ padding:0;
+ display:block;
+}
+
+.dj_ie .dijitRuleContainer {
+ z-index: -1; /* #4809 */
+}
+
+.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; /* 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%;
+}
+
+.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;
+}
+
+/* Toolbar A11y */
+.dijit_a11y .dijitButtonContents .dijitButtonText {
+ display: inline !important;
+}
+
+.dijitTextArea {
+ width:100%;
+ overflow: auto; /* w/out this IE's SimpleTextArea goes to overflow: scroll */
+}
+
+.dj_ie .dijitTextArea p {
+ margin-top:0;
+ margin-bottom:0;
+ line-height: normal !important;
+}
+
+.dijitToolbarSeparator {
+ height: 18px;
+ width: 5px;
+ padding: 0 1px;
+ margin: 0;
+}
+
+/* Editor */
+.dijitIEFixedToolbar {
+ position:absolute;
+ /* top:0; */
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+
+/* TimePicker */
+
+.dijitTimePickerItemInner {
+ text-align:center;
+ border:0;
+ padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick {
+ /* opacity:0.1 !important; */
+ color:#dedede;
+ border-bottom:1px solid #dedede;
+ border-top:1px solid #dedede;
+ position:relative;
+}
+.dijitTimePickerTick .dijitTimePickerItemInner {
+ font-size:0.25em;
+}
+.dijitTimePickerMarker {
+ background-color:#ededed;
+ border-top:1px solid #999;
+ border-bottom:1px solid #999;
+}
+
+.dijitTimePickerItemHover {
+ opacity:1 !important;
+ background-color:#808080;
+ color:#fff;
+ border-top:1px solid #333;
+ border-bottom:1px solid #333;
+ cursor:pointer;
+}
+.dijitTimePickerMarker.dijitTimePickerItemHover {
+ font-size:1.3em;
+}
+
+.dijitTimePickerItemHover .dijitTimePickerItemInner {
+ display:block;
+ overflow:visible;
+ background-color:#808080;
+ font-size:1em;
+}
+
+.dijitTimePickerItemSelected {
+ font-weight:bold;
+ color:#333;
+ background-color:#b7cdee !important;
+}
+
+.dijit_a11y .dijitTimePickerItem {
+ border-bottom:1px solid #333;
+}
+
+
+/* Disable the high contrast character */
+.dijitToggleButtonIconChar {
+ display:none !important;
+}
+.dijit_a11y .dijitToggleButtonIconChar {
+ display:inline !important;
+}
+
+.dijit_a11y .dijitToggleButtonIconChar {
+ visibility:hidden;
+}
+.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+ visibility:visible !important;
+}
+
+.dijitArrowButtonChar {
+ display:none !important;
+}
+.dijit_a11y .dijitArrowButtonChar {
+ display:inline !important;
+}
+.dijitInputLayoutContainer {
+ position: relative;
+ overflow: hidden;
+}
+.dijitSpinnerButtonContainer {
+ float: right;
+ width: 18px;
+ position: relative;
+ overflow: hidden;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ height: 50%;
+ width: 16px;
+ overflow: hidden;
+}
+.dj_ie .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ behavior: expression(
+ function(self){
+ var e;
+ try{
+ var h = self.parentNode.offsetHeight/2;
+ if(h > 1){
+ self.style.height = h;
+ self.style.behavior = null; /* prevent re-eval of css expression */
+ }
+ }catch(e){} /* random exceptions thrown during init */
+ }(this)
+ );
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitArrowButtonInner {
+ overflow: hidden;
+ line-height: 50%;
+}
+.dijit_a11y .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ width: 100%;
+}
+.dijit_a11y .dijitSpinner .dijitArrowButton .dijitArrowButtonChar {
+ font-size: 0.4em;
+ vertical-align: top;
+}
+.dijit_a11y .dijitSpinnerButtonContainer {
+ width: 0.5em;
+ margin-left: 2px;
+ overflow: visible;
+}
+.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
+ border-width: 1px 0px 0px 1px;
+ border-style: solid !important;
+}
diff --git a/includes/js/dijit/themes/dijit_rtl.css b/includes/js/dijit/themes/dijit_rtl.css
new file mode 100644
index 0000000..e25cd2e
--- /dev/null
+++ b/includes/js/dijit/themes/dijit_rtl.css
@@ -0,0 +1,140 @@
+.dj_gecko .dijitRtl .dijitInputField {
+ direction: ltr;
+}
+.dj_gecko .dijitRtl .dijitInputField * {
+ direction: rtl;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpando, .dijitRtl .dijitTreeContainer .dijitTreeExpand {
+ float:right;
+}
+.dijitRtl .dijitExpandoText {
+ float: right;
+ padding-left: 3px;
+ padding-right: 0;
+}
+.dijitRtl .dijitComboBox .dijitInputField {
+ border-right-width:1px !important;
+ border-left-width:0 !important;
+}
+.dijitRtl .dijitCalendarNextYear {
+ margin:0 0.55em 0 0;
+}
+.dijitRtl .dijitCalendarPreviousYear {
+ margin:0 0 0 0.55em;
+}
+.dijitRtl .dijitProgressBarFull .dijitProgressBarLabel {
+ right:0;
+}
+.dijitRtl .dijitComboButton .dijitButtonContents {
+ border-right-width:1px !important;
+}
+.dijitRtl .dijitA11ySideArrow {
+ margin-left:1em;
+ margin-right:0;
+}
+.dijitRtl .dijitAccordionArrow,
+.dijitRtl .dijitAccordionTitle .arrowTextUp,
+.dijitRtl .dijitAccordionTitle .arrowTextDown {
+ float: left;
+}
+.dijitRtl .dijitSliderImageHandleV {
+ left:auto;
+ right:-6px;
+}
+.dj_ie .dijitRtl .dijitSliderImageHandleV {
+ right:-10px;
+}
+.dijitRtl .dijitSliderMoveableH {
+ right:auto;
+ left:0;
+}
+.dijitRtl .dijitRuleContainerV {
+ float:right;
+}
+.dj_gecko .dijitRtl .dijitRuleContainerV {
+ float:left;
+}
+.dj_ie .dijitRtl .dijitRuleContainerV {
+ text-align:right;
+}
+.dj_ie .dijitRtl .dijitRuleLabelV {
+ text-align:left;
+}
+.dj_ie .dijitRtl .dijitRuleLabelH {
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitSliderProgressBarH {
+ right:0;
+ left:auto;
+}
+.dj_gecko .dijitRtl .dijitSliderProgressBarH {
+ float:right;
+ right:0;
+ left:auto;
+}
+.dijitRtl .dijitTab {
+ float:right;
+}
+.dj_ie .dijitRtl .dijitTab,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv span {
+ position:static;
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ margin-left:1px !important;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignRight {
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTab {
+
+ width:1px;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+
+ margin-left:1px !important;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignRight {
+
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ overflow-x:visible;
+ margin-left:2px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ overflow-x:visible;
+ margin-right:2px !important;
+}
+.dj_ie7 .dijitRtl .dijitTab .dijitTabInnerDiv {
+ float:left;
+}
+.dj_ie7 .dijitRtl .dijitTab .closeImage {
+ padding: 0 0 0 12px;
+}
+.dj_ie .dijitRtl .dijitAlignRight .dijitTab {
+ position:relative;
+}
+.dijitRtl .dijitTitlePane .dijitArrowNode {
+ float: left;
+}
+.dijitRtl .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ right: auto;
+ left: 0;
+ border-width: 0 1px 0 0 !important;
+}
+.dijitRtl .dijitSpinnerButtonContainer {
+ float: left;
+}
+.dijitRtl .dijit_a11y .dijitSpinnerButtonContainer {
+ margin-left: none;
+ margin-right: 2px;
+}
+.dijitRtl DIV.dijitArrowButton, .dijitRtl .dijitValidationIcon, .dijitRtl .dijitValidationIconText {
+ float: left;
+}
+.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
+ background-position:right;
+ padding-right:25px;
+}
diff --git a/includes/js/dijit/themes/dijit_rtl.css.commented.css b/includes/js/dijit/themes/dijit_rtl.css.commented.css
new file mode 100644
index 0000000..2016849
--- /dev/null
+++ b/includes/js/dijit/themes/dijit_rtl.css.commented.css
@@ -0,0 +1,194 @@
+.dj_gecko .dijitRtl .dijitInputField {
+ direction: ltr; /* Firefox needs this - probably a bug */
+}
+.dj_gecko .dijitRtl .dijitInputField * {
+ direction: rtl; /* Firefox needs dijitInputField to be ltr, so fix the contained tags */
+}
+
+/* Tree */
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpando, .dijitRtl .dijitTreeContainer .dijitTreeExpand {
+ float:right;
+}
+
+/* can't specify .dijitRtl and .dijit_a11y on this rule, since they are on the same node */
+.dijitRtl .dijitExpandoText {
+ float: right;
+ padding-left: 3px;
+ padding-right: 0;
+}
+
+.dijitRtl .dijitComboBox .dijitInputField {
+ border-right-width:1px !important;
+ border-left-width:0 !important;
+}
+
+/* Calendar */
+
+.dijitRtl .dijitCalendarNextYear {
+ margin:0 0.55em 0 0;
+}
+
+.dijitRtl .dijitCalendarPreviousYear {
+ margin:0 0 0 0.55em;
+}
+
+.dijitRtl .dijitProgressBarFull .dijitProgressBarLabel {
+ right:0; /* FF workaround */
+}
+
+/* Button */
+
+.dijitRtl .dijitComboButton .dijitButtonContents {
+ border-right-width:1px !important;
+}
+
+/* A11y */
+.dijitRtl .dijitA11ySideArrow {
+ margin-left:1em;
+ margin-right:0;
+}
+
+/* AccordionPane */
+
+.dijitRtl .dijitAccordionArrow,
+.dijitRtl .dijitAccordionTitle .arrowTextUp,
+.dijitRtl .dijitAccordionTitle .arrowTextDown {
+ float: left;
+}
+
+/* Slider */
+
+.dijitRtl .dijitSliderImageHandleV {
+ left:auto;
+ right:-6px;
+}
+
+.dj_ie .dijitRtl .dijitSliderImageHandleV {
+ right:-10px;
+}
+
+.dijitRtl .dijitSliderMoveableH {
+ right:auto;
+ left:0;
+}
+
+.dijitRtl .dijitRuleContainerV {
+ float:right;
+}
+
+.dj_gecko .dijitRtl .dijitRuleContainerV {
+ float:left;
+}
+
+.dj_ie .dijitRtl .dijitRuleContainerV {
+ text-align:right;
+}
+
+.dj_ie .dijitRtl .dijitRuleLabelV {
+ text-align:left;
+}
+
+.dj_ie .dijitRtl .dijitRuleLabelH {
+ zoom:1;
+}
+
+.dj_ie .dijitRtl .dijitSliderProgressBarH {
+ right:0;
+ left:auto;
+}
+
+.dj_gecko .dijitRtl .dijitSliderProgressBarH {
+ float:right;
+ right:0;
+ left:auto;
+}
+
+/* TabContainer */
+
+.dijitRtl .dijitTab {
+ float:right;
+}
+
+.dj_ie .dijitRtl .dijitTab,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv span {
+ position:static;
+ zoom:1;
+}
+
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ margin-left:1px !important;
+}
+
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignRight {
+ margin-right:1px !important;
+}
+
+.dj_ie6 .dijitRtl .dijitTab {
+ /* force ie6 to render each tab based on the tab's label */
+ width:1px;
+}
+
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ /* fix the offset between tabs and the pane */
+ margin-left:1px !important;
+}
+
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ /* fix the offset between tabs and the pane */
+ margin-right:1px !important;
+}
+
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ overflow-x:visible;
+ margin-left:2px !important;
+}
+
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ overflow-x:visible;
+ margin-right:2px !important;
+}
+
+.dj_ie7 .dijitRtl .dijitTab .dijitTabInnerDiv {
+ float:left;
+}
+
+.dj_ie7 .dijitRtl .dijitTab .closeImage {
+ padding: 0 0 0 12px;
+}
+
+.dj_ie .dijitRtl .dijitAlignRight .dijitTab {
+ position:relative;
+}
+
+/* TitlePane */
+
+.dijitRtl .dijitTitlePane .dijitArrowNode {
+ float: left;
+}
+
+.dijitRtl .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ right: auto;
+ left: 0;
+ border-width: 0 1px 0 0 !important;
+}
+
+.dijitRtl .dijitSpinnerButtonContainer {
+ float: left;
+}
+
+.dijitRtl .dijit_a11y .dijitSpinnerButtonContainer {
+ margin-left: none;
+ margin-right: 2px;
+}
+
+.dijitRtl DIV.dijitArrowButton, .dijitRtl .dijitValidationIcon, .dijitRtl .dijitValidationIconText {
+ float: left;
+}
+
+/* ContentPane*/
+.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
+ background-position:right;
+ padding-right:25px;
+}
diff --git a/includes/js/dijit/themes/nihilo/Calendar.css b/includes/js/dijit/themes/nihilo/Calendar.css
new file mode 100644
index 0000000..af415d3
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Calendar.css
@@ -0,0 +1,136 @@
+
+
+.nihilo .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.nihilo .dijitCalendarIncreaseInner,
+.nihilo .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.nihilo .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+.nihilo .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .nihilo .dijitCalendarDateTemplate,
+.dj_ie6 .nihilo .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.nihilo .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fdfdfd;
+ border:#fdfdfd solid 1px !important;
+}
+.nihilo .dijitCalendarPreviousMonth,
+.nihilo .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#f5f5f5 !important;
+ border:#f5f5f5 solid 1px !important;
+}
+.nihilo .dijitCalendarPreviousMonthDisabled,
+.nihilo .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.nihilo .dijitCalendarCurrentMonth {
+
+}
+.nihilo .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.nihilo .dijitCalendarDisabledDate {
+
+
+ text-decoration:line-through !important;
+ cursor:default !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;
+}
diff --git a/includes/js/dijit/themes/nihilo/Calendar.css.commented.css b/includes/js/dijit/themes/nihilo/Calendar.css.commented.css
new file mode 100644
index 0000000..c3d4c96
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Calendar.css.commented.css
@@ -0,0 +1,159 @@
+/* Calendar*/
+
+.nihilo .dijitCalendarIncrementControl {
+ /* next/prev month buttons */
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+
+.nihilo .dijitCalendarIncreaseInner,
+.nihilo .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+
+.nihilo .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+
+.nihilo .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -30px top;
+}
+
+.nihilo table.dijitCalendarContainer {
+ font-size: 100%;
+ border-spacing: 0;
+ border-collapse: separate;
+ 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;
+ text-align:center;
+}
+.dj_ie6 .nihilo .dijitCalendarMonthContainer th {
+ padding-top:.1em;
+ padding-bottom:0em;
+}
+
+.nihilo .dijitCalendarDayLabelTemplate {
+ /* day of week labels */
+ 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;
+}
+
+.dj_ie7 .nihilo .dijitCalendarDateTemplate,
+.dj_ie6 .nihilo .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+
+.nihilo .dijitCalendarDateTemplate {
+ /* style for each day cell */
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fdfdfd;
+ border:#fdfdfd solid 1px !important;
+}
+
+
+.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 .dijitCalendarPreviousMonthDisabled,
+.nihilo .dijitCalendarNextMonthDisabled {
+ /* days that are part of the previous or next month - disabled*/
+ background-color:#a4a5a6 !important;
+}
+
+.nihilo .dijitCalendarCurrentMonth {
+ /* days that are part of this month */
+}
+
+.nihilo .dijitCalendarCurrentMonthDisabled {
+ /* days that are part of this month - disabled */
+ background-color:#bbbbbc !important;
+}
+
+.nihilo .dijitCalendarDisabledDate {
+ /* one or the other? */
+ /* background: url(images/noX.gif) no-repeat center center !important; */
+ text-decoration:line-through !important;
+ cursor:default !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;
+}
diff --git a/includes/js/dijit/themes/nihilo/Calendar_rtl.css b/includes/js/dijit/themes/nihilo/Calendar_rtl.css
new file mode 100644
index 0000000..e64cdf2
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Calendar_rtl.css
@@ -0,0 +1,13 @@
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css
new file mode 100644
index 0000000..84146f8
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css
@@ -0,0 +1,16 @@
+
+/* Calendar */
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/ColorPalette.css b/includes/js/dijit/themes/nihilo/ColorPalette.css
new file mode 100644
index 0000000..328bc84
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/ColorPalette.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #d3d3d3;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/ColorPalette.css.commented.css b/includes/js/dijit/themes/nihilo/ColorPalette.css.commented.css
new file mode 100644
index 0000000..328bc84
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/ColorPalette.css.commented.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #d3d3d3;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/Common.css b/includes/js/dijit/themes/nihilo/Common.css
new file mode 100644
index 0000000..947afa3
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Common.css
@@ -0,0 +1,29 @@
+
+.nihilo .dijitSliderDisabled *,
+.nihilo .dijitDisabledClickableRegion,
+.nihilo .dijitSpinnerDisabled *,
+.nihilo .dijitButtonDisabled *,
+.nihilo .dijitDropDownButtonDisabled *,
+.nihilo .dijitComboButtonDisabled *,
+.nihilo .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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;}
diff --git a/includes/js/dijit/themes/nihilo/Common.css.commented.css b/includes/js/dijit/themes/nihilo/Common.css.commented.css
new file mode 100644
index 0000000..1044920
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Common.css.commented.css
@@ -0,0 +1,37 @@
+
+/**** Disabled cursor *****/
+.nihilo .dijitSliderDisabled *,
+.nihilo .dijitDisabledClickableRegion, /* a region the user would be able to click on, but it's disabled */
+.nihilo .dijitSpinnerDisabled *,
+.nihilo .dijitButtonDisabled *,
+.nihilo .dijitDropDownButtonDisabled *,
+.nihilo .dijitComboButtonDisabled *,
+.nihilo .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+
+
+/* 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; }
+.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;}
diff --git a/includes/js/dijit/themes/nihilo/Dialog.css b/includes/js/dijit/themes/nihilo/Dialog.css
new file mode 100644
index 0000000..1f29d03
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Dialog.css
@@ -0,0 +1,138 @@
+
+.nihilo .dijitDialog {
+ background: #eee;
+ border: 1px solid #d3d3d3;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.nihilo .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+.nihilo .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #d3d3d3;
+ padding:10px;
+}
+.nihilo .dijitDialogTitleBar {
+
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.nihilo .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.nihilo .dijitDialogCloseIcon {
+
+ background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .nihilo .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+.nihilo .dijitDialogContent {
+
+ padding: 8px;
+}
+.nihilo .dijitTooltip,
+.nihilo .dijitTooltipDialog {
+
+ opacity: 0.95;
+ 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_ie6 .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_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -5px;
+}
+.nihilo .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.nihilo .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+.nihilo .dijitTooltipRight {
+ padding-left: 10px;
+}
+.nihilo .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
diff --git a/includes/js/dijit/themes/nihilo/Dialog.css.commented.css b/includes/js/dijit/themes/nihilo/Dialog.css.commented.css
new file mode 100644
index 0000000..91b1c23
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Dialog.css.commented.css
@@ -0,0 +1,175 @@
+
+/* Dialog */
+
+.nihilo .dijitDialog {
+ background: #eee;
+ border: 1px solid #d3d3d3;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+
+.nihilo .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+
+.nihilo .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #d3d3d3; /* #cddde9; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+ padding:10px;
+
+}
+
+.nihilo .dijitDialogTitleBar {
+ /* outer container for the titlebar of the dialog */
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+ /* border: 1px solid #bfbfbf; */
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+}
+
+.nihilo .dijitDialogTitle {
+ /* typography and styling of the dialog title */
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+
+.nihilo .dijitDialogCloseIcon {
+ /* the default close icon for the dialog */
+ background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .nihilo .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+
+.nihilo .dijitDialogContent {
+ /* the body of the dialog */
+ padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.nihilo .dijitTooltip,
+.nihilo .dijitTooltipDialog {
+ /* the outermost dom node, holding the connector and container */
+ opacity: 0.95;
+ 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;
+ /*
+ border-radius: 6px;
+ -moz-border-radius: 7px;
+ -webkit-border-radius: 6px;
+ */
+}
+
+.nihilo .dijitTooltipConnector {
+ /* the arrow piece */
+ border:0px;
+ 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 {
+ /* the arrow piece for tooltips below an element */
+ top: 0px;
+ left: 6px;
+ background:url("images/tooltipConnectorUp.png") no-repeat top left;
+ width:17px;
+ height:11px;
+}
+
+.dj_ie6 .nihilo .dijitTooltipBelow .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.nihilo .dijitTooltipAbove .dijitTooltipConnector {
+ /* the arrow piece for tooltips above an element */
+ bottom: 0px;
+ left: 6px;
+ background:url("images/tooltipConnectorDown.png") no-repeat top left;
+ width:17px;
+ height:11px;
+}
+.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -5px;
+}
+
+.nihilo .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.nihilo .dijitTooltipLeft .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.nihilo .dijitTooltipRight {
+ padding-left: 10px;
+}
+.nihilo .dijitTooltipRight .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
+
diff --git a/includes/js/dijit/themes/nihilo/Dialog_rtl.css b/includes/js/dijit/themes/nihilo/Dialog_rtl.css
new file mode 100644
index 0000000..2f29eda
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Dialog_rtl.css
@@ -0,0 +1,21 @@
+
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css
new file mode 100644
index 0000000..74b193a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css
@@ -0,0 +1,29 @@
+/* Dialog */
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+
+/*FIXME: redundant?*/
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+
+
+/* ToolTip */
+
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/Editor.css b/includes/js/dijit/themes/nihilo/Editor.css
new file mode 100644
index 0000000..e6cefe0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Editor.css
@@ -0,0 +1,55 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.nihilo .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+.nihilo .dijitEditorIcon {
+ background-image: url('images/editor.gif');
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.nihilo .dijitEditorIconSep { background-position: 0px; }
+.nihilo .dijitEditorIconBackColor { background-position: -18px; }
+.nihilo .dijitEditorIconBold { background-position: -36px; }
+.nihilo .dijitEditorIconCancel { background-position: -54px; }
+.nihilo .dijitEditorIconCopy { background-position: -72px; }
+.nihilo .dijitEditorIconCreateLink { background-position: -90px; }
+.nihilo .dijitEditorIconCut { background-position: -108px; }
+.nihilo .dijitEditorIconDelete { background-position: -126px; }
+.nihilo .dijitEditorIconForeColor { background-position: -144px; }
+.nihilo .dijitEditorIconHiliteColor { background-position: -162px; }
+.nihilo .dijitEditorIconIndent { background-position: -180px; }
+.nihilo .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.nihilo .dijitEditorIconInsertImage { background-position: -216px; }
+.nihilo .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.nihilo .dijitEditorIconInsertTable { background-position: -252px; }
+.nihilo .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.nihilo .dijitEditorIconItalic { background-position: -288px; }
+.nihilo .dijitEditorIconJustifyCenter { background-position: -306px; }
+.nihilo .dijitEditorIconJustifyFull { background-position: -324px; }
+.nihilo .dijitEditorIconJustifyLeft { background-position: -342px; }
+.nihilo .dijitEditorIconJustifyRight { background-position: -360px; }
+.nihilo .dijitEditorIconLeftToRight { background-position: -378px; }
+.nihilo .dijitEditorIconListBulletIndent { background-position: -396px; }
+.nihilo .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.nihilo .dijitEditorIconListNumIndent { background-position: -432px; }
+.nihilo .dijitEditorIconListNumOutdent { background-position: -450px; }
+.nihilo .dijitEditorIconOutdent { background-position: -468px; }
+.nihilo .dijitEditorIconPaste { background-position: -486px; }
+.nihilo .dijitEditorIconRedo { background-position: -504px; }
+.nihilo .dijitEditorIconRemoveFormat { background-position: -522px; }
+.nihilo .dijitEditorIconRightToLeft { background-position: -540px; }
+.nihilo .dijitEditorIconSave { background-position: -558px; }
+.nihilo .dijitEditorIconSpace { background-position: -576px; }
+.nihilo .dijitEditorIconStrikethrough { background-position: -594px; }
+.nihilo .dijitEditorIconSubscript { background-position: -612px; }
+.nihilo .dijitEditorIconSuperscript { background-position: -630px; }
+.nihilo .dijitEditorIconUnderline { background-position: -648px; }
+.nihilo .dijitEditorIconUndo { background-position: -666px; }
+.nihilo .dijitEditorIconWikiword { background-position: -684px; }
+.nihilo .dijitEditorIconToggleDir { background-position: -540px; }
diff --git a/includes/js/dijit/themes/nihilo/Editor.css.commented.css b/includes/js/dijit/themes/nihilo/Editor.css.commented.css
new file mode 100644
index 0000000..7498ccf
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Editor.css.commented.css
@@ -0,0 +1,60 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+ /* top:0; */
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+
+.nihilo .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+
+/**** ICONS *****/
+
+.nihilo .dijitEditorIcon {
+ background-image: url('images/editor.gif'); /* editor icons sprite image */
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.nihilo .dijitEditorIconSep { background-position: 0px; }
+.nihilo .dijitEditorIconBackColor { background-position: -18px; }
+.nihilo .dijitEditorIconBold { background-position: -36px; }
+.nihilo .dijitEditorIconCancel { background-position: -54px; }
+.nihilo .dijitEditorIconCopy { background-position: -72px; }
+.nihilo .dijitEditorIconCreateLink { background-position: -90px; }
+.nihilo .dijitEditorIconCut { background-position: -108px; }
+.nihilo .dijitEditorIconDelete { background-position: -126px; }
+.nihilo .dijitEditorIconForeColor { background-position: -144px; }
+.nihilo .dijitEditorIconHiliteColor { background-position: -162px; }
+.nihilo .dijitEditorIconIndent { background-position: -180px; }
+.nihilo .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.nihilo .dijitEditorIconInsertImage { background-position: -216px; }
+.nihilo .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.nihilo .dijitEditorIconInsertTable { background-position: -252px; }
+.nihilo .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.nihilo .dijitEditorIconItalic { background-position: -288px; }
+.nihilo .dijitEditorIconJustifyCenter { background-position: -306px; }
+.nihilo .dijitEditorIconJustifyFull { background-position: -324px; }
+.nihilo .dijitEditorIconJustifyLeft { background-position: -342px; }
+.nihilo .dijitEditorIconJustifyRight { background-position: -360px; }
+.nihilo .dijitEditorIconLeftToRight { background-position: -378px; }
+.nihilo .dijitEditorIconListBulletIndent { background-position: -396px; }
+.nihilo .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.nihilo .dijitEditorIconListNumIndent { background-position: -432px; }
+.nihilo .dijitEditorIconListNumOutdent { background-position: -450px; }
+.nihilo .dijitEditorIconOutdent { background-position: -468px; }
+.nihilo .dijitEditorIconPaste { background-position: -486px; }
+.nihilo .dijitEditorIconRedo { background-position: -504px; }
+.nihilo .dijitEditorIconRemoveFormat { background-position: -522px; }
+.nihilo .dijitEditorIconRightToLeft { background-position: -540px; }
+.nihilo .dijitEditorIconSave { background-position: -558px; }
+.nihilo .dijitEditorIconSpace { background-position: -576px; }
+.nihilo .dijitEditorIconStrikethrough { background-position: -594px; }
+.nihilo .dijitEditorIconSubscript { background-position: -612px; }
+.nihilo .dijitEditorIconSuperscript { background-position: -630px; }
+.nihilo .dijitEditorIconUnderline { background-position: -648px; }
+.nihilo .dijitEditorIconUndo { background-position: -666px; }
+.nihilo .dijitEditorIconWikiword { background-position: -684px; }
+.nihilo .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/includes/js/dijit/themes/nihilo/Editor_rtl.css b/includes/js/dijit/themes/nihilo/Editor_rtl.css
new file mode 100644
index 0000000..2e936ec
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Editor_rtl.css
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif');
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/nihilo/Editor_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/Editor_rtl.css.commented.css
new file mode 100644
index 0000000..e834b52
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Editor_rtl.css.commented.css
@@ -0,0 +1,11 @@
+/* Editor */
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif'); /* editor icons sprite image */
+}
+
+
+/* Toolbar */
+
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/nihilo/Menu.css b/includes/js/dijit/themes/nihilo/Menu.css
new file mode 100644
index 0000000..3f3ad14
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Menu.css
@@ -0,0 +1,54 @@
+
+.nihilo .dijitMenu {
+ border: 1px solid #d3d3d3;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+.nihilo .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
+ font-style: italic;
+}
+.nihilo .dijitMenuItem TD {
+ padding:1px;
+}
+.nihilo .dijitMenuItemHover {
+ background-color: #ffe284;
+ color: #243C5F;
+}
+.nihilo .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+
+}
+.nihilo .dijitMenuExpand {
+ display:none;
+}
+.nihilo .dijitMenuExpandEnabled {
+
+ width:15px;
+ height:15px;
+ background:url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .nihilo .dijitMenuExpandEnabled {
+ background-image:url('images/spriteRoundedIconsSmall.gif');
+}
+.nihilo .dijitMenuExpandInner {
+ display:none;
+}
+.nihilo .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+.nihilo .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff;
+}
+.nihilo .dijitMenuSeparatorBottom {
+ border-top: 1px solid #d3d3d3;
+}
diff --git a/includes/js/dijit/themes/nihilo/Menu.css.commented.css b/includes/js/dijit/themes/nihilo/Menu.css.commented.css
new file mode 100644
index 0000000..fddc2f9
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Menu.css.commented.css
@@ -0,0 +1,63 @@
+
+/* Menu */
+.nihilo .dijitMenu {
+ border: 1px solid #d3d3d3;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+
+.nihilo .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
+ font-style: italic;
+}
+.nihilo .dijitMenuItem TD {
+ padding:1px;
+}
+
+.nihilo .dijitMenuItemHover {
+ background-color: #ffe284; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
+ color: #243C5F;
+}
+
+.nihilo .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+ /* padding-right: 3px; */
+}
+
+.nihilo .dijitMenuExpand {
+ display:none;
+}
+.nihilo .dijitMenuExpandEnabled {
+ /* margin-top:4px; */
+ width:15px;
+ height:15px;
+ background:url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .nihilo .dijitMenuExpandEnabled {
+ background-image:url('images/spriteRoundedIconsSmall.gif');
+}
+.nihilo .dijitMenuExpandInner {
+ display:none;
+}
+
+.nihilo .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+
+/* separator can be two pixels -- set border of either one to 0px to have only one */
+.nihilo .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff; /*97adcb; */
+}
+
+.nihilo .dijitMenuSeparatorBottom {
+ border-top: 1px solid #d3d3d3;
+}
diff --git a/includes/js/dijit/themes/nihilo/Menu_rtl.css b/includes/js/dijit/themes/nihilo/Menu_rtl.css
new file mode 100644
index 0000000..8b751fd
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Menu_rtl.css
@@ -0,0 +1,11 @@
+
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.png');
+}
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/nihilo/Menu_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/Menu_rtl.css.commented.css
new file mode 100644
index 0000000..ac66852
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Menu_rtl.css.commented.css
@@ -0,0 +1,15 @@
+
+/* Menu */
+
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.png');
+}
+
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/nihilo/ProgressBar.css b/includes/js/dijit/themes/nihilo/ProgressBar.css
new file mode 100644
index 0000000..7713aeb
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/ProgressBar.css
@@ -0,0 +1,24 @@
+
+.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;
+}
diff --git a/includes/js/dijit/themes/nihilo/ProgressBar.css.commented.css b/includes/js/dijit/themes/nihilo/ProgressBar.css.commented.css
new file mode 100644
index 0000000..7089a14
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/ProgressBar.css.commented.css
@@ -0,0 +1,33 @@
+
+/****
+ dijit.ProgressBar
+ ****/
+
+.nihilo .dijitProgressBar {
+ margin:2px 0px 2px 0px;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/nihilo/TitlePane.css b/includes/js/dijit/themes/nihilo/TitlePane.css
new file mode 100644
index 0000000..a48d0c5
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/TitlePane.css
@@ -0,0 +1,64 @@
+
+
+.nihilo .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.nihilo .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+.nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.nihilo .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.nihilo .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.nihilo .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.nihilo .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d;
+}
+.nihilo .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .nihilo .dijitTitlePaneContentOuter,
+.dj_ie6 .nihilo .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.nihilo .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/TitlePane.css.commented.css b/includes/js/dijit/themes/nihilo/TitlePane.css.commented.css
new file mode 100644
index 0000000..476c581
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/TitlePane.css.commented.css
@@ -0,0 +1,77 @@
+/**
+ * dijit.layout.TitlePane
+ *
+ */
+
+.nihilo .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.nihilo .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+
+.nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+
+
+.nihilo .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+
+.nihilo .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+
+.nihilo .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+
+.nihilo .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.nihilo .dijitTitlePaneContentInner {
+ padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .nihilo .dijitTitlePaneContentOuter,
+.dj_ie6 .nihilo .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.nihilo .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/TitlePane_rtl.css b/includes/js/dijit/themes/nihilo/TitlePane_rtl.css
new file mode 100644
index 0000000..6a3b2cd
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/TitlePane_rtl.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css
new file mode 100644
index 0000000..6a3b2cd
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/Toolbar.css b/includes/js/dijit/themes/nihilo/Toolbar.css
new file mode 100644
index 0000000..c07287c
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Toolbar.css
@@ -0,0 +1,83 @@
+.nihilo .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+.nihilo .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.nihilo .dijitToolbar .dijitButton,
+.nihilo .dijitToolbar .dijitToggleButton,
+.nihilo .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.nihilo .dijitToolbar .dijitButtonChecked,
+.nihilo .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.nihilo .dijitToolbar .dijitButtonCheckedHover,
+.nihilo .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.nihilo .dijitToolbar .dijitButtonHover,
+.nihilo .dijitToolbar .dijitToggleButtonHover,
+.nihilo .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #f7c95c;
+ background-color:#ffe284;
+}
+.nihilo .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .nihilo.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/Toolbar.css.commented.css b/includes/js/dijit/themes/nihilo/Toolbar.css.commented.css
new file mode 100644
index 0000000..7143e55
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Toolbar.css.commented.css
@@ -0,0 +1,95 @@
+.nihilo .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+
+.nihilo .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+
+.nihilo .dijitToolbar .dijitButton,
+.nihilo .dijitToolbar .dijitToggleButton,
+.nihilo .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+
+.nihilo .dijitToolbar .dijitButtonChecked,
+.nihilo .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.nihilo .dijitToolbar .dijitButtonCheckedHover,
+.nihilo .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.nihilo .dijitToolbar .dijitButtonHover,
+.nihilo .dijitToolbar .dijitToggleButtonHover,
+.nihilo .dijitToolbar .dijitDropDownButtonHover {
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
+ border: 1px solid #f7c95c;
+ background-color:#ffe284;
+}
+
+.nihilo .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .nihilo.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+/* IE6 specific rules */
+.dj_ie6 .nihilo .dijitToolbar .dijitButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButton {
+ /* workaround no transparent border support in IE6 */
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/Tree.css b/includes/js/dijit/themes/nihilo/Tree.css
new file mode 100644
index 0000000..7834018
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Tree.css
@@ -0,0 +1,68 @@
+
+.nihilo .dijitTreeNode {
+ background : url('images/treeI.gif') no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1;
+}
+.nihilo .dijitTreeIsLast {
+ background: url('images/treeI_half.gif') no-repeat;
+}
+.nihilo .dijitTreeLabel {
+ font-weight: normal;
+ margin-left: 3px;
+}
+.nihilo .dijitTreeIsRoot {
+ margin-left: 0;
+ background-image: none;
+}
+.nihilo .dijitTreeExpando {
+ width: 18px;
+ height: 18px;
+}
+.nihilo .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.nihilo .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.nihilo .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.nihilo .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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;
+}
diff --git a/includes/js/dijit/themes/nihilo/Tree.css.commented.css b/includes/js/dijit/themes/nihilo/Tree.css.commented.css
new file mode 100644
index 0000000..72edfd2
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Tree.css.commented.css
@@ -0,0 +1,90 @@
+
+/* Tree */
+
+.nihilo .dijitTreeNode {
+ background : url('images/treeI.gif') no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1; /* MOW: what the heck is this doing in here? */
+}
+
+/* left vertical line (grid) for all nodes */
+.nihilo .dijitTreeIsLast {
+ background: url('images/treeI_half.gif') no-repeat;
+}
+
+.nihilo .dijitTreeLabel {
+ font-weight: normal;
+ margin-left: 3px;
+}
+
+.nihilo .dijitTreeIsRoot {
+ margin-left: 0;
+ background-image: none;
+}
+
+.nihilo .dijitTreeExpando {
+ width: 18px;
+ height: 18px;
+}
+
+.nihilo .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+
+
+.nihilo .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+
+/* same style as IE selection */
+.nihilo .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+/* don't use :focus due to opera and IE's lack of support on div's */
+.nihilo .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/nihilo/Tree_rtl.css b/includes/js/dijit/themes/nihilo/Tree_rtl.css
new file mode 100644
index 0000000..5734d9f
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Tree_rtl.css
@@ -0,0 +1,30 @@
+
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/treeI_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/treeI_half_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/spriteTree_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url('images/spriteTree_rtl.gif') no-repeat -36px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/Tree_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/Tree_rtl.css.commented.css
new file mode 100644
index 0000000..1fa4e00
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/Tree_rtl.css.commented.css
@@ -0,0 +1,38 @@
+
+
+/* Tree */
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/treeI_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/treeI_half_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/spriteTree_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url('images/spriteTree_rtl.gif') no-repeat -36px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Button.css b/includes/js/dijit/themes/nihilo/form/Button.css
new file mode 100644
index 0000000..76bec06
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Button.css
@@ -0,0 +1,90 @@
+
+.nihilo .dijitButtonNode {
+
+
+ border:1px solid #dedede;
+ border-bottom:1px solid #dedede;
+ border-right:1px solid #dedede;
+ padding: 0.2em;
+ background:#fff url("../images/buttonEnabled.png") repeat-x top left;
+}
+.dj_ie .nihilo .dijitButtonNode {
+ zoom: 1;
+}
+.nihilo .dijitButtonText {
+ padding: 0 0.3em;
+}
+.nihilo .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.nihilo .dijitArrowButton {
+ color: #111;
+}
+.nihilo .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .nihilo .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.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_ie .nihilo .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.nihilo .dijitButtonHover .dijitButtonNode,
+.nihilo .dijitToggleButtonHover .dijitButtonNode,
+.nihilo .dijitDropDownButtonHover .dijitButtonNode,
+.nihilo .dijitComboButtonHover .dijitButtonContents,
+.nihilo .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.nihilo .dijitComboBoxHover .dijitDownArrowButton,
+.nihilo .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ color:#000;
+ background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
+}
+.nihilo .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitButtonActive .dijitButtonNode,
+.nihilo .dijitToggleButtonActive .dijitButtonNode,
+.nihilo .dijitDropDownButtonActive .dijitButtonNode,
+.nihilo .dijitComboButtonActive .dijitButtonContents,
+.nihilo .dijitDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#dedede;
+ background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
+}
+.nihilo .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left top;
+ width: 11px;
+}
+.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat -22px top;
+ width: 11px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Button.css.commented.css b/includes/js/dijit/themes/nihilo/form/Button.css.commented.css
new file mode 100644
index 0000000..4a02447
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Button.css.commented.css
@@ -0,0 +1,109 @@
+
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ *****/
+
+.nihilo .dijitButtonNode {
+ /* enabled state - inner */
+ /* border:1px outset #a0a0a0; */
+ border:1px solid #dedede;
+ border-bottom:1px solid #dedede;
+ border-right:1px solid #dedede;
+ padding: 0.2em;
+ background:#fff url("../images/buttonEnabled.png") repeat-x top left;
+}
+.dj_ie .nihilo .dijitButtonNode {
+ zoom: 1;
+}
+
+.nihilo .dijitButtonText {
+ padding: 0 0.3em;
+}
+
+.nihilo .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+
+.nihilo .dijitArrowButton {
+ color: #111;
+}
+
+.nihilo .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+
+.dj_ff2 .nihilo .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+.nihilo .dijitButtonDisabled .dijitButtonNode,
+.nihilo .dijitToggleButtonDisabled .dijitButtonNode,
+.nihilo .dijitDropDownButtonDisabled .dijitButtonNode,
+.nihilo .dijitComboButtonDisabled .dijitButtonNode,
+.nihilo .dijitComboBoxDisabled,
+.nihilo .dijitSpinnerDisabled,
+.nihilo .dijitSpinnerDisabled .dijitButtonNode {
+ /* disabled state - inner */
+ border-color: #dedede;
+ /*color:#b4b4b4;*/
+ background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
+ opacity: 0.60; /* Safari, Opera and Mozilla */
+}
+.dj_ie .nihilo .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50); /* IE */
+}
+
+.nihilo .dijitButtonHover .dijitButtonNode,
+.nihilo .dijitToggleButtonHover .dijitButtonNode,
+.nihilo .dijitDropDownButtonHover .dijitButtonNode,
+.nihilo .dijitComboButtonHover .dijitButtonContents,
+.nihilo .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.nihilo .dijitComboBoxHover .dijitDownArrowButton,
+.nihilo .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+ /* hover state - inner */
+ /* TODO: change from Hover to Selected so that button is still highlighted while drop down is being used */
+ color:#000;
+ background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
+}
+
+.nihilo .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitButtonActive .dijitButtonNode,
+.nihilo .dijitToggleButtonActive .dijitButtonNode,
+.nihilo .dijitDropDownButtonActive .dijitButtonNode,
+.nihilo .dijitComboButtonActive .dijitButtonContents,
+.nihilo .dijitDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitComboBoxActive .dijitDownArrowButton {
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a toggle button is in a depressed state
+ */
+ border-color:#dedede;
+ background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
+}
+
+
+.nihilo .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left top;
+ width: 11px;
+}
+.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat -22px top;
+ width: 11px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Button_rtl.css b/includes/js/dijit/themes/nihilo/form/Button_rtl.css
new file mode 100644
index 0000000..fd92f00
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Button_rtl.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css
new file mode 100644
index 0000000..fd92f00
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Checkbox.css b/includes/js/dijit/themes/nihilo/form/Checkbox.css
new file mode 100644
index 0000000..8281aca
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Checkbox.css
@@ -0,0 +1,42 @@
+
+.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,
+.nihilo .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.nihilo .dijitCheckBoxCheckedHover,
+ .nihilo .dijitCheckBoxCheckedFocused {
+
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Checkbox.css.commented.css b/includes/js/dijit/themes/nihilo/form/Checkbox.css.commented.css
new file mode 100644
index 0000000..5c07b73
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Checkbox.css.commented.css
@@ -0,0 +1,69 @@
+
+/*
+ * 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 { /* 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 {
+ /* checked */
+ background-position: 0px;
+}
+
+.nihilo .dijitCheckBoxDisabled {
+ /* disabled */
+ background-position: -48px;
+}
+
+.nihilo .dijitCheckBoxCheckedDisabled {
+ /* disabled but checked */
+ background-position: -32px;
+}
+
+.nihilo .dijitCheckBoxHover,
+.nihilo .dijitCheckBoxFocused {
+ /* hovering over an unchecked enabled checkbox */
+ background-position: -80px;
+}
+
+.nihilo .dijitCheckBoxCheckedHover,
+ .nihilo .dijitCheckBoxCheckedFocused {
+ /* hovering over a checked enabled checkbox */
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/ComboBox.css b/includes/js/dijit/themes/nihilo/form/ComboBox.css
new file mode 100644
index 0000000..5de42ab
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/ComboBox.css
@@ -0,0 +1,7 @@
+.nihilo .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left center;
+ width: 11px;
+}
+.nihilo .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
diff --git a/includes/js/dijit/themes/nihilo/form/ComboBox.css.commented.css b/includes/js/dijit/themes/nihilo/form/ComboBox.css.commented.css
new file mode 100644
index 0000000..e997538
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/ComboBox.css.commented.css
@@ -0,0 +1,7 @@
+.nihilo .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left center;
+ width: 11px;
+}
+.nihilo .dijitComboBoxHover .dijitArrowButtonInner {
+ /* TODO: url("images/arrowDownHover.png") but in IE6 it flickers some? */
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Common.css b/includes/js/dijit/themes/nihilo/form/Common.css
new file mode 100644
index 0000000..94042fa
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Common.css
@@ -0,0 +1,61 @@
+
+.nihilo .dijitInputField INPUT,
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner,
+.nihilo .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+.nihilo .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.nihilo .dijitComboBox .dijitButtonNode,
+.nihilo .dijitSpinner .dijitButtonNode {
+
+ border-color: #d3d3d3;
+ border-left: 1px solid #d3d3d3;
+}
+.nihilo .dijitTextBoxFocused,
+.nihilo .dijitComboBoxFocused,
+.nihilo .dijitSpinnerFocused {
+
+ border-color:#b3b3b3;
+}
+.nihilo .dijitComboBoxFocused .dijitButtonNode, .nihilo .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#d3d3d3;
+}
+.nihilo .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#d3d3d3;
+}
+.nihilo .dijitError {
+ border-color:#b3b3b3;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.nihilo .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.nihilo .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url('../images/warning.png') no-repeat center center;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Common.css.commented.css b/includes/js/dijit/themes/nihilo/form/Common.css.commented.css
new file mode 100644
index 0000000..39aa1a6
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Common.css.commented.css
@@ -0,0 +1,82 @@
+
+/****
+ 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 .dijitInputField INPUT,
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner {
+ margin: 0em 0.1em;
+}
+
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner,
+.nihilo .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+
+.nihilo .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.nihilo .dijitComboBox .dijitButtonNode,
+.nihilo .dijitSpinner .dijitButtonNode {
+ /* line between the input area and the drop down button */
+ border-color: #d3d3d3;
+ border-left: 1px solid #d3d3d3;
+}
+
+.nihilo .dijitTextBoxFocused,
+.nihilo .dijitComboBoxFocused,
+.nihilo .dijitSpinnerFocused {
+ /* input field when focused (ie: typing affects it) */
+ border-color:#b3b3b3;
+}
+.nihilo .dijitComboBoxFocused .dijitButtonNode, .nihilo .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#d3d3d3;
+}
+.nihilo .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#d3d3d3;
+}
+
+.nihilo .dijitError {
+ border-color:#b3b3b3;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitError INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#f9f7ba !important;
+}
+
+.nihilo .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitErrorFocused INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#ff6 !important;
+}
+
+/* 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;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Common_rtl.css b/includes/js/dijit/themes/nihilo/form/Common_rtl.css
new file mode 100644
index 0000000..0bced8b
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Common_rtl.css
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css
new file mode 100644
index 0000000..83f79d2
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+ /* line between the input area and the drop down button */
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/RadioButton.css b/includes/js/dijit/themes/nihilo/form/RadioButton.css
new file mode 100644
index 0000000..21d8599
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/RadioButton.css
@@ -0,0 +1,42 @@
+
+.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 .dijitRadioCheckedDisabled {
+
+ background-position: -48px;
+}
+.nihilo .dijitRadioDisabled {
+
+ background-position: -32px;
+}
+.nihilo .dijitRadioHover,
+.nihilo .dijitRadioFocused {
+
+ background-position: -80px;
+}
+.nihilo .dijitRadioCheckedHover,
+.nihilo .dijitRadioCheckedFocused {
+
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/RadioButton.css.commented.css b/includes/js/dijit/themes/nihilo/form/RadioButton.css.commented.css
new file mode 100644
index 0000000..456cd05
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/RadioButton.css.commented.css
@@ -0,0 +1,68 @@
+/*
+ * 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 { /* 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 {
+ /* selected */
+ background-position: 0px;
+}
+
+.nihilo .dijitRadioCheckedDisabled {
+ /* selected but disabled */
+ background-position: -48px;
+}
+
+.nihilo .dijitRadioDisabled {
+ /* unselected and disabled */
+ background-position: -32px;
+}
+
+.nihilo .dijitRadioHover,
+.nihilo .dijitRadioFocused {
+ /* hovering over an unselected enabled radio button */
+ background-position: -80px;
+}
+
+.nihilo .dijitRadioCheckedHover,
+.nihilo .dijitRadioCheckedFocused {
+ /* hovering over a selected enabled radio button */
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Slider.css b/includes/js/dijit/themes/nihilo/form/Slider.css
new file mode 100644
index 0000000..448fb94
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Slider.css
@@ -0,0 +1,112 @@
+
+.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;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.nihilo .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.nihilo .dijitSliderFocused .dijitSliderImageHandleH {
+ background-image:url("../images/preciseSliderThumbFocus.png");
+ #background-image:url("../images/preciseSliderThumbFocus.gif");
+}
+.dj_ie6 .nihilo .dijitSliderImageHandleH {
+ background-image:url("../images/preciseSliderThumb.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;
+ cursor:pointer;
+}
+.nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url("../images/sliderThumbFocus.png");
+}
+.dj_ie6 .nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.nihilo .dijitSliderIncrementIconH {
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+}
+.nihilo .dijitSliderDecrementIconH,
+.nihilo .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.nihilo .dijitSliderDecrementIconH { background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top; }
+.nihilo .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.nihilo .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .nihilo .dijitSliderDisabled,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Slider.css.commented.css b/includes/js/dijit/themes/nihilo/form/Slider.css.commented.css
new file mode 100644
index 0000000..8b3ebb0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Slider.css.commented.css
@@ -0,0 +1,136 @@
+
+/****
+ 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;
+}
+
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+
+.nihilo .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.nihilo .dijitSliderFocused .dijitSliderImageHandleH {
+ background-image:url("../images/preciseSliderThumbFocus.png");
+ #background-image:url("../images/preciseSliderThumbFocus.gif");
+}
+
+.dj_ie6 .nihilo .dijitSliderImageHandleH {
+ background-image:url("../images/preciseSliderThumb.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;
+ cursor:pointer;
+}
+
+.nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url("../images/sliderThumbFocus.png");
+}
+.dj_ie6 .nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.nihilo .dijitSliderIncrementIconH {
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+}
+
+.nihilo .dijitSliderDecrementIconH,
+.nihilo .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.nihilo .dijitSliderDecrementIconH { background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top; }
+
+.nihilo .dijitSliderButtonInner {
+ visibility:hidden;
+}
+
+.nihilo .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+
+.dj_ie6 .nihilo .dijitSliderDisabled,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Slider_rtl.css b/includes/js/dijit/themes/nihilo/form/Slider_rtl.css
new file mode 100644
index 0000000..febfd0a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Slider_rtl.css
@@ -0,0 +1,27 @@
+
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css
new file mode 100644
index 0000000..930be3d
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css
@@ -0,0 +1,34 @@
+
+/* Slider */
+
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Textarea.css b/includes/js/dijit/themes/nihilo/form/Textarea.css
new file mode 100644
index 0000000..c6f4700
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Textarea.css
@@ -0,0 +1,11 @@
+.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 #c4c4c4;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/Textarea.css.commented.css b/includes/js/dijit/themes/nihilo/form/Textarea.css.commented.css
new file mode 100644
index 0000000..2d26487
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/Textarea.css.commented.css
@@ -0,0 +1,15 @@
+.nihilo .dijitTextBox {
+ margin: 0em 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 #c4c4c4;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/nihilo/form/TimeTextBox.css b/includes/js/dijit/themes/nihilo/form/TimeTextBox.css
new file mode 100644
index 0000000..d450925
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/TimeTextBox.css
@@ -0,0 +1 @@
+@CHARSET "UTF-8";
diff --git a/includes/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css b/includes/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css
new file mode 100644
index 0000000..d450925
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css
@@ -0,0 +1 @@
+@CHARSET "UTF-8";
diff --git a/includes/js/dijit/themes/nihilo/images/accordionItemActive.png b/includes/js/dijit/themes/nihilo/images/accordionItemActive.png
new file mode 100644
index 0000000..58f3cf9
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/accordionItemActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/buttonActive.png b/includes/js/dijit/themes/nihilo/images/buttonActive.png
new file mode 100644
index 0000000..e2f2fda
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/buttonActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/buttonDisabled.png b/includes/js/dijit/themes/nihilo/images/buttonDisabled.png
new file mode 100644
index 0000000..b76af42
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/buttonDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/buttonEnabled.png b/includes/js/dijit/themes/nihilo/images/buttonEnabled.png
new file mode 100644
index 0000000..d4fd306
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/buttonEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/buttonHover.png b/includes/js/dijit/themes/nihilo/images/buttonHover.png
new file mode 100644
index 0000000..1af7e83
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/buttonHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/dndCopy.png b/includes/js/dijit/themes/nihilo/images/dndCopy.png
new file mode 100644
index 0000000..baecd7c
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/dndCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/dndMove.png b/includes/js/dijit/themes/nihilo/images/dndMove.png
new file mode 100644
index 0000000..07f878c
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/dndMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/dndNoCopy.png b/includes/js/dijit/themes/nihilo/images/dndNoCopy.png
new file mode 100644
index 0000000..9bf9c33
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/dndNoCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/dndNoMove.png b/includes/js/dijit/themes/nihilo/images/dndNoMove.png
new file mode 100644
index 0000000..cb8bd8b
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/dndNoMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/editor.gif b/includes/js/dijit/themes/nihilo/images/editor.gif
new file mode 100644
index 0000000..1c96329
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/editor.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/editor_rtl.gif b/includes/js/dijit/themes/nihilo/images/editor_rtl.gif
new file mode 100644
index 0000000..ef04938
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/editor_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/no.gif b/includes/js/dijit/themes/nihilo/images/no.gif
new file mode 100644
index 0000000..9021a14
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/no.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.gif b/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.gif
new file mode 100644
index 0000000..53b33e5
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.png b/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.png
new file mode 100644
index 0000000..045bf35
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/preciseSliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif b/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif
new file mode 100644
index 0000000..8c6f92e
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png b/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png
new file mode 100644
index 0000000..c235849
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/progressBarAnim.gif b/includes/js/dijit/themes/nihilo/images/progressBarAnim.gif
new file mode 100644
index 0000000..543d048
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/progressBarAnim.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/progressBarEmpty.png b/includes/js/dijit/themes/nihilo/images/progressBarEmpty.png
new file mode 100644
index 0000000..c2d3695
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/progressBarEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/progressBarFull.png b/includes/js/dijit/themes/nihilo/images/progressBarFull.png
new file mode 100644
index 0000000..a8f3865
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/progressBarFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderEmpty.png b/includes/js/dijit/themes/nihilo/images/sliderEmpty.png
new file mode 100644
index 0000000..99fbd72
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderEmptyVertical.png b/includes/js/dijit/themes/nihilo/images/sliderEmptyVertical.png
new file mode 100644
index 0000000..2d497e3
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderEmptyVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderFull.png b/includes/js/dijit/themes/nihilo/images/sliderFull.png
new file mode 100644
index 0000000..9adb254
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderFullFocus.png b/includes/js/dijit/themes/nihilo/images/sliderFullFocus.png
new file mode 100644
index 0000000..3d75cae
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderFullFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderFullVertical.png b/includes/js/dijit/themes/nihilo/images/sliderFullVertical.png
new file mode 100644
index 0000000..27e9752
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderFullVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png b/includes/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png
new file mode 100644
index 0000000..cca6184
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderThumb.png b/includes/js/dijit/themes/nihilo/images/sliderThumb.png
new file mode 100644
index 0000000..b6abbd2
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.gif b/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.gif
new file mode 100644
index 0000000..f8d306f
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.png b/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.png
new file mode 100644
index 0000000..73ee705
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/sliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png b/includes/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png
new file mode 100644
index 0000000..e7bc204
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/splitContainerSizerH.png b/includes/js/dijit/themes/nihilo/images/splitContainerSizerH.png
new file mode 100644
index 0000000..5f5b0e9
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/splitContainerSizerH.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png b/includes/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png
new file mode 100644
index 0000000..410a0a7
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/splitContainerSizerV.png b/includes/js/dijit/themes/nihilo/images/splitContainerSizerV.png
new file mode 100644
index 0000000..064bc18
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/splitContainerSizerV.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteArrows.gif b/includes/js/dijit/themes/nihilo/images/spriteArrows.gif
new file mode 100644
index 0000000..fc81207
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteArrows.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteArrows.png b/includes/js/dijit/themes/nihilo/images/spriteArrows.png
new file mode 100644
index 0000000..73aa700
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteArrows.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteCheckbox.gif b/includes/js/dijit/themes/nihilo/images/spriteCheckbox.gif
new file mode 100644
index 0000000..d2c4ebf
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteCheckbox.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteCheckbox.png b/includes/js/dijit/themes/nihilo/images/spriteCheckbox.png
new file mode 100644
index 0000000..e992330
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteCheckbox.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteDivIcons.gif b/includes/js/dijit/themes/nihilo/images/spriteDivIcons.gif
new file mode 100644
index 0000000..00ad23a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteDivIcons.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteDivIcons.png b/includes/js/dijit/themes/nihilo/images/spriteDivIcons.png
new file mode 100644
index 0000000..413098a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteDivIcons.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteRadio.gif b/includes/js/dijit/themes/nihilo/images/spriteRadio.gif
new file mode 100644
index 0000000..8dd6e57
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteRadio.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteRadio.png b/includes/js/dijit/themes/nihilo/images/spriteRadio.png
new file mode 100644
index 0000000..14c1080
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteRadio.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif b/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif
new file mode 100644
index 0000000..251389a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png b/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png
new file mode 100644
index 0000000..e81ba07
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteTree.gif b/includes/js/dijit/themes/nihilo/images/spriteTree.gif
new file mode 100644
index 0000000..e546e28
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteTree.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteTree.png b/includes/js/dijit/themes/nihilo/images/spriteTree.png
new file mode 100644
index 0000000..33ae07b
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteTree.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.gif b/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.gif
new file mode 100644
index 0000000..bbcc64b
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.png b/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.png
new file mode 100644
index 0000000..b06afdb
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/spriteTree_rtl.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomActiveC.gif b/includes/js/dijit/themes/nihilo/images/tabBottomActiveC.gif
new file mode 100644
index 0000000..84bffde
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomActiveC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif b/includes/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
new file mode 100644
index 0000000..6803db4
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif b/includes/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif
new file mode 100644
index 0000000..9ef9ab0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif b/includes/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
new file mode 100644
index 0000000..b6b08ce
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomHoverC.gif b/includes/js/dijit/themes/nihilo/images/tabBottomHoverC.gif
new file mode 100644
index 0000000..0f533b5
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomHoverC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif b/includes/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
new file mode 100644
index 0000000..010b08a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabContainerSprite.gif b/includes/js/dijit/themes/nihilo/images/tabContainerSprite.gif
new file mode 100644
index 0000000..92044a7
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabContainerSprite.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabLeftChecked.gif b/includes/js/dijit/themes/nihilo/images/tabLeftChecked.gif
new file mode 100644
index 0000000..d59fd4a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabLeftChecked.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabRightChecked.gif b/includes/js/dijit/themes/nihilo/images/tabRightChecked.gif
new file mode 100644
index 0000000..d32f44e
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabRightChecked.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabStripe.gif b/includes/js/dijit/themes/nihilo/images/tabStripe.gif
new file mode 100644
index 0000000..a934675
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabStripe.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabStripeBottom.gif b/includes/js/dijit/themes/nihilo/images/tabStripeBottom.gif
new file mode 100644
index 0000000..64c3376
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabStripeBottom.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabStripeLeft.gif b/includes/js/dijit/themes/nihilo/images/tabStripeLeft.gif
new file mode 100644
index 0000000..d607a45
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabStripeLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tabStripeRight.gif b/includes/js/dijit/themes/nihilo/images/tabStripeRight.gif
new file mode 100644
index 0000000..9778ced
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tabStripeRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/titleBar.png b/includes/js/dijit/themes/nihilo/images/titleBar.png
new file mode 100644
index 0000000..48f3a2f
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/titleBar.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/titleBarActive.png b/includes/js/dijit/themes/nihilo/images/titleBarActive.png
new file mode 100644
index 0000000..58f3cf9
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/titleBarActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif b/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif
new file mode 100644
index 0000000..9c38495
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.png b/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.png
new file mode 100644
index 0000000..d75af71
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif b/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif
new file mode 100644
index 0000000..fc947e0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png b/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png
new file mode 100644
index 0000000..f3de66a
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif b/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif
new file mode 100644
index 0000000..b0e8097
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.png b/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.png
new file mode 100644
index 0000000..ed6efc4
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif b/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif
new file mode 100644
index 0000000..54bcf65
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.png b/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.png
new file mode 100644
index 0000000..7f7a5d8
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/treeExpand_loading.gif b/includes/js/dijit/themes/nihilo/images/treeExpand_loading.gif
new file mode 100644
index 0000000..db9ddd0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/treeExpand_loading.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/treeI.gif b/includes/js/dijit/themes/nihilo/images/treeI.gif
new file mode 100644
index 0000000..6f669e2
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/treeI.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/treeI_half.gif b/includes/js/dijit/themes/nihilo/images/treeI_half.gif
new file mode 100644
index 0000000..e5fd015
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/treeI_half.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/treeI_half_rtl.gif b/includes/js/dijit/themes/nihilo/images/treeI_half_rtl.gif
new file mode 100644
index 0000000..44ad021
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/treeI_half_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/treeI_rtl.gif b/includes/js/dijit/themes/nihilo/images/treeI_rtl.gif
new file mode 100644
index 0000000..0d32a2f
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/treeI_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/validationInputBg.gif b/includes/js/dijit/themes/nihilo/images/validationInputBg.gif
new file mode 100644
index 0000000..c28475c
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/validationInputBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/validationInputBg.png b/includes/js/dijit/themes/nihilo/images/validationInputBg.png
new file mode 100644
index 0000000..f3039f9
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/validationInputBg.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/images/warning.png b/includes/js/dijit/themes/nihilo/images/warning.png
new file mode 100644
index 0000000..c52f83d
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/images/warning.png
Binary files differ
diff --git a/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css b/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css
new file mode 100644
index 0000000..2a96e6e
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css
@@ -0,0 +1,35 @@
+
+.nihilo .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.nihilo .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x top left;
+ border-top: 1px solid #dedede;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+.nihilo .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+.nihilo .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+.nihilo .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -15px top;
+ margin-top:-1px;
+}
+.nihilo .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css b/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css
new file mode 100644
index 0000000..7242752
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css
@@ -0,0 +1,44 @@
+/**
+ * dijit.layout.Accordioncontainer
+ *
+ */
+
+.nihilo .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+
+.nihilo .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x top left;
+ border-top: 1px solid #dedede;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+
+.nihilo .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+
+.nihilo .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+
+.nihilo .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -15px top;
+ margin-top:-1px;
+}
+
+.nihilo .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css b/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
new file mode 100644
index 0000000..4ceda54
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css
new file mode 100644
index 0000000..4ceda54
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/BorderContainer.css b/includes/js/dijit/themes/nihilo/layout/BorderContainer.css
new file mode 100644
index 0000000..6b3ee0d
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/BorderContainer.css
@@ -0,0 +1,27 @@
+
+.nihilo .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.nihilo .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.nihilo .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.nihilo .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css b/includes/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css
new file mode 100644
index 0000000..e95a534
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css
@@ -0,0 +1,34 @@
+/**
+ * dijit.layout.BorderContainer
+ *
+ */
+
+.nihilo .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+
+.nihilo .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+
+.nihilo .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+
+.nihilo .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/SplitContainer.css b/includes/js/dijit/themes/nihilo/layout/SplitContainer.css
new file mode 100644
index 0000000..6d6d715
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/SplitContainer.css
@@ -0,0 +1,27 @@
+
+.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;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css b/includes/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css
new file mode 100644
index 0000000..7099289
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css
@@ -0,0 +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;
+ 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;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/TabContainer.css b/includes/js/dijit/themes/nihilo/layout/TabContainer.css
new file mode 100644
index 0000000..03d5af5
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/TabContainer.css
@@ -0,0 +1,277 @@
+
+
+.nihilo .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #ccc;
+}
+.nihilo .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: -1px;
+}
+.nihilo dijitTabChecked {
+ margin-bottom: -2px;
+}
+.nihilo .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
+}
+.nihilo .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+.nihilo .dijitTabHover,
+.nihilo .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+}
+.nihilo .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
+ border: none;
+}
+.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+.nihilo .dijitTabChecked,
+.nihilo .dijitTabCloseButtonChecked
+{
+
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+}
+.nihilo .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
+ border: none;
+}
+.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+.nihilo .dijitTabLabels-top {
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ padding-top: 2px;
+ padding-left: 3px;
+ background: #fafafa url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-bottom: 4px;
+}
+.nihilo .dijitAlignLeft .dijitTab,
+.nihilo .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.nihilo .dijitAlignTop .dijitTabChecked,
+.nihilo .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+
+}
+.nihilo .dijitAlignLeft .dijitTabChecked,
+.nihilo .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.nihilo .dijitAlignRight .dijitTabChecked,
+.nihilo .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.nihilo .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ background: #fafafa url("../images/tabStripeBottom.gif") repeat-x left top;
+ padding-top: 3px;
+}
+.nihilo .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+.nihilo .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabHover,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+.nihilo .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+.nihilo .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+.nihilo .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url("../images/tabLeftChecked.gif") no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede !important;
+}
+.nihilo .dijitAlignLeft .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url("../images/tabStripeLeft.gif") repeat-y right top;
+ padding-right: 3px;
+}
+.nihilo .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.nihilo .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url("../images/tabStripeRight.gif") repeat-y left top;
+ padding-left: 3px;
+}
+.nihilo .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+.nihilo .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+.nihilo .dijitAlignRight .dijitTabChecked {
+ background: url("../images/tabRightChecked.gif") no-repeat left top !important;
+}
+.nihilo .dijitAlignRight .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
+}
+.nihilo .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.nihilo .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede !important;
+}
+.nihilo .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitTab .dijitClosable {
+ position: relative;
+ padding: 0;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+.nihilo .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+.nihilo .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
+}
+.dj_ie6 .nihilo .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
+}
+.nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px -15px !important;
+}
+.dj_ie6 .nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px !important;
+}
+.dj_ie6 .nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.nihilo .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css b/includes/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css
new file mode 100644
index 0000000..8b404e0
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css
@@ -0,0 +1,369 @@
+/**
+ * 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) */
+
+.nihilo .dijitTabPaneWrapper { /* Container for tab content */
+ /*
+ overflow: hidden;
+ */
+ background:#fff;
+ border:1px solid #ccc;
+}
+
+.nihilo .dijitTab {
+ line-height:normal;
+ margin-right:3px; /* space between one tab and the next in top/bottom mode */
+ padding:0px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: -1px;
+}
+
+.nihilo dijitTabChecked {
+ margin-bottom: -2px;
+}
+
+.nihilo .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
+}
+
+.nihilo .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+
+.nihilo .dijitTabHover,
+.nihilo .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+}
+
+.nihilo .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
+ border: none;
+}
+
+.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+
+.nihilo .dijitTabChecked,
+.nihilo .dijitTabCloseButtonChecked
+{
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+}
+
+.nihilo .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
+ border: none;
+}
+
+.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+
+/* top specific classes */
+
+.nihilo .dijitTabLabels-top {
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ padding-top: 2px;
+ padding-left: 3px;
+ background: #fafafa url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-bottom: 4px;
+}
+/*
+.nihilo .dijitAlignTop .dijitTabStripe {
+ background: url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-left: 2px;
+ padding-top: 0px;
+ height: 4px;
+ clear: both;
+ font-size: 1px;
+ margin-left: -3px;
+}
+*/
+
+.nihilo .dijitAlignLeft .dijitTab,
+.nihilo .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px; /* space between one tab and the next in left/right mode */
+}
+
+/* make the active tab white on the side next to the content pane */
+.nihilo .dijitAlignTop .dijitTabChecked,
+.nihilo .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+ /*-moz-border-radius:2px 2px 0px 0px; eliminate some border detritrus on moz */
+}
+
+.nihilo .dijitAlignLeft .dijitTabChecked,
+.nihilo .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+
+.nihilo .dijitAlignRight .dijitTabChecked,
+.nihilo .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+
+/* bottom specific classes */
+
+.nihilo .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ background: #fafafa url("../images/tabStripeBottom.gif") repeat-x left top;
+ padding-top: 3px;
+}
+/*
+.nihilo .dijitAlignBottom .dijitTabStripe {
+ background: url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-left: 2px;
+ padding-top: 0px;
+ height: 4px;
+ clear: both;
+ font-size: 1px;
+ margin-left: -3px;
+}
+*/
+.nihilo .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px; /* space between one tab and the next in top/bottom mode */
+ padding:0px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+
+.nihilo .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+
+.nihilo .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
+}
+
+.nihilo .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.nihilo .dijitAlignBottom .dijitTabHover,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
+}
+
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+}
+
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+
+
+/* left specific classes */
+.nihilo .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+
+.nihilo .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+
+.nihilo .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url("../images/tabLeftChecked.gif") no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede !important;
+}
+
+.nihilo .dijitAlignLeft .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+
+.nihilo .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url("../images/tabStripeLeft.gif") repeat-y right top;
+ padding-right: 3px;
+}
+
+.nihilo .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+
+/* right specific classes */
+.nihilo .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url("../images/tabStripeRight.gif") repeat-y left top;
+ padding-left: 3px;
+}
+
+.nihilo .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+
+.nihilo .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+
+.nihilo .dijitAlignRight .dijitTabChecked {
+ background: url("../images/tabRightChecked.gif") no-repeat left top !important;
+}
+
+.nihilo .dijitAlignRight .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
+}
+.nihilo .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+
+.nihilo .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede !important;
+}
+
+.nihilo .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+
+/* make space for a positioned close button */
+.nihilo .dijitTab .dijitClosable {
+ position: relative;
+ padding: 0;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+
+.nihilo .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+
+.nihilo .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
+}
+.dj_ie6 .nihilo .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
+}
+
+.nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px -15px !important;
+}
+.dj_ie6 .nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px !important;
+}
+
+/* correct for IE6.
+ We cant force hasLayout as that blows out the shrink wrapped tabs
+ ..so we shim in the closeImage position properties instead
+*/
+.dj_ie6 .nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+
+.nihilo .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+
+.nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css b/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css
new file mode 100644
index 0000000..1f498ce
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css
@@ -0,0 +1,55 @@
+
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
diff --git a/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css
new file mode 100644
index 0000000..d0b6c84
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css
@@ -0,0 +1,69 @@
+/* TabContainer */
+
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px; /* space between one tab and the next in top/bottom mode */
+}
+
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px; /* space between one tab and the next in top/bottom mode */
+}
+
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
diff --git a/includes/js/dijit/themes/nihilo/nihilo.css b/includes/js/dijit/themes/nihilo/nihilo.css
new file mode 100644
index 0000000..b7ecbc4
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/nihilo.css
@@ -0,0 +1,1378 @@
+
+@import url("../dijit.css");
+.nihilo .dijitSliderDisabled *,
+.nihilo .dijitDisabledClickableRegion,
+.nihilo .dijitSpinnerDisabled *,
+.nihilo .dijitButtonDisabled *,
+.nihilo .dijitDropDownButtonDisabled *,
+.nihilo .dijitComboButtonDisabled *,
+.nihilo .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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 .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #ccc;
+}
+.nihilo .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url(images/tabContainerSprite.gif) no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: -1px;
+}
+.nihilo dijitTabChecked {
+ margin-bottom: -2px;
+}
+.nihilo .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
+}
+.nihilo .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabContainerSprite.gif) no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+.nihilo .dijitTabHover,
+.nihilo .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url(images/tabContainerSprite.gif) no-repeat 0px -150px;
+}
+.nihilo .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -250px;
+ border: none;
+}
+.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+.nihilo .dijitTabChecked,
+.nihilo .dijitTabCloseButtonChecked
+{
+
+ background: url(images/tabContainerSprite.gif) no-repeat 0px -0px;
+}
+.nihilo .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabContainerSprite.gif) no-repeat right -100px;
+ border: none;
+}
+.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+.nihilo .dijitTabLabels-top {
+ border-left: 1px solid #ccc;
+ border-top: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ padding-top: 2px;
+ padding-left: 3px;
+ background: #fafafa url(images/tabStripe.gif) repeat-x left bottom;
+ padding-bottom: 4px;
+}
+.nihilo .dijitAlignLeft .dijitTab,
+.nihilo .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.nihilo .dijitAlignTop .dijitTabChecked,
+.nihilo .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+
+}
+.nihilo .dijitAlignLeft .dijitTabChecked,
+.nihilo .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.nihilo .dijitAlignRight .dijitTabChecked,
+.nihilo .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.nihilo .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ background: #fafafa url(images/tabStripeBottom.gif) repeat-x left top;
+ padding-top: 3px;
+}
+.nihilo .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+.nihilo .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabHover,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabBottomHoverC.gif) repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .nihilo .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url(images/tabHover.gif);
+}
+.nihilo .dijitAlignBottom .dijitTabChecked,
+.nihilo .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+
+ background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom left;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.nihilo .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabBottomActiveC.gif) repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+.nihilo .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+.nihilo .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+.nihilo .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url(images/tabLeftChecked.gif) no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede !important;
+}
+.nihilo .dijitAlignLeft .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url(images/tabStripeLeft.gif) repeat-y right top;
+ padding-right: 3px;
+}
+.nihilo .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.nihilo .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #fafafa url(images/tabStripeRight.gif) repeat-y left top;
+ padding-left: 3px;
+}
+.nihilo .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+.nihilo .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+.nihilo .dijitAlignRight .dijitTabChecked {
+ background: url(images/tabRightChecked.gif) no-repeat left top !important;
+}
+.nihilo .dijitAlignRight .dijitTab {
+ background: url(images/tabContainerSprite.gif) no-repeat left -350px;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url(images/tabContainerSprite.gif) no-repeat left -200px;
+}
+.nihilo .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.nihilo .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede !important;
+}
+.nihilo .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #dedede;
+}
+.nihilo .dijitTab .dijitClosable {
+ position: relative;
+ padding: 0;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+.nihilo .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+.nihilo .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
+}
+.dj_ie6 .nihilo .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
+}
+.nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px -15px !important;
+}
+.dj_ie6 .nihilo .dijitTabHover .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px -15px !important;
+}
+.dj_ie6 .nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.nihilo .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.nihilo .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
+
+.nihilo .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.nihilo .dijitAccordionTitle {
+ background:#fafafa url(images/titleBar.png) repeat-x top left;
+ border-top: 1px solid #dedede;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+.nihilo .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+.nihilo .dijitAccordionArrow {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+.nihilo .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
+ margin-top:-1px;
+}
+.nihilo .dijitAccordionBody {
+ background: #fff;
+}
+
+.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 .dijitSplitterH {
+ background:url(images/splitContainerSizerH.png) repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.nihilo .dijitSplitterH .dijitSplitterThumb {
+ background:url(images/splitContainerSizerH-thumb.png) no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.nihilo .dijitSplitterV {
+ background:url(images/splitContainerSizerV.png) repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.nihilo .dijitSplitterV .dijitSplitterThumb {
+ background:url(images/splitContainerSizerV-thumb.png) no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
+.nihilo .dijitInputField INPUT,
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.nihilo .dijitTextBox,
+.nihilo .dijitComboBox,
+.nihilo .dijitSpinner,
+.nihilo .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+.nihilo .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.nihilo .dijitComboBox .dijitButtonNode,
+.nihilo .dijitSpinner .dijitButtonNode {
+
+ border-color: #d3d3d3;
+ border-left: 1px solid #d3d3d3;
+}
+.nihilo .dijitTextBoxFocused,
+.nihilo .dijitComboBoxFocused,
+.nihilo .dijitSpinnerFocused {
+
+ border-color:#b3b3b3;
+}
+.nihilo .dijitComboBoxFocused .dijitButtonNode, .nihilo .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#d3d3d3;
+}
+.nihilo .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#d3d3d3;
+}
+.nihilo .dijitError {
+ border-color:#b3b3b3;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.nihilo .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .nihilo .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.nihilo .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url(images/warning.png) no-repeat center center;
+}
+.nihilo .dijitButtonNode {
+
+
+ border:1px solid #dedede;
+ border-bottom:1px solid #dedede;
+ border-right:1px solid #dedede;
+ padding: 0.2em;
+ background:#fff url(images/buttonEnabled.png) repeat-x top left;
+}
+.dj_ie .nihilo .dijitButtonNode {
+ zoom: 1;
+}
+.nihilo .dijitButtonText {
+ padding: 0 0.3em;
+}
+.nihilo .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.nihilo .dijitArrowButton {
+ color: #111;
+}
+.nihilo .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .nihilo .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.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_ie .nihilo .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .nihilo .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.nihilo .dijitButtonHover .dijitButtonNode,
+.nihilo .dijitToggleButtonHover .dijitButtonNode,
+.nihilo .dijitDropDownButtonHover .dijitButtonNode,
+.nihilo .dijitComboButtonHover .dijitButtonContents,
+.nihilo .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.nihilo .dijitComboBoxHover .dijitDownArrowButton,
+.nihilo .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ color:#000;
+ background:#fcfcfc url(images/buttonHover.png) repeat-x top left;
+}
+.nihilo .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.nihilo .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitButtonActive .dijitButtonNode,
+.nihilo .dijitToggleButtonActive .dijitButtonNode,
+.nihilo .dijitDropDownButtonActive .dijitButtonNode,
+.nihilo .dijitComboButtonActive .dijitButtonContents,
+.nihilo .dijitDownArrowActive .dijitDownArrowButton,
+.nihilo .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#dedede;
+ background: #f5f5f5 url(images/buttonActive.png) top left repeat-x;
+}
+.nihilo .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat left top;
+ width: 11px;
+}
+.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitArrowButtonInner {
+ background:url(images/spriteArrows.gif) no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.gif) no-repeat -22px top;
+ width: 11px;
+}
+.nihilo .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat left center;
+ width: 11px;
+}
+.nihilo .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
+.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,
+.nihilo .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.nihilo .dijitCheckBoxCheckedHover,
+ .nihilo .dijitCheckBoxCheckedFocused {
+
+ 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 .dijitRadioCheckedDisabled {
+
+ background-position: -48px;
+}
+.nihilo .dijitRadioDisabled {
+
+ background-position: -32px;
+}
+.nihilo .dijitRadioHover,
+.nihilo .dijitRadioFocused {
+
+ background-position: -80px;
+}
+.nihilo .dijitRadioCheckedHover,
+.nihilo .dijitRadioCheckedFocused {
+
+ background-position: -64px;
+}
+.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 #c4c4c4;
+ line-height: normal;
+}
+.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;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.nihilo .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url(images/preciseSliderThumb.png) no-repeat center top;
+ cursor:pointer;
+}
+.nihilo .dijitSliderFocused .dijitSliderImageHandleH {
+ background-image:url(images/preciseSliderThumbFocus.png);
+ #background-image:url(images/preciseSliderThumbFocus.gif);
+}
+.dj_ie6 .nihilo .dijitSliderImageHandleH {
+ background-image:url(images/preciseSliderThumb.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;
+ cursor:pointer;
+}
+.nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url(images/sliderThumbFocus.png);
+}
+.dj_ie6 .nihilo .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.nihilo .dijitSliderIncrementIconH {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.nihilo .dijitSliderDecrementIconH,
+.nihilo .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
+}
+.nihilo .dijitSliderDecrementIconH { background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top; }
+.nihilo .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.nihilo .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .nihilo .dijitSliderDisabled,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .nihilo .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
+.nihilo .dijitTreeNode {
+ background : url(images/treeI.gif) no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1;
+}
+.nihilo .dijitTreeIsLast {
+ background: url(images/treeI_half.gif) no-repeat;
+}
+.nihilo .dijitTreeLabel {
+ font-weight: normal;
+ margin-left: 3px;
+}
+.nihilo .dijitTreeIsRoot {
+ margin-left: 0;
+ background-image: none;
+}
+.nihilo .dijitTreeExpando {
+ width: 18px;
+ height: 18px;
+}
+.nihilo .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.nihilo .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.nihilo .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.nihilo .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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 .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 .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url(images/titleBar.png) repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.nihilo .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+.nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.nihilo .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url(images/spriteRoundedIconsSmall.png) no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.nihilo .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.nihilo .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.nihilo .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d;
+}
+.nihilo .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .nihilo .dijitTitlePaneContentOuter,
+.dj_ie6 .nihilo .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.nihilo .dijitClickableRegion {
+ background-color : #ffc !important;
+}
+
+.nihilo .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.nihilo .dijitCalendarIncreaseInner,
+.nihilo .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.nihilo .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat top left;
+}
+.dj_ie6 .nihilo .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat top left;
+}
+.nihilo .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .nihilo .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat -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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .nihilo .dijitCalendarDateTemplate,
+.dj_ie6 .nihilo .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.nihilo .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fdfdfd;
+ border:#fdfdfd solid 1px !important;
+}
+.nihilo .dijitCalendarPreviousMonth,
+.nihilo .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#f5f5f5 !important;
+ border:#f5f5f5 solid 1px !important;
+}
+.nihilo .dijitCalendarPreviousMonthDisabled,
+.nihilo .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.nihilo .dijitCalendarCurrentMonth {
+
+}
+.nihilo .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.nihilo .dijitCalendarDisabledDate {
+
+
+ text-decoration:line-through !important;
+ cursor:default !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 .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url(images/titleBar.png) repeat-x top left;
+}
+.nihilo .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.nihilo .dijitToolbar .dijitButton,
+.nihilo .dijitToolbar .dijitToggleButton,
+.nihilo .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.nihilo .dijitToolbar .dijitButtonChecked,
+.nihilo .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.nihilo .dijitToolbar .dijitButtonCheckedHover,
+.nihilo .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.nihilo .dijitToolbar .dijitButtonHover,
+.nihilo .dijitToolbar .dijitToggleButtonHover,
+.nihilo .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #f7c95c;
+ background-color:#ffe284;
+}
+.nihilo .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .nihilo.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButton,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#ffeeb9;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .nihilo .dijitToolbar .dijitButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .nihilo .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#ffe284;
+ border:1px solid #f7c95c;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.nihilo .dijitDialog {
+ background: #eee;
+ border: 1px solid #d3d3d3;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.nihilo .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+.nihilo .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #d3d3d3;
+ padding:10px;
+}
+.nihilo .dijitDialogTitleBar {
+
+ background: #fafafa url(images/titleBar.png) repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.nihilo .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.nihilo .dijitDialogCloseIcon {
+
+ background : url(images/spriteRoundedIconsSmall.png) no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .nihilo .dijitDialogCloseIcon {
+ background : url(images/spriteRoundedIconsSmall.gif) no-repeat right top;
+}
+.nihilo .dijitDialogContent {
+
+ padding: 8px;
+}
+.nihilo .dijitTooltip,
+.nihilo .dijitTooltipDialog {
+
+ opacity: 0.95;
+ 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_ie6 .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_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorDown.gif);
+ bottom: -5px;
+}
+.nihilo .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.nihilo .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorRight.png) no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorRight.gif);
+}
+.nihilo .dijitTooltipRight {
+ padding-left: 10px;
+}
+.nihilo .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorLeft.png) no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorLeft.gif);
+}
+.nihilo .dijitMenu {
+ border: 1px solid #d3d3d3;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+.nihilo .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
+ font-style: italic;
+}
+.nihilo .dijitMenuItem TD {
+ padding:1px;
+}
+.nihilo .dijitMenuItemHover {
+ background-color: #ffe284;
+ color: #243C5F;
+}
+.nihilo .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+
+}
+.nihilo .dijitMenuExpand {
+ display:none;
+}
+.nihilo .dijitMenuExpandEnabled {
+
+ width:15px;
+ height:15px;
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .nihilo .dijitMenuExpandEnabled {
+ background-image:url(images/spriteRoundedIconsSmall.gif);
+}
+.nihilo .dijitMenuExpandInner {
+ display:none;
+}
+.nihilo .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+.nihilo .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff;
+}
+.nihilo .dijitMenuSeparatorBottom {
+ border-top: 1px solid #d3d3d3;
+}
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.nihilo .dijitToolbar .dijitToolbarSeparator {
+ background: url(images/editor.gif);
+}
+.nihilo .dijitEditorIcon {
+ background-image: url(images/editor.gif);
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.nihilo .dijitEditorIconSep { background-position: 0px; }
+.nihilo .dijitEditorIconBackColor { background-position: -18px; }
+.nihilo .dijitEditorIconBold { background-position: -36px; }
+.nihilo .dijitEditorIconCancel { background-position: -54px; }
+.nihilo .dijitEditorIconCopy { background-position: -72px; }
+.nihilo .dijitEditorIconCreateLink { background-position: -90px; }
+.nihilo .dijitEditorIconCut { background-position: -108px; }
+.nihilo .dijitEditorIconDelete { background-position: -126px; }
+.nihilo .dijitEditorIconForeColor { background-position: -144px; }
+.nihilo .dijitEditorIconHiliteColor { background-position: -162px; }
+.nihilo .dijitEditorIconIndent { background-position: -180px; }
+.nihilo .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.nihilo .dijitEditorIconInsertImage { background-position: -216px; }
+.nihilo .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.nihilo .dijitEditorIconInsertTable { background-position: -252px; }
+.nihilo .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.nihilo .dijitEditorIconItalic { background-position: -288px; }
+.nihilo .dijitEditorIconJustifyCenter { background-position: -306px; }
+.nihilo .dijitEditorIconJustifyFull { background-position: -324px; }
+.nihilo .dijitEditorIconJustifyLeft { background-position: -342px; }
+.nihilo .dijitEditorIconJustifyRight { background-position: -360px; }
+.nihilo .dijitEditorIconLeftToRight { background-position: -378px; }
+.nihilo .dijitEditorIconListBulletIndent { background-position: -396px; }
+.nihilo .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.nihilo .dijitEditorIconListNumIndent { background-position: -432px; }
+.nihilo .dijitEditorIconListNumOutdent { background-position: -450px; }
+.nihilo .dijitEditorIconOutdent { background-position: -468px; }
+.nihilo .dijitEditorIconPaste { background-position: -486px; }
+.nihilo .dijitEditorIconRedo { background-position: -504px; }
+.nihilo .dijitEditorIconRemoveFormat { background-position: -522px; }
+.nihilo .dijitEditorIconRightToLeft { background-position: -540px; }
+.nihilo .dijitEditorIconSave { background-position: -558px; }
+.nihilo .dijitEditorIconSpace { background-position: -576px; }
+.nihilo .dijitEditorIconStrikethrough { background-position: -594px; }
+.nihilo .dijitEditorIconSubscript { background-position: -612px; }
+.nihilo .dijitEditorIconSuperscript { background-position: -630px; }
+.nihilo .dijitEditorIconUnderline { background-position: -648px; }
+.nihilo .dijitEditorIconUndo { background-position: -666px; }
+.nihilo .dijitEditorIconWikiword { background-position: -684px; }
+.nihilo .dijitEditorIconToggleDir { background-position: -540px; }
+.dijitColorPalette {
+ border:1px solid #d3d3d3;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/nihilo/nihilo.css.commented.css b/includes/js/dijit/themes/nihilo/nihilo.css.commented.css
new file mode 100644
index 0000000..d2bdd78
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/nihilo.css.commented.css
@@ -0,0 +1,39 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
+
+ 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("Common.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/ComboBox.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Textarea.css");
+@import url("form/Slider.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("ColorPalette.css");
diff --git a/includes/js/dijit/themes/nihilo/nihilo_rtl.css b/includes/js/dijit/themes/nihilo/nihilo_rtl.css
new file mode 100644
index 0000000..134c52e
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/nihilo_rtl.css
@@ -0,0 +1,317 @@
+
+.dj_gecko .dijitRtl .dijitInputField {
+ direction: ltr;
+}
+.dj_gecko .dijitRtl .dijitInputField * {
+ direction: rtl;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpando, .dijitRtl .dijitTreeContainer .dijitTreeExpand {
+ float:right;
+}
+.dijitRtl .dijitExpandoText {
+ float: right;
+ padding-left: 3px;
+ padding-right: 0;
+}
+.dijitRtl .dijitComboBox .dijitInputField {
+ border-right-width:1px !important;
+ border-left-width:0 !important;
+}
+.dijitRtl .dijitCalendarNextYear {
+ margin:0 0.55em 0 0;
+}
+.dijitRtl .dijitCalendarPreviousYear {
+ margin:0 0 0 0.55em;
+}
+.dijitRtl .dijitProgressBarFull .dijitProgressBarLabel {
+ right:0;
+}
+.dijitRtl .dijitComboButton .dijitButtonContents {
+ border-right-width:1px !important;
+}
+.dijitRtl .dijitA11ySideArrow {
+ margin-left:1em;
+ margin-right:0;
+}
+.dijitRtl .dijitAccordionArrow,
+.dijitRtl .dijitAccordionTitle .arrowTextUp,
+.dijitRtl .dijitAccordionTitle .arrowTextDown {
+ float: left;
+}
+.dijitRtl .dijitSliderImageHandleV {
+ left:auto;
+ right:-6px;
+}
+.dj_ie .dijitRtl .dijitSliderImageHandleV {
+ right:-10px;
+}
+.dijitRtl .dijitSliderMoveableH {
+ right:auto;
+ left:0;
+}
+.dijitRtl .dijitRuleContainerV {
+ float:right;
+}
+.dj_gecko .dijitRtl .dijitRuleContainerV {
+ float:left;
+}
+.dj_ie .dijitRtl .dijitRuleContainerV {
+ text-align:right;
+}
+.dj_ie .dijitRtl .dijitRuleLabelV {
+ text-align:left;
+}
+.dj_ie .dijitRtl .dijitRuleLabelH {
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitSliderProgressBarH {
+ right:0;
+ left:auto;
+}
+.dj_gecko .dijitRtl .dijitSliderProgressBarH {
+ float:right;
+ right:0;
+ left:auto;
+}
+.dijitRtl .dijitTab {
+ float:right;
+}
+.dj_ie .dijitRtl .dijitTab,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv span {
+ position:static;
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ margin-left:1px !important;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignRight {
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTab {
+
+ width:1px;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+
+ margin-left:1px !important;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignRight {
+
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ overflow-x:visible;
+ margin-left:2px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ overflow-x:visible;
+ margin-right:2px !important;
+}
+.dj_ie7 .dijitRtl .dijitTab .dijitTabInnerDiv {
+ float:left;
+}
+.dj_ie7 .dijitRtl .dijitTab .closeImage {
+ padding: 0 0 0 12px;
+}
+.dj_ie .dijitRtl .dijitAlignRight .dijitTab {
+ position:relative;
+}
+.dijitRtl .dijitTitlePane .dijitArrowNode {
+ float: left;
+}
+.dijitRtl .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ right: auto;
+ left: 0;
+ border-width: 0 1px 0 0 !important;
+}
+.dijitRtl .dijitSpinnerButtonContainer {
+ float: left;
+}
+.dijitRtl .dijit_a11y .dijitSpinnerButtonContainer {
+ margin-left: none;
+ margin-right: 2px;
+}
+.dijitRtl DIV.dijitArrowButton, .dijitRtl .dijitValidationIcon, .dijitRtl .dijitValidationIconText {
+ float: left;
+}
+.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
+ background-position:right;
+ padding-right:25px;
+}
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url(images/arrowLeft.png);
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url(images/arrowRight.png);
+}
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url(images/treeI_rtl.gif);
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url(images/treeI_half_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url(images/spriteTree_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url(images/spriteTree_rtl.gif) no-repeat -36px top;
+}
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url(images/arrowLeft.png);
+}
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url(images/arrowLeft.gif);
+}
+.dijitRtl .dijitEditorIcon {
+ background-image: url(images/editor_rtl.gif);
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url(images/editor_rtl.gif);
+}
diff --git a/includes/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css b/includes/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css
new file mode 100644
index 0000000..0984f57
--- /dev/null
+++ b/includes/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css
@@ -0,0 +1,28 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
+
+ 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("form/Common_rtl.css");
+@import url("Tree_rtl.css");
+@import url("TitlePane_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Menu_rtl.css");
+@import url("Editor_rtl.css");
diff --git a/includes/js/dijit/themes/soria/Calendar.css b/includes/js/dijit/themes/soria/Calendar.css
new file mode 100644
index 0000000..5537b8e
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Calendar.css
@@ -0,0 +1,136 @@
+
+
+.soria .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .soria .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.soria .dijitCalendarIncreaseInner,
+.soria .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.soria .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .soria .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+.soria .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .soria .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .soria .dijitCalendarDateTemplate,
+.dj_ie6 .soria .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.soria .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fff;
+ border:#fff solid 1px !important;
+}
+.soria .dijitCalendarPreviousMonth,
+.soria .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#fdfdfd !important;
+ border:#fdfdfd solid 1px !important;
+}
+.soria .dijitCalendarPreviousMonthDisabled,
+.soria .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.soria .dijitCalendarCurrentMonth {
+
+}
+.soria .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.soria .dijitCalendarDisabledDate {
+
+
+ text-decoration:line-through !important;
+ cursor:default !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;
+}
diff --git a/includes/js/dijit/themes/soria/Calendar.css.commented.css b/includes/js/dijit/themes/soria/Calendar.css.commented.css
new file mode 100644
index 0000000..7a9c05f
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Calendar.css.commented.css
@@ -0,0 +1,159 @@
+/* Calendar*/
+
+.soria .dijitCalendarIncrementControl {
+ /* next/prev month buttons */
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .soria .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+
+.soria .dijitCalendarIncreaseInner,
+.soria .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+
+.soria .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .soria .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+
+.soria .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .soria .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -30px top;
+}
+
+.soria table.dijitCalendarContainer {
+ font-size: 100%;
+ border-spacing: 0;
+ border-collapse: separate;
+ 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;
+ text-align:center;
+}
+.dj_ie6 .soria .dijitCalendarMonthContainer th {
+ padding-top:.1em;
+ padding-bottom:0em;
+}
+
+.soria .dijitCalendarDayLabelTemplate {
+ /* day of week labels */
+ 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;
+}
+
+.dj_ie7 .soria .dijitCalendarDateTemplate,
+.dj_ie6 .soria .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+
+.soria .dijitCalendarDateTemplate {
+ /* style for each day cell */
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fff;
+ border:#fff solid 1px !important;
+}
+
+
+.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 .dijitCalendarPreviousMonthDisabled,
+.soria .dijitCalendarNextMonthDisabled {
+ /* days that are part of the previous or next month - disabled*/
+ background-color:#a4a5a6 !important;
+}
+
+.soria .dijitCalendarCurrentMonth {
+ /* days that are part of this month */
+}
+
+.soria .dijitCalendarCurrentMonthDisabled {
+ /* days that are part of this month - disabled */
+ background-color:#bbbbbc !important;
+}
+
+.soria .dijitCalendarDisabledDate {
+ /* one or the other? */
+ /* background: url(images/noX.gif) no-repeat center center !important; */
+ text-decoration:line-through !important;
+ cursor:default !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;
+}
diff --git a/includes/js/dijit/themes/soria/Calendar_rtl.css b/includes/js/dijit/themes/soria/Calendar_rtl.css
new file mode 100644
index 0000000..e64cdf2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Calendar_rtl.css
@@ -0,0 +1,13 @@
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/Calendar_rtl.css.commented.css b/includes/js/dijit/themes/soria/Calendar_rtl.css.commented.css
new file mode 100644
index 0000000..84146f8
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Calendar_rtl.css.commented.css
@@ -0,0 +1,16 @@
+
+/* Calendar */
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/ColorPalette.css b/includes/js/dijit/themes/soria/ColorPalette.css
new file mode 100644
index 0000000..5a51275
--- /dev/null
+++ b/includes/js/dijit/themes/soria/ColorPalette.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #cbcbcb;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/soria/ColorPalette.css.commented.css b/includes/js/dijit/themes/soria/ColorPalette.css.commented.css
new file mode 100644
index 0000000..5a51275
--- /dev/null
+++ b/includes/js/dijit/themes/soria/ColorPalette.css.commented.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #cbcbcb;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/soria/Common.css b/includes/js/dijit/themes/soria/Common.css
new file mode 100644
index 0000000..89fab27
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Common.css
@@ -0,0 +1,29 @@
+
+.soria .dijitSliderDisabled *,
+.soria .dijitDisabledClickableRegion,
+.soria .dijitSpinnerDisabled *,
+.soria .dijitButtonDisabled *,
+.soria .dijitDropDownButtonDisabled *,
+.soria .dijitComboButtonDisabled *,
+.soria .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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;}
diff --git a/includes/js/dijit/themes/soria/Common.css.commented.css b/includes/js/dijit/themes/soria/Common.css.commented.css
new file mode 100644
index 0000000..6a9febf
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Common.css.commented.css
@@ -0,0 +1,36 @@
+
+/**** Disabled cursor *****/
+.soria .dijitSliderDisabled *,
+.soria .dijitDisabledClickableRegion, /* a region the user would be able to click on, but it's disabled */
+.soria .dijitSpinnerDisabled *,
+.soria .dijitButtonDisabled *,
+.soria .dijitDropDownButtonDisabled *,
+.soria .dijitComboButtonDisabled *,
+.soria .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+
+/* 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; }
+.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;}
diff --git a/includes/js/dijit/themes/soria/Dialog.css b/includes/js/dijit/themes/soria/Dialog.css
new file mode 100644
index 0000000..a4a695d
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Dialog.css
@@ -0,0 +1,138 @@
+
+.soria .dijitDialog {
+ background: #eee;
+ border: 1px solid #cbcbcb;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.soria .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+.soria .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #b1badf;
+ padding:10px;
+}
+.soria .dijitDialogTitleBar {
+
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.soria .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.soria .dijitDialogCloseIcon {
+
+ background : url("images/spriteRoundedIconsSmallBl.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .soria .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmallBl.gif") no-repeat right top;
+}
+.soria .dijitDialogContent {
+
+ padding: 8px;
+}
+.soria .dijitTooltip,
+.soria .dijitTooltipDialog {
+
+ opacity: 0.95;
+ 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_ie6 .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_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -5px;
+}
+.soria .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .soria .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.soria .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+.soria .dijitTooltipRight {
+ padding-left: 10px;
+}
+.soria .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
diff --git a/includes/js/dijit/themes/soria/Dialog.css.commented.css b/includes/js/dijit/themes/soria/Dialog.css.commented.css
new file mode 100644
index 0000000..ed48613
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Dialog.css.commented.css
@@ -0,0 +1,175 @@
+
+/* Dialog */
+
+.soria .dijitDialog {
+ background: #eee;
+ border: 1px solid #cbcbcb;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+
+.soria .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+
+.soria .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #b1badf; /* #cddde9; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+ padding:10px;
+
+}
+
+.soria .dijitDialogTitleBar {
+ /* outer container for the titlebar of the dialog */
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+ /* border: 1px solid #bfbfbf; */
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0; /* remove this line if keyboard focus on dialog startup is an issue. tab still takes you to first focusable element */
+}
+
+.soria .dijitDialogTitle {
+ /* typography and styling of the dialog title */
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+
+.soria .dijitDialogCloseIcon {
+ /* the default close icon for the dialog */
+ background : url("images/spriteRoundedIconsSmallBl.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .soria .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmallBl.gif") no-repeat right top;
+}
+
+.soria .dijitDialogContent {
+ /* the body of the dialog */
+ padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.soria .dijitTooltip,
+.soria .dijitTooltipDialog {
+ /* the outermost dom node, holding the connector and container */
+ opacity: 0.95;
+ 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;
+ /*
+ border-radius: 6px;
+ -moz-border-radius: 7px;
+ -webkit-border-radius: 6px;
+ */
+}
+
+.soria .dijitTooltipConnector {
+ /* the arrow piece */
+ border:0px;
+ 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 {
+ /* the arrow piece for tooltips below an element */
+ top: 0px;
+ left: 6px;
+ background:url("images/tooltipConnectorUp.png") no-repeat top left;
+ width:17px;
+ height:11px;
+}
+
+.dj_ie6 .soria .dijitTooltipBelow .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.soria .dijitTooltipAbove .dijitTooltipConnector {
+ /* the arrow piece for tooltips above an element */
+ bottom: 0px;
+ left: 6px;
+ background:url("images/tooltipConnectorDown.png") no-repeat top left;
+ width:17px;
+ height:11px;
+}
+.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -5px;
+}
+
+.soria .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .soria .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.soria .dijitTooltipLeft .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.soria .dijitTooltipRight {
+ padding-left: 10px;
+}
+.soria .dijitTooltipRight .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
+
diff --git a/includes/js/dijit/themes/soria/Dialog_rtl.css b/includes/js/dijit/themes/soria/Dialog_rtl.css
new file mode 100644
index 0000000..2f29eda
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Dialog_rtl.css
@@ -0,0 +1,21 @@
+
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/soria/Dialog_rtl.css.commented.css b/includes/js/dijit/themes/soria/Dialog_rtl.css.commented.css
new file mode 100644
index 0000000..74b193a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Dialog_rtl.css.commented.css
@@ -0,0 +1,29 @@
+/* Dialog */
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+
+/*FIXME: redundant?*/
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+
+
+/* ToolTip */
+
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/soria/Editor.css b/includes/js/dijit/themes/soria/Editor.css
new file mode 100644
index 0000000..c7f0ef4
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Editor.css
@@ -0,0 +1,55 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.soria .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+.soria .dijitEditorIcon {
+ background-image: url('images/editor.gif');
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.soria .dijitEditorIconSep { background-position: 0px; }
+.soria .dijitEditorIconBackColor { background-position: -18px; }
+.soria .dijitEditorIconBold { background-position: -36px; }
+.soria .dijitEditorIconCancel { background-position: -54px; }
+.soria .dijitEditorIconCopy { background-position: -72px; }
+.soria .dijitEditorIconCreateLink { background-position: -90px; }
+.soria .dijitEditorIconCut { background-position: -108px; }
+.soria .dijitEditorIconDelete { background-position: -126px; }
+.soria .dijitEditorIconForeColor { background-position: -144px; }
+.soria .dijitEditorIconHiliteColor { background-position: -162px; }
+.soria .dijitEditorIconIndent { background-position: -180px; }
+.soria .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.soria .dijitEditorIconInsertImage { background-position: -216px; }
+.soria .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.soria .dijitEditorIconInsertTable { background-position: -252px; }
+.soria .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.soria .dijitEditorIconItalic { background-position: -288px; }
+.soria .dijitEditorIconJustifyCenter { background-position: -306px; }
+.soria .dijitEditorIconJustifyFull { background-position: -324px; }
+.soria .dijitEditorIconJustifyLeft { background-position: -342px; }
+.soria .dijitEditorIconJustifyRight { background-position: -360px; }
+.soria .dijitEditorIconLeftToRight { background-position: -378px; }
+.soria .dijitEditorIconListBulletIndent { background-position: -396px; }
+.soria .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.soria .dijitEditorIconListNumIndent { background-position: -432px; }
+.soria .dijitEditorIconListNumOutdent { background-position: -450px; }
+.soria .dijitEditorIconOutdent { background-position: -468px; }
+.soria .dijitEditorIconPaste { background-position: -486px; }
+.soria .dijitEditorIconRedo { background-position: -504px; }
+.soria .dijitEditorIconRemoveFormat { background-position: -522px; }
+.soria .dijitEditorIconRightToLeft { background-position: -540px; }
+.soria .dijitEditorIconSave { background-position: -558px; }
+.soria .dijitEditorIconSpace { background-position: -576px; }
+.soria .dijitEditorIconStrikethrough { background-position: -594px; }
+.soria .dijitEditorIconSubscript { background-position: -612px; }
+.soria .dijitEditorIconSuperscript { background-position: -630px; }
+.soria .dijitEditorIconUnderline { background-position: -648px; }
+.soria .dijitEditorIconUndo { background-position: -666px; }
+.soria .dijitEditorIconWikiword { background-position: -684px; }
+.soria .dijitEditorIconToggleDir { background-position: -540px; }
diff --git a/includes/js/dijit/themes/soria/Editor.css.commented.css b/includes/js/dijit/themes/soria/Editor.css.commented.css
new file mode 100644
index 0000000..cddbf00
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Editor.css.commented.css
@@ -0,0 +1,60 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+ /* top:0; */
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+
+.soria .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+
+/**** ICONS *****/
+
+.soria .dijitEditorIcon {
+ background-image: url('images/editor.gif'); /* editor icons sprite image */
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.soria .dijitEditorIconSep { background-position: 0px; }
+.soria .dijitEditorIconBackColor { background-position: -18px; }
+.soria .dijitEditorIconBold { background-position: -36px; }
+.soria .dijitEditorIconCancel { background-position: -54px; }
+.soria .dijitEditorIconCopy { background-position: -72px; }
+.soria .dijitEditorIconCreateLink { background-position: -90px; }
+.soria .dijitEditorIconCut { background-position: -108px; }
+.soria .dijitEditorIconDelete { background-position: -126px; }
+.soria .dijitEditorIconForeColor { background-position: -144px; }
+.soria .dijitEditorIconHiliteColor { background-position: -162px; }
+.soria .dijitEditorIconIndent { background-position: -180px; }
+.soria .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.soria .dijitEditorIconInsertImage { background-position: -216px; }
+.soria .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.soria .dijitEditorIconInsertTable { background-position: -252px; }
+.soria .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.soria .dijitEditorIconItalic { background-position: -288px; }
+.soria .dijitEditorIconJustifyCenter { background-position: -306px; }
+.soria .dijitEditorIconJustifyFull { background-position: -324px; }
+.soria .dijitEditorIconJustifyLeft { background-position: -342px; }
+.soria .dijitEditorIconJustifyRight { background-position: -360px; }
+.soria .dijitEditorIconLeftToRight { background-position: -378px; }
+.soria .dijitEditorIconListBulletIndent { background-position: -396px; }
+.soria .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.soria .dijitEditorIconListNumIndent { background-position: -432px; }
+.soria .dijitEditorIconListNumOutdent { background-position: -450px; }
+.soria .dijitEditorIconOutdent { background-position: -468px; }
+.soria .dijitEditorIconPaste { background-position: -486px; }
+.soria .dijitEditorIconRedo { background-position: -504px; }
+.soria .dijitEditorIconRemoveFormat { background-position: -522px; }
+.soria .dijitEditorIconRightToLeft { background-position: -540px; }
+.soria .dijitEditorIconSave { background-position: -558px; }
+.soria .dijitEditorIconSpace { background-position: -576px; }
+.soria .dijitEditorIconStrikethrough { background-position: -594px; }
+.soria .dijitEditorIconSubscript { background-position: -612px; }
+.soria .dijitEditorIconSuperscript { background-position: -630px; }
+.soria .dijitEditorIconUnderline { background-position: -648px; }
+.soria .dijitEditorIconUndo { background-position: -666px; }
+.soria .dijitEditorIconWikiword { background-position: -684px; }
+.soria .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/includes/js/dijit/themes/soria/Editor_rtl.css b/includes/js/dijit/themes/soria/Editor_rtl.css
new file mode 100644
index 0000000..2e936ec
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Editor_rtl.css
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif');
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/soria/Editor_rtl.css.commented.css b/includes/js/dijit/themes/soria/Editor_rtl.css.commented.css
new file mode 100644
index 0000000..2a2df3e
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Editor_rtl.css.commented.css
@@ -0,0 +1,9 @@
+/* Editor */
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif'); /* editor icons sprite image */
+}
+
+/* Toolbar */
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/soria/Menu.css b/includes/js/dijit/themes/soria/Menu.css
new file mode 100644
index 0000000..2df350a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Menu.css
@@ -0,0 +1,54 @@
+
+.soria .dijitMenu {
+ border: 1px solid #cbcbcb;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+.soria .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.soria .dijitMenuPreviousButton, .soria .dijitMenuNextButton {
+ font-style: italic;
+}
+.soria .dijitMenuItem TD {
+ padding:1px;
+}
+.soria .dijitMenuItemHover {
+ background-color: #d9e6f9;
+ color: #243C5F;
+}
+.soria .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+
+}
+.soria .dijitMenuExpand {
+ display:none;
+}
+.soria .dijitMenuExpandEnabled {
+
+ width:15px;
+ height:15px;
+ background:url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .soria .dijitMenuExpandEnabled {
+ background-image:url('images/spriteRoundedIconsSmall.gif');
+}
+.soria .dijitMenuExpandInner {
+ display:none;
+}
+.soria .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+.soria .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff;
+}
+.soria .dijitMenuSeparatorBottom {
+ border-top: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/soria/Menu.css.commented.css b/includes/js/dijit/themes/soria/Menu.css.commented.css
new file mode 100644
index 0000000..e5de907
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Menu.css.commented.css
@@ -0,0 +1,63 @@
+
+/* Menu */
+.soria .dijitMenu {
+ border: 1px solid #cbcbcb;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+
+.soria .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.soria .dijitMenuPreviousButton, .soria .dijitMenuNextButton {
+ font-style: italic;
+}
+.soria .dijitMenuItem TD {
+ padding:1px;
+}
+
+.soria .dijitMenuItemHover {
+ background-color: #d9e6f9; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
+ color: #243C5F;
+}
+
+.soria .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+ /* padding-right: 3px; */
+}
+
+.soria .dijitMenuExpand {
+ display:none;
+}
+.soria .dijitMenuExpandEnabled {
+ /* margin-top:4px; */
+ width:15px;
+ height:15px;
+ background:url('images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .soria .dijitMenuExpandEnabled {
+ background-image:url('images/spriteRoundedIconsSmall.gif');
+}
+.soria .dijitMenuExpandInner {
+ display:none;
+}
+
+.soria .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+
+/* separator can be two pixels -- set border of either one to 0px to have only one */
+.soria .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff; /*97adcb; */
+}
+
+.soria .dijitMenuSeparatorBottom {
+ border-top: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/soria/Menu_rtl.css b/includes/js/dijit/themes/soria/Menu_rtl.css
new file mode 100644
index 0000000..8b751fd
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Menu_rtl.css
@@ -0,0 +1,11 @@
+
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.png');
+}
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/soria/Menu_rtl.css.commented.css b/includes/js/dijit/themes/soria/Menu_rtl.css.commented.css
new file mode 100644
index 0000000..ac66852
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Menu_rtl.css.commented.css
@@ -0,0 +1,15 @@
+
+/* Menu */
+
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.png');
+}
+
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/soria/ProgressBar.css b/includes/js/dijit/themes/soria/ProgressBar.css
new file mode 100644
index 0000000..566d048
--- /dev/null
+++ b/includes/js/dijit/themes/soria/ProgressBar.css
@@ -0,0 +1,24 @@
+
+.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;
+}
diff --git a/includes/js/dijit/themes/soria/ProgressBar.css.commented.css b/includes/js/dijit/themes/soria/ProgressBar.css.commented.css
new file mode 100644
index 0000000..f371936
--- /dev/null
+++ b/includes/js/dijit/themes/soria/ProgressBar.css.commented.css
@@ -0,0 +1,33 @@
+
+/****
+ dijit.ProgressBar
+ ****/
+
+.soria .dijitProgressBar {
+ margin:2px 0px 2px 0px;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/soria/TitlePane.css b/includes/js/dijit/themes/soria/TitlePane.css
new file mode 100644
index 0000000..c37e7e2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/TitlePane.css
@@ -0,0 +1,64 @@
+
+
+.soria .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.soria .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+.soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.soria .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.soria .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.soria .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.soria .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d;
+}
+.soria .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .soria .dijitTitlePaneContentOuter,
+.dj_ie6 .soria .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.soria .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/soria/TitlePane.css.commented.css b/includes/js/dijit/themes/soria/TitlePane.css.commented.css
new file mode 100644
index 0000000..62e43b3
--- /dev/null
+++ b/includes/js/dijit/themes/soria/TitlePane.css.commented.css
@@ -0,0 +1,77 @@
+/**
+ * dijit.layout.TitlePane
+ *
+ */
+
+.soria .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.soria .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+
+.soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+
+
+.soria .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url('images/spriteRoundedIconsSmall.png') no-repeat top left;
+}
+.dj_ie6 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/spriteRoundedIconsSmall.gif') no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+
+.soria .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+
+.soria .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+
+.soria .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.soria .dijitTitlePaneContentInner {
+ padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .soria .dijitTitlePaneContentOuter,
+.dj_ie6 .soria .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.soria .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/soria/TitlePane_rtl.css b/includes/js/dijit/themes/soria/TitlePane_rtl.css
new file mode 100644
index 0000000..6a3b2cd
--- /dev/null
+++ b/includes/js/dijit/themes/soria/TitlePane_rtl.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/TitlePane_rtl.css.commented.css b/includes/js/dijit/themes/soria/TitlePane_rtl.css.commented.css
new file mode 100644
index 0000000..6a3b2cd
--- /dev/null
+++ b/includes/js/dijit/themes/soria/TitlePane_rtl.css.commented.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/Toolbar.css b/includes/js/dijit/themes/soria/Toolbar.css
new file mode 100644
index 0000000..58ae9c9
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Toolbar.css
@@ -0,0 +1,83 @@
+.soria .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+.soria .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.soria .dijitToolbar .dijitButton,
+.soria .dijitToolbar .dijitToggleButton,
+.soria .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.soria .dijitToolbar .dijitButtonChecked,
+.soria .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.soria .dijitToolbar .dijitButtonCheckedHover,
+.soria .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.soria .dijitToolbar .dijitButtonHover,
+.soria .dijitToolbar .dijitToggleButtonHover,
+.soria .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #316ac5;
+ background-color:#9abbea;
+}
+.soria .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .soria.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButton,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButton,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/soria/Toolbar.css.commented.css b/includes/js/dijit/themes/soria/Toolbar.css.commented.css
new file mode 100644
index 0000000..c8a070a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Toolbar.css.commented.css
@@ -0,0 +1,95 @@
+.soria .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+
+.soria .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+
+.soria .dijitToolbar .dijitButton,
+.soria .dijitToolbar .dijitToggleButton,
+.soria .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+
+.soria .dijitToolbar .dijitButtonChecked,
+.soria .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.soria .dijitToolbar .dijitButtonCheckedHover,
+.soria .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.soria .dijitToolbar .dijitButtonHover,
+.soria .dijitToolbar .dijitToggleButtonHover,
+.soria .dijitToolbar .dijitDropDownButtonHover {
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
+ border: 1px solid #316ac5;
+ background-color:#9abbea;
+}
+
+.soria .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .soria.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+/* IE6 specific rules */
+.dj_ie6 .soria .dijitToolbar .dijitButton,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButton,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButton {
+ /* workaround no transparent border support in IE6 */
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+
+.dj_ie6 .soria .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .soria .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .soria .dijitToolbar .dijitButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/soria/Tree.css b/includes/js/dijit/themes/soria/Tree.css
new file mode 100644
index 0000000..23491bc
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Tree.css
@@ -0,0 +1,68 @@
+
+.soria .dijitTreeNode {
+ background : url('images/treeI.gif') no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1;
+}
+.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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.soria .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.soria .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.soria .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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;
+}
diff --git a/includes/js/dijit/themes/soria/Tree.css.commented.css b/includes/js/dijit/themes/soria/Tree.css.commented.css
new file mode 100644
index 0000000..55da526
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Tree.css.commented.css
@@ -0,0 +1,90 @@
+
+/* Tree */
+
+.soria .dijitTreeNode {
+ background : url('images/treeI.gif') no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1; /* MOW: what the heck is this doing in here? */
+}
+
+/* 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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+
+
+.soria .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+
+/* same style as IE selection */
+.soria .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+/* don't use :focus due to opera and IE's lack of support on div's */
+.soria .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/soria/Tree_rtl.css b/includes/js/dijit/themes/soria/Tree_rtl.css
new file mode 100644
index 0000000..5734d9f
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Tree_rtl.css
@@ -0,0 +1,30 @@
+
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/treeI_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/treeI_half_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/spriteTree_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url('images/spriteTree_rtl.gif') no-repeat -36px top;
+}
diff --git a/includes/js/dijit/themes/soria/Tree_rtl.css.commented.css b/includes/js/dijit/themes/soria/Tree_rtl.css.commented.css
new file mode 100644
index 0000000..1fa4e00
--- /dev/null
+++ b/includes/js/dijit/themes/soria/Tree_rtl.css.commented.css
@@ -0,0 +1,38 @@
+
+
+/* Tree */
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/treeI_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/treeI_half_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/spriteTree_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url('images/spriteTree_rtl.gif') no-repeat -36px top;
+}
diff --git a/includes/js/dijit/themes/soria/form/Button.css b/includes/js/dijit/themes/soria/form/Button.css
new file mode 100644
index 0000000..ba7a81a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Button.css
@@ -0,0 +1,90 @@
+
+.soria .dijitButtonNode {
+
+
+ border:1px solid #8ba0bd;
+ border-bottom:1px solid #657c9c;
+ border-right:1px solid #657c9c;
+ padding: 0.2em;
+ background:#bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
+}
+.dj_ie .soria .dijitButtonNode {
+ zoom: 1;
+}
+.soria .dijitButtonText {
+ padding: 0 0.3em;
+}
+.soria .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.soria .dijitArrowButton {
+ color: #111;
+}
+.soria .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .soria .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.soria .dijitButtonDisabled .dijitButtonNode,
+.soria .dijitToggleButtonDisabled .dijitButtonNode,
+.soria .dijitDropDownButtonDisabled .dijitButtonNode,
+.soria .dijitComboButtonDisabled .dijitButtonNode,
+.soria .dijitComboBoxDisabled,
+.soria .dijitSpinnerDisabled,
+.soria .dijitSpinnerDisabled .dijitButtonNode {
+
+ border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+
+ background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
+ opacity: 0.60;
+}
+.dj_ie .soria .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.soria .dijitButtonHover .dijitButtonNode,
+.soria .dijitToggleButtonHover .dijitButtonNode,
+.soria .dijitDropDownButtonHover .dijitButtonNode,
+.soria .dijitComboButtonHover .dijitButtonContents,
+.soria .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.soria .dijitComboBoxHover .dijitDownArrowButton,
+.soria .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ color:#000;
+ background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
+}
+.soria .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.soria .dijitButtonActive .dijitButtonNode,
+.soria .dijitToggleButtonActive .dijitButtonNode,
+.soria .dijitDropDownButtonActive .dijitButtonNode,
+.soria .dijitComboButtonActive .dijitButtonContents,
+.soria .dijitDownArrowActive .dijitDownArrowButton,
+.soria .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#657c9c;
+ background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
+}
+.soria .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left top;
+ width: 11px;
+}
+.soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat -22px top;
+ width: 11px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Button.css.commented.css b/includes/js/dijit/themes/soria/form/Button.css.commented.css
new file mode 100644
index 0000000..652dfaa
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Button.css.commented.css
@@ -0,0 +1,109 @@
+
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ *****/
+
+.soria .dijitButtonNode {
+ /* enabled state - inner */
+ /* border:1px outset #a0a0a0; */
+ border:1px solid #8ba0bd;
+ border-bottom:1px solid #657c9c;
+ border-right:1px solid #657c9c;
+ padding: 0.2em;
+ background:#bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
+}
+.dj_ie .soria .dijitButtonNode {
+ zoom: 1;
+}
+
+.soria .dijitButtonText {
+ padding: 0 0.3em;
+}
+
+.soria .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+
+.soria .dijitArrowButton {
+ color: #111;
+}
+
+.soria .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+
+.dj_ff2 .soria .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+.soria .dijitButtonDisabled .dijitButtonNode,
+.soria .dijitToggleButtonDisabled .dijitButtonNode,
+.soria .dijitDropDownButtonDisabled .dijitButtonNode,
+.soria .dijitComboButtonDisabled .dijitButtonNode,
+.soria .dijitComboBoxDisabled,
+.soria .dijitSpinnerDisabled,
+.soria .dijitSpinnerDisabled .dijitButtonNode {
+ /* disabled state - inner */
+ border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+ /*color:#b4b4b4;*/
+ background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
+ opacity: 0.60; /* Safari, Opera and Mozilla */
+}
+.dj_ie .soria .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50); /* IE */
+}
+
+.soria .dijitButtonHover .dijitButtonNode,
+.soria .dijitToggleButtonHover .dijitButtonNode,
+.soria .dijitDropDownButtonHover .dijitButtonNode,
+.soria .dijitComboButtonHover .dijitButtonContents,
+.soria .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.soria .dijitComboBoxHover .dijitDownArrowButton,
+.soria .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+ /* hover state - inner */
+ /* TODO: change from Hover to Selected so that button is still highlighted while drop down is being used */
+ color:#000;
+ background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
+}
+
+.soria .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.soria .dijitButtonActive .dijitButtonNode,
+.soria .dijitToggleButtonActive .dijitButtonNode,
+.soria .dijitDropDownButtonActive .dijitButtonNode,
+.soria .dijitComboButtonActive .dijitButtonContents,
+.soria .dijitDownArrowActive .dijitDownArrowButton,
+.soria .dijitComboBoxActive .dijitDownArrowButton {
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a toggle button is in a depressed state
+ */
+ border-color:#657c9c;
+ background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
+}
+
+
+.soria .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left top;
+ width: 11px;
+}
+.soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.gif") no-repeat -22px top;
+ width: 11px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Button_rtl.css b/includes/js/dijit/themes/soria/form/Button_rtl.css
new file mode 100644
index 0000000..fd92f00
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Button_rtl.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Button_rtl.css.commented.css b/includes/js/dijit/themes/soria/form/Button_rtl.css.commented.css
new file mode 100644
index 0000000..fd92f00
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Button_rtl.css.commented.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Checkbox.css b/includes/js/dijit/themes/soria/form/Checkbox.css
new file mode 100644
index 0000000..18a1e36
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Checkbox.css
@@ -0,0 +1,42 @@
+
+.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,
+.soria .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.soria .dijitCheckBoxCheckedHover,
+ .soria .dijitCheckBoxCheckedFocused {
+
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Checkbox.css.commented.css b/includes/js/dijit/themes/soria/form/Checkbox.css.commented.css
new file mode 100644
index 0000000..afa18ba
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Checkbox.css.commented.css
@@ -0,0 +1,69 @@
+
+/*
+ * 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 { /* 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 {
+ /* checked */
+ background-position: 0px;
+}
+
+.soria .dijitCheckBoxDisabled {
+ /* disabled */
+ background-position: -48px;
+}
+
+.soria .dijitCheckBoxCheckedDisabled {
+ /* disabled but checked */
+ background-position: -32px;
+}
+
+.soria .dijitCheckBoxHover,
+.soria .dijitCheckBoxFocused {
+ /* hovering over an unchecked enabled checkbox */
+ background-position: -80px;
+}
+
+.soria .dijitCheckBoxCheckedHover,
+ .soria .dijitCheckBoxCheckedFocused {
+ /* hovering over a checked enabled checkbox */
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/soria/form/ComboBox.css b/includes/js/dijit/themes/soria/form/ComboBox.css
new file mode 100644
index 0000000..6cdbf29
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/ComboBox.css
@@ -0,0 +1,7 @@
+.soria .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left center;
+ width: 11px;
+}
+.soria .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
diff --git a/includes/js/dijit/themes/soria/form/ComboBox.css.commented.css b/includes/js/dijit/themes/soria/form/ComboBox.css.commented.css
new file mode 100644
index 0000000..b4f1439
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/ComboBox.css.commented.css
@@ -0,0 +1,7 @@
+.soria .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/spriteArrows.png") no-repeat left center;
+ width: 11px;
+}
+.soria .dijitComboBoxHover .dijitArrowButtonInner {
+ /* TODO: url("images/arrowDownHover.png") but in IE6 it flickers some? */
+}
diff --git a/includes/js/dijit/themes/soria/form/Common.css b/includes/js/dijit/themes/soria/form/Common.css
new file mode 100644
index 0000000..8d71cdb
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Common.css
@@ -0,0 +1,61 @@
+
+.soria .dijitInputField INPUT,
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner,
+.soria .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+.soria .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.soria .dijitComboBox .dijitButtonNode,
+.soria .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 1px solid #8ba0bd;
+}
+.soria .dijitTextBoxFocused,
+.soria .dijitComboBoxFocused,
+.soria .dijitSpinnerFocused {
+
+ border-color:#406b9b;
+}
+.soria .dijitComboBoxFocused .dijitButtonNode, .soria .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#8ba0bd;
+}
+.soria .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#8ba0bd;
+}
+.soria .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.soria .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.soria .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url('../images/warning.png') no-repeat center center;
+}
diff --git a/includes/js/dijit/themes/soria/form/Common.css.commented.css b/includes/js/dijit/themes/soria/form/Common.css.commented.css
new file mode 100644
index 0000000..1aaf6a4
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Common.css.commented.css
@@ -0,0 +1,82 @@
+
+/****
+ 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 .dijitInputField INPUT,
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner {
+ margin: 0em 0.1em;
+}
+
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner,
+.soria .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+
+.soria .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.soria .dijitComboBox .dijitButtonNode,
+.soria .dijitSpinner .dijitButtonNode {
+ /* line between the input area and the drop down button */
+ border-color: #8ba0bd;
+ border-left: 1px solid #8ba0bd;
+}
+
+.soria .dijitTextBoxFocused,
+.soria .dijitComboBoxFocused,
+.soria .dijitSpinnerFocused {
+ /* input field when focused (ie: typing affects it) */
+ border-color:#406b9b;
+}
+.soria .dijitComboBoxFocused .dijitButtonNode, .soria .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#8ba0bd;
+}
+.soria .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#8ba0bd;
+}
+
+.soria .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitError INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#f9f7ba !important;
+}
+
+.soria .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitErrorFocused INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#ff6 !important;
+}
+
+/* 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;
+}
diff --git a/includes/js/dijit/themes/soria/form/Common_rtl.css b/includes/js/dijit/themes/soria/form/Common_rtl.css
new file mode 100644
index 0000000..0bced8b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Common_rtl.css
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/soria/form/Common_rtl.css.commented.css b/includes/js/dijit/themes/soria/form/Common_rtl.css.commented.css
new file mode 100644
index 0000000..83f79d2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Common_rtl.css.commented.css
@@ -0,0 +1,7 @@
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+ /* line between the input area and the drop down button */
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
diff --git a/includes/js/dijit/themes/soria/form/RadioButton.css b/includes/js/dijit/themes/soria/form/RadioButton.css
new file mode 100644
index 0000000..6cdcea4
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/RadioButton.css
@@ -0,0 +1,42 @@
+
+.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 .dijitRadioCheckedDisabled {
+
+ background-position: -48px;
+}
+.soria .dijitRadioDisabled {
+
+ background-position: -32px;
+}
+.soria .dijitRadioHover,
+.soria .dijitRadioFocused {
+
+ background-position: -80px;
+}
+.soria .dijitRadioCheckedHover,
+.soria .dijitRadioCheckedFocused {
+
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/soria/form/RadioButton.css.commented.css b/includes/js/dijit/themes/soria/form/RadioButton.css.commented.css
new file mode 100644
index 0000000..dad4ac5
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/RadioButton.css.commented.css
@@ -0,0 +1,68 @@
+/*
+ * 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 { /* 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 {
+ /* selected */
+ background-position: 0px;
+}
+
+.soria .dijitRadioCheckedDisabled {
+ /* selected but disabled */
+ background-position: -48px;
+}
+
+.soria .dijitRadioDisabled {
+ /* unselected and disabled */
+ background-position: -32px;
+}
+
+.soria .dijitRadioHover,
+.soria .dijitRadioFocused {
+ /* hovering over an unselected enabled radio button */
+ background-position: -80px;
+}
+
+.soria .dijitRadioCheckedHover,
+.soria .dijitRadioCheckedFocused {
+ /* hovering over a selected enabled radio button */
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/soria/form/Slider.css b/includes/js/dijit/themes/soria/form/Slider.css
new file mode 100644
index 0000000..17e93c8
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Slider.css
@@ -0,0 +1,112 @@
+
+.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;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.soria .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+.soria .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url("../images/sliderThumbFocus.png");
+}
+.dj_ie6 .soria .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.soria .dijitSliderIncrementIconH {
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+}
+.soria .dijitSliderDecrementIconH,
+.soria .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.soria .dijitSliderDecrementIconH { background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top; }
+.soria .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.soria .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .soria .dijitSliderDisabled,
+.dj_ie6 .soria .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
diff --git a/includes/js/dijit/themes/soria/form/Slider.css.commented.css b/includes/js/dijit/themes/soria/form/Slider.css.commented.css
new file mode 100644
index 0000000..34a107a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Slider.css.commented.css
@@ -0,0 +1,136 @@
+
+/****
+ 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;
+}
+
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+
+.soria .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+
+.soria .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url("../images/sliderThumbFocus.png");
+}
+.dj_ie6 .soria .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.soria .dijitSliderIncrementIconH {
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -30px top;
+}
+
+.soria .dijitSliderDecrementIconH,
+.soria .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
+}
+.soria .dijitSliderDecrementIconH { background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top; }
+
+.soria .dijitSliderButtonInner {
+ visibility:hidden;
+}
+
+.soria .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+
+.dj_ie6 .soria .dijitSliderDisabled,
+.dj_ie6 .soria .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
diff --git a/includes/js/dijit/themes/soria/form/Slider_rtl.css b/includes/js/dijit/themes/soria/form/Slider_rtl.css
new file mode 100644
index 0000000..febfd0a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Slider_rtl.css
@@ -0,0 +1,27 @@
+
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/soria/form/Slider_rtl.css.commented.css b/includes/js/dijit/themes/soria/form/Slider_rtl.css.commented.css
new file mode 100644
index 0000000..930be3d
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Slider_rtl.css.commented.css
@@ -0,0 +1,34 @@
+
+/* Slider */
+
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/soria/form/Textarea.css b/includes/js/dijit/themes/soria/form/Textarea.css
new file mode 100644
index 0000000..0e0226b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Textarea.css
@@ -0,0 +1,11 @@
+.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 #c4c4c4;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/soria/form/Textarea.css.commented.css b/includes/js/dijit/themes/soria/form/Textarea.css.commented.css
new file mode 100644
index 0000000..b950beb
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/Textarea.css.commented.css
@@ -0,0 +1,15 @@
+.soria .dijitTextBox {
+ margin: 0em 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 #c4c4c4;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/soria/form/TimeTextBox.css b/includes/js/dijit/themes/soria/form/TimeTextBox.css
new file mode 100644
index 0000000..d450925
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/TimeTextBox.css
@@ -0,0 +1 @@
+@CHARSET "UTF-8";
diff --git a/includes/js/dijit/themes/soria/form/TimeTextBox.css.commented.css b/includes/js/dijit/themes/soria/form/TimeTextBox.css.commented.css
new file mode 100644
index 0000000..d450925
--- /dev/null
+++ b/includes/js/dijit/themes/soria/form/TimeTextBox.css.commented.css
@@ -0,0 +1 @@
+@CHARSET "UTF-8";
diff --git a/includes/js/dijit/themes/soria/images/accordionItemActive.gif b/includes/js/dijit/themes/soria/images/accordionItemActive.gif
new file mode 100644
index 0000000..249a153
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/accordionItemActive.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/accordionItemActive.png b/includes/js/dijit/themes/soria/images/accordionItemActive.png
new file mode 100644
index 0000000..92c7431
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/accordionItemActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/buttonActive.png b/includes/js/dijit/themes/soria/images/buttonActive.png
new file mode 100644
index 0000000..f815983
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/buttonActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/buttonDisabled.png b/includes/js/dijit/themes/soria/images/buttonDisabled.png
new file mode 100644
index 0000000..f76e4ab
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/buttonDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/buttonEnabled.png b/includes/js/dijit/themes/soria/images/buttonEnabled.png
new file mode 100644
index 0000000..3c55c83
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/buttonEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/buttonHover.png b/includes/js/dijit/themes/soria/images/buttonHover.png
new file mode 100644
index 0000000..a22ebda
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/buttonHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/dndCopy.png b/includes/js/dijit/themes/soria/images/dndCopy.png
new file mode 100644
index 0000000..baecd7c
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/dndCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/dndMove.png b/includes/js/dijit/themes/soria/images/dndMove.png
new file mode 100644
index 0000000..07f878c
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/dndMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/dndNoCopy.png b/includes/js/dijit/themes/soria/images/dndNoCopy.png
new file mode 100644
index 0000000..9bf9c33
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/dndNoCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/dndNoMove.png b/includes/js/dijit/themes/soria/images/dndNoMove.png
new file mode 100644
index 0000000..cb8bd8b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/dndNoMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/editor.gif b/includes/js/dijit/themes/soria/images/editor.gif
new file mode 100644
index 0000000..1c96329
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/editor.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/editor_rtl.gif b/includes/js/dijit/themes/soria/images/editor_rtl.gif
new file mode 100644
index 0000000..ef04938
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/editor_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/preciseSliderThumb.gif b/includes/js/dijit/themes/soria/images/preciseSliderThumb.gif
new file mode 100644
index 0000000..53b33e5
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/preciseSliderThumb.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/preciseSliderThumb.png b/includes/js/dijit/themes/soria/images/preciseSliderThumb.png
new file mode 100644
index 0000000..045bf35
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/preciseSliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif b/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif
new file mode 100644
index 0000000..8c6f92e
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.png b/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.png
new file mode 100644
index 0000000..c235849
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/progressBarAnim.gif b/includes/js/dijit/themes/soria/images/progressBarAnim.gif
new file mode 100644
index 0000000..73e25e1
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/progressBarAnim.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/progressBarEmpty.png b/includes/js/dijit/themes/soria/images/progressBarEmpty.png
new file mode 100644
index 0000000..04d81df
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/progressBarEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/progressBarFull.png b/includes/js/dijit/themes/soria/images/progressBarFull.png
new file mode 100644
index 0000000..bed17b3
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/progressBarFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderEmpty.png b/includes/js/dijit/themes/soria/images/sliderEmpty.png
new file mode 100644
index 0000000..99fbd72
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderEmptyVertical.png b/includes/js/dijit/themes/soria/images/sliderEmptyVertical.png
new file mode 100644
index 0000000..2d497e3
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderEmptyVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderFull.png b/includes/js/dijit/themes/soria/images/sliderFull.png
new file mode 100644
index 0000000..171eb54
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderFullFocus.png b/includes/js/dijit/themes/soria/images/sliderFullFocus.png
new file mode 100644
index 0000000..0956a72
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderFullFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderFullVertical.png b/includes/js/dijit/themes/soria/images/sliderFullVertical.png
new file mode 100644
index 0000000..35845da
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderFullVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderFullVerticalFocus.png b/includes/js/dijit/themes/soria/images/sliderFullVerticalFocus.png
new file mode 100644
index 0000000..9b158bb
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderFullVerticalFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderThumb.png b/includes/js/dijit/themes/soria/images/sliderThumb.png
new file mode 100644
index 0000000..b6abbd2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderThumbFocus.gif b/includes/js/dijit/themes/soria/images/sliderThumbFocus.gif
new file mode 100644
index 0000000..f8d306f
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/sliderThumbFocus.png b/includes/js/dijit/themes/soria/images/sliderThumbFocus.png
new file mode 100644
index 0000000..73ee705
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/sliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png b/includes/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png
new file mode 100644
index 0000000..0e8f397
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/splitContainerSizerH.png b/includes/js/dijit/themes/soria/images/splitContainerSizerH.png
new file mode 100644
index 0000000..7cdf79a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/splitContainerSizerH.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png b/includes/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png
new file mode 100644
index 0000000..7f12fed
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/splitContainerSizerV.png b/includes/js/dijit/themes/soria/images/splitContainerSizerV.png
new file mode 100644
index 0000000..9ff14d6
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/splitContainerSizerV.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteArrows.gif b/includes/js/dijit/themes/soria/images/spriteArrows.gif
new file mode 100644
index 0000000..fc81207
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteArrows.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteArrows.png b/includes/js/dijit/themes/soria/images/spriteArrows.png
new file mode 100644
index 0000000..73aa700
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteArrows.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteCheckbox.gif b/includes/js/dijit/themes/soria/images/spriteCheckbox.gif
new file mode 100644
index 0000000..d2c4ebf
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteCheckbox.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteCheckbox.png b/includes/js/dijit/themes/soria/images/spriteCheckbox.png
new file mode 100644
index 0000000..e992330
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteCheckbox.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteDivIcons.gif b/includes/js/dijit/themes/soria/images/spriteDivIcons.gif
new file mode 100644
index 0000000..f5c58e4
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteDivIcons.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteDivIcons.png b/includes/js/dijit/themes/soria/images/spriteDivIcons.png
new file mode 100644
index 0000000..d76325f
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteDivIcons.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRadio.gif b/includes/js/dijit/themes/soria/images/spriteRadio.gif
new file mode 100644
index 0000000..8dd6e57
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRadio.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRadio.png b/includes/js/dijit/themes/soria/images/spriteRadio.png
new file mode 100644
index 0000000..14c1080
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRadio.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif
new file mode 100644
index 0000000..795ea84
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png
new file mode 100644
index 0000000..10c0d13
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif
new file mode 100644
index 0000000..6758181
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png
new file mode 100644
index 0000000..2c9f51a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteTree.gif b/includes/js/dijit/themes/soria/images/spriteTree.gif
new file mode 100644
index 0000000..e546e28
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteTree.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteTree.png b/includes/js/dijit/themes/soria/images/spriteTree.png
new file mode 100644
index 0000000..33ae07b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteTree.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteTree_rtl.gif b/includes/js/dijit/themes/soria/images/spriteTree_rtl.gif
new file mode 100644
index 0000000..bbcc64b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteTree_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/spriteTree_rtl.png b/includes/js/dijit/themes/soria/images/spriteTree_rtl.png
new file mode 100644
index 0000000..b06afdb
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/spriteTree_rtl.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomActiveC.gif b/includes/js/dijit/themes/soria/images/tabBottomActiveC.gif
new file mode 100644
index 0000000..fb61df9
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomActiveC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif b/includes/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
new file mode 100644
index 0000000..7c2ed86
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomEnabledC.gif b/includes/js/dijit/themes/soria/images/tabBottomEnabledC.gif
new file mode 100644
index 0000000..0a5f0f8
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomEnabledC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif b/includes/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif
new file mode 100644
index 0000000..a77da39
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomHoverC.gif b/includes/js/dijit/themes/soria/images/tabBottomHoverC.gif
new file mode 100644
index 0000000..47b9da2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomHoverC.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif b/includes/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
new file mode 100644
index 0000000..59f3edd
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabContainerSprite.gif b/includes/js/dijit/themes/soria/images/tabContainerSprite.gif
new file mode 100644
index 0000000..f0b3842
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabContainerSprite.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabLeftChecked.gif b/includes/js/dijit/themes/soria/images/tabLeftChecked.gif
new file mode 100644
index 0000000..3e7475a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabLeftChecked.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabRightChecked.gif b/includes/js/dijit/themes/soria/images/tabRightChecked.gif
new file mode 100644
index 0000000..ec4b659
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabRightChecked.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabStripe.gif b/includes/js/dijit/themes/soria/images/tabStripe.gif
new file mode 100644
index 0000000..51a2d40
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabStripe.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabStripeBottom.gif b/includes/js/dijit/themes/soria/images/tabStripeBottom.gif
new file mode 100644
index 0000000..41b1ac0
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabStripeBottom.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabStripeLeft.gif b/includes/js/dijit/themes/soria/images/tabStripeLeft.gif
new file mode 100644
index 0000000..b2214fa
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabStripeLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tabStripeRight.gif b/includes/js/dijit/themes/soria/images/tabStripeRight.gif
new file mode 100644
index 0000000..bff3115
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tabStripeRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/titleBar.png b/includes/js/dijit/themes/soria/images/titleBar.png
new file mode 100644
index 0000000..cbf98da
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/titleBar.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/titleBarActive.png b/includes/js/dijit/themes/soria/images/titleBarActive.png
new file mode 100644
index 0000000..92c7431
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/titleBarActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorDown.gif b/includes/js/dijit/themes/soria/images/tooltipConnectorDown.gif
new file mode 100644
index 0000000..9c38495
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorDown.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorDown.png b/includes/js/dijit/themes/soria/images/tooltipConnectorDown.png
new file mode 100644
index 0000000..d75af71
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.gif b/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.gif
new file mode 100644
index 0000000..fc947e0
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.png b/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.png
new file mode 100644
index 0000000..f3de66a
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorLeft.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorRight.gif b/includes/js/dijit/themes/soria/images/tooltipConnectorRight.gif
new file mode 100644
index 0000000..b0e8097
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorRight.png b/includes/js/dijit/themes/soria/images/tooltipConnectorRight.png
new file mode 100644
index 0000000..ed6efc4
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorRight.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorUp.gif b/includes/js/dijit/themes/soria/images/tooltipConnectorUp.gif
new file mode 100644
index 0000000..54bcf65
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorUp.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/tooltipConnectorUp.png b/includes/js/dijit/themes/soria/images/tooltipConnectorUp.png
new file mode 100644
index 0000000..7f7a5d8
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/tooltipConnectorUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/treeExpand_loading.gif b/includes/js/dijit/themes/soria/images/treeExpand_loading.gif
new file mode 100644
index 0000000..db9ddd0
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/treeExpand_loading.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/treeI.gif b/includes/js/dijit/themes/soria/images/treeI.gif
new file mode 100644
index 0000000..6f669e2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/treeI.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/treeI_half.gif b/includes/js/dijit/themes/soria/images/treeI_half.gif
new file mode 100644
index 0000000..e5fd015
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/treeI_half.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/treeI_half_rtl.gif b/includes/js/dijit/themes/soria/images/treeI_half_rtl.gif
new file mode 100644
index 0000000..44ad021
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/treeI_half_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/treeI_rtl.gif b/includes/js/dijit/themes/soria/images/treeI_rtl.gif
new file mode 100644
index 0000000..0d32a2f
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/treeI_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/validationInputBg.gif b/includes/js/dijit/themes/soria/images/validationInputBg.gif
new file mode 100644
index 0000000..c28475c
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/validationInputBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/validationInputBg.png b/includes/js/dijit/themes/soria/images/validationInputBg.png
new file mode 100644
index 0000000..f3039f9
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/validationInputBg.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/images/warning.png b/includes/js/dijit/themes/soria/images/warning.png
new file mode 100644
index 0000000..c52f83d
--- /dev/null
+++ b/includes/js/dijit/themes/soria/images/warning.png
Binary files differ
diff --git a/includes/js/dijit/themes/soria/layout/AccordionContainer.css b/includes/js/dijit/themes/soria/layout/AccordionContainer.css
new file mode 100644
index 0000000..5824f35
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/AccordionContainer.css
@@ -0,0 +1,39 @@
+
+
+.soria .dijitAccordionContainer {
+ border-color: #b1badf;
+}
+.soria .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+}
+.soria .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x top left;
+ border-top: 1px solid #b9bbdd;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+.soria .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+.soria .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+.soria .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -15px top;
+ margin-top:-1px;
+}
+.soria .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css b/includes/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css
new file mode 100644
index 0000000..fb299df
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css
@@ -0,0 +1,48 @@
+/**
+ * dijit.layout.Accordioncontainer
+ *
+ */
+
+.soria .dijitAccordionContainer {
+ border-color: #b1badf;
+}
+
+.soria .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+}
+
+.soria .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x top left;
+ border-top: 1px solid #b9bbdd;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+
+.soria .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+
+.soria .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+
+.soria .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -15px top;
+ margin-top:-1px;
+}
+
+.soria .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css b/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css
new file mode 100644
index 0000000..4ceda54
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css b/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css
new file mode 100644
index 0000000..4ceda54
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css
@@ -0,0 +1,3 @@
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/soria/layout/BorderContainer.css b/includes/js/dijit/themes/soria/layout/BorderContainer.css
new file mode 100644
index 0000000..84883ba
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/BorderContainer.css
@@ -0,0 +1,27 @@
+
+.soria .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.soria .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.soria .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.soria .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/soria/layout/BorderContainer.css.commented.css b/includes/js/dijit/themes/soria/layout/BorderContainer.css.commented.css
new file mode 100644
index 0000000..b21c545
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/BorderContainer.css.commented.css
@@ -0,0 +1,34 @@
+/**
+ * dijit.layout.BorderContainer
+ *
+ */
+
+.soria .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+
+.soria .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+
+.soria .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+
+.soria .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/soria/layout/SplitContainer.css b/includes/js/dijit/themes/soria/layout/SplitContainer.css
new file mode 100644
index 0000000..88b0de2
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/SplitContainer.css
@@ -0,0 +1,27 @@
+
+.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;
+}
diff --git a/includes/js/dijit/themes/soria/layout/SplitContainer.css.commented.css b/includes/js/dijit/themes/soria/layout/SplitContainer.css.commented.css
new file mode 100644
index 0000000..743a99b
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/SplitContainer.css.commented.css
@@ -0,0 +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;
+ 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;
+}
diff --git a/includes/js/dijit/themes/soria/layout/TabContainer.css b/includes/js/dijit/themes/soria/layout/TabContainer.css
new file mode 100644
index 0000000..c1a6858
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/TabContainer.css
@@ -0,0 +1,281 @@
+
+
+.soria .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #b1badf;
+}
+.soria .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: -1px;
+}
+.soria dijitTabChecked {
+ margin-bottom: -2px;
+}
+.soria .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
+}
+.soria .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+.soria .dijitTabHover,
+.soria .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+}
+.soria .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
+ border: none;
+}
+.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+.soria .dijitTabChecked,
+.soria .dijitTabCloseButtonChecked
+{
+
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+}
+.soria .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
+ border: none;
+}
+.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+.soria .dijitTabLabels-top {
+ border-left: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ padding-top: 2px;
+ padding-left: 3px;
+ padding-right: 3px;
+ background: #F0F4FC url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-bottom: 4px;
+}
+.soria .dijitAlignLeft .dijitTab,
+.soria .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.soria .dijitAlignTop .dijitTabChecked,
+.soria .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+
+}
+.soria .dijitAlignLeft .dijitTabChecked,
+.soria .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.soria .dijitAlignRight .dijitTabChecked,
+.soria .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.soria .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeBottom.gif") repeat-x left top;
+ padding-top: 3px;
+ padding-right: 3px;
+}
+.soria .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+.soria .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+.soria .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
+}
+.soria .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabHover,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
+}
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+.dj_ie6 .soria .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+}
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+.soria .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+.soria .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+.soria .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url("../images/tabLeftChecked.gif") no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #8ba0bd !important;
+}
+.soria .dijitAlignLeft .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeLeft.gif") repeat-y right top;
+ padding-right: 3px;
+}
+.soria .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.soria .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeRight.gif") repeat-y left top;
+ padding-left: 3px;
+}
+.soria .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+.soria .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+.soria .dijitAlignRight .dijitTabChecked {
+ background: url("../images/tabRightChecked.gif") no-repeat left top !important;
+}
+.soria .dijitAlignRight .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
+}
+.soria .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.soria .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #8ba0bd !important;
+}
+.soria .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitTab .dijitClosable {
+ position: relative;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+.soria .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+.soria .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/spriteRoundedIconsSmallBl.png") no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px top;
+}
+.dj_ie6 .soria .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px top;
+}
+.soria .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.png") no-repeat -60px -15px !important;
+}
+.dj_ie6 .soria .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px -15px !important;
+}
+.dj_ie6 .soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.soria .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/soria/layout/TabContainer.css.commented.css b/includes/js/dijit/themes/soria/layout/TabContainer.css.commented.css
new file mode 100644
index 0000000..c559cfc
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/TabContainer.css.commented.css
@@ -0,0 +1,372 @@
+/**
+ * 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 .dijitTabPaneWrapper { /* Container for tab content */
+ /*
+ overflow: hidden;
+ */
+ background:#fff;
+ border:1px solid #b1badf;
+}
+
+.soria .dijitTab {
+ line-height:normal;
+ margin-right:3px; /* space between one tab and the next in top/bottom mode */
+ padding:0px;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: -1px;
+}
+
+.soria dijitTabChecked {
+ margin-bottom: -2px;
+}
+
+.soria .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
+}
+
+.soria .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+
+.soria .dijitTabHover,
+.soria .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
+}
+
+.soria .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
+ border: none;
+}
+
+.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+
+.soria .dijitTabChecked,
+.soria .dijitTabCloseButtonChecked
+{
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabContainerSprite.gif") no-repeat 0px -0px;
+}
+
+.soria .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
+ border: none;
+}
+
+.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+
+/* top specific classes */
+
+.soria .dijitTabLabels-top {
+ border-left: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ padding-top: 2px;
+ padding-left: 3px;
+ padding-right: 3px;
+ background: #F0F4FC url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-bottom: 4px;
+}
+/*
+.soria .dijitAlignTop .dijitTabStripe {
+ background: url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-left: 2px;
+ padding-top: 0px;
+ height: 4px;
+ clear: both;
+ font-size: 1px;
+ margin-left: -3px;
+}
+*/
+
+.soria .dijitAlignLeft .dijitTab,
+.soria .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px; /* space between one tab and the next in left/right mode */
+}
+
+/* make the active tab white on the side next to the content pane */
+.soria .dijitAlignTop .dijitTabChecked,
+.soria .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+ /*-moz-border-radius:2px 2px 0px 0px; eliminate some border detritrus on moz */
+}
+
+.soria .dijitAlignLeft .dijitTabChecked,
+.soria .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+
+.soria .dijitAlignRight .dijitTabChecked,
+.soria .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+
+/* bottom specific classes */
+
+.soria .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeBottom.gif") repeat-x left top;
+ padding-top: 3px;
+ padding-right: 3px;
+}
+/*
+.soria .dijitAlignBottom .dijitTabStripe {
+ background: url("../images/tabStripe.gif") repeat-x left bottom;
+ padding-left: 2px;
+ padding-top: 0px;
+ height: 4px;
+ clear: both;
+ font-size: 1px;
+ margin-left: -3px;
+}
+*/
+.soria .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px; /* space between one tab and the next in top/bottom mode */
+ padding:0px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+
+.soria .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+
+.soria .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
+}
+
+.soria .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.soria .dijitAlignBottom .dijitTabHover,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
+}
+
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+
+.dj_ie6 .soria .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ /* the selected tab (with or without hover) */
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+}
+
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
+ border: none;
+}
+
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+
+/* left specific classes */
+.soria .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+
+.soria .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+
+.soria .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url("../images/tabLeftChecked.gif") no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #8ba0bd !important;
+}
+
+.soria .dijitAlignLeft .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+
+.soria .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeLeft.gif") repeat-y right top;
+ padding-right: 3px;
+}
+
+.soria .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+
+/* right specific classes */
+.soria .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url("../images/tabStripeRight.gif") repeat-y left top;
+ padding-left: 3px;
+}
+
+.soria .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+
+.soria .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+
+.soria .dijitAlignRight .dijitTabChecked {
+ background: url("../images/tabRightChecked.gif") no-repeat left top !important;
+}
+
+.soria .dijitAlignRight .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
+}
+.soria .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+
+.soria .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #8ba0bd !important;
+}
+
+.soria .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+
+/* make space for a positioned close button */
+.soria .dijitTab .dijitClosable {
+ position: relative;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+
+.soria .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+
+.soria .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/spriteRoundedIconsSmallBl.png") no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px top;
+}
+.dj_ie6 .soria .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px top;
+}
+
+.soria .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.png") no-repeat -60px -15px !important;
+}
+.dj_ie6 .soria .dijitTabHover .dijitClosable .closeImage {
+ background: url("../images/spriteRoundedIconsSmallBl.gif") no-repeat -60px -15px !important;
+}
+
+/* correct for IE6.
+ We cant force hasLayout as that blows out the shrink wrapped tabs
+ ..so we shim in the closeImage position properties instead
+*/
+.dj_ie6 .soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+
+.soria .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+
+.soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css b/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css
new file mode 100644
index 0000000..1f498ce
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css
@@ -0,0 +1,55 @@
+
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
diff --git a/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css b/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css
new file mode 100644
index 0000000..d0b6c84
--- /dev/null
+++ b/includes/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css
@@ -0,0 +1,69 @@
+/* TabContainer */
+
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px; /* space between one tab and the next in top/bottom mode */
+}
+
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px; /* space between one tab and the next in top/bottom mode */
+}
+
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
diff --git a/includes/js/dijit/themes/soria/soria.css b/includes/js/dijit/themes/soria/soria.css
new file mode 100644
index 0000000..f965241
--- /dev/null
+++ b/includes/js/dijit/themes/soria/soria.css
@@ -0,0 +1,1386 @@
+
+@import url("../dijit.css");
+.soria .dijitSliderDisabled *,
+.soria .dijitDisabledClickableRegion,
+.soria .dijitSpinnerDisabled *,
+.soria .dijitButtonDisabled *,
+.soria .dijitDropDownButtonDisabled *,
+.soria .dijitComboButtonDisabled *,
+.soria .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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 .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #b1badf;
+}
+.soria .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url(images/tabContainerSprite.gif) no-repeat 0 -300px;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: -1px;
+}
+.soria dijitTabChecked {
+ margin-bottom: -2px;
+}
+.soria .dijitTabInnerDiv .dijitTabContent {
+ padding:8px 10px 4px 10px;
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
+}
+.soria .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabContainerSprite.gif) no-repeat;
+ background-position: right -400px;
+ border: none;
+}
+.soria .dijitTabHover,
+.soria .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url(images/tabContainerSprite.gif) no-repeat 0px -150px;
+}
+.soria .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -250px;
+ border: none;
+}
+.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -200px;
+ padding:8px 10px 4px 10px;
+}
+.soria .dijitTabChecked,
+.soria .dijitTabCloseButtonChecked
+{
+
+ background: url(images/tabContainerSprite.gif) no-repeat 0px -0px;
+}
+.soria .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabContainerSprite.gif) no-repeat right -100px;
+ border: none;
+}
+.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabContainerSprite.gif) repeat-x 0 -50px;
+ padding:8px 10px 5px 10px;
+ color: #243C5F !important;
+}
+.soria .dijitTabLabels-top {
+ border-left: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ padding-top: 2px;
+ padding-left: 3px;
+ padding-right: 3px;
+ background: #F0F4FC url(images/tabStripe.gif) repeat-x left bottom;
+ padding-bottom: 4px;
+}
+.soria .dijitAlignLeft .dijitTab,
+.soria .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.soria .dijitAlignTop .dijitTabChecked,
+.soria .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+
+}
+.soria .dijitAlignLeft .dijitTabChecked,
+.soria .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.soria .dijitAlignRight .dijitTabChecked,
+.soria .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.soria .dijitTabLabels-bottom {
+ padding-bottom: 2px;
+ padding-left: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-right: 1px solid #b1badf;
+ background: #F0F4FC url(images/tabStripeBottom.gif) repeat-x left top;
+ padding-top: 3px;
+ padding-right: 3px;
+}
+.soria .dijitAlignBottom .dijitTab {
+ line-height:normal;
+ margin-right:3px;
+ padding:0px;
+ background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom left;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+ margin-bottom: 0px;
+ margin-top: 1px;
+}
+.soria .dijitAlignBottom .dijitTabChecked {
+ margin-bottom: 0px;
+ margin-top: 0px !important;
+}
+.soria .dijitAlignBottom .dijitTabInnerDiv .dijitTabContent {
+ padding:6px 10px 6px 10px;
+ background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
+}
+.soria .dijitAlignBottom .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabHover,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ color: #243C5F;
+ background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom left;
+}
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv {
+ background: url(images/tabBottomHoverSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabHover .dijitTabInnerDiv .dijitTabContent,
+.soria .dijitAlignBottom .dijitTabCloseButtonHover .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabBottomHoverC.gif) repeat-x bottom left;
+ padding:6px 10px 6px 10px;
+}
+.dj_ie6 .soria .dijitAlignBottom .dijitTabHover,
+.dj_ie6 .soria .dijitAlignBottom .dijitTabCloseButtonHover {
+ background-image: url(images/tabHover.gif);
+}
+.soria .dijitAlignBottom .dijitTabChecked,
+.soria .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+
+ background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom left;
+}
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv {
+ padding:0px 10px 0px 10px;
+ background: url(images/tabBottomActiveSpriteLR.gif) no-repeat bottom right;
+ border: none;
+}
+.soria .dijitAlignBottom .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+ background: url(images/tabBottomActiveC.gif) repeat-x bottom left;
+ padding:7px 10px 6px 10px;
+}
+.soria .dijitAlignLeft .dijitTab {
+ margin-right: 1px !important;
+}
+.soria .dijitAlignLeft .dijitTabChecked {
+ margin-right: 0px !important;
+}
+.soria .dijitAlignLeft .dijitTabChecked .dijitTabInnerDiv {
+ background: url(images/tabLeftChecked.gif) no-repeat right top !important;
+ padding-left: 10px;
+ border-bottom: 1px solid #8ba0bd !important;
+}
+.soria .dijitAlignLeft .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -350px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignLeft .dijitTabHover .dijitTabInnerDiv {
+ background: url(images/tabContainerSprite.gif) no-repeat right -200px;
+ padding-left: 10px;
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitTabLabels-left-h {
+ padding-left: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-left: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url(images/tabStripeLeft.gif) repeat-y right top;
+ padding-right: 3px;
+}
+.soria .dijitAlignLeft .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.soria .dijitTabLabels-right-h {
+ padding-right: 2px;
+ padding-top: 3px;
+ background-color: #f0f4fc;
+ border-right: 1px solid #b1badf;
+ border-bottom: 1px solid #b1badf;
+ border-top: 1px solid #b1badf;
+ background: #F0F4FC url(images/tabStripeRight.gif) repeat-y left top;
+ padding-left: 3px;
+}
+.soria .dijitAlignRight .dijitTab {
+ margin-left: 1px;
+}
+.soria .dijitAlignRight .dijitTabChecked {
+ margin-left: 0px;
+}
+.soria .dijitAlignRight .dijitTabChecked {
+ background: url(images/tabRightChecked.gif) no-repeat left top !important;
+}
+.soria .dijitAlignRight .dijitTab {
+ background: url(images/tabContainerSprite.gif) no-repeat left -350px;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTab {
+ background: url(images/tabContainerSprite.gif) no-repeat left -200px;
+}
+.soria .dijitAlignRight .dijitTabInnerDiv .dijitTabContent {
+ padding:7px 10px 6px 10px !important;
+}
+.soria .dijitAlignRight .dijitTabChecked .dijitTabInnerDiv {
+ border-bottom: 1px solid #8ba0bd !important;
+}
+.soria .dijitAlignRight .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitAlignRight .dijitTabHover .dijitTabInnerDiv {
+ border-bottom: 1px solid #b9bbdd;
+}
+.soria .dijitTab .dijitClosable {
+ position: relative;
+ padding-left: 10px !important;
+ padding-right: 20px !important;
+}
+.soria .dijitTab img {
+ padding: 0;
+ margin: 0;
+}
+.soria .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 5px;
+ right: 5px;
+ height: 15px;
+ width: 15px;
+ padding: 0;
+ margin: 0;
+ background: url(images/spriteRoundedIconsSmallBl.png) no-repeat -60px top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background:url(images/spriteRoundedIconsSmallBl.gif) no-repeat -60px top;
+}
+.dj_ie6 .soria .dijitTabCloseButton .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmallBl.gif) no-repeat -60px top;
+}
+.soria .dijitTabHover .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmallBl.png) no-repeat -60px -15px !important;
+}
+.dj_ie6 .soria .dijitTabHover .dijitClosable .closeImage {
+ background: url(images/spriteRoundedIconsSmallBl.gif) no-repeat -60px -15px !important;
+}
+.dj_ie6 .soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.soria .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.soria .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
+
+
+.soria .dijitAccordionContainer {
+ border-color: #b1badf;
+}
+.soria .dijitAccordionPane {
+ background-color: #e7e7e7;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #373941;
+}
+.soria .dijitAccordionTitle {
+ background:#fafafa url(images/titleBar.png) repeat-x top left;
+ border-top: 1px solid #b9bbdd;
+ padding: 5px 4px 6px 8px;
+ cursor:pointer;
+}
+.soria .dijitAccordionTitle-selected {
+ 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;
+ cursor: default;
+ color: #243C5F;
+}
+.soria .dijitAccordionArrow {
+ background:url(images/spriteRoundedIconsSmallBl.gif) no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:-1px;
+}
+.soria .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:url(images/spriteRoundedIconsSmallBl.gif) no-repeat -15px top;
+ margin-top:-1px;
+}
+.soria .dijitAccordionBody {
+ background: #fff;
+}
+
+.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 .dijitSplitterH {
+ background:url(images/splitContainerSizerH.png) repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.soria .dijitSplitterH .dijitSplitterThumb {
+ background:url(images/splitContainerSizerH-thumb.png) no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.soria .dijitSplitterV {
+ background:url(images/splitContainerSizerV.png) repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.soria .dijitSplitterV .dijitSplitterThumb {
+ background:url(images/splitContainerSizerV-thumb.png) no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
+.soria .dijitInputField INPUT,
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.soria .dijitTextBox,
+.soria .dijitComboBox,
+.soria .dijitSpinner,
+.soria .dijitInlineEditor input,
+.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;
+ line-height: normal;
+}
+.soria .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.soria .dijitComboBox .dijitButtonNode,
+.soria .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 1px solid #8ba0bd;
+}
+.soria .dijitTextBoxFocused,
+.soria .dijitComboBoxFocused,
+.soria .dijitSpinnerFocused {
+
+ border-color:#406b9b;
+}
+.soria .dijitComboBoxFocused .dijitButtonNode, .soria .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#8ba0bd;
+}
+.soria .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#8ba0bd;
+}
+.soria .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.soria .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .soria .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.soria .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url(images/warning.png) no-repeat center center;
+}
+.soria .dijitButtonNode {
+
+
+ border:1px solid #8ba0bd;
+ border-bottom:1px solid #657c9c;
+ border-right:1px solid #657c9c;
+ padding: 0.2em;
+ background:#bcd5f0 url(images/buttonEnabled.png) repeat-x top left;
+}
+.dj_ie .soria .dijitButtonNode {
+ zoom: 1;
+}
+.soria .dijitButtonText {
+ padding: 0 0.3em;
+}
+.soria .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.soria .dijitArrowButton {
+ color: #111;
+}
+.soria .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .soria .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.soria .dijitButtonDisabled .dijitButtonNode,
+.soria .dijitToggleButtonDisabled .dijitButtonNode,
+.soria .dijitDropDownButtonDisabled .dijitButtonNode,
+.soria .dijitComboButtonDisabled .dijitButtonNode,
+.soria .dijitComboBoxDisabled,
+.soria .dijitSpinnerDisabled,
+.soria .dijitSpinnerDisabled .dijitButtonNode {
+
+ border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+
+ background:#c3d3e5 url(images/buttonDisabled.png) top repeat-x;
+ opacity: 0.60;
+}
+.dj_ie .soria .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .soria .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.soria .dijitButtonHover .dijitButtonNode,
+.soria .dijitToggleButtonHover .dijitButtonNode,
+.soria .dijitDropDownButtonHover .dijitButtonNode,
+.soria .dijitComboButtonHover .dijitButtonContents,
+.soria .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.soria .dijitComboBoxHover .dijitDownArrowButton,
+.soria .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ color:#000;
+ background:#acc5e2 url(images/buttonHover.png) repeat-x top left;
+}
+.soria .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.soria .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.soria .dijitButtonActive .dijitButtonNode,
+.soria .dijitToggleButtonActive .dijitButtonNode,
+.soria .dijitDropDownButtonActive .dijitButtonNode,
+.soria .dijitComboButtonActive .dijitButtonContents,
+.soria .dijitDownArrowActive .dijitDownArrowButton,
+.soria .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#657c9c;
+ background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
+}
+.soria .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat left top;
+ width: 11px;
+}
+.soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat -22px top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitArrowButtonInner {
+ background:url(images/spriteArrows.gif) no-repeat left top;
+ width: 11px;
+}
+.dj_ie6 .soria .dijitUpArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.gif) no-repeat -22px top;
+ width: 11px;
+}
+.soria .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url(images/spriteArrows.png) no-repeat left center;
+ width: 11px;
+}
+.soria .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
+.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,
+.soria .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.soria .dijitCheckBoxCheckedHover,
+ .soria .dijitCheckBoxCheckedFocused {
+
+ 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 .dijitRadioCheckedDisabled {
+
+ background-position: -48px;
+}
+.soria .dijitRadioDisabled {
+
+ background-position: -32px;
+}
+.soria .dijitRadioHover,
+.soria .dijitRadioFocused {
+
+ background-position: -80px;
+}
+.soria .dijitRadioCheckedHover,
+.soria .dijitRadioCheckedFocused {
+
+ background-position: -64px;
+}
+.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 #c4c4c4;
+ line-height: normal;
+}
+.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;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.soria .dijitSliderImageHandleH {
+ border:0px;
+ width:15px;
+ height:18px;
+ background:url(images/preciseSliderThumb.png) no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+.soria .dijitSliderFocused .dijitSliderImageHandleV {
+ background-image:url(images/sliderThumbFocus.png);
+}
+.dj_ie6 .soria .dijitSliderFocused .dijitSliderImageHandleV {
+ 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;
+ width:15px; height:15px;
+ cursor:pointer;
+}
+.soria .dijitSliderIncrementIconH {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.soria .dijitSliderDecrementIconH,
+.soria .dijitSliderDecrementIconV {
+ width:15px;
+ height:15px;
+ cursor:pointer;
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
+}
+.soria .dijitSliderDecrementIconH { background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top; }
+.soria .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.soria .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .soria .dijitSliderDisabled,
+.dj_ie6 .soria .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .soria .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
+.soria .dijitTreeNode {
+ background : url(images/treeI.gif) no-repeat;
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1;
+}
+.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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.soria .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.soria .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.soria .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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 .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 .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url(images/titleBar.png) repeat-x top left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ font-weight: bold;
+ color: #6d6d6d;
+}
+.soria .dijitTitlePane .dijitArrowNode {
+ width:15px;
+ height:15px;
+ float:right;
+ margin-top: -2px;
+}
+.soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.soria .dijitOpen .dijitTitlePaneTextNode {
+ color: #243C5F;
+}
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background: url(images/spriteRoundedIconsSmall.png) no-repeat top left;
+}
+.dj_ie6 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat top left;
+}
+.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 .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.soria .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.soria .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.soria .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 0px solid #3d3d3d;
+}
+.soria .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .soria .dijitTitlePaneContentOuter,
+.dj_ie6 .soria .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.soria .dijitClickableRegion {
+ background-color : #ffc !important;
+}
+
+.soria .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .soria .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.soria .dijitCalendarIncreaseInner,
+.soria .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.soria .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat top left;
+}
+.dj_ie6 .soria .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat top left;
+}
+.soria .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .soria .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat -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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .soria .dijitCalendarDateTemplate,
+.dj_ie6 .soria .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.soria .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.1em 0.3em;
+ letter-spacing: 1px;
+ background-color: #fff;
+ border:#fff solid 1px !important;
+}
+.soria .dijitCalendarPreviousMonth,
+.soria .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#fdfdfd !important;
+ border:#fdfdfd solid 1px !important;
+}
+.soria .dijitCalendarPreviousMonthDisabled,
+.soria .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.soria .dijitCalendarCurrentMonth {
+
+}
+.soria .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.soria .dijitCalendarDisabledDate {
+
+
+ text-decoration:line-through !important;
+ cursor:default !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 .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url(images/titleBar.png) repeat-x top left;
+}
+.soria .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.soria .dijitToolbar .dijitButton,
+.soria .dijitToolbar .dijitToggleButton,
+.soria .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.soria .dijitToolbar .dijitButtonChecked,
+.soria .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.soria .dijitToolbar .dijitButtonCheckedHover,
+.soria .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.soria .dijitToolbar .dijitButtonHover,
+.soria .dijitToolbar .dijitToggleButtonHover,
+.soria .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #316ac5;
+ background-color:#9abbea;
+}
+.soria .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .soria.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButton,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButton,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#d8e5f8;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .soria .dijitToolbar .dijitButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .soria .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#9abbea;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.soria .dijitDialog {
+ background: #eee;
+ border: 1px solid #cbcbcb;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.soria .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+ font-size: 0.9em;
+ color: #3243C5F;
+}
+.soria .dijitDialog .dijitDialogPaneContent {
+ background: #ffffff;
+ border:none;
+ border-top: 1px solid #b1badf;
+ padding:10px;
+}
+.soria .dijitDialogTitleBar {
+
+ background: #fafafa url(images/titleBar.png) repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.soria .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.soria .dijitDialogCloseIcon {
+
+ background : url(images/spriteRoundedIconsSmallBl.png) no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .soria .dijitDialogCloseIcon {
+ background : url(images/spriteRoundedIconsSmallBl.gif) no-repeat right top;
+}
+.soria .dijitDialogContent {
+
+ padding: 8px;
+}
+.soria .dijitTooltip,
+.soria .dijitTooltipDialog {
+
+ opacity: 0.95;
+ 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_ie6 .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_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorDown.gif);
+ bottom: -5px;
+}
+.soria .dijitTooltipLeft {
+ padding-right: 10px;
+}
+.dj_ie6 .soria .dijitTooltipLeft {
+ padding-left: 11px;
+}
+.soria .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorRight.png) no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorRight.gif);
+}
+.soria .dijitTooltipRight {
+ padding-left: 10px;
+}
+.soria .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorLeft.png) no-repeat top left;
+ width:11px;
+ height:17px;
+}
+.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorLeft.gif);
+}
+.soria .dijitMenu {
+ border: 1px solid #cbcbcb;
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+}
+.soria .dijitMenuItem {
+ background-color: #fff;
+ font: menu;
+ margin: 0px;
+ color: #243C5F;
+}
+.soria .dijitMenuPreviousButton, .soria .dijitMenuNextButton {
+ font-style: italic;
+}
+.soria .dijitMenuItem TD {
+ padding:1px;
+}
+.soria .dijitMenuItemHover {
+ background-color: #d9e6f9;
+ color: #243C5F;
+}
+.soria .dijitMenuItemIcon {
+ width: 15px;
+ height: 15px;
+
+}
+.soria .dijitMenuExpand {
+ display:none;
+}
+.soria .dijitMenuExpandEnabled {
+
+ width:15px;
+ height:15px;
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+ display:block;
+}
+.dj_ie6 .soria .dijitMenuExpandEnabled {
+ background-image:url(images/spriteRoundedIconsSmall.gif);
+}
+.soria .dijitMenuExpandInner {
+ display:none;
+}
+.soria .dijitMenuSeparator {
+ background-color: #fff;
+ height: 1px;
+}
+.soria .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #fff;
+}
+.soria .dijitMenuSeparatorBottom {
+ border-top: 1px solid #8ba0bd;
+}
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.soria .dijitToolbar .dijitToolbarSeparator {
+ background: url(images/editor.gif);
+}
+.soria .dijitEditorIcon {
+ background-image: url(images/editor.gif);
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.soria .dijitEditorIconSep { background-position: 0px; }
+.soria .dijitEditorIconBackColor { background-position: -18px; }
+.soria .dijitEditorIconBold { background-position: -36px; }
+.soria .dijitEditorIconCancel { background-position: -54px; }
+.soria .dijitEditorIconCopy { background-position: -72px; }
+.soria .dijitEditorIconCreateLink { background-position: -90px; }
+.soria .dijitEditorIconCut { background-position: -108px; }
+.soria .dijitEditorIconDelete { background-position: -126px; }
+.soria .dijitEditorIconForeColor { background-position: -144px; }
+.soria .dijitEditorIconHiliteColor { background-position: -162px; }
+.soria .dijitEditorIconIndent { background-position: -180px; }
+.soria .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.soria .dijitEditorIconInsertImage { background-position: -216px; }
+.soria .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.soria .dijitEditorIconInsertTable { background-position: -252px; }
+.soria .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.soria .dijitEditorIconItalic { background-position: -288px; }
+.soria .dijitEditorIconJustifyCenter { background-position: -306px; }
+.soria .dijitEditorIconJustifyFull { background-position: -324px; }
+.soria .dijitEditorIconJustifyLeft { background-position: -342px; }
+.soria .dijitEditorIconJustifyRight { background-position: -360px; }
+.soria .dijitEditorIconLeftToRight { background-position: -378px; }
+.soria .dijitEditorIconListBulletIndent { background-position: -396px; }
+.soria .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.soria .dijitEditorIconListNumIndent { background-position: -432px; }
+.soria .dijitEditorIconListNumOutdent { background-position: -450px; }
+.soria .dijitEditorIconOutdent { background-position: -468px; }
+.soria .dijitEditorIconPaste { background-position: -486px; }
+.soria .dijitEditorIconRedo { background-position: -504px; }
+.soria .dijitEditorIconRemoveFormat { background-position: -522px; }
+.soria .dijitEditorIconRightToLeft { background-position: -540px; }
+.soria .dijitEditorIconSave { background-position: -558px; }
+.soria .dijitEditorIconSpace { background-position: -576px; }
+.soria .dijitEditorIconStrikethrough { background-position: -594px; }
+.soria .dijitEditorIconSubscript { background-position: -612px; }
+.soria .dijitEditorIconSuperscript { background-position: -630px; }
+.soria .dijitEditorIconUnderline { background-position: -648px; }
+.soria .dijitEditorIconUndo { background-position: -666px; }
+.soria .dijitEditorIconWikiword { background-position: -684px; }
+.soria .dijitEditorIconToggleDir { background-position: -540px; }
+.dijitColorPalette {
+ border:1px solid #cbcbcb;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/soria/soria.css.commented.css b/includes/js/dijit/themes/soria/soria.css.commented.css
new file mode 100644
index 0000000..d2bdd78
--- /dev/null
+++ b/includes/js/dijit/themes/soria/soria.css.commented.css
@@ -0,0 +1,39 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
+
+ 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("Common.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/ComboBox.css");
+@import url("form/Checkbox.css");
+@import url("form/RadioButton.css");
+@import url("form/Textarea.css");
+@import url("form/Slider.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("ColorPalette.css");
diff --git a/includes/js/dijit/themes/soria/soria_rtl.css b/includes/js/dijit/themes/soria/soria_rtl.css
new file mode 100644
index 0000000..134c52e
--- /dev/null
+++ b/includes/js/dijit/themes/soria/soria_rtl.css
@@ -0,0 +1,317 @@
+
+.dj_gecko .dijitRtl .dijitInputField {
+ direction: ltr;
+}
+.dj_gecko .dijitRtl .dijitInputField * {
+ direction: rtl;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpando, .dijitRtl .dijitTreeContainer .dijitTreeExpand {
+ float:right;
+}
+.dijitRtl .dijitExpandoText {
+ float: right;
+ padding-left: 3px;
+ padding-right: 0;
+}
+.dijitRtl .dijitComboBox .dijitInputField {
+ border-right-width:1px !important;
+ border-left-width:0 !important;
+}
+.dijitRtl .dijitCalendarNextYear {
+ margin:0 0.55em 0 0;
+}
+.dijitRtl .dijitCalendarPreviousYear {
+ margin:0 0 0 0.55em;
+}
+.dijitRtl .dijitProgressBarFull .dijitProgressBarLabel {
+ right:0;
+}
+.dijitRtl .dijitComboButton .dijitButtonContents {
+ border-right-width:1px !important;
+}
+.dijitRtl .dijitA11ySideArrow {
+ margin-left:1em;
+ margin-right:0;
+}
+.dijitRtl .dijitAccordionArrow,
+.dijitRtl .dijitAccordionTitle .arrowTextUp,
+.dijitRtl .dijitAccordionTitle .arrowTextDown {
+ float: left;
+}
+.dijitRtl .dijitSliderImageHandleV {
+ left:auto;
+ right:-6px;
+}
+.dj_ie .dijitRtl .dijitSliderImageHandleV {
+ right:-10px;
+}
+.dijitRtl .dijitSliderMoveableH {
+ right:auto;
+ left:0;
+}
+.dijitRtl .dijitRuleContainerV {
+ float:right;
+}
+.dj_gecko .dijitRtl .dijitRuleContainerV {
+ float:left;
+}
+.dj_ie .dijitRtl .dijitRuleContainerV {
+ text-align:right;
+}
+.dj_ie .dijitRtl .dijitRuleLabelV {
+ text-align:left;
+}
+.dj_ie .dijitRtl .dijitRuleLabelH {
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitSliderProgressBarH {
+ right:0;
+ left:auto;
+}
+.dj_gecko .dijitRtl .dijitSliderProgressBarH {
+ float:right;
+ right:0;
+ left:auto;
+}
+.dijitRtl .dijitTab {
+ float:right;
+}
+.dj_ie .dijitRtl .dijitTab,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv span {
+ position:static;
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ margin-left:1px !important;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignRight {
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTab {
+
+ width:1px;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+
+ margin-left:1px !important;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignRight {
+
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ overflow-x:visible;
+ margin-left:2px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ overflow-x:visible;
+ margin-right:2px !important;
+}
+.dj_ie7 .dijitRtl .dijitTab .dijitTabInnerDiv {
+ float:left;
+}
+.dj_ie7 .dijitRtl .dijitTab .closeImage {
+ padding: 0 0 0 12px;
+}
+.dj_ie .dijitRtl .dijitAlignRight .dijitTab {
+ position:relative;
+}
+.dijitRtl .dijitTitlePane .dijitArrowNode {
+ float: left;
+}
+.dijitRtl .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ right: auto;
+ left: 0;
+ border-width: 0 1px 0 0 !important;
+}
+.dijitRtl .dijitSpinnerButtonContainer {
+ float: left;
+}
+.dijitRtl .dijit_a11y .dijitSpinnerButtonContainer {
+ margin-left: none;
+ margin-right: 2px;
+}
+.dijitRtl DIV.dijitArrowButton, .dijitRtl .dijitValidationIcon, .dijitRtl .dijitValidationIconText {
+ float: left;
+}
+.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
+ background-position:right;
+ padding-right:25px;
+}
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 0 10px 0 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab {
+ margin-right:0;
+ margin-left:3px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAccordionArrow {
+ background-position: -30px top;
+}
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url(images/arrowLeft.png);
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url(images/arrowRight.png);
+}
+.dijitRtl .dijitComboBox .dijitButtonNode {
+ border-width: 0px 0px 0px 1px;
+}
+.dijitRtl .dijitComboBox .dijitButtonNode,
+.dijitRtl .dijitSpinner .dijitButtonNode {
+
+ border-color: #8ba0bd;
+ border-left: 0px solid #8ba0bd;
+ border-right: 1px solid #8ba0bd;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url(images/treeI_rtl.gif);
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url(images/treeI_half_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url(images/spriteTree_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background: url(images/spriteTree_rtl.gif) no-repeat -36px top;
+}
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url(images/arrowLeft.png);
+}
+.dj_ie6 .dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url(images/arrowLeft.gif);
+}
+.dijitRtl .dijitEditorIcon {
+ background-image: url(images/editor_rtl.gif);
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url(images/editor_rtl.gif);
+}
diff --git a/includes/js/dijit/themes/soria/soria_rtl.css.commented.css b/includes/js/dijit/themes/soria/soria_rtl.css.commented.css
new file mode 100644
index 0000000..0984f57
--- /dev/null
+++ b/includes/js/dijit/themes/soria/soria_rtl.css.commented.css
@@ -0,0 +1,28 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
+
+ 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("form/Common_rtl.css");
+@import url("Tree_rtl.css");
+@import url("TitlePane_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Menu_rtl.css");
+@import url("Editor_rtl.css");
diff --git a/includes/js/dijit/themes/templateThemeTest.html b/includes/js/dijit/themes/templateThemeTest.html
new file mode 100644
index 0000000..0573ba7
--- /dev/null
+++ b/includes/js/dijit/themes/templateThemeTest.html
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Test Widget Templates in Multiple Themes</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "noir/noir.css";
+ @import "tundra/tundra.css";
+ @import "soria/soria.css";
+ @import "../tests/css/dijitTests.css";
+
+ /* group multiple buttons in a row */
+ body {
+ margin:10px;
+ }
+ .box {
+ display: block;
+ }
+ .box .dijitButton {
+ margin-right: 10px;
+ }
+ </style>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: true, isDebug: true"></script>
+ <script type="text/javascript" src="../tests/_testCommon.js"></script>
+
+ <script type="text/javascript">
+ dojo.require("dijit.Menu");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.form.ComboBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dojo.parser");
+ logMessage = console.debug;
+ </script>
+ </head>
+ <body>
+ <h2>Tundra</h2>
+ <div id='tundra' class="box tundra">
+ <button dojoType="dijit.form.Button" onClick='logMessage("clicked simple")'>
+ Button
+ </button>
+ <button dojoType="dijit.form.Button" iconClass="noteIcon" onClick='logMessage("clicked simple")'>
+ Button w/image
+ </button>
+ <button dojoType="dijit.form.Button" onClick='logMessage("clicked simple")' disabled='true'>
+ Disabled Button
+ </button>
+ <br><br>
+ <button dojoType="dijit.form.DropDownButton">
+ <span>Drop Down Button</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCut"
+ onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCopy"
+ onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconPaste"
+ onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+ </div>
+ </button>
+ <button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+ <span>Button w/image</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCut"
+ onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCopy"
+ onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconPaste"
+ onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+ </div>
+ </button>
+ <button dojoType="dijit.form.DropDownButton" disabled='true'>
+ <span>Drop Down Disabled</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCut"
+ onClick="logMessage('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconCopy"
+ onClick="logMessage('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconPaste"
+ onClick="logMessage('not actually pasting anything, just a test!')">Paste</div>
+ </div>
+ </button>
+ <br><br>
+ <button dojoType="dijit.form.ComboButton" onClick='logMessage("clicked combo save")'>
+ <span>Combo Button</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconSrc="../../templates/buttons/save.gif"
+ onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem" iconSrc="../../templates/buttons/save.gif"
+ onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </button>
+ <button dojoType="dijit.form.ComboButton" iconClass="noteIcon" onClick='logMessage("clicked combo save")'>
+ <span>Combo w/image</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconSave"
+ onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem"
+ onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </button>
+ <button dojoType="dijit.form.ComboButton" onClick='logMessage("clicked combo save")' disabled='true'>
+ <span>Combo Disabled</span>
+ <div dojoType="dijit.Menu" style="display: none;">
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIconSave"
+ onClick="logMessage('not actually saving anything, just a test!')">Save</div>
+ <div dojoType="dijit.MenuItem"
+ onClick="logMessage('not actually saving anything, just a test!')">Save As</div>
+ </div>
+ </button>
+ <br><br>
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ url="../tests/form/states.json"
+ searchAttr="name"
+ labelField="label"
+ labelType="html"
+ style="width: 300px;"
+ name="state2"
+ promptMessage="Please enter a state"
+ >
+
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ url="../tests/form/states.json"
+ searchAttr="name"
+ labelField="label"
+ labelType="html"
+ style="width: 300px;"
+ name="state2"
+ promptMessage="Please enter a state"
+ disabled="true"
+ >
+
+ <br><br>
+ <input dojoType="dijit.form.NumberSpinner"
+ onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+ value="900"
+ constraints={max:1550,places:0}
+ maxLength="10"
+ >
+
+
+ <input dojoType="dijit.form.NumberSpinner"
+ onChange="console.debug('onChange fired for widget id = ' + this.id + ' with value = ' + arguments[0]);"
+ value="900"
+ disabled='true'
+ constraints={max:1550,places:0}
+ maxLength="10"
+ >
+
+ </div>
+ <br clear=both>
+
+ <h2>Noir</h2>
+ <div id='noir' class="box noir">
+ </div>
+ <br clear=both>
+
+ <h2>Soria</h2>
+ <div id='soria' class="box soria">
+ </div>
+ <br clear=both>
+
+ <h2>a11y mode</h2>
+ <div id='a11y' class="box dijit_a11y">
+ </div>
+ <br clear=both>
+
+
+
+<script language='javascript'>
+ var html = dojo.byId("tundra").innerHTML;
+ dojo.byId("noir").innerHTML = html;
+ dojo.byId("a11y").innerHTML = html;
+ dojo.byId("soria").innerHTML = html;
+</script>
+
+ </body>
+</html>
diff --git a/includes/js/dijit/themes/themeTester.html b/includes/js/dijit/themes/themeTester.html
new file mode 100644
index 0000000..99fa625
--- /dev/null
+++ b/includes/js/dijit/themes/themeTester.html
@@ -0,0 +1,745 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+ <title>Dijit Theme Tester</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../tests/css/dijitTests.css";
+
+ html, body { height: 100%; width: 100%; padding: 0; border: 0; }
+ #main { height: 100%; width: 100%; padding: 0; border: 0; }
+/* #header, #mainSplit { margin: 10px; } */
+ #leftAccordion { width: 25%; }
+ #bottomTabs { height: 40%; }
+ #main .dijitSplitterH { height: 7px }
+ #main .dijitSplitterV { width: 7px }
+
+ /* pre-loader specific stuff to prevent unsightly flash of unstyled content */
+ #loader {
+ padding:0;
+ margin:0;
+ position:absolute;
+ top:0; left:0;
+ width:100%; height:100%;
+ background:#ededed;
+ z-index:999;
+ vertical-align:center;
+ }
+ #loaderInner {
+ padding:5px;
+ position:relative;
+ left:0;
+ top:0;
+ width:175px;
+ background:#3c3;
+ color:#fff;
+
+ }
+
+ hr.spacer { border:0; background-color:#ededed; width:80%; height:1px; }
+
+ /* for custom menu buttons, do not appear to have any effect */
+ .myCustomTheme .dijitButtonNode {
+ border:1px solid #000;
+ vertical-align: middle;
+ padding: 0.2em 0.2em;
+ background: url("themeTesterImages/blackButtonEnabled.gif") repeat-x bottom left #474747;
+ color: blue;
+ }
+
+ .myCustomTheme .dijitButtonHover .dijitButtonNode,
+ .myCustomTheme .dijitToggleButtonHover .dijitButtonNode {
+ background: url("themeTesterImages/blackButtonHover.gif") repeat-x bottom left #3b3b3b !important;
+ }
+ </style>
+
+ <script type="text/javascript">
+ window.__globalList = {dojo: true, dijit: true, dojox: true, djConfig: true};
+ for(var i in window){
+ window.__globalList[i] = true;
+ }
+ </script>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: false, isDebug: true"></script>
+ <!--
+ <script type="text/javascript" src="http://prototypejs.org/assets/2007/10/16/prototype.js"></script>
+ -->
+ <script type="text/javascript" src="../dijit.js"></script>
+ <script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+
+ <script type="text/javascript" src="../tests/_testCommon.js"></script>
+ <script type="text/javascript"> // dojo.requires()
+
+ dojo.require("dijit.Menu");
+ dojo.require("dijit._Calendar");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.TitlePane");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.Tree");
+
+ // editor:
+ dojo.require("dijit.Editor");
+
+ // dnd:
+ dojo.require("dojo.dnd.Source");
+
+ // various Form elemetns
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.TimeTextBox");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.Slider");
+
+ // layouts used in page
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.Dialog");
+
+ // scan page for widgets and instantiate them
+ dojo.require("dojo.parser");
+
+ // humm?
+ dojo.require("dojo.date.locale");
+
+ // for the Tree
+ dojo.require("dojo.data.ItemFileReadStore");
+
+ // for the colorpalette
+ function setColor(color){
+ var theSpan = dojo.byId("outputSpan");
+ dojo.style(theSpan,"color",color);
+ theSpan.innerHTML = color;
+ }
+
+ // for the calendar
+ function myHandler(id,newValue){
+ console.debug("onChange for id = " + id + ", value: " + newValue);
+ }
+
+ dojo.addOnLoad(function() {
+
+ // this is just a list of 'official' dijit themes, you can use ?theme=String
+ // for 'un-supported' themes, too. (eg: yours)
+ var availableThemes = [
+ { theme:"tundra", author:"Dojo", baseUri:"../themes/" },
+ { theme:"soria", author:"nikolai", baseUri:"../themes/" },
+ //{ theme:"noir", author:"owen", baseUri:"../themes/"},
+ { theme:"nihilo", author:"nikolai", baseUri:"../themes/" }
+ ];
+
+ var holder = dojo.byId('themeData');
+ var tmpString='';
+ dojo.forEach(availableThemes,function(theme){
+ tmpString += '<a href="?theme='+theme.theme+'">'+theme.theme+'</'+'a> - by: '+theme.author+' <br>';
+ });
+ holder.innerHTML = tmpString;
+
+ var start = new Date().getTime();
+ dojo.parser.parse(dojo.byId('container'));
+ console.info("Total parse time: " + (new Date().getTime() - start) + "ms");
+
+ dojo.byId('loaderInner').innerHTML += " done.";
+ setTimeout(function hideLoader(){
+ var loader = dojo.byId('loader');
+ dojo.fadeOut({ node: loader, duration:500,
+ onEnd: function(){
+ loader.style.display = "none";
+ }
+ }).play();
+ }, 250);
+
+ var strayGlobals = [];
+ for(var i in window){
+ if(!window.__globalList[i]){ strayGlobals.push(i); }
+ }
+ if(strayGlobals.length){
+ console.warn("Stray globals: "+strayGlobals.join(", "));
+ }
+ });
+
+ /***
+ dojo.addOnLoad(function(){
+ // use "before advice" to print log message each time resize is called on a layout widget
+ var origResize = dijit.layout._LayoutWidget.prototype.resize;
+ dijit.layout._LayoutWidget.prototype.resize = function(mb){
+ console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+ origResize.apply(this, arguments);
+ };
+
+ // content pane has no children so just use dojo's builtin after advice
+ dojo.connect(dijit.layout.ContentPane.prototype, "resize", function(mb){
+ console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+ });
+ });
+ ***/
+ </script>
+</head>
+<body>
+ <!-- basic preloader: -->
+ <div id="loader"><div id="loaderInner">Loading themeTester ... </div></div>
+
+ <!-- data for tree and combobox -->
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+ url="../tests/_data/countries.json"></div>
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../tests/_data/states.json"></div>
+ <!-- contentMenu popup -->
+ <div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+ <div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu2">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu4">
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu3" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit.ColorPalette"></div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit._Calendar"></div>
+ </div>
+ </div>
+ <!-- end contextMenu -->
+
+ <!-- "main" BorderContainer just contains page title and another BorderContainer -->
+ <div id="main" dojoType="dijit.layout.BorderContainer">
+
+ <h1 id="header" dojoType="dijit.layout.ContentPane" region="top">Dijit Theme Test Page</h1>
+
+ <!-- "mainSplit" BorderContainer has all the real content -->
+ <div dojoType="dijit.layout.BorderContainer" liveSplitters="false" design="sidebar"
+ region="center" id="mainSplit">
+
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ minSize="20" style="width: 300px;" id="leftAccordion" region="leading" splitter="true">
+
+ <div dojoType="dijit.layout.AccordionPane" title="Popups and Alerts"><div style="padding:8px">
+ <h2>Tooltips:</h2>
+ <ul>
+ <li>
+ <span id="ttRich">rich text tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="ttRich" style="display:none;">
+ Embedded <b>bold</b> <i>RICH</i> text <span style="color:#309; font-size:x-large;">weirdness!</span>
+ </span>
+ </li>
+
+ <li><a id="ttOne" href="#bogus">anchor tooltip</a>
+ <span dojoType="dijit.Tooltip" connectId="ttOne" style="display:none;">tooltip on anchor</span>
+ </li>
+
+ </ul>
+
+ <hr class="spacer">
+
+ <h2>Dialogs:</h2>
+ <ul>
+ <li><a href="#" onclick="dijit.byId('dialog1').show()">show Modal Dialog</a></li>
+ </ul>
+
+ <div dojoType="dijit.form.DropDownButton">
+ <span>Show Tooltip Dialog</span>
+ <div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+ <table>
+ <tr>
+ <td><label for="user">User:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" id="user" name="user" ></td>
+ </tr>
+ <tr>
+ <td><label for="pwd">Password:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="password" id="pwd" name="pwd"></td>
+ </tr>
+ <tr>
+ <td colspan="2" align="center">
+ <button dojoType=dijit.form.Button type="submit" name="submit">Login</button>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Dojo Tree from Store">
+ <!-- tree widget -->
+ <div dojoType="dijit.Tree" store="continentStore" query="{type:'continent'}"
+ label="Continents">
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Calendar" selected="true">
+ <!-- calendar widget pane -->
+ <input id="calendar1" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])">
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Color Picker">
+ <!-- color palette picker -->
+ <h2 class="testHeader">Dijit Color Palette(7x10)</h2>
+ <div dojoType="dijit.ColorPalette" onChange="setColor(this.value);"></div>
+ <br>
+ Test color is: <span id="outputSpan"></span>
+
+ <br><br>
+ <div dojoType="dijit.ColorPalette" palette="3x4"></div>
+ </div>
+
+
+
+ </div><!-- end AccordionContainer -->
+
+ <!-- top tabs (marked as "center" to take up the main part of the BorderContainer) -->
+ <div dojoType="dijit.layout.TabContainer" region="center" id="topTabs">
+ <!-- first tab? -->
+ <div id="tab1" dojoType="dijit.layout.ContentPane" title="Form Feel" style="padding:10px;display:none;">
+ <h2>Various Form Elements:</h2>
+
+ <form name="dijitFormTest">
+
+ <p><input type="checkBox" dojoType="dijit.form.CheckBox" checked="checked"> Standard Dijit CheckBox
+ <br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled"> Disabled Dijit
+ <br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled" checked="checked"> Checked and Disabled Dijit
+ </p>
+
+ <p>
+ <span>Radio group #1:</span>
+ <input type="radio" name="g1" id="g1rb1" value="news" dojoType="dijit.form.RadioButton">
+ <label for="g1rb1">news</label>
+ <input type="radio" name="g1" id="g1rb2" value="talk" dojoType="dijit.form.RadioButton" checked="checked"/>
+ <label for="g1rb2">talk</label>
+ <input type="radio" name="g1" id="g1rb3" value="weather" dojoType="dijit.form.RadioButton" disabled="disabled"/>
+ <label for="g1rb3">weather (disabled)</label>
+ </p>
+
+ <p>
+ <span>Radio group #2: (no default value, and has breaks)</span><br>
+ <input type="radio" name="g2" id="g2rb1" value="top40" dojoType="dijit.form.RadioButton">
+ <label for="g2rb1">top 40</label><br>
+ <input type="radio" name="g2" id="g2rb2" value="oldies" dojoType="dijit.form.RadioButton">
+ <label for="g2rb2">oldies</label><br>
+
+ <input type="radio" name="g2" id="g2rb3" value="country" dojoType="dijit.form.RadioButton">
+ <label for="g2rb3">country</label><br>
+
+ <br>
+ (Note if using keyboard: tab to navigate, and use arrow or space to select)
+ </p>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.NumberSpinner max=100</h2>
+ <input dojoType="dijit.form.NumberSpinner" constraints="{max:100,places:0}" id="integertextbox3" value="10">
+
+ <hr class="spacer">
+
+ <h2>dijit.form.Textarea: (sans <i>any</i> styling...)</h2>
+ <textarea dojoType="dijit.form.Textarea" name="areText">Lorem ipsum dolor sit amet,
+ consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet
+ dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci
+ tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis
+ autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
+ vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
+ dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait
+ nulla facilisi.
+ </textarea>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.ComboBox</h2>
+ <label for="datatestComboBox">US State test 2: </label>
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ store="stateStore"
+ searchAttr="name"
+ style="width: 300px;"
+ name="state2"
+ id="datatestComboBox"
+ >
+
+ </form>
+
+ </div><!-- end first tab -->
+
+ <!-- second upper tab -->
+ <div id="tab2" dojoType="dijit.layout.ContentPane" title="Various Dijits"
+ style="padding:10px; display:none;">
+
+ <!-- Sliders: -->
+ <div style="float:right;">
+ <div dojoType="dijit.form.VerticalSlider" name="vertical1"
+ onChange="dojo.byId('slider2input').value=arguments[0];"
+ value="10"
+ maximum="100"
+ minimum="0"
+ discreteValues="11"
+ style="height:175px; clear:both"
+ id="slider2">
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="leftDecoration"style="width:2em;color:gray;" labelStyle="right:0px;">
+ <li>0
+ <li>100
+ </ol>
+
+ <div dojoType="dijit.form.VerticalRule" container="leftDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <div dojoType="dijit.form.VerticalRule" container="rightDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="rightDecoration"style="width:2em;color:gray;" maximum="100" count="6" numericMargin="1" constraints="{pattern:'#'}"></ol>
+ </div>
+ <br> Slider2 Value:<input readonly id="slider2input" size="3" value="10">
+ </div>
+ <h2>Sliders</h2>
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal1"
+ onChange="dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});"
+ value="10"
+ maximum="100"
+ minimum="0"
+ showButtons="false"
+ intermediateChanges="true"
+ style="width:50%; height: 20px;"
+ id="horizontal1">
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" numericMargin="1" count="6"></ol>
+ <div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=11 style="height:5px;"></div>
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+ <li>lowest
+ <li>normal
+ <li>highest
+ </ol>
+
+ </div>
+ <br>Value: <input readonly id="slider1input" size="5" value="10.0%">
+
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal2"
+ minimum="1"
+ value="2"
+ maximum="3"
+ discreteValues="3"
+ showButtons="false"
+ intermediateChanges="true"
+ style="width:300px; height: 40px;"
+ id="horizontal2">
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=3 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+ <li><img width=10 height=10 src="../tests/images/note.gif"><br><span style="font-size: small">small</span>
+ <li><img width=15 height=15 src="../tests/images/note.gif"><br><span style="font-size: medium">medium</span>
+
+ <li><img width=20 height=20 src="../tests/images/note.gif"><br><span style="font-size: large">large</span>
+ </ol>
+ </div>
+
+ <br style="clear:both;">
+ <hr class="spacer">
+
+ <h2>ProgressBar</h2>
+ <div style="width:400px; height:20px;" annotate="true" maximum="200" id="setTestBar"
+ progress="20" dojoType="dijit.ProgressBar"></div>
+
+ Indeterminate:
+ <div style="width:400px; height:20px" indeterminate="true" dojoType="dijit.ProgressBar"></div>
+
+ <hr class="spacer">
+
+ <h2>TitlePane (nested)</h2>
+ <div dojoType="dijit.TitlePane" title="Outer pane" width="275">
+ <p>This is a title pane, containing another title pane ...</p>
+ <div dojoType="dijit.TitlePane" title="Inner pane" width="125">
+
+ <p>And this is the inner title pane...</p>
+
+ <p>Sed sollicitudin suscipit risus. Nam
+ ullamcorper. Sed nisl lectus, pellentesque nec,
+ malesuada eget, ornare a, libero. Lorem ipsum dolor
+ sit amet, consectetuer adipiscing elit.</p>
+
+ </div><!-- end inner titlepane -->
+ <p>And this is the closing line for the outer title pane.</p>
+ </div><!-- end outer title pane -->
+ <h2>HTML After, check indent</h2>
+ </div><!-- end:second upper tab -->
+
+ <!-- start third upper tab -->
+ <div id="tab3" dojoType="dijit.layout.ContentPane" title="Buttons"
+ style="padding:10px; display:none; ">
+
+ <h2>Simple, drop down &amp; combo buttons</h2>
+ <p>Buttons can do an action, display a menu, or both:</p>
+
+ <div class="box">
+ <button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'>
+ Create
+ </button>
+
+ <button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+ <span>Edit</span>
+ <div dojoType="dijit.Menu" id="editMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="console.debug('not actually cutting anything, just a test!')">
+ Cut
+ </div>
+
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="console.debug('not actually copying anything, just a test!')">
+ Copy
+ </div>
+
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="console.debug('not actually pasting anything, just a test!')">
+ Paste
+ </div>
+ </div>
+ </button>
+
+ <button dojoType="dijit.form.ComboButton" iconClass="noteIcon"
+ optionsTitle='save options'
+ onClick='console.debug("clicked combo save")'>
+ <span>Save</span>
+ <div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconSave"
+ onClick="console.debug('not actually saving anything, just a test!')">
+ Save
+ </div>
+ <div dojoType="dijit.MenuItem"
+ onClick="console.debug('not actually saving anything, just a test!')">
+ Save As
+ </div>
+ </div>
+ </button>
+
+ <button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'
+ disabled='true'>
+ Disabled
+ </button>
+ </div><!-- end:box -->
+
+ <hr class="spacer">
+
+ <h2>Sizing</h2>
+ <p>Short button, tall buttons, big buttons, small buttons... These buttons
+ size to their content (just like &lt;button&gt;).</p>
+
+ <div class="box">
+ <button dojoType="dijit.form.Button" iconClass="flatScreenIcon" onclick='console.debug("big");'>
+ <span style="font-size:xx-large">big</span>
+ </button>
+
+ <button id="smallButton1" dojoType="dijit.form.Button" onclick='console.debug("small");'>
+ <img src="../tests/images/arrowSmall.gif" width="15" height="5">
+ <span style="font-size:x-small">small</span>
+ </button>
+
+ <button dojoType="dijit.form.Button" onclick='console.debug("long");'>
+ <img src="../tests/images/tube.gif" width="150" height="16"> long
+ </button>
+
+ <button dojoType="dijit.form.Button" onclick='console.debug("tall");' width2height="0.1">
+ <img src="../tests/images/tubeTall.gif" height="75" width="35"><br>
+ <span style="font-size:medium">tall</span>
+ </button>
+ <div style="clear: both;"></div>
+ </div><!-- end box -->
+
+ <hr class="spacer">
+
+ <h2>Customized buttons</h2>
+ <p>Dojo users can mix in their styles. Here's an example:</p>
+
+ <div><!-- custom styled button tests -->
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("short");'>
+ <div class="dc">short</div>
+ </button>
+
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("longer");'>
+ <div class="dc">bit longer</div>
+ </button>
+
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("longer yet");'>
+ <div class="dc">ridiculously long</div>
+ </button>
+
+ <div style="clear: both;"></div>
+ </div><!-- end styled buttons -->
+
+ </div><!-- end third upper tab-->
+
+ <!-- fourth upper tab -->
+ <div id="tab" dojoType="dijit.layout.ContentPane" title="Editable Text" style="padding:10px;" selected="selected">
+
+ <h2>dijit.Editor:</h2>
+ <!-- FIXME:
+ set height on this node to size the whole editor, but causes the tab to not scroll
+ until you select another tab and come back. alternative is no height: here, but that
+ causes editor to become VERY tall, and size to a normal height when selected (like the
+ dijit.form.TextArea in "Form Feel" Tab), but in reverse. refs #3980 and is maybe new bug?
+ -->
+ <div style="border:1px solid #ededed;">
+ <textarea height="175" dojoType="dijit.Editor" styleSheets="../../dojo/resources/dojo.css" sytle="width:400px; height:175px; overflow:auto; ">
+ <ul>
+ <li>Lorem <a href="http://dojotoolkit.org">and a link</a>, what do you think?</li>
+ <li>This is the Editor with a Toolbar attached.</li>
+ </ul>
+ </textarea>
+ </div>
+ <hr class="spacer">
+
+
+ <h2 class="testTitle">dijit.InlineEditBox + dijit.form.TextBox on &lt;h3&gt;</h2>
+
+ (HTML before)
+ <h3 id="editable" style="font-size:larger;" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])">
+ Edit me - I trigger the onChange callback
+ </h3>
+ (HTML after)
+
+ <hr class="spacer">
+
+ <h2>dijit.InlineEditBox + dijit.form.Textarea</h2>
+
+ (HTML before)
+ <p id="areaEditable" dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea" autoSave="false">
+ I'm one big paragraph. Go ahead and edit me. I dare you.
+ The quick brown fox jumped over the lazy dog. Blah blah blah blah blah blah blah ...
+ </p>
+ (HTML after)
+
+ <p>
+ These links will
+ <a href="#" onClick="dijit.byId('areaEditable').setDisabled(true)">disable</a> /
+ <a href="#" onClick="dijit.byId('areaEditable').setDisabled(false)">enable</a>
+ the text area above.
+ </p>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.DateTextBox:</h2>
+
+ (HTML inline before)
+ <span id="backgroundArea" dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="170px">12/30/2005</span>
+ (HTML after)
+
+ <hr class="spacer">
+
+ <h2>dijit.form.TimeTextBox:</h2>
+
+ (HTML inline before)
+ <span id="timePicker" dojoType="dijit.InlineEditBox" editor="dijit.form.TimeTextBox" width="150px">9:00 AM</span>
+ (HTML after)
+
+ <hr class="spacer">
+
+
+ <h2>dijit.form.FilteringSelect + Inline + remote data store:</h2>
+ (HTML inline before)
+ <span id="backgroundArea2" dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+ editorParams="{store: stateStore, autoComplete: true, promptMessage: 'Please enter a state'}"
+ width="300px">
+ Indiana
+ </span>
+ (HTML after)
+
+ </div><!-- end fourth upper tab -->
+
+ <!-- fifth upper tab -->
+ <div id="tab5" dojoType="dijit.layout.ContentPane" title="DnD"
+ style="padding:10px; display:none; ">
+ <div style="float:left; margin:5px; ">
+ <h3>Source 1</h3>
+ <div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+ <div class="dojoDndItem">Item <strong>X</strong></div>
+ <div class="dojoDndItem">Item <strong>Y</strong></div>
+ <div class="dojoDndItem">Item <strong>Z</strong></div>
+ </div>
+ </div>
+ <div style="float:left; margin:5px; ">
+ <h3>Source 2</h3>
+ <div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+ <div class="dojoDndItem">Item <strong>1</strong></div>
+ <div class="dojoDndItem">Item <strong>2</strong></div>
+ <div class="dojoDndItem">Item <strong>3</strong></div>
+ </div>
+ </div>
+ </div>
+
+ <!-- sixth upper tab -->
+ <div id="tab6" dojoType="dijit.layout.ContentPane" title="Closable"
+ style="display:none; padding:10px; " closable="true">
+ This pane is closable, just for the icon ...
+ </div>
+ </div><!-- end of region="center" TabContainer -->
+
+ <!-- bottom right tabs -->
+ <div dojoType="dijit.layout.TabContainer" id="bottomTabs" tabPosition="bottom" selectedChild="btab1" region="bottom" splitter="true">
+
+ <!-- btab 1 -->
+ <div id="btab1" dojoType="dijit.layout.ContentPane" title="Info" style=" padding:10px; ">
+ <p>You can explore this single page after applying a Theme
+ for use in creation of your own theme.</p>
+
+ <p>I am whole slew of Widgets on a page. Jump to <a href="../tests/">dijit tests</a> to
+ test individual components.</p>
+
+ <p>There is a right-click [context] pop-up menu here, as well.</p>
+ </div><!-- end:info btab1 -->
+
+ <div id="btab2" dojoType="dijit.layout.ContentPane" title="Alternate Themes" style="padding:20px;">
+ <span id="themeData"></span>
+ </div><!-- btab2 -->
+
+ <div id="btab3" dojoType="dijit.layout.ContentPane" title="Bottom 3" closable="true">
+ <p>I am the last Tab</p>
+ <div id="dialog2" dojoType="dijit.Dialog" title="Encased Dialog" style="display:none;">
+ I am the second dialog. I am
+ parented by the Low Tab Pane #3
+ </div>
+ </div><!-- btab3 -->
+
+ </div><!-- end Bottom TabContainer -->
+
+ </div> <!-- end of "mainSplit" BorderContainer -->
+ </div><!-- end of "main" BorderContainer -->
+
+ <!-- dialog in body -->
+ <div id="dialog1" dojoType="dijit.Dialog" title="Floating Modal Dialog" style="display:none;" href="../tests/layout/doc0.html"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif b/includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif
new file mode 100644
index 0000000..9174efd
--- /dev/null
+++ b/includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif
Binary files differ
diff --git a/includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif b/includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif
new file mode 100644
index 0000000..16f087c
--- /dev/null
+++ b/includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif
Binary files differ
diff --git a/includes/js/dijit/themes/themeTesterQuirk.html b/includes/js/dijit/themes/themeTesterQuirk.html
new file mode 100644
index 0000000..9f5e26c
--- /dev/null
+++ b/includes/js/dijit/themes/themeTesterQuirk.html
@@ -0,0 +1,743 @@
+<html>
+<head>
+ <title>Dijit Theme Tester</title>
+
+ <style type="text/css">
+ @import "../../dojo/resources/dojo.css";
+ @import "../tests/css/dijitTests.css";
+
+ html, body { height: 100%; width: 100%; padding: 0; border: 0; }
+ #main { height: 100%; width: 100%; padding: 0; border: 0; }
+/* #header, #mainSplit { margin: 10px; } */
+ #leftAccordion { width: 25%; }
+ #bottomTabs { height: 40%; }
+ #main .dijitSplitterH { height: 7px }
+ #main .dijitSplitterV { width: 7px }
+
+ /* pre-loader specific stuff to prevent unsightly flash of unstyled content */
+ #loader {
+ padding:0;
+ margin:0;
+ position:absolute;
+ top:0; left:0;
+ width:100%; height:100%;
+ background:#ededed;
+ z-index:999;
+ vertical-align:center;
+ }
+ #loaderInner {
+ padding:5px;
+ position:relative;
+ left:0;
+ top:0;
+ width:175px;
+ background:#3c3;
+ color:#fff;
+
+ }
+
+ hr.spacer { border:0; background-color:#ededed; width:80%; height:1px; }
+
+ /* for custom menu buttons, do not appear to have any effect */
+ .myCustomTheme .dijitButtonNode {
+ border:1px solid #000;
+ vertical-align: middle;
+ padding: 0.2em 0.2em;
+ background: url("themeTesterImages/blackButtonEnabled.gif") repeat-x bottom left #474747;
+ color: blue;
+ }
+
+ .myCustomTheme .dijitButtonHover .dijitButtonNode,
+ .myCustomTheme .dijitToggleButtonHover .dijitButtonNode {
+ background: url("themeTesterImages/blackButtonHover.gif") repeat-x bottom left #3b3b3b !important;
+ }
+ </style>
+
+ <script type="text/javascript">
+ window.__globalList = {dojo: true, dijit: true, dojox: true, djConfig: true};
+ for(var i in window){
+ window.__globalList[i] = true;
+ }
+ </script>
+
+ <script type="text/javascript" src="../../dojo/dojo.js"
+ djConfig="parseOnLoad: false, isDebug: true"></script>
+ <!--
+ <script type="text/javascript" src="http://prototypejs.org/assets/2007/10/16/prototype.js"></script>
+ -->
+ <script type="text/javascript" src="../dijit.js"></script>
+ <script type="text/javascript" src="../dijit-all.js" charset="utf-8"></script>
+
+ <script type="text/javascript" src="../tests/_testCommon.js"></script>
+ <script type="text/javascript"> // dojo.requires()
+
+ dojo.require("dijit.Menu");
+ dojo.require("dijit._Calendar");
+ dojo.require("dijit.ColorPalette");
+ dojo.require("dijit.ProgressBar");
+ dojo.require("dijit.TitlePane");
+ dojo.require("dijit.Tooltip");
+ dojo.require("dijit.Tree");
+
+ // editor:
+ dojo.require("dijit.Editor");
+
+ // dnd:
+ dojo.require("dojo.dnd.Source");
+
+ // various Form elemetns
+ dojo.require("dijit.form.CheckBox");
+ dojo.require("dijit.form.Textarea");
+ dojo.require("dijit.form.FilteringSelect");
+ dojo.require("dijit.form.TextBox");
+ dojo.require("dijit.form.DateTextBox");
+ dojo.require("dijit.form.TimeTextBox");
+ dojo.require("dijit.form.Button");
+ dojo.require("dijit.InlineEditBox");
+ dojo.require("dijit.form.NumberSpinner");
+ dojo.require("dijit.form.Slider");
+
+ // layouts used in page
+ dojo.require("dijit.layout.AccordionContainer");
+ dojo.require("dijit.layout.ContentPane");
+ dojo.require("dijit.layout.TabContainer");
+ dojo.require("dijit.layout.BorderContainer");
+ dojo.require("dijit.Dialog");
+
+ // scan page for widgets and instantiate them
+ dojo.require("dojo.parser");
+
+ // humm?
+ dojo.require("dojo.date.locale");
+
+ // for the Tree
+ dojo.require("dojo.data.ItemFileReadStore");
+
+ // for the colorpalette
+ function setColor(color){
+ var theSpan = dojo.byId("outputSpan");
+ dojo.style(theSpan,"color",color);
+ theSpan.innerHTML = color;
+ }
+
+ // for the calendar
+ function myHandler(id,newValue){
+ console.debug("onChange for id = " + id + ", value: " + newValue);
+ }
+
+ dojo.addOnLoad(function() {
+
+ // this is just a list of 'official' dijit themes, you can use ?theme=String
+ // for 'un-supported' themes, too. (eg: yours)
+ var availableThemes = [
+ { theme:"tundra", author:"Dojo", baseUri:"../themes/" },
+ { theme:"soria", author:"nikolai", baseUri:"../themes/" },
+ //{ theme:"noir", author:"owen", baseUri:"../themes/"},
+ { theme:"nihilo", author:"nikolai", baseUri:"../themes/" }
+ ];
+
+ var holder = dojo.byId('themeData');
+ var tmpString='';
+ dojo.forEach(availableThemes,function(theme){
+ tmpString += '<a href="?theme='+theme.theme+'">'+theme.theme+'</'+'a> - by: '+theme.author+' <br>';
+ });
+ holder.innerHTML = tmpString;
+
+ var start = new Date().getTime();
+ dojo.parser.parse(dojo.byId('container'));
+ console.info("Total parse time: " + (new Date().getTime() - start) + "ms");
+
+ dojo.byId('loaderInner').innerHTML += " done.";
+ setTimeout(function hideLoader(){
+ var loader = dojo.byId('loader');
+ dojo.fadeOut({ node: loader, duration:500,
+ onEnd: function(){
+ loader.style.display = "none";
+ }
+ }).play();
+ }, 250);
+
+ var strayGlobals = [];
+ for(var i in window){
+ if(!window.__globalList[i]){ strayGlobals.push(i); }
+ }
+ if(strayGlobals.length){
+ console.warn("Stray globals: "+strayGlobals.join(", "));
+ }
+ });
+
+ /***
+ dojo.addOnLoad(function(){
+ // use "before advice" to print log message each time resize is called on a layout widget
+ var origResize = dijit.layout._LayoutWidget.prototype.resize;
+ dijit.layout._LayoutWidget.prototype.resize = function(mb){
+ console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+ origResize.apply(this, arguments);
+ };
+
+ // content pane has no children so just use dojo's builtin after advice
+ dojo.connect(dijit.layout.ContentPane.prototype, "resize", function(mb){
+ console.log(this + ": resize({w:"+ mb.w + ", h:" + mb.h + "})");
+ });
+ });
+ ***/
+ </script>
+</head>
+<body>
+ <!-- basic preloader: -->
+ <div id="loader"><div id="loaderInner">Loading themeTester ... </div></div>
+
+ <!-- data for tree and combobox -->
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="continentStore"
+ url="../tests/_data/countries.json"></div>
+ <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore"
+ url="../tests/_data/states.json"></div>
+ <!-- contentMenu popup -->
+ <div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
+ <div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="alert('not actually cutting anything, just a test!')">Cut</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="alert('not actually copying anything, just a test!')">Copy</div>
+ <div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="alert('not actually pasting anything, just a test!')">Paste</div>
+ <div dojoType="dijit.MenuSeparator"></div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Enabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu2">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Deeper Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu4">
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem" disabled="true">
+ <span>Disabled Submenu</span>
+ <div dojoType="dijit.Menu" id="submenu3" style="display: none;">
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
+ <div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
+ </div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit.ColorPalette"></div>
+ </div>
+ <div dojoType="dijit.PopupMenuItem">
+ <span>Different popup</span>
+ <div dojoType="dijit._Calendar"></div>
+ </div>
+ </div>
+ <!-- end contextMenu -->
+
+ <!-- "main" BorderContainer just contains page title and another BorderContainer -->
+ <div id="main" dojoType="dijit.layout.BorderContainer">
+
+ <h1 id="header" dojoType="dijit.layout.ContentPane" region="top">Dijit Theme Test Page</h1>
+
+ <!-- "mainSplit" BorderContainer has all the real content -->
+ <div dojoType="dijit.layout.BorderContainer" liveSplitters="false" design="sidebar"
+ region="center" id="mainSplit">
+
+ <div dojoType="dijit.layout.AccordionContainer" duration="200"
+ minSize="20" style="width: 300px;" id="leftAccordion" region="leading" splitter="true">
+
+ <div dojoType="dijit.layout.AccordionPane" title="Popups and Alerts"><div style="padding:8px">
+ <h2>Tooltips:</h2>
+ <ul>
+ <li>
+ <span id="ttRich">rich text tooltip</span>
+ <span dojoType="dijit.Tooltip" connectId="ttRich" style="display:none;">
+ Embedded <b>bold</b> <i>RICH</i> text <span style="color:#309; font-size:x-large;">weirdness!</span>
+ </span>
+ </li>
+
+ <li><a id="ttOne" href="#bogus">anchor tooltip</a>
+ <span dojoType="dijit.Tooltip" connectId="ttOne" style="display:none;">tooltip on anchor</span>
+ </li>
+
+ </ul>
+
+ <hr class="spacer">
+
+ <h2>Dialogs:</h2>
+ <ul>
+ <li><a href="#" onclick="dijit.byId('dialog1').show()">show Modal Dialog</a></li>
+ </ul>
+
+ <div dojoType="dijit.form.DropDownButton">
+ <span>Show Tooltip Dialog</span>
+ <div dojoType="dijit.TooltipDialog" id="tooltipDlg" title="Enter Login information"
+ execute="alert('submitted w/args:\n' + dojo.toJson(arguments[0], true));">
+ <table>
+ <tr>
+ <td><label for="user">User:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="text" id="user" name="user" ></td>
+ </tr>
+ <tr>
+ <td><label for="pwd">Password:</label></td>
+ <td><input dojoType=dijit.form.TextBox type="password" id="pwd" name="pwd"></td>
+ </tr>
+ <tr>
+ <td colspan="2" align="center">
+ <button dojoType=dijit.form.Button type="submit" name="submit">Login</button>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Dojo Tree from Store">
+ <!-- tree widget -->
+ <div dojoType="dijit.Tree" store="continentStore" query="{type:'continent'}"
+ label="Continents">
+ </div>
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Calendar" selected="true">
+ <!-- calendar widget pane -->
+ <input id="calendar1" dojoType="dijit._Calendar" onChange="myHandler(this.id,arguments[0])">
+ </div>
+
+ <div dojoType="dijit.layout.AccordionPane" title="Color Picker">
+ <!-- color palette picker -->
+ <h2 class="testHeader">Dijit Color Palette(7x10)</h2>
+ <div dojoType="dijit.ColorPalette" onChange="setColor(this.value);"></div>
+ <br>
+ Test color is: <span id="outputSpan"></span>
+
+ <br><br>
+ <div dojoType="dijit.ColorPalette" palette="3x4"></div>
+ </div>
+
+
+
+ </div><!-- end AccordionContainer -->
+
+ <!-- top tabs (marked as "center" to take up the main part of the BorderContainer) -->
+ <div dojoType="dijit.layout.TabContainer" region="center" id="topTabs">
+ <!-- first tab? -->
+ <div id="tab1" dojoType="dijit.layout.ContentPane" title="Form Feel" style="padding:10px;display:none;">
+ <h2>Various Form Elements:</h2>
+
+ <form name="dijitFormTest">
+
+ <p><input type="checkBox" dojoType="dijit.form.CheckBox" checked="checked"> Standard Dijit CheckBox
+ <br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled"> Disabled Dijit
+ <br><input type="checkBox" dojoType="dijit.form.CheckBox" disabled="disabled" checked="checked"> Checked and Disabled Dijit
+ </p>
+
+ <p>
+ <span>Radio group #1:</span>
+ <input type="radio" name="g1" id="g1rb1" value="news" dojoType="dijit.form.RadioButton">
+ <label for="g1rb1">news</label>
+ <input type="radio" name="g1" id="g1rb2" value="talk" dojoType="dijit.form.RadioButton" checked="checked"/>
+ <label for="g1rb2">talk</label>
+ <input type="radio" name="g1" id="g1rb3" value="weather" dojoType="dijit.form.RadioButton" disabled="disabled"/>
+ <label for="g1rb3">weather (disabled)</label>
+ </p>
+
+ <p>
+ <span>Radio group #2: (no default value, and has breaks)</span><br>
+ <input type="radio" name="g2" id="g2rb1" value="top40" dojoType="dijit.form.RadioButton">
+ <label for="g2rb1">top 40</label><br>
+ <input type="radio" name="g2" id="g2rb2" value="oldies" dojoType="dijit.form.RadioButton">
+ <label for="g2rb2">oldies</label><br>
+
+ <input type="radio" name="g2" id="g2rb3" value="country" dojoType="dijit.form.RadioButton">
+ <label for="g2rb3">country</label><br>
+
+ <br>
+ (Note if using keyboard: tab to navigate, and use arrow or space to select)
+ </p>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.NumberSpinner max=100</h2>
+ <input dojoType="dijit.form.NumberSpinner" constraints="{max:100,places:0}" id="integertextbox3" value="10">
+
+ <hr class="spacer">
+
+ <h2>dijit.form.Textarea: (sans <i>any</i> styling...)</h2>
+ <textarea dojoType="dijit.form.Textarea" name="areText">Lorem ipsum dolor sit amet,
+ consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet
+ dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci
+ tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis
+ autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,
+ vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
+ dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait
+ nulla facilisi.
+ </textarea>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.ComboBox</h2>
+ <label for="datatestComboBox">US State test 2: </label>
+ <input dojoType="dijit.form.ComboBox"
+ value="California"
+ class="medium"
+ store="stateStore"
+ searchAttr="name"
+ style="width: 300px;"
+ name="state2"
+ id="datatestComboBox"
+ >
+
+ </form>
+
+ </div><!-- end first tab -->
+
+ <!-- second upper tab -->
+ <div id="tab2" dojoType="dijit.layout.ContentPane" title="Various Dijits"
+ style="padding:10px; display:none;">
+
+ <!-- Sliders: -->
+ <div style="float:right;">
+ <div dojoType="dijit.form.VerticalSlider" name="vertical1"
+ onChange="dojo.byId('slider2input').value=arguments[0];"
+ value="10"
+ maximum="100"
+ minimum="0"
+ discreteValues="11"
+ style="height:175px; clear:both"
+ id="slider2">
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="leftDecoration"style="width:2em;color:gray;" labelStyle="right:0px;">
+ <li>0
+ <li>100
+ </ol>
+
+ <div dojoType="dijit.form.VerticalRule" container="leftDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <div dojoType="dijit.form.VerticalRule" container="rightDecoration" count=11 style="width:5px;" ruleStyle="border-color:gray;"></div>
+ <ol dojoType="dijit.form.VerticalRuleLabels" container="rightDecoration"style="width:2em;color:gray;" maximum="100" count="6" numericMargin="1" constraints="{pattern:'#'}"></ol>
+ </div>
+ <br> Slider2 Value:<input readonly id="slider2input" size="3" value="10">
+ </div>
+ <h2>Sliders</h2>
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal1"
+ onChange="dojo.byId('slider1input').value=dojo.number.format(arguments[0]/100,{places:1,pattern:'#%'});"
+ value="10"
+ maximum="100"
+ minimum="0"
+ showButtons="false"
+ intermediateChanges="true"
+ style="width:50%; height: 20px;"
+ id="horizontal1">
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="topDecoration" style="height:1.2em;font-size:75%;color:gray;" numericMargin="1" count="6"></ol>
+ <div dojoType="dijit.form.HorizontalRule" container="topDecoration" count=11 style="height:5px;"></div>
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=5 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration" style="height:1em;font-size:75%;color:gray;">
+ <li>lowest
+ <li>normal
+ <li>highest
+ </ol>
+
+ </div>
+ <br>Value: <input readonly id="slider1input" size="5" value="10.0%">
+
+ <div dojoType="dijit.form.HorizontalSlider" name="horizontal2"
+ minimum="1"
+ value="2"
+ maximum="3"
+ discreteValues="3"
+ showButtons="false"
+ intermediateChanges="true"
+ style="width:300px; height: 40px;"
+ id="horizontal2">
+ <div dojoType="dijit.form.HorizontalRule" container="bottomDecoration" count=3 style="height:5px;"></div>
+ <ol dojoType="dijit.form.HorizontalRuleLabels" container="bottomDecoration"style="height:1em;font-size:75%;color:gray;">
+ <li><img width=10 height=10 src="../tests/images/note.gif"><br><span style="font-size: small">small</span>
+ <li><img width=15 height=15 src="../tests/images/note.gif"><br><span style="font-size: medium">medium</span>
+
+ <li><img width=20 height=20 src="../tests/images/note.gif"><br><span style="font-size: large">large</span>
+ </ol>
+ </div>
+
+ <br style="clear:both;">
+ <hr class="spacer">
+
+ <h2>ProgressBar</h2>
+ <div style="width:400px; height:20px;" annotate="true" maximum="200" id="setTestBar"
+ progress="20" dojoType="dijit.ProgressBar"></div>
+
+ Indeterminate:
+ <div style="width:400px; height:20px" indeterminate="true" dojoType="dijit.ProgressBar"></div>
+
+ <hr class="spacer">
+
+ <h2>TitlePane (nested)</h2>
+ <div dojoType="dijit.TitlePane" title="Outer pane" width="275">
+ <p>This is a title pane, containing another title pane ...</p>
+ <div dojoType="dijit.TitlePane" title="Inner pane" width="125">
+
+ <p>And this is the inner title pane...</p>
+
+ <p>Sed sollicitudin suscipit risus. Nam
+ ullamcorper. Sed nisl lectus, pellentesque nec,
+ malesuada eget, ornare a, libero. Lorem ipsum dolor
+ sit amet, consectetuer adipiscing elit.</p>
+
+ </div><!-- end inner titlepane -->
+ <p>And this is the closing line for the outer title pane.</p>
+ </div><!-- end outer title pane -->
+ <h2>HTML After, check indent</h2>
+ </div><!-- end:second upper tab -->
+
+ <!-- start third upper tab -->
+ <div id="tab3" dojoType="dijit.layout.ContentPane" title="Buttons"
+ style="padding:10px; display:none; ">
+
+ <h2>Simple, drop down &amp; combo buttons</h2>
+ <p>Buttons can do an action, display a menu, or both:</p>
+
+ <div class="box">
+ <button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'>
+ Create
+ </button>
+
+ <button dojoType="dijit.form.DropDownButton" iconClass="noteIcon">
+ <span>Edit</span>
+ <div dojoType="dijit.Menu" id="editMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconCut"
+ onClick="console.debug('not actually cutting anything, just a test!')">
+ Cut
+ </div>
+
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconCopy"
+ onClick="console.debug('not actually copying anything, just a test!')">
+ Copy
+ </div>
+
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconPaste"
+ onClick="console.debug('not actually pasting anything, just a test!')">
+ Paste
+ </div>
+ </div>
+ </button>
+
+ <button dojoType="dijit.form.ComboButton" iconClass="noteIcon"
+ optionsTitle='save options'
+ onClick='console.debug("clicked combo save")'>
+ <span>Save</span>
+ <div dojoType="dijit.Menu" id="saveMenu" style="display: none;">
+ <div dojoType="dijit.MenuItem"
+ iconClass="dijitEditorIcon dijitEditorIconSave"
+ onClick="console.debug('not actually saving anything, just a test!')">
+ Save
+ </div>
+ <div dojoType="dijit.MenuItem"
+ onClick="console.debug('not actually saving anything, just a test!')">
+ Save As
+ </div>
+ </div>
+ </button>
+
+ <button dojoType="dijit.form.Button" iconClass="plusIcon" onClick='console.debug("clicked simple")'
+ disabled='true'>
+ Disabled
+ </button>
+ </div><!-- end:box -->
+
+ <hr class="spacer">
+
+ <h2>Sizing</h2>
+ <p>Short button, tall buttons, big buttons, small buttons... These buttons
+ size to their content (just like &lt;button&gt;).</p>
+
+ <div class="box">
+ <button dojoType="dijit.form.Button" iconClass="flatScreenIcon" onclick='console.debug("big");'>
+ <span style="font-size:xx-large">big</span>
+ </button>
+
+ <button id="smallButton1" dojoType="dijit.form.Button" onclick='console.debug("small");'>
+ <img src="../tests/images/arrowSmall.gif" width="15" height="5">
+ <span style="font-size:x-small">small</span>
+ </button>
+
+ <button dojoType="dijit.form.Button" onclick='console.debug("long");'>
+ <img src="../tests/images/tube.gif" width="150" height="16"> long
+ </button>
+
+ <button dojoType="dijit.form.Button" onclick='console.debug("tall");' width2height="0.1">
+ <img src="../tests/images/tubeTall.gif" height="75" width="35"><br>
+ <span style="font-size:medium">tall</span>
+ </button>
+ <div style="clear: both;"></div>
+ </div><!-- end box -->
+
+ <hr class="spacer">
+
+ <h2>Customized buttons</h2>
+ <p>Dojo users can mix in their styles. Here's an example:</p>
+
+ <div><!-- custom styled button tests -->
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("short");'>
+ <div class="dc">short</div>
+ </button>
+
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("longer");'>
+ <div class="dc">bit longer</div>
+ </button>
+
+ <button dojoType="dijit.form.Button" class="myCustomTheme"
+ onclick='console.debug("longer yet");'>
+ <div class="dc">ridiculously long</div>
+ </button>
+
+ <div style="clear: both;"></div>
+ </div><!-- end styled buttons -->
+
+ </div><!-- end third upper tab-->
+
+ <!-- fourth upper tab -->
+ <div id="tab" dojoType="dijit.layout.ContentPane" title="Editable Text" style="padding:10px;" selected="selected">
+
+ <h2>dijit.Editor:</h2>
+ <!-- FIXME:
+ set height on this node to size the whole editor, but causes the tab to not scroll
+ until you select another tab and come back. alternative is no height: here, but that
+ causes editor to become VERY tall, and size to a normal height when selected (like the
+ dijit.form.TextArea in "Form Feel" Tab), but in reverse. refs #3980 and is maybe new bug?
+ -->
+ <div style="border:1px solid #ededed;">
+ <textarea height="175" dojoType="dijit.Editor" styleSheets="../../dojo/resources/dojo.css" sytle="width:400px; height:175px; overflow:auto; ">
+ <ul>
+ <li>Lorem <a href="http://dojotoolkit.org">and a link</a>, what do you think?</li>
+ <li>This is the Editor with a Toolbar attached.</li>
+ </ul>
+ </textarea>
+ </div>
+ <hr class="spacer">
+
+
+ <h2 class="testTitle">dijit.InlineEditBox + dijit.form.TextBox on &lt;h3&gt;</h2>
+
+ (HTML before)
+ <h3 id="editable" style="font-size:larger;" dojoType="dijit.InlineEditBox" onChange="myHandler(this.id,arguments[0])">
+ Edit me - I trigger the onChange callback
+ </h3>
+ (HTML after)
+
+ <hr class="spacer">
+
+ <h2>dijit.InlineEditBox + dijit.form.Textarea</h2>
+
+ (HTML before)
+ <p id="areaEditable" dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea" autoSave="false">
+ I'm one big paragraph. Go ahead and edit me. I dare you.
+ The quick brown fox jumped over the lazy dog. Blah blah blah blah blah blah blah ...
+ </p>
+ (HTML after)
+
+ <p>
+ These links will
+ <a href="#" onClick="dijit.byId('areaEditable').setDisabled(true)">disable</a> /
+ <a href="#" onClick="dijit.byId('areaEditable').setDisabled(false)">enable</a>
+ the text area above.
+ </p>
+
+ <hr class="spacer">
+
+ <h2>dijit.form.DateTextBox:</h2>
+
+ (HTML inline before)
+ <span id="backgroundArea" dojoType="dijit.InlineEditBox" editor="dijit.form.DateTextBox" width="170px">12/30/2005</span>
+ (HTML after)
+
+ <hr class="spacer">
+
+ <h2>dijit.form.TimeTextBox:</h2>
+
+ (HTML inline before)
+ <span id="timePicker" dojoType="dijit.InlineEditBox" editor="dijit.form.TimeTextBox" width="150px">9:00 AM</span>
+ (HTML after)
+
+ <hr class="spacer">
+
+
+ <h2>dijit.form.FilteringSelect + Inline + remote data store:</h2>
+ (HTML inline before)
+ <span id="backgroundArea2" dojoType="dijit.InlineEditBox" editor="dijit.form.FilteringSelect"
+ editorParams="{store: stateStore, autoComplete: true, promptMessage: 'Please enter a state'}"
+ width="300px">
+ Indiana
+ </span>
+ (HTML after)
+
+ </div><!-- end fourth upper tab -->
+
+ <!-- fifth upper tab -->
+ <div id="tab5" dojoType="dijit.layout.ContentPane" title="DnD"
+ style="padding:10px; display:none; ">
+ <div style="float:left; margin:5px; ">
+ <h3>Source 1</h3>
+ <div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+ <div class="dojoDndItem">Item <strong>X</strong></div>
+ <div class="dojoDndItem">Item <strong>Y</strong></div>
+ <div class="dojoDndItem">Item <strong>Z</strong></div>
+ </div>
+ </div>
+ <div style="float:left; margin:5px; ">
+ <h3>Source 2</h3>
+ <div dojoType="dojo.dnd.Source" style="border:3px solid #ccc; padding: 1em 3em; ">
+ <div class="dojoDndItem">Item <strong>1</strong></div>
+ <div class="dojoDndItem">Item <strong>2</strong></div>
+ <div class="dojoDndItem">Item <strong>3</strong></div>
+ </div>
+ </div>
+ </div>
+
+ <!-- sixth upper tab -->
+ <div id="tab6" dojoType="dijit.layout.ContentPane" title="Closable"
+ style="display:none; padding:10px; " closable="true">
+ This pane is closable, just for the icon ...
+ </div>
+ </div><!-- end of region="center" TabContainer -->
+
+ <!-- bottom right tabs -->
+ <div dojoType="dijit.layout.TabContainer" id="bottomTabs" tabPosition="bottom" selectedChild="btab1" region="bottom" splitter="true">
+
+ <!-- btab 1 -->
+ <div id="btab1" dojoType="dijit.layout.ContentPane" title="Info" style=" padding:10px; ">
+ <p>You can explore this single page after applying a Theme
+ for use in creation of your own theme.</p>
+
+ <p>I am whole slew of Widgets on a page. Jump to <a href="../tests/">dijit tests</a> to
+ test individual components.</p>
+
+ <p>There is a right-click [context] pop-up menu here, as well.</p>
+ </div><!-- end:info btab1 -->
+
+ <div id="btab2" dojoType="dijit.layout.ContentPane" title="Alternate Themes" style="padding:20px;">
+ <span id="themeData"></span>
+ </div><!-- btab2 -->
+
+ <div id="btab3" dojoType="dijit.layout.ContentPane" title="Bottom 3" closable="true">
+ <p>I am the last Tab</p>
+ <div id="dialog2" dojoType="dijit.Dialog" title="Encased Dialog" style="display:none;">
+ I am the second dialog. I am
+ parented by the Low Tab Pane #3
+ </div>
+ </div><!-- btab3 -->
+
+ </div><!-- end Bottom TabContainer -->
+
+ </div> <!-- end of "mainSplit" BorderContainer -->
+ </div><!-- end of "main" BorderContainer -->
+
+ <!-- dialog in body -->
+ <div id="dialog1" dojoType="dijit.Dialog" title="Floating Modal Dialog" style="display:none;" href="../tests/layout/doc0.html"></div>
+
+</body>
+</html>
diff --git a/includes/js/dijit/themes/tundra/Calendar.css b/includes/js/dijit/themes/tundra/Calendar.css
new file mode 100644
index 0000000..4a75069
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Calendar.css
@@ -0,0 +1,132 @@
+
+
+.tundra .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .tundra .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.tundra .dijitCalendarIncreaseInner,
+.tundra .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.tundra .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .tundra .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+.tundra .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat -30px top;
+}
+.dj_ie6 .tundra .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -30px top;
+}
+.tundra table.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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .tundra .dijitCalendarDateTemplate,
+.dj_ie6 .tundra .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.tundra .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.05em 0.3em;
+ letter-spacing: 1px;
+}
+.tundra .dijitCalendarPreviousMonth,
+.tundra .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#f8f8f8 !important;
+}
+.tundra .dijitCalendarPreviousMonthDisabled,
+.tundra .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.tundra .dijitCalendarCurrentMonth {
+
+ background-color:white !important;
+}
+.tundra .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.tundra .dijitCalendarCurrentDate {
+
+ text-decoration:underline;
+ font-weight:bold;
+}
+.tundra .dijitCalendarCurrentDate {
+
+ text-decoration:underline;
+ font-weight:bold;
+}
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Calendar.css.commented.css b/includes/js/dijit/themes/tundra/Calendar.css.commented.css
new file mode 100644
index 0000000..53f9a83
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Calendar.css.commented.css
@@ -0,0 +1,154 @@
+/* Calendar*/
+
+.tundra .dijitCalendarIncrementControl {
+ /* next/prev month buttons */
+ width:15px;
+ height:15px;
+
+}
+.dj_ie6 .tundra .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+
+.tundra .dijitCalendarIncreaseInner,
+.tundra .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+
+.tundra .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat top left;
+}
+.dj_ie6 .tundra .dijitCalendarDecrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat top left;
+}
+
+.tundra .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.png") no-repeat -30px top;
+}
+.dj_ie6 .tundra .dijitCalendarIncrease {
+ background:url("images/spriteRoundedIconsSmall.gif") no-repeat -30px top;
+}
+
+.tundra table.dijitCalendarContainer {
+ font-size: 100%;
+ border-spacing: 0;
+ border-collapse: separate;
+ 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;
+ text-align:center;
+}
+.dj_ie6 .tundra .dijitCalendarMonthContainer th {
+ padding-top:.1em;
+ padding-bottom:0em;
+}
+
+.tundra .dijitCalendarDayLabelTemplate {
+ /* day of week labels */
+ 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;
+}
+
+.dj_ie7 .tundra .dijitCalendarDateTemplate,
+.dj_ie6 .tundra .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+
+.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;
+}
+
+
+.tundra .dijitCalendarPreviousMonth,
+.tundra .dijitCalendarNextMonth {
+ /* days that are part of the previous or next month */
+ color:#999999;
+ background-color:#f8f8f8 !important;
+}
+
+.tundra .dijitCalendarPreviousMonthDisabled,
+.tundra .dijitCalendarNextMonthDisabled {
+ /* days that are part of the previous or next month - disabled*/
+ background-color:#a4a5a6 !important;
+}
+
+.tundra .dijitCalendarCurrentMonth {
+ /* days that are part of this month */
+ background-color:white !important;
+}
+
+.tundra .dijitCalendarCurrentMonthDisabled {
+ /* days that are part of this month - disabled */
+ background-color:#bbbbbc !important;
+}
+
+.tundra .dijitCalendarCurrentDate {
+ /* cell for today's date */
+ text-decoration:underline;
+ font-weight:bold;
+}
+
+.tundra .dijitCalendarCurrentDate {
+ /* cell for today's date */
+ text-decoration:underline;
+ font-weight:bold;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Calendar_rtl.css b/includes/js/dijit/themes/tundra/Calendar_rtl.css
new file mode 100644
index 0000000..e64cdf2
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Calendar_rtl.css
@@ -0,0 +1,13 @@
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/tundra/Calendar_rtl.css.commented.css b/includes/js/dijit/themes/tundra/Calendar_rtl.css.commented.css
new file mode 100644
index 0000000..84146f8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Calendar_rtl.css.commented.css
@@ -0,0 +1,16 @@
+
+/* Calendar */
+
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
diff --git a/includes/js/dijit/themes/tundra/ColorPalette.css b/includes/js/dijit/themes/tundra/ColorPalette.css
new file mode 100644
index 0000000..56fa558
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/ColorPalette.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #7eabcd;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/tundra/ColorPalette.css.commented.css b/includes/js/dijit/themes/tundra/ColorPalette.css.commented.css
new file mode 100644
index 0000000..56fa558
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/ColorPalette.css.commented.css
@@ -0,0 +1,5 @@
+.dijitColorPalette {
+ border:1px solid #7eabcd;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/tundra/Common.css b/includes/js/dijit/themes/tundra/Common.css
new file mode 100644
index 0000000..1089f4b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Common.css
@@ -0,0 +1,37 @@
+
+.tundra .dijitSliderDisabled *,
+.tundra .dijitDisabledClickableRegion,
+.tundra .dijitSpinnerDisabled *,
+.tundra .dijitButtonDisabled *,
+.tundra .dijitDropDownButtonDisabled *,
+.tundra .dijitComboButtonDisabled *,
+.tundra .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Common.css.commented.css b/includes/js/dijit/themes/tundra/Common.css.commented.css
new file mode 100644
index 0000000..6419b38
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Common.css.commented.css
@@ -0,0 +1,45 @@
+/**** Disabled cursor *****/
+.tundra .dijitSliderDisabled *,
+.tundra .dijitDisabledClickableRegion, /* a region the user would be able to click on, but it's disabled */
+.tundra .dijitSpinnerDisabled *,
+.tundra .dijitButtonDisabled *,
+.tundra .dijitDropDownButtonDisabled *,
+.tundra .dijitComboButtonDisabled *,
+.tundra .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+
+/* 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; }
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Dialog.css b/includes/js/dijit/themes/tundra/Dialog.css
new file mode 100644
index 0000000..9fcccd5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Dialog.css
@@ -0,0 +1,145 @@
+
+.tundra .dijitDialog {
+ background: #fff;
+ border: 1px solid #7eabcd;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.tundra .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+.tundra .dijitDialog .dijitDialogPaneContent {
+ background: #fff;
+ border:none;
+ border-top: 1px solid #d3d3d3;
+ padding:10px;
+}
+.tundra .dijitDialogTitleBar {
+
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.tundra .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.tundra .dijitDialogCloseIcon {
+
+ background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .tundra .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+.tundra .dijitDialogContent {
+
+ padding: 8px;
+}
+.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: 6px;
+}
+.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_ie6 .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_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -3px;
+}
+.tundra .dijitTooltipLeft {
+ padding-right: 14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft {
+ padding-left: 15px;
+}
+.tundra .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+.tundra .dijitTooltipRight {
+ padding-left: 14px;
+}
+.tundra .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
+.dj_safari .tundra .dijitPopup .dijitTooltipContainer,
+.dj_safari .tundra .dijitPopup .dijitMenu {
+
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+}
+.tundra .dijitPopup > div,
+.tundra .dijitPopup > table {
+ opacity: 0.95;
+}
diff --git a/includes/js/dijit/themes/tundra/Dialog.css.commented.css b/includes/js/dijit/themes/tundra/Dialog.css.commented.css
new file mode 100644
index 0000000..1782b55
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Dialog.css.commented.css
@@ -0,0 +1,179 @@
+
+/* Dialog */
+
+
+
+.tundra .dijitDialog {
+ background: #fff;
+ border: 1px solid #7eabcd;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+
+.tundra .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
+.tundra .dijitDialog .dijitDialogPaneContent {
+ background: #fff;
+ border:none;
+ border-top: 1px solid #d3d3d3; /* #cddde9; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+ padding:10px;
+
+}
+
+.tundra .dijitDialogTitleBar {
+ /* outer container for the titlebar of the dialog */
+ background: #fafafa url("images/titleBar.png") repeat-x top left;
+ /* border: 1px solid #bfbfbf; */
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ 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: 8px 12px 8px 12px;
+ outline:0;
+}
+
+.tundra .dijitDialogCloseIcon {
+ /* the default close icon for the dialog */
+ background : url("images/spriteRoundedIconsSmall.png") no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .tundra .dijitDialogCloseIcon {
+ background : url("images/spriteRoundedIconsSmall.gif") no-repeat right top;
+}
+
+.tundra .dijitDialogContent {
+ /* the body of the dialog */
+ padding: 8px;
+}
+
+
+/* Tooltip and TooltipDialog */
+
+.tundra .dijitTooltip,
+.tundra .dijitTooltipDialog {
+ /* the outermost dom node, holding the connector and container */
+ /* opacity: 0.95; */
+ 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: 6px;
+}
+
+.tundra .dijitTooltipConnector {
+ /* the arrow piece */
+ border:0px;
+ 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 {
+ /* the arrow piece for tooltips below an element */
+ top: 0px;
+ left: 3px;
+ background:url("images/tooltipConnectorUp.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+
+.dj_ie6 .tundra .dijitTooltipBelow .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorUp.gif");
+}
+
+.tundra .dijitTooltipAbove .dijitTooltipConnector {
+ /* the arrow piece for tooltips above an element */
+ bottom: 0px;
+ left: 3px;
+ background:url("images/tooltipConnectorDown.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorDown.gif");
+ bottom: -3px;
+}
+
+.tundra .dijitTooltipLeft {
+ padding-right: 14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft {
+ padding-left: 15px;
+}
+.tundra .dijitTooltipLeft .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the left of an element, bottom borders aligned */
+ right: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorRight.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorRight.gif");
+}
+
+.tundra .dijitTooltipRight {
+ padding-left: 14px;
+}
+.tundra .dijitTooltipRight .dijitTooltipConnector {
+ /* the arrow piece for tooltips to the right of an element, bottom borders aligned */
+ left: 0px;
+ bottom: 7px;
+ background:url("images/tooltipConnectorLeft.png") no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url("images/tooltipConnectorLeft.gif");
+}
+
+
+.dj_safari .tundra .dijitPopup .dijitTooltipContainer,
+.dj_safari .tundra .dijitPopup .dijitMenu {
+ /* -webkit-border-radius: 5px; */
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+}
+
+
+/*
+ * Control opacity of popups
+ */
+.tundra .dijitPopup > div,
+.tundra .dijitPopup > table {
+ opacity: 0.95;
+}
diff --git a/includes/js/dijit/themes/tundra/Dialog_rtl.css b/includes/js/dijit/themes/tundra/Dialog_rtl.css
new file mode 100644
index 0000000..2f29eda
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Dialog_rtl.css
@@ -0,0 +1,21 @@
+
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/tundra/Dialog_rtl.css.commented.css b/includes/js/dijit/themes/tundra/Dialog_rtl.css.commented.css
new file mode 100644
index 0000000..74b193a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Dialog_rtl.css.commented.css
@@ -0,0 +1,29 @@
+/* Dialog */
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+
+/*FIXME: redundant?*/
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+
+
+/* ToolTip */
+
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
diff --git a/includes/js/dijit/themes/tundra/Editor.css b/includes/js/dijit/themes/tundra/Editor.css
new file mode 100644
index 0000000..aed1e46
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Editor.css
@@ -0,0 +1,55 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.tundra .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+.tundra .dijitEditorIcon {
+ background-image: url('images/editor.gif');
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.tundra .dijitEditorIconSep { background-position: 0px; }
+.tundra .dijitEditorIconBackColor { background-position: -18px; }
+.tundra .dijitEditorIconBold { background-position: -36px; }
+.tundra .dijitEditorIconCancel { background-position: -54px; }
+.tundra .dijitEditorIconCopy { background-position: -72px; }
+.tundra .dijitEditorIconCreateLink { background-position: -90px; }
+.tundra .dijitEditorIconCut { background-position: -108px; }
+.tundra .dijitEditorIconDelete { background-position: -126px; }
+.tundra .dijitEditorIconForeColor { background-position: -144px; }
+.tundra .dijitEditorIconHiliteColor { background-position: -162px; }
+.tundra .dijitEditorIconIndent { background-position: -180px; }
+.tundra .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.tundra .dijitEditorIconInsertImage { background-position: -216px; }
+.tundra .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.tundra .dijitEditorIconInsertTable { background-position: -252px; }
+.tundra .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.tundra .dijitEditorIconItalic { background-position: -288px; }
+.tundra .dijitEditorIconJustifyCenter { background-position: -306px; }
+.tundra .dijitEditorIconJustifyFull { background-position: -324px; }
+.tundra .dijitEditorIconJustifyLeft { background-position: -342px; }
+.tundra .dijitEditorIconJustifyRight { background-position: -360px; }
+.tundra .dijitEditorIconLeftToRight { background-position: -378px; }
+.tundra .dijitEditorIconListBulletIndent { background-position: -396px; }
+.tundra .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.tundra .dijitEditorIconListNumIndent { background-position: -432px; }
+.tundra .dijitEditorIconListNumOutdent { background-position: -450px; }
+.tundra .dijitEditorIconOutdent { background-position: -468px; }
+.tundra .dijitEditorIconPaste { background-position: -486px; }
+.tundra .dijitEditorIconRedo { background-position: -504px; }
+.tundra .dijitEditorIconRemoveFormat { background-position: -522px; }
+.tundra .dijitEditorIconRightToLeft { background-position: -540px; }
+.tundra .dijitEditorIconSave { background-position: -558px; }
+.tundra .dijitEditorIconSpace { background-position: -576px; }
+.tundra .dijitEditorIconStrikethrough { background-position: -594px; }
+.tundra .dijitEditorIconSubscript { background-position: -612px; }
+.tundra .dijitEditorIconSuperscript { background-position: -630px; }
+.tundra .dijitEditorIconUnderline { background-position: -648px; }
+.tundra .dijitEditorIconUndo { background-position: -666px; }
+.tundra .dijitEditorIconWikiword { background-position: -684px; }
+.tundra .dijitEditorIconToggleDir { background-position: -540px; }
diff --git a/includes/js/dijit/themes/tundra/Editor.css.commented.css b/includes/js/dijit/themes/tundra/Editor.css.commented.css
new file mode 100644
index 0000000..a656cf4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Editor.css.commented.css
@@ -0,0 +1,58 @@
+.dijitIEFixedToolbar {
+ position:absolute;
+ /* top:0; */
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+
+.tundra .dijitToolbar .dijitToolbarSeparator {
+ background: url('images/editor.gif');
+}
+
+.tundra .dijitEditorIcon {
+ background-image: url('images/editor.gif'); /* editor icons sprite image */
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.tundra .dijitEditorIconSep { background-position: 0px; }
+.tundra .dijitEditorIconBackColor { background-position: -18px; }
+.tundra .dijitEditorIconBold { background-position: -36px; }
+.tundra .dijitEditorIconCancel { background-position: -54px; }
+.tundra .dijitEditorIconCopy { background-position: -72px; }
+.tundra .dijitEditorIconCreateLink { background-position: -90px; }
+.tundra .dijitEditorIconCut { background-position: -108px; }
+.tundra .dijitEditorIconDelete { background-position: -126px; }
+.tundra .dijitEditorIconForeColor { background-position: -144px; }
+.tundra .dijitEditorIconHiliteColor { background-position: -162px; }
+.tundra .dijitEditorIconIndent { background-position: -180px; }
+.tundra .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.tundra .dijitEditorIconInsertImage { background-position: -216px; }
+.tundra .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.tundra .dijitEditorIconInsertTable { background-position: -252px; }
+.tundra .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.tundra .dijitEditorIconItalic { background-position: -288px; }
+.tundra .dijitEditorIconJustifyCenter { background-position: -306px; }
+.tundra .dijitEditorIconJustifyFull { background-position: -324px; }
+.tundra .dijitEditorIconJustifyLeft { background-position: -342px; }
+.tundra .dijitEditorIconJustifyRight { background-position: -360px; }
+.tundra .dijitEditorIconLeftToRight { background-position: -378px; }
+.tundra .dijitEditorIconListBulletIndent { background-position: -396px; }
+.tundra .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.tundra .dijitEditorIconListNumIndent { background-position: -432px; }
+.tundra .dijitEditorIconListNumOutdent { background-position: -450px; }
+.tundra .dijitEditorIconOutdent { background-position: -468px; }
+.tundra .dijitEditorIconPaste { background-position: -486px; }
+.tundra .dijitEditorIconRedo { background-position: -504px; }
+.tundra .dijitEditorIconRemoveFormat { background-position: -522px; }
+.tundra .dijitEditorIconRightToLeft { background-position: -540px; }
+.tundra .dijitEditorIconSave { background-position: -558px; }
+.tundra .dijitEditorIconSpace { background-position: -576px; }
+.tundra .dijitEditorIconStrikethrough { background-position: -594px; }
+.tundra .dijitEditorIconSubscript { background-position: -612px; }
+.tundra .dijitEditorIconSuperscript { background-position: -630px; }
+.tundra .dijitEditorIconUnderline { background-position: -648px; }
+.tundra .dijitEditorIconUndo { background-position: -666px; }
+.tundra .dijitEditorIconWikiword { background-position: -684px; }
+.tundra .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/includes/js/dijit/themes/tundra/Editor_rtl.css b/includes/js/dijit/themes/tundra/Editor_rtl.css
new file mode 100644
index 0000000..2e936ec
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Editor_rtl.css
@@ -0,0 +1,7 @@
+
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif');
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/Editor_rtl.css.commented.css b/includes/js/dijit/themes/tundra/Editor_rtl.css.commented.css
new file mode 100644
index 0000000..2a2df3e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Editor_rtl.css.commented.css
@@ -0,0 +1,9 @@
+/* Editor */
+.dijitRtl .dijitEditorIcon {
+ background-image: url('images/editor_rtl.gif'); /* editor icons sprite image */
+}
+
+/* Toolbar */
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url('images/editor_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/Menu.css b/includes/js/dijit/themes/tundra/Menu.css
new file mode 100644
index 0000000..2e685d0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Menu.css
@@ -0,0 +1,45 @@
+.tundra .dijitMenu {
+ border: 1px solid #7eabcd;
+ margin: 0px;
+ padding: 0px;
+}
+.tundra .dijitMenuItem {
+ background-color: #f7f7f7;
+ font: menu;
+ margin: 0;
+}
+.tundra .dijitMenuPreviousButton, .tundra .dijitMenuNextButton {
+ font-style: italic;
+}
+.tundra .dijitMenuItem td {
+ padding:2px;
+}
+.tundra .dijitMenuItemHover {
+ background-color: #60a1ea;
+ color:#fff;
+}
+.tundra .dijitMenuItemIcon {
+ width: 16px;
+ height: 16px;
+}
+.tundra .dijitMenuExpand {
+ display:none;
+}
+.tundra .dijitMenuExpandEnabled {
+ width:16px;
+ height:16px;
+ background:url('images/arrowRight.gif') no-repeat center center;
+ display:block;
+}
+.tundra .dijitMenuExpandInner {
+ display:none;
+}
+.tundra .dijitMenuSeparator {
+ background-color: #f7f7f7;
+}
+.tundra .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #9b9b9b;
+}
+.tundra .dijitMenuSeparatorBottom {
+ border-top: 1px solid #e8e8e8;
+}
diff --git a/includes/js/dijit/themes/tundra/Menu.css.commented.css b/includes/js/dijit/themes/tundra/Menu.css.commented.css
new file mode 100644
index 0000000..bed92ca
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Menu.css.commented.css
@@ -0,0 +1,54 @@
+.tundra .dijitMenu {
+ border: 1px solid #7eabcd;
+ margin: 0px;
+ padding: 0px;
+}
+
+.tundra .dijitMenuItem {
+ background-color: #f7f7f7;
+ font: menu;
+ margin: 0;
+}
+.tundra .dijitMenuPreviousButton, .tundra .dijitMenuNextButton {
+ font-style: italic;
+}
+.tundra .dijitMenuItem td {
+ padding:2px;
+}
+
+.tundra .dijitMenuItemHover {
+ background-color: #60a1ea;
+ color:#fff;
+}
+
+.tundra .dijitMenuItemIcon {
+ width: 16px;
+ height: 16px;
+}
+
+.tundra .dijitMenuExpand {
+ display:none;
+}
+.tundra .dijitMenuExpandEnabled {
+ width:16px;
+ height:16px;
+ background:url('images/arrowRight.gif') no-repeat center center;
+ display:block;
+}
+
+.tundra .dijitMenuExpandInner {
+ display:none;
+}
+
+.tundra .dijitMenuSeparator {
+ background-color: #f7f7f7;
+}
+
+/* separator can be two pixels -- set border of either one to 0px to have only one */
+.tundra .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #9b9b9b;
+}
+
+.tundra .dijitMenuSeparatorBottom {
+ border-top: 1px solid #e8e8e8;
+}
diff --git a/includes/js/dijit/themes/tundra/Menu_rtl.css b/includes/js/dijit/themes/tundra/Menu_rtl.css
new file mode 100644
index 0000000..1c4ab3f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Menu_rtl.css
@@ -0,0 +1,7 @@
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/Menu_rtl.css.commented.css b/includes/js/dijit/themes/tundra/Menu_rtl.css.commented.css
new file mode 100644
index 0000000..f8f4bb3
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Menu_rtl.css.commented.css
@@ -0,0 +1,8 @@
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url('images/arrowLeft.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/ProgressBar.css b/includes/js/dijit/themes/tundra/ProgressBar.css
new file mode 100644
index 0000000..2263381
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/ProgressBar.css
@@ -0,0 +1,23 @@
+.tundra .dijitProgressBar {
+ margin:2px 0px 2px 0px;
+}
+.tundra .dijitProgressBarEmpty{
+
+ background:#fff url("images/progressBarEmpty.png") repeat-x top left;
+ 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;
+}
diff --git a/includes/js/dijit/themes/tundra/ProgressBar.css.commented.css b/includes/js/dijit/themes/tundra/ProgressBar.css.commented.css
new file mode 100644
index 0000000..190c517
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/ProgressBar.css.commented.css
@@ -0,0 +1,28 @@
+.tundra .dijitProgressBar {
+ margin:2px 0px 2px 0px;
+}
+
+.tundra .dijitProgressBarEmpty{
+ /* outer container and background of the bar that's not finished yet*/
+ background:#fff url("images/progressBarEmpty.png") repeat-x top left;
+ 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/includes/js/dijit/themes/tundra/TitlePane.css b/includes/js/dijit/themes/tundra/TitlePane.css
new file mode 100644
index 0000000..7cff86a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/TitlePane.css
@@ -0,0 +1,55 @@
+.tundra .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x bottom left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+}
+.tundra .dijitTitlePane .dijitArrowNode {
+ width:16px;
+ height:16px;
+ float:right;
+}
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/arrowRight.png') no-repeat center center;
+}
+.tundra .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ text-decoration:underline;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url('images/arrowRight.gif');
+}
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background:url('images/arrowDown.png') no-repeat center center;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background-image:url('images/arrowDown.gif');
+}
+.tundra .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.tundra .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.tundra .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.tundra .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 1px solid #ccc;
+}
+.tundra .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .tundra .dijitTitlePaneContentOuter,
+.dj_ie6 .tundra .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.tundra .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/tundra/TitlePane.css.commented.css b/includes/js/dijit/themes/tundra/TitlePane.css.commented.css
new file mode 100644
index 0000000..b4fb596
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/TitlePane.css.commented.css
@@ -0,0 +1,63 @@
+.tundra .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url("images/titleBar.png") repeat-x bottom left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+}
+
+/* TODO: merge these, and all other icons to a series of background-image:() and background-position: -16*n px styles */
+.tundra .dijitTitlePane .dijitArrowNode {
+ width:16px;
+ height:16px;
+ float:right;
+}
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/arrowRight.png') no-repeat center center;
+}
+
+.tundra .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ text-decoration:underline;
+}
+
+.dj_ie6 .tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url('images/arrowRight.gif');
+}
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background:url('images/arrowDown.png') no-repeat center center;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background-image:url('images/arrowDown.gif');
+}
+.tundra .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+
+.tundra .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+
+.tundra .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+
+.tundra .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 1px solid #ccc; /* w/out this, an <h1> on the top line causes a gap between the .content and .label */
+}
+.tundra .dijitTitlePaneContentInner {
+ padding:10px;
+}
+/* force hasLayout to ensure borders etc, show up */
+.dj_ie6 .tundra .dijitTitlePaneContentOuter,
+.dj_ie6 .tundra .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.tundra .dijitClickableRegion {
+ background-color : #ffc !important;
+}
diff --git a/includes/js/dijit/themes/tundra/TitlePane_rtl.css b/includes/js/dijit/themes/tundra/TitlePane_rtl.css
new file mode 100644
index 0000000..dfa7d89
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/TitlePane_rtl.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/arrowRight.png') no-repeat center center;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url('images/arrowRight.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css b/includes/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css
new file mode 100644
index 0000000..dfa7d89
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css
@@ -0,0 +1,6 @@
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url('images/arrowRight.png') no-repeat center center;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url('images/arrowRight.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/Toolbar.css b/includes/js/dijit/themes/tundra/Toolbar.css
new file mode 100644
index 0000000..c5d232b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Toolbar.css
@@ -0,0 +1,83 @@
+.tundra .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+.tundra .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.tundra .dijitToolbar .dijitButton,
+.tundra .dijitToolbar .dijitToggleButton,
+.tundra .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.tundra .dijitToolbar .dijitButtonChecked,
+.tundra .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d4dff2;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.tundra .dijitToolbar .dijitButtonCheckedHover,
+.tundra .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#abc1e5;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.tundra .dijitToolbar .dijitButtonHover,
+.tundra .dijitToolbar .dijitToggleButtonHover,
+.tundra .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #316ac5;
+ background-color:#abc1e5;
+}
+.tundra .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .tundra.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButton,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButton,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/tundra/Toolbar.css.commented.css b/includes/js/dijit/themes/tundra/Toolbar.css.commented.css
new file mode 100644
index 0000000..42c62ef
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Toolbar.css.commented.css
@@ -0,0 +1,95 @@
+.tundra .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url("images/titleBar.png") repeat-x top left;
+}
+
+.tundra .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+
+.tundra .dijitToolbar .dijitButton,
+.tundra .dijitToolbar .dijitToggleButton,
+.tundra .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+
+.tundra .dijitToolbar .dijitButtonChecked,
+.tundra .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d4dff2;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.tundra .dijitToolbar .dijitButtonCheckedHover,
+.tundra .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#abc1e5;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+
+.tundra .dijitToolbar .dijitButtonHover,
+.tundra .dijitToolbar .dijitToggleButtonHover,
+.tundra .dijitToolbar .dijitDropDownButtonHover {
+ /* TODO: change this from Hover to Selected so that button is still highlighted while drop down is being used */
+ border: 1px solid #316ac5;
+ background-color:#abc1e5;
+}
+
+.tundra .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .tundra.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+/* IE6 specific rules */
+.dj_ie6 .tundra .dijitToolbar .dijitButton,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButton,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButton {
+ /* workaround no transparent border support in IE6 */
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+
+.dj_ie6 .tundra .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .tundra .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+
+.dj_ie6 .tundra .dijitToolbar .dijitButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
diff --git a/includes/js/dijit/themes/tundra/Tree.css b/includes/js/dijit/themes/tundra/Tree.css
new file mode 100644
index 0000000..954be37
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Tree.css
@@ -0,0 +1,65 @@
+
+.tundra .dijitTreeNode {
+ background-image : url('images/i.gif');
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ 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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.tundra .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.tundra .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.tundra .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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;
+ padding-right: 4px;
+}
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Tree.css.commented.css b/includes/js/dijit/themes/tundra/Tree.css.commented.css
new file mode 100644
index 0000000..b172a66
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Tree.css.commented.css
@@ -0,0 +1,86 @@
+
+/* Tree */
+
+.tundra .dijitTreeNode {
+ background-image : url('images/i.gif');
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ zoom: 1; /* MOW: what the heck is this doing in here? */
+}
+
+/* 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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+
+
+.tundra .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+
+/* same style as IE selection */
+.tundra .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+/* don't use :focus due to opera and IE's lack of support on div's */
+.tundra .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+
+.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;
+ padding-right: 4px;
+}
+
+.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;
+}
diff --git a/includes/js/dijit/themes/tundra/Tree_rtl.css b/includes/js/dijit/themes/tundra/Tree_rtl.css
new file mode 100644
index 0000000..5b4ba1f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Tree_rtl.css
@@ -0,0 +1,30 @@
+
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/i_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/i_half_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background-image: url('images/treeExpand_minus_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/treeExpand_plus_rtl.gif');
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background-image: url('images/treeExpand_leaf_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/Tree_rtl.css.commented.css b/includes/js/dijit/themes/tundra/Tree_rtl.css.commented.css
new file mode 100644
index 0000000..52e0135
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/Tree_rtl.css.commented.css
@@ -0,0 +1,37 @@
+
+/* Tree */
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url('images/i_rtl.gif');
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url('images/i_half_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background-image: url('images/treeExpand_minus_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url('images/treeExpand_plus_rtl.gif');
+}
+
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background-image: url('images/treeExpand_leaf_rtl.gif');
+}
diff --git a/includes/js/dijit/themes/tundra/form/Button.css b/includes/js/dijit/themes/tundra/form/Button.css
new file mode 100644
index 0000000..40e1e0f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Button.css
@@ -0,0 +1,93 @@
+
+.tundra .dijitButtonNode {
+
+
+ border:1px solid #c0c0c0;
+ border-bottom:1px solid #9b9b9b;
+ border-right:1px solid #9b9b9b;
+ padding: 0.2em;
+ background:#fff url("../images/buttonEnabled.png") repeat-x bottom left;
+}
+.dj_ie .tundra .dijitButtonNode {
+ zoom: 1;
+}
+.tundra .dijitButtonText {
+ padding: 0 0.3em;
+}
+.tundra .dijitComboBox .dijitButtonNode {
+ border: 0px;
+}
+.tundra .dijitArrowButton {
+ color: #111;
+}
+.tundra .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .tundra .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.tundra .dijitButtonDisabled .dijitButtonNode,
+.tundra .dijitToggleButtonDisabled .dijitButtonNode,
+.tundra .dijitDropDownButtonDisabled .dijitButtonNode,
+.tundra .dijitComboButtonDisabled .dijitButtonNode,
+.tundra .dijitComboBoxDisabled,
+.tundra .dijitSpinnerDisabled,
+.tundra .dijitSpinnerDisabled .dijitButtonNode {
+
+ border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+
+ background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
+ opacity: 0.60;
+}
+.dj_ie .tundra .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.tundra .dijitButtonHover .dijitButtonNode,
+.tundra .dijitToggleButtonHover .dijitButtonNode,
+.tundra .dijitDropDownButtonHover .dijitButtonNode,
+.tundra .dijitComboButtonHover .dijitButtonContents,
+.tundra .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.tundra .dijitComboBoxHover .dijitDownArrowButton,
+.tundra .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ border-color:#a5beda;
+ border-bottom-color:#5c7590;
+ border-right-color:#5c7590;
+ color:#000;
+ background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
+}
+.tundra .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.tundra .dijitButtonActive .dijitButtonNode,
+.tundra .dijitToggleButtonActive .dijitButtonNode,
+.tundra .dijitDropDownButtonActive .dijitButtonNode,
+.tundra .dijitComboButtonActive .dijitButtonContents,
+.tundra .dijitDownArrowActive .dijitDownArrowButton,
+.tundra .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#366dba;
+ background: #ededed url("../images/buttonActive.png") bottom repeat-x;
+}
+.tundra .dijitArrowButtonInner {
+ background:url("../images/arrowDown.png") no-repeat center center;
+}
+.tundra .dijitUpArrowButton .dijitArrowButtonInner { background-image:url("../images/arrowUp.png"); }
+.dj_ie6 .tundra .dijitArrowButtonInner {
+ background-image:url("../images/arrowDown.gif");
+}
+.dj_ie6 .tundra .dijitUpArrowButton .dijitArrowButtonInner {
+ background-image:url("../images/arrowUp.gif");
+}
+.tundra .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/comboArrowDown.gif") no-repeat center center;
+}
+.tundra .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
diff --git a/includes/js/dijit/themes/tundra/form/Button.css.commented.css b/includes/js/dijit/themes/tundra/form/Button.css.commented.css
new file mode 100644
index 0000000..f5bd15a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Button.css.commented.css
@@ -0,0 +1,113 @@
+
+/*****
+ dijit.form.Button
+ dijit.form.DropDownButton
+ dijit.form.ComboButton
+ dijit.form.ComboBox (partial)
+ *****/
+
+.tundra .dijitButtonNode {
+ /* enabled state - inner */
+ /* border:1px outset #a0a0a0; */
+ border:1px solid #c0c0c0;
+ border-bottom:1px solid #9b9b9b;
+ border-right:1px solid #9b9b9b;
+ padding: 0.2em;
+ background:#fff url("../images/buttonEnabled.png") repeat-x bottom left;
+}
+.dj_ie .tundra .dijitButtonNode {
+ zoom: 1;
+}
+
+.tundra .dijitButtonText {
+ padding: 0 0.3em;
+}
+
+.tundra .dijitComboBox .dijitButtonNode {
+ border: 0px;
+}
+
+.tundra .dijitArrowButton {
+ color: #111;
+}
+
+.tundra .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+
+.dj_ff2 .tundra .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+
+.tundra .dijitButtonDisabled .dijitButtonNode,
+.tundra .dijitToggleButtonDisabled .dijitButtonNode,
+.tundra .dijitDropDownButtonDisabled .dijitButtonNode,
+.tundra .dijitComboButtonDisabled .dijitButtonNode,
+.tundra .dijitComboBoxDisabled,
+.tundra .dijitSpinnerDisabled,
+.tundra .dijitSpinnerDisabled .dijitButtonNode {
+ /* disabled state - inner */
+ border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+ /*color:#b4b4b4;*/
+ background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
+ opacity: 0.60; /* Safari, Opera and Mozilla */
+}
+.dj_ie .tundra .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50); /* IE */
+}
+
+.tundra .dijitButtonHover .dijitButtonNode,
+.tundra .dijitToggleButtonHover .dijitButtonNode,
+.tundra .dijitDropDownButtonHover .dijitButtonNode,
+.tundra .dijitComboButtonHover .dijitButtonContents,
+.tundra .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.tundra .dijitComboBoxHover .dijitDownArrowButton,
+.tundra .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+ /* 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;
+ border-right-color:#5c7590;
+ color:#000;
+ background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
+}
+
+.tundra .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.tundra .dijitButtonActive .dijitButtonNode,
+.tundra .dijitToggleButtonActive .dijitButtonNode,
+.tundra .dijitDropDownButtonActive .dijitButtonNode,
+.tundra .dijitComboButtonActive .dijitButtonContents,
+.tundra .dijitDownArrowActive .dijitDownArrowButton,
+.tundra .dijitComboBoxActive .dijitDownArrowButton {
+ /* active state - inner (for when you are pressing a normal button, or
+ * when a toggle button is in a depressed state
+ */
+ border-color:#366dba;
+ background: #ededed url("../images/buttonActive.png") bottom repeat-x;
+}
+
+
+
+.tundra .dijitArrowButtonInner {
+ background:url("../images/arrowDown.png") no-repeat center center;
+}
+.tundra .dijitUpArrowButton .dijitArrowButtonInner { background-image:url("../images/arrowUp.png"); }
+.dj_ie6 .tundra .dijitArrowButtonInner {
+ background-image:url("../images/arrowDown.gif");
+}
+.dj_ie6 .tundra .dijitUpArrowButton .dijitArrowButtonInner {
+ background-image:url("../images/arrowUp.gif");
+}
+.tundra .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url("../images/comboArrowDown.gif") no-repeat center center;
+}
+.tundra .dijitComboBoxHover .dijitArrowButtonInner {
+ /* TODO: url("../images/arrowDownHover.png") but in IE6 it flickers some? */
+}
diff --git a/includes/js/dijit/themes/tundra/form/Checkbox.css b/includes/js/dijit/themes/tundra/form/Checkbox.css
new file mode 100644
index 0000000..0c59885
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Checkbox.css
@@ -0,0 +1,40 @@
+.tundra .dijitToggleButton .dijitCheckBoxIcon {
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+.tundra .dijitCheckBox,
+.tundra .dijitCheckBoxIcon {
+ background-image: url('../images/checkmark.gif');
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+.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,
+.tundra .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.tundra .dijitCheckBoxCheckedHover,
+.tundra .dijitCheckBoxCheckedFocused {
+
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/tundra/form/Checkbox.css.commented.css b/includes/js/dijit/themes/tundra/form/Checkbox.css.commented.css
new file mode 100644
index 0000000..8b7b2cc
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Checkbox.css.commented.css
@@ -0,0 +1,47 @@
+.tundra .dijitToggleButton .dijitCheckBoxIcon {
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+
+.tundra .dijitCheckBox,
+.tundra .dijitCheckBoxIcon /* inside a toggle button */ {
+ background-image: url('../images/checkmark.gif'); /* checkbox sprite image */
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+
+.tundra .dijitCheckBox,
+.tundra .dijitToggleButton .dijitCheckBoxIcon {
+ /* unchecked */
+ background-position: -16px;
+}
+
+.tundra .dijitCheckBoxChecked,
+.tundra .dijitToggleButtonChecked .dijitCheckBoxIcon {
+ /* checked */
+ background-position: 0px;
+}
+
+.tundra .dijitCheckBoxDisabled {
+ /* disabled */
+ background-position: -48px;
+}
+
+.tundra .dijitCheckBoxCheckedDisabled {
+ /* disabled but checked */
+ background-position: -32px;
+}
+
+.tundra .dijitCheckBoxHover,
+.tundra .dijitCheckBoxFocused {
+ /* hovering over an unchecked enabled checkbox */
+ background-position: -80px;
+}
+
+.tundra .dijitCheckBoxCheckedHover,
+.tundra .dijitCheckBoxCheckedFocused {
+ /* hovering over a checked enabled checkbox */
+ background-position: -64px;
+}
diff --git a/includes/js/dijit/themes/tundra/form/Common.css b/includes/js/dijit/themes/tundra/form/Common.css
new file mode 100644
index 0000000..d8ab7a0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Common.css
@@ -0,0 +1,83 @@
+
+.tundra .dijitInputField INPUT,
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner,
+.tundra .dijitInlineEditor input {
+
+ background:#fff url("../images/validationInputBg.png") repeat-x top left;
+ #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+ border:1px solid #b3b3b3;
+ line-height: normal;
+}
+.tundra .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.tundra .dijitComboBox .dijitButtonNode,
+.tundra .dijitSpinner .dijitButtonNode {
+
+ border-color: #9b9b9b;
+}
+.tundra .dijitTextBoxFocused,
+.tundra .dijitComboBoxFocused,
+.tundra .dijitSpinnerFocused {
+
+ border-color:#406b9b;
+}
+.tundra .dijitComboBoxFocused .dijitButtonNode, .tundra .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#366dba;
+}
+.tundra .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#366dba;
+}
+.tundra .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.tundra .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.tundra .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url('../images/warning.png') no-repeat center center;
+}
+.tundra .dijitInlineValue {
+
+ padding:3px;
+ margin:4px;
+}
+.tundra .dijitInlineEditor {
+
+ display: inline-block;
+ display: -moz-inline-stack;
+ #display:inline;
+
+}
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+ margin:3px 3px 3px 0px;
+}
+.RichTextEditable {
+ border:1px solid #bfbfbf;
+ border-top:0;
+}
+.dj_ie6 .tundra .dijitInputField
+{
+ background: url("../images/validationInputBg.gif") repeat-x top left #fff;
+}
diff --git a/includes/js/dijit/themes/tundra/form/Common.css.commented.css b/includes/js/dijit/themes/tundra/form/Common.css.commented.css
new file mode 100644
index 0000000..5bbb265
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Common.css.commented.css
@@ -0,0 +1,126 @@
+
+/****
+ 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 .dijitInputField INPUT,
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner {
+ margin: 0em 0.1em;
+}
+
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner,
+.tundra .dijitInlineEditor input {
+ /* 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 #b3b3b3;
+ line-height: normal;
+}
+
+.tundra .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.tundra .dijitComboBox .dijitButtonNode,
+.tundra .dijitSpinner .dijitButtonNode {
+ /* line between the input area and the drop down button */
+ border-color: #9b9b9b;
+}
+
+.tundra .dijitTextBoxFocused,
+.tundra .dijitComboBoxFocused,
+.tundra .dijitSpinnerFocused {
+ /* input field when focused (ie: typing affects it) */
+ border-color:#406b9b;
+}
+.tundra .dijitComboBoxFocused .dijitButtonNode, .tundra .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#366dba;
+}
+.tundra .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#366dba;
+}
+
+.tundra .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitError INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#f9f7ba !important;
+}
+
+.tundra .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitErrorFocused INPUT {
+ /* background-color: transparent on an <input> doesn't work on IE6 */
+ background-color:#ff6 !important;
+}
+
+/* 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;
+}
+
+
+
+/* inline edit boxen */
+.tundra .dijitInlineValue {
+ /* span around an inline-editable value when NOT in edit mode */
+ padding:3px;
+ margin:4px;
+}
+
+
+/* MOW: trying to get this to look like a mini-dialog. Advised? */
+.tundra .dijitInlineEditor {
+ /* fieldset surrounding an inlineEditor in edit mode */
+ display: inline-block;
+ display: -moz-inline-stack;
+ #display:inline;
+ /*
+ border-style: solid;
+ border-color: #7788a0 #344257 #344257 #7788a0;
+ border-width:1px 2px 2px 1px;
+ -moz-border-radius:0px 2px 0px 2px; make BL and TR corners indent on Moz so it looks like we have a shadow
+ background-color:white;
+ */
+}
+
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+ margin:3px 3px 3px 0px;
+}
+
+.RichTextEditable {
+ border:1px solid #bfbfbf;
+ border-top:0;
+}
+
+/*
+ * IE6: can't display PNG images with gradient transparency.
+ * Want to use filter property for those images, but then need to specify a path relative
+ * to the main page, rather than relative to this file... using gifs for now
+ */
+
+.dj_ie6 .tundra .dijitInputField
+{
+ background: url("../images/validationInputBg.gif") repeat-x top left #fff;
+}
diff --git a/includes/js/dijit/themes/tundra/form/RadioButton.css b/includes/js/dijit/themes/tundra/form/RadioButton.css
new file mode 100644
index 0000000..bc99ef0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/RadioButton.css
@@ -0,0 +1,41 @@
+.tundra .dijitToggleButton .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+.tundra .dijitRadio,
+.tundra .dijitRadioIcon {
+ background-image: url('../images/checkmark.gif');
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+.tundra .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+
+ background-position: -112px;
+}
+.tundra .dijitRadioChecked,
+.tundra .dijitToggleButtonChecked .dijitRadioIcon {
+
+ background-position: -96px;
+}
+.tundra .dijitRadioDisabled {
+
+ background-position: -144px;
+}
+.tundra .dijitRadioCheckedDisabled {
+
+ background-position: -128px;
+}
+.tundra .dijitRadioHover,
+.tundra .dijitRadioFocused {
+
+ background-position: -176px;
+}
+.tundra .dijitRadioCheckedHover,
+.tundra .dijitRadioCheckedFocused {
+
+ background-position: -160px;
+}
diff --git a/includes/js/dijit/themes/tundra/form/RadioButton.css.commented.css b/includes/js/dijit/themes/tundra/form/RadioButton.css.commented.css
new file mode 100644
index 0000000..e1d7713
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/RadioButton.css.commented.css
@@ -0,0 +1,49 @@
+.tundra .dijitToggleButton .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+ background-image: url('../images/checkmarkNoBorder.gif');
+}
+
+.tundra .dijitRadio,
+.tundra .dijitRadioIcon { /* inside a toggle button */
+ background-image: url('../images/checkmark.gif'); /* checkbox sprite image */
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+
+.tundra .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+ /* unselected */
+ background-position: -112px;
+}
+
+.tundra .dijitRadioChecked,
+.tundra .dijitToggleButtonChecked .dijitRadioIcon {
+ /* selected */
+ background-position: -96px;
+}
+
+.tundra .dijitRadioDisabled {
+ /* unselected and disabled */
+ background-position: -144px;
+}
+
+.tundra .dijitRadioCheckedDisabled {
+ /* selected but disabled */
+ background-position: -128px;
+}
+
+.tundra .dijitRadioHover,
+.tundra .dijitRadioFocused {
+ /* hovering over an unselected enabled radio button */
+ background-position: -176px;
+}
+
+.tundra .dijitRadioCheckedHover,
+.tundra .dijitRadioCheckedFocused {
+ /* hovering over a selected enabled radio button */
+ background-position: -160px;
+}
+
diff --git a/includes/js/dijit/themes/tundra/form/Slider.css b/includes/js/dijit/themes/tundra/form/Slider.css
new file mode 100644
index 0000000..ecbc923
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Slider.css
@@ -0,0 +1,113 @@
+.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:#333;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.tundra .dijitSliderImageHandleH {
+ border:0px;
+ width:16px;
+ height:16px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+.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 .dijitSliderIncrementIconH,
+.tundra .dijitSliderIncrementIconV {
+ background:url('../images/arrowUp.png') no-repeat center center;
+ width:16px; height:16px;
+ cursor:pointer;
+}
+.tundra .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
+.tundra .dijitSliderDecrementIconH,
+.tundra .dijitSliderDecrementIconV {
+ width:16px;
+ height:16px;
+ cursor:pointer;
+ background:url('../images/arrowDown.png') no-repeat center center;
+}
+.tundra .dijitSliderDecrementIconH { background-image:url('../images/arrowLeft.png'); }
+.tundra .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.tundra .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .tundra .dijitSliderDisabled,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
+.tundra .dijitSliderDisabled * {
+ cursor: not-allowed !important;
+}
diff --git a/includes/js/dijit/themes/tundra/form/Slider.css.commented.css b/includes/js/dijit/themes/tundra/form/Slider.css.commented.css
new file mode 100644
index 0000000..0e0a5c8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Slider.css.commented.css
@@ -0,0 +1,134 @@
+.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:#333;
+}
+
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+
+.tundra .dijitSliderImageHandleH {
+ border:0px;
+ width:16px;
+ height:16px;
+ background:url("../images/preciseSliderThumb.png") no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+
+.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 .dijitSliderIncrementIconH,
+.tundra .dijitSliderIncrementIconV {
+ background:url('../images/arrowUp.png') no-repeat center center;
+ width:16px; height:16px;
+ cursor:pointer;
+}
+.tundra .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
+
+.tundra .dijitSliderDecrementIconH,
+.tundra .dijitSliderDecrementIconV {
+ width:16px;
+ height:16px;
+ cursor:pointer;
+ background:url('../images/arrowDown.png') no-repeat center center;
+}
+.tundra .dijitSliderDecrementIconH { background-image:url('../images/arrowLeft.png'); }
+
+.tundra .dijitSliderButtonInner {
+ visibility:hidden;
+}
+
+.tundra .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+
+.dj_ie6 .tundra .dijitSliderDisabled,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
+
+.tundra .dijitSliderDisabled * {
+ cursor: not-allowed !important;
+}
diff --git a/includes/js/dijit/themes/tundra/form/Slider_rtl.css b/includes/js/dijit/themes/tundra/form/Slider_rtl.css
new file mode 100644
index 0000000..af024e5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Slider_rtl.css
@@ -0,0 +1,26 @@
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css b/includes/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css
new file mode 100644
index 0000000..d6b80b8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css
@@ -0,0 +1,31 @@
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url('../images/arrowLeft.png');
+}
+
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url('../images/arrowRight.png');
+}
diff --git a/includes/js/dijit/themes/tundra/form/TextArea.css b/includes/js/dijit/themes/tundra/form/TextArea.css
new file mode 100644
index 0000000..a4f0be1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/TextArea.css
@@ -0,0 +1,7 @@
+.tundra .dijitTextArea {
+
+ background:#fff url("../images/validationInputBg.png") repeat-x top left;
+ #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+ border:1px solid #b3b3b3;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/tundra/form/TextArea.css.commented.css b/includes/js/dijit/themes/tundra/form/TextArea.css.commented.css
new file mode 100644
index 0000000..2f25001
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/form/TextArea.css.commented.css
@@ -0,0 +1,10 @@
+.tundra .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 #b3b3b3;
+ line-height: normal;
+}
diff --git a/includes/js/dijit/themes/tundra/images/accordionItemActive.gif b/includes/js/dijit/themes/tundra/images/accordionItemActive.gif
new file mode 100644
index 0000000..f7e04a3
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/accordionItemActive.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowDown.gif b/includes/js/dijit/themes/tundra/images/arrowDown.gif
new file mode 100644
index 0000000..7a73f82
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowDown.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowDown.png b/includes/js/dijit/themes/tundra/images/arrowDown.png
new file mode 100644
index 0000000..148b810
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowLeft.gif b/includes/js/dijit/themes/tundra/images/arrowLeft.gif
new file mode 100644
index 0000000..22e8649
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowLeft.png b/includes/js/dijit/themes/tundra/images/arrowLeft.png
new file mode 100644
index 0000000..ff0dbfc
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowLeft.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowRight.gif b/includes/js/dijit/themes/tundra/images/arrowRight.gif
new file mode 100644
index 0000000..7e21dc0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowRight.png b/includes/js/dijit/themes/tundra/images/arrowRight.png
new file mode 100644
index 0000000..c8b64ef
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowRight.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowUp.gif b/includes/js/dijit/themes/tundra/images/arrowUp.gif
new file mode 100644
index 0000000..9452da0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowUp.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/arrowUp.png b/includes/js/dijit/themes/tundra/images/arrowUp.png
new file mode 100644
index 0000000..c4c06ce
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/arrowUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/buttonActive.png b/includes/js/dijit/themes/tundra/images/buttonActive.png
new file mode 100644
index 0000000..09417b1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/buttonActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/buttonDisabled.png b/includes/js/dijit/themes/tundra/images/buttonDisabled.png
new file mode 100644
index 0000000..70766f4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/buttonDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/buttonEnabled.png b/includes/js/dijit/themes/tundra/images/buttonEnabled.png
new file mode 100644
index 0000000..924522a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/buttonEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/buttonHover.png b/includes/js/dijit/themes/tundra/images/buttonHover.png
new file mode 100644
index 0000000..b074e4e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/buttonHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/calendarDayLabel.png b/includes/js/dijit/themes/tundra/images/calendarDayLabel.png
new file mode 100644
index 0000000..c1a1553
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/calendarDayLabel.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/calendarMonthLabel.png b/includes/js/dijit/themes/tundra/images/calendarMonthLabel.png
new file mode 100644
index 0000000..fd2cf0a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/calendarMonthLabel.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/calendarYearLabel.png b/includes/js/dijit/themes/tundra/images/calendarYearLabel.png
new file mode 100644
index 0000000..dd344f5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/calendarYearLabel.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkboxActive.png b/includes/js/dijit/themes/tundra/images/checkboxActive.png
new file mode 100644
index 0000000..24c935b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkboxActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkboxDisabled.png b/includes/js/dijit/themes/tundra/images/checkboxDisabled.png
new file mode 100644
index 0000000..f02a752
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkboxDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkboxEnabled.png b/includes/js/dijit/themes/tundra/images/checkboxEnabled.png
new file mode 100644
index 0000000..2205f07
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkboxEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkboxHover.png b/includes/js/dijit/themes/tundra/images/checkboxHover.png
new file mode 100644
index 0000000..1dfeea8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkboxHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkmark.gif b/includes/js/dijit/themes/tundra/images/checkmark.gif
new file mode 100644
index 0000000..77237aa
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkmark.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkmark.png b/includes/js/dijit/themes/tundra/images/checkmark.png
new file mode 100644
index 0000000..a473c9c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkmark.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.gif b/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.gif
new file mode 100644
index 0000000..11dc800
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.png b/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.png
new file mode 100644
index 0000000..7696e28
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/checkmarkNoBorder.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/circleIcon.gif b/includes/js/dijit/themes/tundra/images/circleIcon.gif
new file mode 100644
index 0000000..d582290
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/circleIcon.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/circleIcon.png b/includes/js/dijit/themes/tundra/images/circleIcon.png
new file mode 100644
index 0000000..6f059e6
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/circleIcon.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/comboArrowDown.gif b/includes/js/dijit/themes/tundra/images/comboArrowDown.gif
new file mode 100644
index 0000000..e00a87b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/comboArrowDown.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif b/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif
new file mode 100644
index 0000000..167a3e0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd b/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd
new file mode 100644
index 0000000..0a7bf23
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dndCopy.png b/includes/js/dijit/themes/tundra/images/dndCopy.png
new file mode 100644
index 0000000..baecd7c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dndCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dndMove.png b/includes/js/dijit/themes/tundra/images/dndMove.png
new file mode 100644
index 0000000..07f878c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dndMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dndNoCopy.png b/includes/js/dijit/themes/tundra/images/dndNoCopy.png
new file mode 100644
index 0000000..9bf9c33
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dndNoCopy.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dndNoMove.png b/includes/js/dijit/themes/tundra/images/dndNoMove.png
new file mode 100644
index 0000000..cb8bd8b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dndNoMove.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif b/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif
new file mode 100644
index 0000000..0da1239
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.png b/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.png
new file mode 100644
index 0000000..ac118dd
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/doubleArrowDown.png b/includes/js/dijit/themes/tundra/images/doubleArrowDown.png
new file mode 100644
index 0000000..92678d2
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/doubleArrowDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/doubleArrowUp.png b/includes/js/dijit/themes/tundra/images/doubleArrowUp.png
new file mode 100644
index 0000000..bba30fe
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/doubleArrowUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/editor.gif b/includes/js/dijit/themes/tundra/images/editor.gif
new file mode 100644
index 0000000..1c96329
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/editor.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/editor_rtl.gif b/includes/js/dijit/themes/tundra/images/editor_rtl.gif
new file mode 100644
index 0000000..ef04938
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/editor_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/folderClosed.gif b/includes/js/dijit/themes/tundra/images/folderClosed.gif
new file mode 100644
index 0000000..d32d313
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/folderClosed.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/folderOpened.gif b/includes/js/dijit/themes/tundra/images/folderOpened.gif
new file mode 100644
index 0000000..45359fb
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/folderOpened.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/i.gif b/includes/js/dijit/themes/tundra/images/i.gif
new file mode 100644
index 0000000..ebd95a7
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/i.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/i_half.gif b/includes/js/dijit/themes/tundra/images/i_half.gif
new file mode 100644
index 0000000..2947c4f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/i_half.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/i_half_rtl.gif b/includes/js/dijit/themes/tundra/images/i_half_rtl.gif
new file mode 100644
index 0000000..4f60ec4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/i_half_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/i_rtl.gif b/includes/js/dijit/themes/tundra/images/i_rtl.gif
new file mode 100644
index 0000000..7dafaad
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/i_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/leaf.gif b/includes/js/dijit/themes/tundra/images/leaf.gif
new file mode 100644
index 0000000..85b0178
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/leaf.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/loading.gif b/includes/js/dijit/themes/tundra/images/loading.gif
new file mode 100644
index 0000000..6e7c8e5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/loading.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/menu.png b/includes/js/dijit/themes/tundra/images/menu.png
new file mode 100644
index 0000000..f5b93d1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/menu.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/minusButton.gif b/includes/js/dijit/themes/tundra/images/minusButton.gif
new file mode 100644
index 0000000..48d5172
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/minusButton.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/no.gif b/includes/js/dijit/themes/tundra/images/no.gif
new file mode 100644
index 0000000..9021a14
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/no.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/noX.gif b/includes/js/dijit/themes/tundra/images/noX.gif
new file mode 100644
index 0000000..4a16dc7
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/noX.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/plusButton.gif b/includes/js/dijit/themes/tundra/images/plusButton.gif
new file mode 100644
index 0000000..103c021
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/plusButton.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/popupMenuBg.gif b/includes/js/dijit/themes/tundra/images/popupMenuBg.gif
new file mode 100644
index 0000000..15f4f1b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/popupMenuBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/preciseSliderThumb.gif b/includes/js/dijit/themes/tundra/images/preciseSliderThumb.gif
new file mode 100644
index 0000000..15d4879
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/preciseSliderThumb.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/preciseSliderThumb.png b/includes/js/dijit/themes/tundra/images/preciseSliderThumb.png
new file mode 100644
index 0000000..f2fc338
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/preciseSliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif b/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif
new file mode 100644
index 0000000..b44611c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png b/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png
new file mode 100644
index 0000000..fb06323
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-1.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-1.png
new file mode 100644
index 0000000..cfc3fd2
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-1.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-2.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-2.png
new file mode 100644
index 0000000..d27981d
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-2.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-3.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-3.png
new file mode 100644
index 0000000..3b92a7d
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-3.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-4.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-4.png
new file mode 100644
index 0000000..61e4276
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-4.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-5.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-5.png
new file mode 100644
index 0000000..48b189a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-5.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-6.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-6.png
new file mode 100644
index 0000000..af50c4d
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-6.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-7.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-7.png
new file mode 100644
index 0000000..a4fffa3
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-7.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-8.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-8.png
new file mode 100644
index 0000000..b4c92f3
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-8.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim-9.png b/includes/js/dijit/themes/tundra/images/progressBarAnim-9.png
new file mode 100644
index 0000000..d8bff13
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim-9.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim.gif b/includes/js/dijit/themes/tundra/images/progressBarAnim.gif
new file mode 100644
index 0000000..d3df139
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarAnim.psd b/includes/js/dijit/themes/tundra/images/progressBarAnim.psd
new file mode 100644
index 0000000..0a7bf23
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarAnim.psd
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarEmpty.png b/includes/js/dijit/themes/tundra/images/progressBarEmpty.png
new file mode 100644
index 0000000..84c0e2e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/progressBarFull.png b/includes/js/dijit/themes/tundra/images/progressBarFull.png
new file mode 100644
index 0000000..0ce60f5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/progressBarFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonActive.png b/includes/js/dijit/themes/tundra/images/radioButtonActive.png
new file mode 100644
index 0000000..60840c7
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png b/includes/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png
new file mode 100644
index 0000000..b49724e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonActiveHover.png b/includes/js/dijit/themes/tundra/images/radioButtonActiveHover.png
new file mode 100644
index 0000000..f21d4e5
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonActiveHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonDisabled.png b/includes/js/dijit/themes/tundra/images/radioButtonDisabled.png
new file mode 100644
index 0000000..8da7e78
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonEnabled.png b/includes/js/dijit/themes/tundra/images/radioButtonEnabled.png
new file mode 100644
index 0000000..4342fea
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/radioButtonHover.png b/includes/js/dijit/themes/tundra/images/radioButtonHover.png
new file mode 100644
index 0000000..fcb697f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/radioButtonHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderEmpty.png b/includes/js/dijit/themes/tundra/images/sliderEmpty.png
new file mode 100644
index 0000000..070c12f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderEmpty.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderEmptyVertical.png b/includes/js/dijit/themes/tundra/images/sliderEmptyVertical.png
new file mode 100644
index 0000000..45aceb7
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderEmptyVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderFull.png b/includes/js/dijit/themes/tundra/images/sliderFull.png
new file mode 100644
index 0000000..4b3fcbb
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderFull.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderFullFocus.png b/includes/js/dijit/themes/tundra/images/sliderFullFocus.png
new file mode 100644
index 0000000..ee19356
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderFullFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderFullVertical.png b/includes/js/dijit/themes/tundra/images/sliderFullVertical.png
new file mode 100644
index 0000000..e7618e8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderFullVertical.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png b/includes/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png
new file mode 100644
index 0000000..3ab37e6
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderThumb.png b/includes/js/dijit/themes/tundra/images/sliderThumb.png
new file mode 100644
index 0000000..fe33583
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderThumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderThumbFocus.gif b/includes/js/dijit/themes/tundra/images/sliderThumbFocus.gif
new file mode 100644
index 0000000..15dd3d9
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderThumbFocus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/sliderThumbFocus.png b/includes/js/dijit/themes/tundra/images/sliderThumbFocus.png
new file mode 100644
index 0000000..fe9763a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/sliderThumbFocus.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/smallArrowDown.png b/includes/js/dijit/themes/tundra/images/smallArrowDown.png
new file mode 100644
index 0000000..cabd01c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/smallArrowDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/smallArrowUp.png b/includes/js/dijit/themes/tundra/images/smallArrowUp.png
new file mode 100644
index 0000000..a4dd670
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/smallArrowUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png b/includes/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png
new file mode 100644
index 0000000..e7bc204
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/splitContainerSizerH.png b/includes/js/dijit/themes/tundra/images/splitContainerSizerH.png
new file mode 100644
index 0000000..0e5e471
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/splitContainerSizerH.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png b/includes/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png
new file mode 100644
index 0000000..410a0a7
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/splitContainerSizerV.png b/includes/js/dijit/themes/tundra/images/splitContainerSizerV.png
new file mode 100644
index 0000000..6781f0e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/splitContainerSizerV.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif b/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif
new file mode 100644
index 0000000..251389a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png b/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png
new file mode 100644
index 0000000..e81ba07
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabActive.png b/includes/js/dijit/themes/tundra/images/tabActive.png
new file mode 100644
index 0000000..eaf1ed4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabActive.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabClose.gif b/includes/js/dijit/themes/tundra/images/tabClose.gif
new file mode 100644
index 0000000..2cb0ee1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabClose.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabClose.png b/includes/js/dijit/themes/tundra/images/tabClose.png
new file mode 100644
index 0000000..136cd22
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabClose.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabCloseHover.gif b/includes/js/dijit/themes/tundra/images/tabCloseHover.gif
new file mode 100644
index 0000000..f59471e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabCloseHover.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabCloseHover.png b/includes/js/dijit/themes/tundra/images/tabCloseHover.png
new file mode 100644
index 0000000..290e77f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabCloseHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabDisabled.png b/includes/js/dijit/themes/tundra/images/tabDisabled.png
new file mode 100644
index 0000000..ea0f617
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabDisabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabEnabled.png b/includes/js/dijit/themes/tundra/images/tabEnabled.png
new file mode 100644
index 0000000..d40cf45
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabEnabled.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabHover.gif b/includes/js/dijit/themes/tundra/images/tabHover.gif
new file mode 100644
index 0000000..471e0ee
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabHover.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tabHover.png b/includes/js/dijit/themes/tundra/images/tabHover.png
new file mode 100644
index 0000000..16487f1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tabHover.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/titleBar.png b/includes/js/dijit/themes/tundra/images/titleBar.png
new file mode 100644
index 0000000..617d9d4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/titleBar.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/titleBarBg.gif b/includes/js/dijit/themes/tundra/images/titleBarBg.gif
new file mode 100644
index 0000000..1cd57cf
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/titleBarBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.gif b/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.gif
new file mode 100644
index 0000000..015447e
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.png b/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.png
new file mode 100644
index 0000000..c502c83
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorDown.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif b/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif
new file mode 100644
index 0000000..846b3b8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.png b/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.png
new file mode 100644
index 0000000..a5c2720
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.gif b/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.gif
new file mode 100644
index 0000000..2564c3a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.png b/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.png
new file mode 100644
index 0000000..57e8be0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorRight.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.gif b/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.gif
new file mode 100644
index 0000000..b8ff4c0
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.png b/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.png
new file mode 100644
index 0000000..b891f88
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/tooltipConnectorUp.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_leaf.gif b/includes/js/dijit/themes/tundra/images/treeExpand_leaf.gif
new file mode 100644
index 0000000..4b1c6c1
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_leaf.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif b/includes/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif
new file mode 100644
index 0000000..b563d7c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_loading.gif b/includes/js/dijit/themes/tundra/images/treeExpand_loading.gif
new file mode 100644
index 0000000..424d376
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_loading.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_minus.gif b/includes/js/dijit/themes/tundra/images/treeExpand_minus.gif
new file mode 100644
index 0000000..5977782
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_minus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif b/includes/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif
new file mode 100644
index 0000000..cf50054
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_mius.gif b/includes/js/dijit/themes/tundra/images/treeExpand_mius.gif
new file mode 100644
index 0000000..5977782
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_mius.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_plus.gif b/includes/js/dijit/themes/tundra/images/treeExpand_plus.gif
new file mode 100644
index 0000000..2b96a55
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_plus.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif b/includes/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif
new file mode 100644
index 0000000..11f9916
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/validationInputBg.gif b/includes/js/dijit/themes/tundra/images/validationInputBg.gif
new file mode 100644
index 0000000..5a9916a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/validationInputBg.gif
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/validationInputBg.png b/includes/js/dijit/themes/tundra/images/validationInputBg.png
new file mode 100644
index 0000000..d222fb4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/validationInputBg.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/images/warning.png b/includes/js/dijit/themes/tundra/images/warning.png
new file mode 100644
index 0000000..c52f83d
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/images/warning.png
Binary files differ
diff --git a/includes/js/dijit/themes/tundra/layout/AccordionContainer.css b/includes/js/dijit/themes/tundra/layout/AccordionContainer.css
new file mode 100644
index 0000000..6d27e24
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/AccordionContainer.css
@@ -0,0 +1,31 @@
+
+.tundra .dijitAccordionPane {
+ background-color: #e7e7e7;
+}
+.tundra .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x bottom left;
+ border-top: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor:pointer;
+}
+.tundra .dijitAccordionTitle-selected {
+ background: #f9f9f9 url("../images/accordionItemActive.gif") bottom repeat-x;
+ font-weight: bold;
+ border-top: 1px solid #aaaaaa;
+ border-bottom: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor: default;
+}
+.tundra .dijitAccordionArrow {
+ background:url("../images/plusButton.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:2px;
+}
+.tundra .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:none;
+ margin-top:2px;
+}
+.tundra .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css b/includes/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css
new file mode 100644
index 0000000..14d46ae
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css
@@ -0,0 +1,37 @@
+/* Accordion */
+
+.tundra .dijitAccordionPane {
+ background-color: #e7e7e7;
+}
+
+.tundra .dijitAccordionTitle {
+ background:#fafafa url("../images/titleBar.png") repeat-x bottom left;
+ border-top: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor:pointer;
+}
+
+.tundra .dijitAccordionTitle-selected {
+ background: #f9f9f9 url("../images/accordionItemActive.gif") bottom repeat-x;
+ font-weight: bold;
+ border-top: 1px solid #aaaaaa;
+ border-bottom: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor: default;
+}
+
+.tundra .dijitAccordionArrow {
+ background:url("../images/plusButton.gif") no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:2px;
+}
+
+.tundra .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:none;
+ margin-top:2px;
+}
+
+.tundra .dijitAccordionBody {
+ background: #fff;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/BorderContainer.css b/includes/js/dijit/themes/tundra/layout/BorderContainer.css
new file mode 100644
index 0000000..56bbef4
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/BorderContainer.css
@@ -0,0 +1,27 @@
+
+.tundra .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.tundra .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.tundra .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.tundra .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css b/includes/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css
new file mode 100644
index 0000000..da28106
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css
@@ -0,0 +1,31 @@
+/* BorderContainer */
+
+.tundra .dijitSplitterH {
+ background:url("../images/splitContainerSizerH.png") repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+
+.tundra .dijitSplitterH .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+
+.tundra .dijitSplitterV {
+ background:url("../images/splitContainerSizerV.png") repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+
+.tundra .dijitSplitterV .dijitSplitterThumb {
+ background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/SplitContainer.css b/includes/js/dijit/themes/tundra/layout/SplitContainer.css
new file mode 100644
index 0000000..b9945d6
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/SplitContainer.css
@@ -0,0 +1,31 @@
+.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 .dijitSplitter {
+ border-color: #bfbfbf;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css b/includes/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css
new file mode 100644
index 0000000..53cdf82
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css
@@ -0,0 +1,35 @@
+.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 .dijitSplitter {
+ border-color: #bfbfbf;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/TabContainer.css b/includes/js/dijit/themes/tundra/layout/TabContainer.css
new file mode 100644
index 0000000..a15daf8
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/TabContainer.css
@@ -0,0 +1,109 @@
+
+.tundra .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #ccc;
+}
+.tundra .dijitTab {
+ line-height:normal;
+ margin-right:5px;
+ padding:0px;
+ border:1px solid #ccc;
+ background:#e2e2e2 url("../images/tabEnabled.png") repeat-x;
+}
+.tundra .dijitAlignLeft .dijitTab,
+.tundra .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.tundra .dijitTabInnerDiv {
+ padding:6px 10px 4px 10px;
+ border-left:1px solid #fff;
+ border-bottom:1px solid #fff;
+}
+.tundra .dijitTabHover,
+.tundra .dijitTabCloseButtonHover {
+ color: #243C5F;
+ border-top-color:#92a0b3;
+ border-left-color:#92a0b3;
+ border-right-color:#92a0b3;
+ background:#e2e2e2 url("../images/tabHover.png") repeat-x bottom;
+}
+.dj_ie6 .tundra .dijitTabHover,
+.dj_ie6 .tundra .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+.tundra .dijitTabChecked,
+.tundra .dijitTabCloseButtonChecked
+{
+
+ background-color:#fff;
+ border-color: #ccc;
+ background-image:none;
+}
+.tundra .dijitAlignTop .dijitTabChecked,
+.tundra .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.tundra .dijitAlignBottom .dijitTabChecked,
+.tundra .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+ -moz-border-radius:2px 2px 0px 0px;
+}
+.tundra .dijitAlignLeft .dijitTabChecked,
+.tundra .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.tundra .dijitAlignRight .dijitTabChecked,
+.tundra .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.tundra .dijitTab .dijitClosable {
+ position: relative;
+ padding:6px 20px 4px 10px;
+}
+.tundra .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 7px;
+ right: 3px;
+ height: 12px;
+ width: 12px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/tabClose.png") no-repeat right top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background-image:url("../images/tabClose.gif");
+}
+.tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url("../images/tabClose.png");
+}
+.dj_ie6 .tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url("../images/tabClose.gif");
+}
+.tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url("../images/tabCloseHover.png");
+}
+.dj_ie6 .tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url("../images/tabCloseHover.gif");
+}
+.tundra .dijitAlignLeft .dijitTab .dijitClosable {
+ padding:6px 10px 4px 20px;
+}
+.dj_ie6 .tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.tundra .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/TabContainer.css.commented.css b/includes/js/dijit/themes/tundra/layout/TabContainer.css.commented.css
new file mode 100644
index 0000000..ee3ff6b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/TabContainer.css.commented.css
@@ -0,0 +1,138 @@
+
+/* Tabs */
+
+.tundra .dijitTabPaneWrapper {
+ /*
+ overflow: hidden;
+ */
+ background:#fff;
+ border:1px solid #ccc;
+}
+
+.tundra .dijitTab {
+ line-height:normal;
+ margin-right:5px; /* space between one tab and the next in top/bottom mode */
+ padding:0px;
+ border:1px solid #ccc;
+ background:#e2e2e2 url("../images/tabEnabled.png") repeat-x;
+}
+
+.tundra .dijitAlignLeft .dijitTab,
+.tundra .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px; /* space between one tab and the next in left/right mode */
+}
+
+.tundra .dijitTabInnerDiv {
+ padding:6px 10px 4px 10px;
+ border-left:1px solid #fff;
+ border-bottom:1px solid #fff;
+}
+
+.tundra .dijitTabHover,
+.tundra .dijitTabCloseButtonHover {
+ color: #243C5F;
+ border-top-color:#92a0b3;
+ border-left-color:#92a0b3;
+ border-right-color:#92a0b3;
+ background:#e2e2e2 url("../images/tabHover.png") repeat-x bottom;
+}
+
+.dj_ie6 .tundra .dijitTabHover,
+.dj_ie6 .tundra .dijitTabCloseButtonHover {
+ background-image: url("../images/tabHover.gif");
+}
+
+.tundra .dijitTabChecked,
+.tundra .dijitTabCloseButtonChecked
+{
+ /* the selected tab (with or without hover) */
+ background-color:#fff;
+ border-color: #ccc;
+ background-image:none;
+}
+
+/* make the active tab white on the side next to the content pane */
+.tundra .dijitAlignTop .dijitTabChecked,
+.tundra .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+
+.tundra .dijitAlignBottom .dijitTabChecked,
+.tundra .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+ -moz-border-radius:2px 2px 0px 0px; /* eliminate some border detritrus on moz */
+}
+
+.tundra .dijitAlignLeft .dijitTabChecked,
+.tundra .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+
+.tundra .dijitAlignRight .dijitTabChecked,
+.tundra .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+
+
+/* make space for a positioned close button */
+.tundra .dijitTab .dijitClosable {
+ position: relative;
+ padding:6px 20px 4px 10px;
+}
+
+.tundra .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 7px;
+ right: 3px;
+ height: 12px;
+ width: 12px;
+ padding: 0;
+ margin: 0;
+ background: url("../images/tabClose.png") no-repeat right top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background-image:url("../images/tabClose.gif");
+}
+
+.tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url("../images/tabClose.png");
+}
+.dj_ie6 .tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url("../images/tabClose.gif");
+}
+
+.tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url("../images/tabCloseHover.png");
+}
+.dj_ie6 .tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url("../images/tabCloseHover.gif");
+}
+
+.tundra .dijitAlignLeft .dijitTab .dijitClosable {
+ padding:6px 10px 4px 20px;
+}
+
+/* correct for IE6.
+ We cant force hasLayout as that blows out the shrink wrapped tabs
+ ..so we shim in the closeImage position properties instead
+*/
+.dj_ie6 .tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+
+.tundra .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+
+.tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css b/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css
new file mode 100644
index 0000000..a866bca
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css
@@ -0,0 +1,71 @@
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:5px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+ border-right:1px solid #fff;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 6px 10px 4px 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+ padding: 0px 12px 0px 0px;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: left top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dj_ie .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:19px;
+}
+.dj_gecko .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:11px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitTabContent{
+ position:relative;
+}
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ position:absolute;
+ top:2px;
+ left:3px;
+}
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ float:left;
+}
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .tabLabel{
+ float:right;
+}
+.dj_ie .dijitTab .dijitTabInnerDiv{
+ width : 1%;
+}
diff --git a/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css b/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css
new file mode 100644
index 0000000..9c6151f
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css
@@ -0,0 +1,89 @@
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:5px; /* space between one tab and the next in top/bottom mode */
+}
+
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+ border-right:1px solid #fff;
+}
+
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 6px 10px 4px 20px;
+}
+
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+ padding: 0px 12px 0px 0px;
+}
+
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: left top;
+}
+
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+
+.dj_ie .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:19px;
+}
+
+.dj_gecko .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:11px;
+}
+
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitTabContent{
+ position:relative;
+}
+
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ position:absolute;
+ top:2px;
+ left:3px;
+}
+
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ float:left;
+}
+
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .tabLabel{
+ float:right;
+}
+
+.dj_ie .dijitTab .dijitTabInnerDiv{
+ width : 1%;
+}
diff --git a/includes/js/dijit/themes/tundra/tundra.css b/includes/js/dijit/themes/tundra/tundra.css
new file mode 100644
index 0000000..8b26b1c
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/tundra.css
@@ -0,0 +1,1213 @@
+
+@import url("../dijit.css");
+.tundra .dijitSliderDisabled *,
+.tundra .dijitDisabledClickableRegion,
+.tundra .dijitSpinnerDisabled *,
+.tundra .dijitButtonDisabled *,
+.tundra .dijitDropDownButtonDisabled *,
+.tundra .dijitComboButtonDisabled *,
+.tundra .dijitComboBoxDisabled *
+{
+ cursor: not-allowed !important;
+}
+.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 .dijitTabPaneWrapper {
+
+ background:#fff;
+ border:1px solid #ccc;
+}
+.tundra .dijitTab {
+ line-height:normal;
+ margin-right:5px;
+ padding:0px;
+ border:1px solid #ccc;
+ background:#e2e2e2 url(images/tabEnabled.png) repeat-x;
+}
+.tundra .dijitAlignLeft .dijitTab,
+.tundra .dijitAlignRight .dijitTab {
+ margin-right:0px;
+ margin-bottom:5px;
+}
+.tundra .dijitTabInnerDiv {
+ padding:6px 10px 4px 10px;
+ border-left:1px solid #fff;
+ border-bottom:1px solid #fff;
+}
+.tundra .dijitTabHover,
+.tundra .dijitTabCloseButtonHover {
+ color: #243C5F;
+ border-top-color:#92a0b3;
+ border-left-color:#92a0b3;
+ border-right-color:#92a0b3;
+ background:#e2e2e2 url(images/tabHover.png) repeat-x bottom;
+}
+.dj_ie6 .tundra .dijitTabHover,
+.dj_ie6 .tundra .dijitTabCloseButtonHover {
+ background-image: url(images/tabHover.gif);
+}
+.tundra .dijitTabChecked,
+.tundra .dijitTabCloseButtonChecked
+{
+
+ background-color:#fff;
+ border-color: #ccc;
+ background-image:none;
+}
+.tundra .dijitAlignTop .dijitTabChecked,
+.tundra .dijitAlignTop .dijitTabCloseButtonChecked
+{
+ border-bottom-color:white;
+ vertical-align:bottom;
+}
+.tundra .dijitAlignBottom .dijitTabChecked,
+.tundra .dijitAlignBottom .dijitTabCloseButtonChecked
+{
+ border-top-color:white;
+ -moz-border-radius:2px 2px 0px 0px;
+}
+.tundra .dijitAlignLeft .dijitTabChecked,
+.tundra .dijitAlignLeft .dijitTabCloseButtonChecked
+{
+ border-right-color:white;
+}
+.tundra .dijitAlignRight .dijitTabChecked,
+.tundra .dijitAlignRight .dijitTabCloseButtonChecked
+{
+ border-left-color:white;
+}
+.tundra .dijitTab .dijitClosable {
+ position: relative;
+ padding:6px 20px 4px 10px;
+}
+.tundra .dijitTab .dijitClosable .closeImage {
+ position:absolute;
+ top: 7px;
+ right: 3px;
+ height: 12px;
+ width: 12px;
+ padding: 0;
+ margin: 0;
+ background: url(images/tabClose.png) no-repeat right top;
+}
+.dj_ie6 .dijitTab .dijitClosable .closeImage {
+ background-image:url(images/tabClose.gif);
+}
+.tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url(images/tabClose.png);
+}
+.dj_ie6 .tundra .dijitTabCloseButton .dijitClosable .closeImage {
+ background-image : url(images/tabClose.gif);
+}
+.tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url(images/tabCloseHover.png);
+}
+.dj_ie6 .tundra .dijitTabCloseButtonHover .dijitClosable .closeImage {
+ background-image : url(images/tabCloseHover.gif);
+}
+.tundra .dijitAlignLeft .dijitTab .dijitClosable {
+ padding:6px 10px 4px 20px;
+}
+.dj_ie6 .tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ left:-20px;
+}
+.tundra .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ top: auto;
+ bottom: 7px;
+ right: 3px;
+}
+.tundra .dijitAlignLeft .dijitTab .dijitClosable .closeImage {
+ top: 7px;
+ left: 3px;
+}
+.tundra .dijitAccordionPane {
+ background-color: #e7e7e7;
+}
+.tundra .dijitAccordionTitle {
+ background:#fafafa url(images/titleBar.png) repeat-x bottom left;
+ border-top: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor:pointer;
+}
+.tundra .dijitAccordionTitle-selected {
+ background: #f9f9f9 url(images/accordionItemActive.gif) bottom repeat-x;
+ font-weight: bold;
+ border-top: 1px solid #aaaaaa;
+ border-bottom: 1px solid #bfbfbf;
+ padding: 6px 4px 6px 8px;
+ cursor: default;
+}
+.tundra .dijitAccordionArrow {
+ background:url(images/plusButton.gif) no-repeat;
+ width:15px;
+ height:15px;
+ margin-top:2px;
+}
+.tundra .dijitAccordionTitle-selected .dijitAccordionArrow {
+ background:none;
+ margin-top:2px;
+}
+.tundra .dijitAccordionBody {
+ background: #fff;
+}
+.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 .dijitSplitter {
+ border-color: #bfbfbf;
+}
+.tundra .dijitSplitterH {
+ background:url(images/splitContainerSizerH.png) repeat-x #fff;
+ border:0;
+ border-left:0px solid #d3d3d3;
+ border-right:0px solid #d3d3d3;
+ height:5px;
+}
+.tundra .dijitSplitterH .dijitSplitterThumb {
+ background:url(images/splitContainerSizerH-thumb.png) no-repeat;
+ top:1px;
+ width:19px;
+ height:2px;
+}
+.tundra .dijitSplitterV {
+ background:url(images/splitContainerSizerV.png) repeat-y #fff;
+ border:0;
+ border-top:0px solid #d3d3d3;
+ border-bottom:0px solid #d3d3d3;
+ width:5px;
+}
+.tundra .dijitSplitterV .dijitSplitterThumb {
+ background:url(images/splitContainerSizerV-thumb.png) no-repeat;
+ left:1px;
+ height:19px;
+ width:5px;
+}
+.tundra .dijitInputField INPUT,
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner {
+ margin: 0em 0.1em;
+}
+.tundra .dijitTextBox,
+.tundra .dijitComboBox,
+.tundra .dijitSpinner,
+.tundra .dijitInlineEditor input {
+
+ background:#fff url(images/validationInputBg.png) repeat-x top left;
+ #background:#fff url(images/validationInputBg.gif) repeat-x top left;
+ border:1px solid #b3b3b3;
+ line-height: normal;
+}
+.tundra .dijitComboBox .dijitButtonNode {
+ padding: 0 0.2em;
+}
+.tundra .dijitComboBox .dijitButtonNode,
+.tundra .dijitSpinner .dijitButtonNode {
+
+ border-color: #9b9b9b;
+}
+.tundra .dijitTextBoxFocused,
+.tundra .dijitComboBoxFocused,
+.tundra .dijitSpinnerFocused {
+
+ border-color:#406b9b;
+}
+.tundra .dijitComboBoxFocused .dijitButtonNode, .tundra .dijitSpinnerFocused .dijitButtonNode {
+ border-left-color:#366dba;
+}
+.tundra .dijitSpinnerFocused .dijitDownArrowButton {
+ border-top-color:#366dba;
+}
+.tundra .dijitError {
+ border-color:#f3d118;
+ background-color:#f9f7ba;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitError INPUT {
+
+ background-color:#f9f7ba !important;
+}
+.tundra .dijitErrorFocused {
+ background-color:#ff6;
+ background-image:none;
+}
+.dj_ie6 .tundra .dijitErrorFocused INPUT {
+
+ background-color:#ff6 !important;
+}
+.tundra .dijitValidationIcon {
+
+ width: 16px;
+ background: transparent url(images/warning.png) no-repeat center center;
+}
+.tundra .dijitInlineValue {
+
+ padding:3px;
+ margin:4px;
+}
+.tundra .dijitInlineEditor {
+
+ display: inline-block;
+ display: -moz-inline-stack;
+ #display:inline;
+
+}
+.dijitInlineEditor .saveButton,
+.dijitInlineEditor .cancelButton {
+ margin:3px 3px 3px 0px;
+}
+.RichTextEditable {
+ border:1px solid #bfbfbf;
+ border-top:0;
+}
+.dj_ie6 .tundra .dijitInputField
+{
+ background: url(images/validationInputBg.gif) repeat-x top left #fff;
+}
+.tundra .dijitButtonNode {
+
+
+ border:1px solid #c0c0c0;
+ border-bottom:1px solid #9b9b9b;
+ border-right:1px solid #9b9b9b;
+ padding: 0.2em;
+ background:#fff url(images/buttonEnabled.png) repeat-x bottom left;
+}
+.dj_ie .tundra .dijitButtonNode {
+ zoom: 1;
+}
+.tundra .dijitButtonText {
+ padding: 0 0.3em;
+}
+.tundra .dijitComboBox .dijitButtonNode {
+ border: 0px;
+}
+.tundra .dijitArrowButton {
+ color: #111;
+}
+.tundra .dijitComboButton .dijitDownArrowButton {
+ padding-right:4px;
+}
+.dj_ff2 .tundra .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.tundra .dijitButtonDisabled .dijitButtonNode,
+.tundra .dijitToggleButtonDisabled .dijitButtonNode,
+.tundra .dijitDropDownButtonDisabled .dijitButtonNode,
+.tundra .dijitComboButtonDisabled .dijitButtonNode,
+.tundra .dijitComboBoxDisabled,
+.tundra .dijitSpinnerDisabled,
+.tundra .dijitSpinnerDisabled .dijitButtonNode {
+
+ border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+
+ background:#e4e4e4 url(images/buttonDisabled.png) top repeat-x;
+ opacity: 0.60;
+}
+.dj_ie .tundra .dijitButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitToggleButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitDropDownButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitComboButtonDisabled .dijitButtonNode *,
+.dj_ie .tundra .dijitSpinnerDisabled .dijitButtonNode * {
+ filter: gray() alpha(opacity=50);
+}
+.tundra .dijitButtonHover .dijitButtonNode,
+.tundra .dijitToggleButtonHover .dijitButtonNode,
+.tundra .dijitDropDownButtonHover .dijitButtonNode,
+.tundra .dijitComboButtonHover .dijitButtonContents,
+.tundra .dijitComboButtonDownArrowHover .dijitDownArrowButton,
+.tundra .dijitComboBoxHover .dijitDownArrowButton,
+.tundra .dijitSpinnerUpArrowHover .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowHover .dijitDownArrowButton {
+
+
+ border-color:#a5beda;
+ border-bottom-color:#5c7590;
+ border-right-color:#5c7590;
+ color:#000;
+ background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
+}
+.tundra .dijitSpinnerUpArrowActive .dijitUpArrowButton,
+.tundra .dijitSpinnerDownArrowActive .dijitDownArrowButton,
+.tundra .dijitButtonActive .dijitButtonNode,
+.tundra .dijitToggleButtonActive .dijitButtonNode,
+.tundra .dijitDropDownButtonActive .dijitButtonNode,
+.tundra .dijitComboButtonActive .dijitButtonContents,
+.tundra .dijitDownArrowActive .dijitDownArrowButton,
+.tundra .dijitComboBoxActive .dijitDownArrowButton {
+
+ border-color:#366dba;
+ background: #ededed url(images/buttonActive.png) bottom repeat-x;
+}
+.tundra .dijitArrowButtonInner {
+ background:url(images/arrowDown.png) no-repeat center center;
+}
+.tundra .dijitUpArrowButton .dijitArrowButtonInner { background-image:url(images/arrowUp.png); }
+.dj_ie6 .tundra .dijitArrowButtonInner {
+ background-image:url(images/arrowDown.gif);
+}
+.dj_ie6 .tundra .dijitUpArrowButton .dijitArrowButtonInner {
+ background-image:url(images/arrowUp.gif);
+}
+.tundra .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
+ background:url(images/comboArrowDown.gif) no-repeat center center;
+}
+.tundra .dijitComboBoxHover .dijitArrowButtonInner {
+
+}
+.tundra .dijitToggleButton .dijitCheckBoxIcon {
+ background-image: url(images/checkmarkNoBorder.gif);
+}
+.tundra .dijitCheckBox,
+.tundra .dijitCheckBoxIcon {
+ background-image: url(images/checkmark.gif);
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+.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,
+.tundra .dijitCheckBoxFocused {
+
+ background-position: -80px;
+}
+.tundra .dijitCheckBoxCheckedHover,
+.tundra .dijitCheckBoxCheckedFocused {
+
+ background-position: -64px;
+}
+.tundra .dijitToggleButton .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+ background-image: url(images/checkmarkNoBorder.gif);
+}
+.tundra .dijitRadio,
+.tundra .dijitRadioIcon {
+ background-image: url(images/checkmark.gif);
+ background-repeat: no-repeat;
+ width: 16px;
+ height: 16px;
+ margin: 0;
+ padding: 0;
+}
+.tundra .dijitRadio,
+.tundra .dijitToggleButton .dijitRadioIcon {
+
+ background-position: -112px;
+}
+.tundra .dijitRadioChecked,
+.tundra .dijitToggleButtonChecked .dijitRadioIcon {
+
+ background-position: -96px;
+}
+.tundra .dijitRadioDisabled {
+
+ background-position: -144px;
+}
+.tundra .dijitRadioCheckedDisabled {
+
+ background-position: -128px;
+}
+.tundra .dijitRadioHover,
+.tundra .dijitRadioFocused {
+
+ background-position: -176px;
+}
+.tundra .dijitRadioCheckedHover,
+.tundra .dijitRadioCheckedFocused {
+
+ background-position: -160px;
+}
+.tundra .dijitTextArea {
+
+ background:#fff url(images/validationInputBg.png) repeat-x top left;
+ #background:#fff url(images/validationInputBg.gif) repeat-x top left;
+ border:1px solid #b3b3b3;
+ line-height: normal;
+}
+.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:#333;
+}
+.dijit_a11y .dijitSliderProgressBar {
+ background-color:#333 !important;
+}
+.tundra .dijitSliderImageHandleH {
+ border:0px;
+ width:16px;
+ height:16px;
+ background:url(images/preciseSliderThumb.png) no-repeat center top;
+ cursor:pointer;
+}
+.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;
+ cursor:pointer;
+}
+.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 .dijitSliderIncrementIconH,
+.tundra .dijitSliderIncrementIconV {
+ background:url(images/arrowUp.png) no-repeat center center;
+ width:16px; height:16px;
+ cursor:pointer;
+}
+.tundra .dijitSliderIncrementIconH {
+ background-image:url(images/arrowRight.png);
+}
+.tundra .dijitSliderDecrementIconH,
+.tundra .dijitSliderDecrementIconV {
+ width:16px;
+ height:16px;
+ cursor:pointer;
+ background:url(images/arrowDown.png) no-repeat center center;
+}
+.tundra .dijitSliderDecrementIconH { background-image:url(images/arrowLeft.png); }
+.tundra .dijitSliderButtonInner {
+ visibility:hidden;
+}
+.tundra .dijitSliderDisabled {
+ opacity:0.6 !important;
+}
+.dj_ie6 .tundra .dijitSliderDisabled,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitRuleContainer,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderRemainingBar,
+.dj_ie6 .tundra .dijitSliderDisabled .dijitSliderProgressBar {
+ filter: gray() alpha(opacity=40);
+}
+.tundra .dijitSliderDisabled * {
+ cursor: not-allowed !important;
+}
+.tundra .dijitTreeNode {
+ background-image : url(images/i.gif);
+ background-position : top left;
+ background-repeat : repeat-y;
+ margin-left: 19px;
+ 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 .dijitTreeContent {
+ min-height: 18px;
+ min-width: 18px;
+ margin-left:18px;
+ padding-top:3px;
+ padding-left:1px;
+}
+.tundra .dijitTreeExpand {
+ width: 18px;
+ height: 18px;
+ background-repeat : no-repeat;
+}
+.tundra .dijitTreeNodeEmphasized {
+ background-color: Highlight;
+ color: HighlightText;
+}
+.tundra .dijitTreeLabelFocused {
+ outline: 1px invert dotted;
+ background:#dde7f2;
+}
+.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;
+ padding-right: 4px;
+}
+.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 .dijitProgressBar {
+ margin:2px 0px 2px 0px;
+}
+.tundra .dijitProgressBarEmpty{
+
+ background:#fff url(images/progressBarEmpty.png) repeat-x top left;
+ 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 .dijitTitlePane .dijitTitlePaneTitle {
+ background: #cccccc;
+ background:#fff url(images/titleBar.png) repeat-x bottom left;
+ border:1px solid #bfbfbf;
+ padding:4px 4px 2px 4px;
+ cursor: pointer;
+}
+.tundra .dijitTitlePane .dijitArrowNode {
+ width:16px;
+ height:16px;
+ float:right;
+}
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url(images/arrowRight.png) no-repeat center center;
+}
+.tundra .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+ text-decoration:underline;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url(images/arrowRight.gif);
+}
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background:url(images/arrowDown.png) no-repeat center center;
+}
+.dj_ie6 .tundra .dijitTitlePane .dijitOpen .dijitArrowNode {
+ background-image:url(images/arrowDown.gif);
+}
+.tundra .dijitTitlePane .dijitArrowNodeInner {
+ visibility:hidden;
+}
+.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+ visibility:visible;
+}
+.tundra .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ margin-right:5px;
+}
+.tundra .dijitOpen .dijitTitlePaneTitle .dijitOpenCloseArrowOuter {
+ position:relative;
+ top:2px;
+}
+.tundra .dijitTitlePaneContentOuter {
+ background: #ffffff;
+ border:1px solid #bfbfbf;
+ border-top: 1px solid #ccc;
+}
+.tundra .dijitTitlePaneContentInner {
+ padding:10px;
+}
+.dj_ie6 .tundra .dijitTitlePaneContentOuter,
+.dj_ie6 .tundra .dijitTitlePane .dijitTitlePaneTitle {
+ zoom: 1;
+}
+.tundra .dijitClickableRegion {
+ background-color : #ffc !important;
+}
+
+.tundra .dijitCalendarIncrementControl {
+
+ width:15px;
+ height:15px;
+}
+.dj_ie6 .tundra .dijitCalendarIncrementControl {
+ padding:.1em;
+ font-size:.1em;
+}
+.tundra .dijitCalendarIncreaseInner,
+.tundra .dijitCalendarDecreaseInner {
+ visibility:hidden;
+}
+.tundra .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat top left;
+}
+.dj_ie6 .tundra .dijitCalendarDecrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat top left;
+}
+.tundra .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.png) no-repeat -30px top;
+}
+.dj_ie6 .tundra .dijitCalendarIncrease {
+ background:url(images/spriteRoundedIconsSmall.gif) no-repeat -30px top;
+}
+.tundra table.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:.1em;
+ padding-bottom:0em;
+}
+.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;
+}
+.dj_ie7 .tundra .dijitCalendarDateTemplate,
+.dj_ie6 .tundra .dijitCalendarDateTemplate {
+ font-size: 0.8em;
+}
+.tundra .dijitCalendarDateTemplate {
+
+ font-size: 0.9em;
+ font-weight: bold;
+ text-align: center;
+ padding: 0.3em 0.3em 0.05em 0.3em;
+ letter-spacing: 1px;
+}
+.tundra .dijitCalendarPreviousMonth,
+.tundra .dijitCalendarNextMonth {
+
+ color:#999999;
+ background-color:#f8f8f8 !important;
+}
+.tundra .dijitCalendarPreviousMonthDisabled,
+.tundra .dijitCalendarNextMonthDisabled {
+
+ background-color:#a4a5a6 !important;
+}
+.tundra .dijitCalendarCurrentMonth {
+
+ background-color:white !important;
+}
+.tundra .dijitCalendarCurrentMonthDisabled {
+
+ background-color:#bbbbbc !important;
+}
+.tundra .dijitCalendarCurrentDate {
+
+ text-decoration:underline;
+ font-weight:bold;
+}
+.tundra .dijitCalendarCurrentDate {
+
+ text-decoration:underline;
+ font-weight:bold;
+}
+.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 .dijitToolbar {
+ padding: 3px 0 1px 3px;
+ border-bottom: 1px solid #ccc;
+ background:#eaeaea url(images/titleBar.png) repeat-x top left;
+}
+.tundra .dijitToolbar .dijitButtonNode {
+ background: none;
+ margin: 0px !important;
+ padding: 0px !important;
+ border: none;
+ font-size: 12px;
+}
+.tundra .dijitToolbar .dijitButton,
+.tundra .dijitToolbar .dijitToggleButton,
+.tundra .dijitToolbar .dijitDropDownButton {
+ background: none;
+ margin: 1px;
+ padding: 0px;
+ border: 1px solid transparent;
+}
+.tundra .dijitToolbar .dijitButtonChecked,
+.tundra .dijitToolbar .dijitToggleButtonChecked {
+ background-color:#d4dff2;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.tundra .dijitToolbar .dijitButtonCheckedHover,
+.tundra .dijitToolbar .dijitToggleButtonCheckedHover
+ {
+ background-color:#abc1e5;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px !important;
+}
+.tundra .dijitToolbar .dijitButtonHover,
+.tundra .dijitToolbar .dijitToggleButtonHover,
+.tundra .dijitToolbar .dijitDropDownButtonHover {
+
+ border: 1px solid #316ac5;
+ background-color:#abc1e5;
+}
+.tundra .dijitToolbar label {
+ padding: 3px 3px 0 6px;
+}
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused,
+.dj_ff2 .tundra.dijitToolbar .dijitComboButton .dijitButtonContentsFocused,
+.dj_ff2 .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
+ border: 1px black dotted !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButton,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButton,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButton {
+
+ margin: 2px;
+ padding: 0px 2px;
+ border: 0px;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonChecked,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonChecked {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonCheckedHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonCheckedHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.dj_ie6 .tundra .dijitToolbar .dijitButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitToggleButtonHover,
+.dj_ie6 .tundra .dijitToolbar .dijitDropDownButtonHover {
+ background-color:#c1d2ee;
+ border:1px solid #316ac5;
+ margin: 1px !important;
+ padding: 0px 2px !important;
+}
+.tundra .dijitDialog {
+ background: #fff;
+ border: 1px solid #7eabcd;
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+ padding: 0px;
+}
+.tundra .dijitDialog .dijitDialogTitle {
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+.tundra .dijitDialog .dijitDialogPaneContent {
+ background: #fff;
+ border:none;
+ border-top: 1px solid #d3d3d3;
+ padding:10px;
+}
+.tundra .dijitDialogTitleBar {
+
+ background: #fafafa url(images/titleBar.png) repeat-x top left;
+
+ padding: 5px 6px 3px 2px;
+ cursor: move;
+ outline:0;
+}
+.tundra .dijitDialogTitle {
+
+ font-weight: bold;
+ padding: 8px 12px 8px 12px;
+ outline:0;
+}
+.tundra .dijitDialogCloseIcon {
+
+ background : url(images/spriteRoundedIconsSmall.png) no-repeat right top;
+ float: right;
+ position: absolute;
+ vertical-align: middle;
+ right: 6px;
+ top: 4px;
+ height: 15px;
+ width: 15px;
+ cursor: pointer;
+}
+.dj_ie6 .tundra .dijitDialogCloseIcon {
+ background : url(images/spriteRoundedIconsSmall.gif) no-repeat right top;
+}
+.tundra .dijitDialogContent {
+
+ padding: 8px;
+}
+.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: 6px;
+}
+.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_ie6 .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_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorDown.gif);
+ bottom: -3px;
+}
+.tundra .dijitTooltipLeft {
+ padding-right: 14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft {
+ padding-left: 15px;
+}
+.tundra .dijitTooltipLeft .dijitTooltipConnector {
+
+ right: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorRight.png) no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorRight.gif);
+}
+.tundra .dijitTooltipRight {
+ padding-left: 14px;
+}
+.tundra .dijitTooltipRight .dijitTooltipConnector {
+
+ left: 0px;
+ bottom: 7px;
+ background:url(images/tooltipConnectorLeft.png) no-repeat top left;
+ width:16px;
+ height:14px;
+}
+.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+ background-image: url(images/tooltipConnectorLeft.gif);
+}
+.dj_safari .tundra .dijitPopup .dijitTooltipContainer,
+.dj_safari .tundra .dijitPopup .dijitMenu {
+
+ -webkit-box-shadow: 0px 5px 10px #adadad;
+}
+.tundra .dijitPopup > div,
+.tundra .dijitPopup > table {
+ opacity: 0.95;
+}
+.tundra .dijitMenu {
+ border: 1px solid #7eabcd;
+ margin: 0px;
+ padding: 0px;
+}
+.tundra .dijitMenuItem {
+ background-color: #f7f7f7;
+ font: menu;
+ margin: 0;
+}
+.tundra .dijitMenuPreviousButton, .tundra .dijitMenuNextButton {
+ font-style: italic;
+}
+.tundra .dijitMenuItem td {
+ padding:2px;
+}
+.tundra .dijitMenuItemHover {
+ background-color: #60a1ea;
+ color:#fff;
+}
+.tundra .dijitMenuItemIcon {
+ width: 16px;
+ height: 16px;
+}
+.tundra .dijitMenuExpand {
+ display:none;
+}
+.tundra .dijitMenuExpandEnabled {
+ width:16px;
+ height:16px;
+ background:url(images/arrowRight.gif) no-repeat center center;
+ display:block;
+}
+.tundra .dijitMenuExpandInner {
+ display:none;
+}
+.tundra .dijitMenuSeparator {
+ background-color: #f7f7f7;
+}
+.tundra .dijitMenuSeparatorTop {
+ border-bottom: 1px solid #9b9b9b;
+}
+.tundra .dijitMenuSeparatorBottom {
+ border-top: 1px solid #e8e8e8;
+}
+.dijitIEFixedToolbar {
+ position:absolute;
+
+ top: expression(eval((document.documentElement||document.body).scrollTop));
+}
+.tundra .dijitToolbar .dijitToolbarSeparator {
+ background: url(images/editor.gif);
+}
+.tundra .dijitEditorIcon {
+ background-image: url(images/editor.gif);
+ background-repeat: no-repeat;
+ width: 18px;
+ height: 18px;
+ text-align: center;
+}
+.tundra .dijitEditorIconSep { background-position: 0px; }
+.tundra .dijitEditorIconBackColor { background-position: -18px; }
+.tundra .dijitEditorIconBold { background-position: -36px; }
+.tundra .dijitEditorIconCancel { background-position: -54px; }
+.tundra .dijitEditorIconCopy { background-position: -72px; }
+.tundra .dijitEditorIconCreateLink { background-position: -90px; }
+.tundra .dijitEditorIconCut { background-position: -108px; }
+.tundra .dijitEditorIconDelete { background-position: -126px; }
+.tundra .dijitEditorIconForeColor { background-position: -144px; }
+.tundra .dijitEditorIconHiliteColor { background-position: -162px; }
+.tundra .dijitEditorIconIndent { background-position: -180px; }
+.tundra .dijitEditorIconInsertHorizontalRule { background-position: -198px; }
+.tundra .dijitEditorIconInsertImage { background-position: -216px; }
+.tundra .dijitEditorIconInsertOrderedList { background-position: -234px; }
+.tundra .dijitEditorIconInsertTable { background-position: -252px; }
+.tundra .dijitEditorIconInsertUnorderedList { background-position: -270px; }
+.tundra .dijitEditorIconItalic { background-position: -288px; }
+.tundra .dijitEditorIconJustifyCenter { background-position: -306px; }
+.tundra .dijitEditorIconJustifyFull { background-position: -324px; }
+.tundra .dijitEditorIconJustifyLeft { background-position: -342px; }
+.tundra .dijitEditorIconJustifyRight { background-position: -360px; }
+.tundra .dijitEditorIconLeftToRight { background-position: -378px; }
+.tundra .dijitEditorIconListBulletIndent { background-position: -396px; }
+.tundra .dijitEditorIconListBulletOutdent { background-position: -414px; }
+.tundra .dijitEditorIconListNumIndent { background-position: -432px; }
+.tundra .dijitEditorIconListNumOutdent { background-position: -450px; }
+.tundra .dijitEditorIconOutdent { background-position: -468px; }
+.tundra .dijitEditorIconPaste { background-position: -486px; }
+.tundra .dijitEditorIconRedo { background-position: -504px; }
+.tundra .dijitEditorIconRemoveFormat { background-position: -522px; }
+.tundra .dijitEditorIconRightToLeft { background-position: -540px; }
+.tundra .dijitEditorIconSave { background-position: -558px; }
+.tundra .dijitEditorIconSpace { background-position: -576px; }
+.tundra .dijitEditorIconStrikethrough { background-position: -594px; }
+.tundra .dijitEditorIconSubscript { background-position: -612px; }
+.tundra .dijitEditorIconSuperscript { background-position: -630px; }
+.tundra .dijitEditorIconUnderline { background-position: -648px; }
+.tundra .dijitEditorIconUndo { background-position: -666px; }
+.tundra .dijitEditorIconWikiword { background-position: -684px; }
+.tundra .dijitEditorIconToggleDir { background-position: -540px; }
+.dijitColorPalette {
+ border:1px solid #7eabcd;
+ background:#fff;
+ -moz-border-radius: 0px !important;
+}
diff --git a/includes/js/dijit/themes/tundra/tundra.css.commented.css b/includes/js/dijit/themes/tundra/tundra.css.commented.css
new file mode 100644
index 0000000..6b3fc7b
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/tundra.css.commented.css
@@ -0,0 +1,37 @@
+/*
+ Adds cosmetic styling to Dijit. Users may swap with a custom theme CSS file.
+
+ 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("Common.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/TextArea.css");
+@import url("form/Slider.css");
+@import url("Tree.css");
+@import url("ProgressBar.css");
+@import url("TitlePane.css");
+@import url("Calendar.css");
+@import url("Toolbar.css");
+@import url("Dialog.css");
+@import url("Menu.css");
+@import url("Editor.css");
+@import url("ColorPalette.css");
diff --git a/includes/js/dijit/themes/tundra/tundra_rtl.css b/includes/js/dijit/themes/tundra/tundra_rtl.css
new file mode 100644
index 0000000..21b028d
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/tundra_rtl.css
@@ -0,0 +1,317 @@
+.dj_gecko .dijitRtl .dijitInputField {
+ direction: ltr;
+}
+.dj_gecko .dijitRtl .dijitInputField * {
+ direction: rtl;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpando, .dijitRtl .dijitTreeContainer .dijitTreeExpand {
+ float:right;
+}
+.dijitRtl .dijitExpandoText {
+ float: right;
+ padding-left: 3px;
+ padding-right: 0;
+}
+.dijitRtl .dijitComboBox .dijitInputField {
+ border-right-width:1px !important;
+ border-left-width:0 !important;
+}
+.dijitRtl .dijitCalendarNextYear {
+ margin:0 0.55em 0 0;
+}
+.dijitRtl .dijitCalendarPreviousYear {
+ margin:0 0 0 0.55em;
+}
+.dijitRtl .dijitProgressBarFull .dijitProgressBarLabel {
+ right:0;
+}
+.dijitRtl .dijitComboButton .dijitButtonContents {
+ border-right-width:1px !important;
+}
+.dijitRtl .dijitA11ySideArrow {
+ margin-left:1em;
+ margin-right:0;
+}
+.dijitRtl .dijitAccordionArrow,
+.dijitRtl .dijitAccordionTitle .arrowTextUp,
+.dijitRtl .dijitAccordionTitle .arrowTextDown {
+ float: left;
+}
+.dijitRtl .dijitSliderImageHandleV {
+ left:auto;
+ right:-6px;
+}
+.dj_ie .dijitRtl .dijitSliderImageHandleV {
+ right:-10px;
+}
+.dijitRtl .dijitSliderMoveableH {
+ right:auto;
+ left:0;
+}
+.dijitRtl .dijitRuleContainerV {
+ float:right;
+}
+.dj_gecko .dijitRtl .dijitRuleContainerV {
+ float:left;
+}
+.dj_ie .dijitRtl .dijitRuleContainerV {
+ text-align:right;
+}
+.dj_ie .dijitRtl .dijitRuleLabelV {
+ text-align:left;
+}
+.dj_ie .dijitRtl .dijitRuleLabelH {
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitSliderProgressBarH {
+ right:0;
+ left:auto;
+}
+.dj_gecko .dijitRtl .dijitSliderProgressBarH {
+ float:right;
+ right:0;
+ left:auto;
+}
+.dijitRtl .dijitTab {
+ float:right;
+}
+.dj_ie .dijitRtl .dijitTab,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv,
+.dj_ie .dijitRtl .dijitTab .dijitTabInnerDiv span {
+ position:static;
+ zoom:1;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ margin-left:1px !important;
+}
+.dj_ie .dijitRtl .dijitTabContainer .dijitAlignRight {
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTab {
+
+ width:1px;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+
+ margin-left:1px !important;
+}
+.dj_ie7 .dijitRtl .dijitTabContainer .dijitAlignRight {
+
+ margin-right:1px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignLeft {
+ overflow-x:visible;
+ margin-left:2px !important;
+}
+.dj_ie6 .dijitRtl .dijitTabContainer .dijitAlignRight {
+ overflow-x:visible;
+ margin-right:2px !important;
+}
+.dj_ie7 .dijitRtl .dijitTab .dijitTabInnerDiv {
+ float:left;
+}
+.dj_ie7 .dijitRtl .dijitTab .closeImage {
+ padding: 0 0 0 12px;
+}
+.dj_ie .dijitRtl .dijitAlignRight .dijitTab {
+ position:relative;
+}
+.dijitRtl .dijitTitlePane .dijitArrowNode {
+ float: left;
+}
+.dijitRtl .dijitSpinner .dijitInputLayoutContainer .dijitArrowButton {
+ right: auto;
+ left: 0;
+ border-width: 0 1px 0 0 !important;
+}
+.dijitRtl .dijitSpinnerButtonContainer {
+ float: left;
+}
+.dijitRtl .dijit_a11y .dijitSpinnerButtonContainer {
+ margin-left: none;
+ margin-right: 2px;
+}
+.dijitRtl DIV.dijitArrowButton, .dijitRtl .dijitValidationIcon, .dijitRtl .dijitValidationIconText {
+ float: left;
+}
+.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
+ background-position:right;
+ padding-right:25px;
+}
+.dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarIncrease {
+ background-position: 0px top;
+}
+.dj_ie6 .dijitRtl .dijitCalendarDecrease {
+ background-position: -30px top;
+}
+.dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+ float: left;
+ right: auto;
+ left: 5px;
+}
+.dj_ie6 .dijitRtl .dijitDialogTitleBar .dijitDialogCloseIcon {
+ background-position: -60px top;
+}
+.dj_ie .dijitRtl .dijitTooltipLeft {
+ margin-right: 0px;
+ margin-left: 13px;
+}
+.dj_ie .dijitRtl .dijitTooltipRight {
+ margin-left: 26px;
+ margin-right: -13px;
+}
+.dj_ie .dijitRtl .dijitTooltipDialog {
+ zoom:1 !important;
+}
+.dijitRtl .dijitEditorIcon {
+ background-image: url(images/editor_rtl.gif);
+}
+.dijitRtl .dijitToolbar .dijitToolbarSeparator {
+ background-image: url(images/editor_rtl.gif);
+}
+.dijitRtl .dijitMenuItem .dijitMenuItemIcon {
+ padding-left: 3px;
+ padding-right: 0px;
+}
+.dijitRtl .dijitMenuItem .dijitMenuExpandEnabled {
+ background-image:url(images/arrowLeft.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeNode {
+ background-image : url(images/i_rtl.gif);
+ background-position : top right;
+ margin-left: auto;
+ margin-right: 19px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsRoot {
+ margin-left: auto;
+ margin-right: 0;
+ background-image: none;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeIsLast {
+ background-image: url(images/i_half_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeContent {
+ margin-left: auto;
+ margin-right: 18px;
+ padding-left: auto;
+ padding-right: 1px;
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoOpened {
+ background-image: url(images/treeExpand_minus_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoClosed {
+ background-image: url(images/treeExpand_plus_rtl.gif);
+}
+.dijitRtl .dijitTreeContainer .dijitTreeExpandoLeaf {
+ background-image: url(images/treeExpand_leaf_rtl.gif);
+}
+.dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background:url(images/arrowRight.png) no-repeat center center;
+}
+.dj_ie6 .dijitRtl .dijitTitlePane .dijitClosed .dijitArrowNode {
+ background-image:url(images/arrowRight.gif);
+}
+.dijitRtl .dijitTab {
+ margin-right:0;
+ margin-left:5px;
+}
+.dijitRtl .dijitTab .dijitTabInnerDiv {
+ border-left:none;
+ border-right:1px solid #fff;
+}
+.dijitRtl .dijitTab .dijitClosable {
+ padding: 6px 10px 4px 20px;
+}
+.dijitRtl .dijitTab .closeImage {
+ position:static;
+ padding: 0px 12px 0px 0px;
+}
+.dj_gecko .dijitTab .closeImage {
+ position:relative;
+ float:none;
+ padding:0;
+}
+.dijitRtl .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+ background-position: left top;
+}
+.dj_ie .dijitRtl .dijitTab .dijitClosable .closeImage {
+ width:12px !important;
+}
+.dijitRtl .dijitAlignLeft .dijitTab,
+.dijitRtl .dijitAlignRight .dijitTab {
+ margin-left:0px;
+}
+.dijitRtl .dijitAlignBottom .dijitTab .dijitClosable .closeImage {
+ right:auto;
+ left:3px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitTabInnerDiv {
+ padding-left:10px;
+ padding-right:20px;
+}
+.dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:20px;
+ padding-right:10px;
+}
+.dj_ie .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:19px;
+}
+.dj_gecko .dijitRtl .dijitAlignLeft .dijitTab .dijitTabInnerDiv {
+ padding-left:11px;
+}
+.dijitRtl .dijitAlignRight .dijitTab .dijitClosable .closeImage {
+ left:auto;
+ right:3px;
+}
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitTabContent{
+ position:relative;
+}
+.dj_ie7 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ position:absolute;
+ top:2px;
+ left:3px;
+}
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .closeImage{
+ float:left;
+}
+.dj_ie6 .dijitRtl .dijitAlignLeft .dijitTab .dijitClosable .tabLabel{
+ float:right;
+}
+.dj_ie .dijitTab .dijitTabInnerDiv{
+ width : 1%;
+}
+.dijitRtl .dijitSliderProgressBarH,
+.dijitRtl .dijitSliderRemainingBarH,
+.dijitRtl .dijitSliderLeftBumper,
+.dijitRtl .dijitSliderRightBumper,
+.dijitRtl .dijitSliderTopBumper {
+ background-position: top right;
+}
+.dijitRtl .dijitSliderProgressBarV,
+.dijitRtl .dijitSliderRemainingBarV,
+.dijitRtl .dijitSliderBottomBumper {
+ background-position: bottom right;
+}
+.dijitRtl .dijitSliderLeftBumper {
+ border-left-width: 0px;
+ border-right-width: 1px;
+}
+.dijitRtl .dijitSliderRightBumper {
+ border-left-width: 1px;
+ border-right-width: 0px;
+}
+.dijitRtl .dijitSliderIncrementIconH {
+ background-image:url(images/arrowLeft.png);
+}
+.dijitRtl .dijitSliderDecrementIconH {
+ background-image:url(images/arrowRight.png);
+}
diff --git a/includes/js/dijit/themes/tundra/tundra_rtl.css.commented.css b/includes/js/dijit/themes/tundra/tundra_rtl.css.commented.css
new file mode 100644
index 0000000..6d26d3a
--- /dev/null
+++ b/includes/js/dijit/themes/tundra/tundra_rtl.css.commented.css
@@ -0,0 +1,9 @@
+@import url("../dijit_rtl.css");
+@import url("Calendar_rtl.css");
+@import url("Dialog_rtl.css");
+@import url("Editor_rtl.css");
+@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");