From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: [PATCH] New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- ajax/gettags.php | 51 + includes/js/dijit/ColorPalette.js | 292 + includes/js/dijit/Declaration.js | 76 + includes/js/dijit/Dialog.js | 480 + includes/js/dijit/Editor.js | 373 + includes/js/dijit/InlineEditBox.js | 422 + includes/js/dijit/LICENSE | 195 + includes/js/dijit/Menu.js | 487 + includes/js/dijit/ProgressBar.js | 95 + includes/js/dijit/TitlePane.js | 157 + includes/js/dijit/Toolbar.js | 54 + includes/js/dijit/Tooltip.js | 292 + includes/js/dijit/Tree.js | 1336 ++ includes/js/dijit/_Calendar.js | 239 + includes/js/dijit/_Container.js | 346 + includes/js/dijit/_Templated.js | 329 + includes/js/dijit/_TimePicker.js | 249 + includes/js/dijit/_Widget.js | 407 + includes/js/dijit/_base.js | 27 + includes/js/dijit/_base/bidi.js | 13 + includes/js/dijit/_base/focus.js | 342 + includes/js/dijit/_base/manager.js | 194 + includes/js/dijit/_base/place.js | 213 + includes/js/dijit/_base/popup.js | 269 + includes/js/dijit/_base/scroll.js | 29 + includes/js/dijit/_base/sniff.js | 45 + includes/js/dijit/_base/typematic.js | 139 + includes/js/dijit/_base/wai.js | 143 + includes/js/dijit/_base/window.js | 47 + includes/js/dijit/_editor/RichText.js | 1449 ++ includes/js/dijit/_editor/_Plugin.js | 101 + includes/js/dijit/_editor/html.js | 106 + includes/js/dijit/_editor/nls/FontChoice.js | 1 + includes/js/dijit/_editor/nls/LinkDialog.js | 1 + .../js/dijit/_editor/nls/ar/FontChoice.js | 1 + .../js/dijit/_editor/nls/ar/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/ar/commands.js | 1 + includes/js/dijit/_editor/nls/commands.js | 1 + .../js/dijit/_editor/nls/cs/FontChoice.js | 1 + .../js/dijit/_editor/nls/cs/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/cs/commands.js | 1 + .../js/dijit/_editor/nls/da/FontChoice.js | 1 + .../js/dijit/_editor/nls/da/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/da/commands.js | 1 + .../js/dijit/_editor/nls/de/FontChoice.js | 1 + .../js/dijit/_editor/nls/de/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/de/commands.js | 1 + .../js/dijit/_editor/nls/el/FontChoice.js | 1 + .../js/dijit/_editor/nls/el/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/el/commands.js | 1 + .../js/dijit/_editor/nls/es/FontChoice.js | 1 + .../js/dijit/_editor/nls/es/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/es/commands.js | 1 + .../js/dijit/_editor/nls/fi/FontChoice.js | 1 + .../js/dijit/_editor/nls/fi/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/fi/commands.js | 1 + .../js/dijit/_editor/nls/fr/FontChoice.js | 1 + .../js/dijit/_editor/nls/fr/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/fr/commands.js | 1 + .../js/dijit/_editor/nls/he/FontChoice.js | 1 + .../js/dijit/_editor/nls/he/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/he/commands.js | 1 + .../js/dijit/_editor/nls/hu/FontChoice.js | 1 + .../js/dijit/_editor/nls/hu/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/hu/commands.js | 1 + .../js/dijit/_editor/nls/it/FontChoice.js | 1 + .../js/dijit/_editor/nls/it/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/it/commands.js | 1 + .../js/dijit/_editor/nls/ja/FontChoice.js | 1 + .../js/dijit/_editor/nls/ja/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/ja/commands.js | 1 + .../js/dijit/_editor/nls/ko/FontChoice.js | 1 + .../js/dijit/_editor/nls/ko/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/ko/commands.js | 1 + .../js/dijit/_editor/nls/nb/FontChoice.js | 1 + .../js/dijit/_editor/nls/nb/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/nb/commands.js | 1 + .../js/dijit/_editor/nls/nl/FontChoice.js | 1 + .../js/dijit/_editor/nls/nl/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/nl/commands.js | 1 + .../js/dijit/_editor/nls/pl/FontChoice.js | 1 + .../js/dijit/_editor/nls/pl/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/pl/commands.js | 1 + .../js/dijit/_editor/nls/pt-pt/FontChoice.js | 1 + .../js/dijit/_editor/nls/pt-pt/LinkDialog.js | 1 + .../js/dijit/_editor/nls/pt-pt/commands.js | 1 + .../js/dijit/_editor/nls/pt/FontChoice.js | 1 + .../js/dijit/_editor/nls/pt/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/pt/commands.js | 1 + .../js/dijit/_editor/nls/ru/FontChoice.js | 1 + .../js/dijit/_editor/nls/ru/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/ru/commands.js | 1 + .../js/dijit/_editor/nls/sv/FontChoice.js | 1 + .../js/dijit/_editor/nls/sv/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/sv/commands.js | 1 + .../js/dijit/_editor/nls/tr/FontChoice.js | 1 + .../js/dijit/_editor/nls/tr/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/tr/commands.js | 1 + .../js/dijit/_editor/nls/zh-tw/FontChoice.js | 1 + .../js/dijit/_editor/nls/zh-tw/LinkDialog.js | 1 + .../js/dijit/_editor/nls/zh-tw/commands.js | 1 + .../js/dijit/_editor/nls/zh/FontChoice.js | 1 + .../js/dijit/_editor/nls/zh/LinkDialog.js | 1 + includes/js/dijit/_editor/nls/zh/commands.js | 1 + .../_editor/plugins/AlwaysShowToolbar.js | 140 + .../dijit/_editor/plugins/EnterKeyHandling.js | 416 + .../js/dijit/_editor/plugins/FontChoice.js | 167 + .../js/dijit/_editor/plugins/LinkDialog.js | 147 + .../js/dijit/_editor/plugins/TextColor.js | 40 + .../js/dijit/_editor/plugins/ToggleDir.js | 40 + includes/js/dijit/_editor/range.js | 570 + includes/js/dijit/_editor/selection.js | 246 + includes/js/dijit/_tree/Node.html | 12 + includes/js/dijit/_tree/Tree.html | 3 + includes/js/dijit/_tree/dndContainer.js | 150 + includes/js/dijit/_tree/dndSelector.js | 171 + includes/js/dijit/_tree/dndSource.js | 373 + includes/js/dijit/_tree/model.js | 84 + includes/js/dijit/bench/benchReceive.php | 129 + includes/js/dijit/bench/benchTool.html | 189 + includes/js/dijit/bench/create_widgets.html | 73 + .../dijit/bench/test_Button-programmatic.html | 75 + .../js/dijit/bench/test_button-results.html | 66 + .../dijit/bench/widget_construction_test.php | 186 + includes/js/dijit/changes.txt | 93 + includes/js/dijit/demos/chat.html | 86 + includes/js/dijit/demos/chat/chat.css | 40 + .../dijit/demos/chat/chat.css.commented.css | 46 + includes/js/dijit/demos/chat/client.html | 65 + includes/js/dijit/demos/chat/community.html | 114 + includes/js/dijit/demos/chat/operator.html | 83 + includes/js/dijit/demos/chat/room.js | 127 + includes/js/dijit/demos/form.html | 243 + includes/js/dijit/demos/i18n.html | 158 + includes/js/dijit/demos/i18n/continents.json | 9 + includes/js/dijit/demos/i18n/data.json | 8646 ++++++++ includes/js/dijit/demos/i18n/flags.css | 1223 ++ .../dijit/demos/i18n/flags.css.commented.css | 1224 ++ includes/js/dijit/demos/i18n/flags.png | Bin 0 -> 47275 bytes includes/js/dijit/demos/i18n/generate.html | 2353 +++ .../js/dijit/demos/i18n/langCountryMap.json | 215 + includes/js/dijit/demos/i18n/languages.json | 7045 +++++++ includes/js/dijit/demos/i18n/languages.sh | 18 + includes/js/dijit/demos/i18n/sprite.html | 2319 +++ includes/js/dijit/demos/mail.html | 426 + includes/js/dijit/demos/mail/icons.gif | Bin 0 -> 1757 bytes includes/js/dijit/demos/mail/icons.png | Bin 0 -> 2908 bytes includes/js/dijit/demos/mail/mail.css | 133 + .../dijit/demos/mail/mail.css.commented.css | 157 + includes/js/dijit/demos/mail/mail.json | 75 + includes/js/dijit/demos/mail/newMail.html | 8 + includes/js/dijit/demos/nihao.html | 91 + .../js/dijit/demos/nihao/nls/en/helloworld.js | 1 + .../js/dijit/demos/nihao/nls/fr/helloworld.js | 1 + .../js/dijit/demos/nihao/nls/helloworld.js | 1 + .../js/dijit/demos/nihao/nls/zh/helloworld.js | 1 + includes/js/dijit/dijit-all.js | 20 + .../js/dijit/dijit-all.js.uncompressed.js | 16235 ++++++++++++++++ includes/js/dijit/dijit.js | 20 + includes/js/dijit/dijit.js.uncompressed.js | 3641 ++++ includes/js/dijit/form/Button.js | 425 + includes/js/dijit/form/CheckBox.js | 133 + includes/js/dijit/form/ComboBox.js | 1060 + includes/js/dijit/form/CurrencyTextBox.js | 51 + includes/js/dijit/form/DateTextBox.js | 20 + includes/js/dijit/form/FilteringSelect.js | 241 + includes/js/dijit/form/Form.js | 384 + includes/js/dijit/form/MultiSelect.js | 84 + includes/js/dijit/form/NumberSpinner.js | 31 + includes/js/dijit/form/NumberTextBox.js | 79 + includes/js/dijit/form/SimpleTextarea.js | 50 + includes/js/dijit/form/Slider.js | 481 + includes/js/dijit/form/TextBox.js | 185 + includes/js/dijit/form/Textarea.js | 261 + includes/js/dijit/form/TimeTextBox.js | 33 + includes/js/dijit/form/ValidationTextBox.js | 308 + includes/js/dijit/form/_DateTimeTextBox.js | 175 + includes/js/dijit/form/_FormWidget.js | 340 + includes/js/dijit/form/_Spinner.js | 117 + includes/js/dijit/form/nls/ComboBox.js | 1 + includes/js/dijit/form/nls/Textarea.js | 1 + includes/js/dijit/form/nls/ar/ComboBox.js | 1 + includes/js/dijit/form/nls/ar/Textarea.js | 1 + includes/js/dijit/form/nls/ar/validate.js | 1 + includes/js/dijit/form/nls/cs/ComboBox.js | 1 + includes/js/dijit/form/nls/cs/Textarea.js | 1 + includes/js/dijit/form/nls/cs/validate.js | 1 + includes/js/dijit/form/nls/da/ComboBox.js | 1 + includes/js/dijit/form/nls/da/Textarea.js | 1 + includes/js/dijit/form/nls/da/validate.js | 1 + includes/js/dijit/form/nls/de/ComboBox.js | 1 + includes/js/dijit/form/nls/de/Textarea.js | 1 + includes/js/dijit/form/nls/de/validate.js | 1 + includes/js/dijit/form/nls/el/ComboBox.js | 1 + includes/js/dijit/form/nls/el/Textarea.js | 1 + includes/js/dijit/form/nls/el/validate.js | 1 + includes/js/dijit/form/nls/es/ComboBox.js | 1 + includes/js/dijit/form/nls/es/Textarea.js | 1 + includes/js/dijit/form/nls/es/validate.js | 1 + includes/js/dijit/form/nls/fi/ComboBox.js | 1 + includes/js/dijit/form/nls/fi/Textarea.js | 1 + includes/js/dijit/form/nls/fi/validate.js | 1 + includes/js/dijit/form/nls/fr/ComboBox.js | 1 + includes/js/dijit/form/nls/fr/Textarea.js | 1 + includes/js/dijit/form/nls/fr/validate.js | 1 + includes/js/dijit/form/nls/he/ComboBox.js | 1 + includes/js/dijit/form/nls/he/Textarea.js | 1 + includes/js/dijit/form/nls/he/validate.js | 1 + includes/js/dijit/form/nls/hu/ComboBox.js | 1 + includes/js/dijit/form/nls/hu/Textarea.js | 1 + includes/js/dijit/form/nls/hu/validate.js | 1 + includes/js/dijit/form/nls/it/ComboBox.js | 1 + includes/js/dijit/form/nls/it/Textarea.js | 1 + includes/js/dijit/form/nls/it/validate.js | 1 + includes/js/dijit/form/nls/ja/ComboBox.js | 1 + includes/js/dijit/form/nls/ja/Textarea.js | 1 + includes/js/dijit/form/nls/ja/validate.js | 1 + includes/js/dijit/form/nls/ko/ComboBox.js | 1 + includes/js/dijit/form/nls/ko/Textarea.js | 1 + includes/js/dijit/form/nls/ko/validate.js | 1 + includes/js/dijit/form/nls/nb/ComboBox.js | 1 + includes/js/dijit/form/nls/nb/Textarea.js | 1 + includes/js/dijit/form/nls/nb/validate.js | 1 + includes/js/dijit/form/nls/nl/ComboBox.js | 1 + includes/js/dijit/form/nls/nl/Textarea.js | 1 + includes/js/dijit/form/nls/nl/validate.js | 1 + includes/js/dijit/form/nls/pl/ComboBox.js | 1 + includes/js/dijit/form/nls/pl/Textarea.js | 1 + includes/js/dijit/form/nls/pl/validate.js | 1 + includes/js/dijit/form/nls/pt-pt/ComboBox.js | 1 + includes/js/dijit/form/nls/pt-pt/Textarea.js | 1 + includes/js/dijit/form/nls/pt-pt/validate.js | 1 + includes/js/dijit/form/nls/pt/ComboBox.js | 1 + includes/js/dijit/form/nls/pt/Textarea.js | 1 + includes/js/dijit/form/nls/pt/validate.js | 1 + includes/js/dijit/form/nls/ru/ComboBox.js | 1 + includes/js/dijit/form/nls/ru/Textarea.js | 1 + includes/js/dijit/form/nls/ru/validate.js | 1 + includes/js/dijit/form/nls/sv/ComboBox.js | 1 + includes/js/dijit/form/nls/sv/Textarea.js | 1 + includes/js/dijit/form/nls/sv/validate.js | 1 + includes/js/dijit/form/nls/tr/ComboBox.js | 1 + includes/js/dijit/form/nls/tr/Textarea.js | 1 + includes/js/dijit/form/nls/tr/validate.js | 1 + includes/js/dijit/form/nls/validate.js | 1 + includes/js/dijit/form/nls/zh-tw/ComboBox.js | 1 + includes/js/dijit/form/nls/zh-tw/Textarea.js | 1 + includes/js/dijit/form/nls/zh-tw/validate.js | 1 + includes/js/dijit/form/nls/zh/ComboBox.js | 1 + includes/js/dijit/form/nls/zh/Textarea.js | 1 + includes/js/dijit/form/nls/zh/validate.js | 1 + includes/js/dijit/form/templates/Button.html | 11 + .../js/dijit/form/templates/CheckBox.html | 7 + .../js/dijit/form/templates/ComboBox.html | 19 + .../js/dijit/form/templates/ComboButton.html | 21 + .../dijit/form/templates/DropDownButton.html | 13 + .../form/templates/HorizontalSlider.html | 37 + .../dijit/form/templates/InlineEditBox.html | 12 + includes/js/dijit/form/templates/Spinner.html | 28 + includes/js/dijit/form/templates/TextBox.html | 4 + .../js/dijit/form/templates/TimePicker.html | 5 + .../form/templates/ValidationTextBox.html | 12 + .../dijit/form/templates/VerticalSlider.html | 46 + .../js/dijit/layout/AccordionContainer.js | 229 + includes/js/dijit/layout/BorderContainer.js | 515 + includes/js/dijit/layout/ContentPane.js | 445 + includes/js/dijit/layout/LayoutContainer.js | 74 + includes/js/dijit/layout/LinkPane.js | 36 + includes/js/dijit/layout/SplitContainer.js | 553 + includes/js/dijit/layout/StackContainer.js | 493 + includes/js/dijit/layout/TabContainer.js | 184 + includes/js/dijit/layout/_LayoutWidget.js | 188 + .../dijit/layout/templates/AccordionPane.html | 11 + .../dijit/layout/templates/TabContainer.html | 4 + .../dijit/layout/templates/TooltipDialog.html | 6 + .../js/dijit/layout/templates/_TabButton.html | 10 + includes/js/dijit/nls/ar/common.js | 1 + includes/js/dijit/nls/ar/loading.js | 1 + includes/js/dijit/nls/common.js | 1 + includes/js/dijit/nls/cs/common.js | 1 + includes/js/dijit/nls/cs/loading.js | 1 + includes/js/dijit/nls/da/common.js | 1 + includes/js/dijit/nls/da/loading.js | 1 + includes/js/dijit/nls/de/common.js | 1 + includes/js/dijit/nls/de/loading.js | 1 + includes/js/dijit/nls/dijit-all_ROOT.js | 1 + includes/js/dijit/nls/dijit-all_ar.js | 1 + includes/js/dijit/nls/dijit-all_cs.js | 1 + includes/js/dijit/nls/dijit-all_da.js | 1 + includes/js/dijit/nls/dijit-all_de-de.js | 1 + includes/js/dijit/nls/dijit-all_de.js | 1 + includes/js/dijit/nls/dijit-all_el.js | 1 + includes/js/dijit/nls/dijit-all_en-gb.js | 1 + includes/js/dijit/nls/dijit-all_en-us.js | 1 + includes/js/dijit/nls/dijit-all_en.js | 1 + includes/js/dijit/nls/dijit-all_es-es.js | 1 + includes/js/dijit/nls/dijit-all_es.js | 1 + includes/js/dijit/nls/dijit-all_fi-fi.js | 1 + includes/js/dijit/nls/dijit-all_fi.js | 1 + includes/js/dijit/nls/dijit-all_fr-fr.js | 1 + includes/js/dijit/nls/dijit-all_fr.js | 1 + includes/js/dijit/nls/dijit-all_he-il.js | 1 + includes/js/dijit/nls/dijit-all_he.js | 1 + includes/js/dijit/nls/dijit-all_hu.js | 1 + includes/js/dijit/nls/dijit-all_it-it.js | 1 + includes/js/dijit/nls/dijit-all_it.js | 1 + includes/js/dijit/nls/dijit-all_ja-jp.js | 1 + includes/js/dijit/nls/dijit-all_ja.js | 1 + includes/js/dijit/nls/dijit-all_ko-kr.js | 1 + includes/js/dijit/nls/dijit-all_ko.js | 1 + includes/js/dijit/nls/dijit-all_nl-nl.js | 1 + includes/js/dijit/nls/dijit-all_nl.js | 1 + includes/js/dijit/nls/dijit-all_no.js | 1 + includes/js/dijit/nls/dijit-all_pl.js | 1 + includes/js/dijit/nls/dijit-all_pt-br.js | 1 + includes/js/dijit/nls/dijit-all_pt-pt.js | 1 + includes/js/dijit/nls/dijit-all_pt.js | 1 + includes/js/dijit/nls/dijit-all_ru.js | 1 + includes/js/dijit/nls/dijit-all_sv.js | 1 + includes/js/dijit/nls/dijit-all_tr.js | 1 + includes/js/dijit/nls/dijit-all_xx.js | 1 + includes/js/dijit/nls/dijit-all_zh-cn.js | 1 + includes/js/dijit/nls/dijit-all_zh-tw.js | 1 + includes/js/dijit/nls/dijit-all_zh.js | 1 + includes/js/dijit/nls/el/common.js | 1 + includes/js/dijit/nls/el/loading.js | 1 + includes/js/dijit/nls/es/common.js | 1 + includes/js/dijit/nls/es/loading.js | 1 + includes/js/dijit/nls/fi/common.js | 1 + includes/js/dijit/nls/fi/loading.js | 1 + includes/js/dijit/nls/fr/common.js | 1 + includes/js/dijit/nls/fr/loading.js | 1 + includes/js/dijit/nls/he/common.js | 1 + includes/js/dijit/nls/he/loading.js | 1 + includes/js/dijit/nls/hu/common.js | 1 + includes/js/dijit/nls/hu/loading.js | 1 + includes/js/dijit/nls/it/common.js | 1 + includes/js/dijit/nls/it/loading.js | 1 + includes/js/dijit/nls/ja/common.js | 1 + includes/js/dijit/nls/ja/loading.js | 1 + includes/js/dijit/nls/ko/common.js | 1 + includes/js/dijit/nls/ko/loading.js | 1 + includes/js/dijit/nls/loading.js | 1 + includes/js/dijit/nls/nb/common.js | 1 + includes/js/dijit/nls/nb/loading.js | 1 + includes/js/dijit/nls/nl/common.js | 1 + includes/js/dijit/nls/nl/loading.js | 1 + includes/js/dijit/nls/pl/common.js | 1 + includes/js/dijit/nls/pl/loading.js | 1 + includes/js/dijit/nls/pt-pt/common.js | 1 + includes/js/dijit/nls/pt-pt/loading.js | 1 + includes/js/dijit/nls/pt/common.js | 1 + includes/js/dijit/nls/pt/loading.js | 1 + includes/js/dijit/nls/ru/common.js | 1 + includes/js/dijit/nls/ru/loading.js | 1 + includes/js/dijit/nls/sv/common.js | 1 + includes/js/dijit/nls/sv/loading.js | 1 + includes/js/dijit/nls/tr/common.js | 1 + includes/js/dijit/nls/tr/loading.js | 1 + includes/js/dijit/nls/zh-tw/common.js | 1 + includes/js/dijit/nls/zh-tw/loading.js | 1 + includes/js/dijit/nls/zh/common.js | 1 + includes/js/dijit/nls/zh/loading.js | 1 + includes/js/dijit/resources/_modules.js | 15 + includes/js/dijit/templates/Calendar.html | 35 + includes/js/dijit/templates/ColorPalette.html | 5 + includes/js/dijit/templates/Dialog.html | 9 + .../js/dijit/templates/InlineEditBox.html | 8 + includes/js/dijit/templates/ProgressBar.html | 9 + includes/js/dijit/templates/TitlePane.html | 14 + includes/js/dijit/templates/Tooltip.html | 4 + .../js/dijit/templates/buttons/bg-fade.png | Bin 0 -> 177 bytes includes/js/dijit/templates/colors3x4.png | Bin 0 -> 786 bytes includes/js/dijit/templates/colors7x10.png | Bin 0 -> 2641 bytes includes/js/dijit/tests/Container.html | 63 + includes/js/dijit/tests/Container.js | 9 + includes/js/dijit/tests/_Templated.html | 164 + includes/js/dijit/tests/_Templated.js | 9 + includes/js/dijit/tests/_altCalendar.html | 36 + includes/js/dijit/tests/_base/manager.html | 322 + includes/js/dijit/tests/_base/manager.js | 9 + .../dijit/tests/_base/test_FocusManager.html | 46 + .../dijit/tests/_base/test_focusWidget.html | 130 + .../dijit/tests/_base/test_placeStrict.html | 400 + .../js/dijit/tests/_base/test_typematic.html | 56 + includes/js/dijit/tests/_base/viewport.html | 79 + includes/js/dijit/tests/_base/viewport.js | 10 + .../js/dijit/tests/_base/viewportStrict.html | 81 + includes/js/dijit/tests/_base/wai.html | 115 + includes/js/dijit/tests/_base/wai.js | 9 + includes/js/dijit/tests/_data/categories.json | 12 + .../dijit/tests/_data/categoriesNested.json | 13 + includes/js/dijit/tests/_data/countries.json | 45 + includes/js/dijit/tests/_data/dijits.json | 1 + includes/js/dijit/tests/_data/states.json | 64 + includes/js/dijit/tests/_data/treeTest.json | 22 + .../js/dijit/tests/_editor/test_6112.html | 745 + .../tests/_editor/test_CustomPlugin.html | 151 + .../js/dijit/tests/_editor/test_RichText.html | 59 + .../dijit/tests/_editor/test_ToggleDir.html | 37 + .../js/dijit/tests/_editor/test_richtext.css | 4 + .../_editor/test_richtext.css.commented.css | 4 + includes/js/dijit/tests/_programaticTest.html | 109 + includes/js/dijit/tests/_testCommon.js | 103 + includes/js/dijit/tests/css/dijitTests.css | 69 + .../tests/css/dijitTests.css.commented.css | 78 + includes/js/dijit/tests/form/Form.html | 354 + includes/js/dijit/tests/form/Form.js | 9 + .../js/dijit/tests/form/images/Alabama.jpg | Bin 0 -> 4585 bytes includes/js/dijit/tests/form/test_Button.html | 286 + .../js/dijit/tests/form/test_CheckBox.html | 127 + .../js/dijit/tests/form/test_ComboBox.html | 289 + .../tests/form/test_ComboBox_destroy.html | 58 + .../js/dijit/tests/form/test_DateTextBox.html | 156 + .../tests/form/test_FilteringSelect.html | 296 + .../dijit/tests/form/test_Form_onsubmit.html | 87 + .../js/dijit/tests/form/test_MultiSelect.html | 138 + .../dijit/tests/form/test_SimpleTextarea.html | 62 + includes/js/dijit/tests/form/test_Slider.html | 208 + .../js/dijit/tests/form/test_Spinner.html | 92 + .../js/dijit/tests/form/test_Textarea.html | 106 + .../js/dijit/tests/form/test_TimeTextBox.html | 143 + .../js/dijit/tests/form/test_validate.html | 428 + includes/js/dijit/tests/i18n/README | 4 + includes/js/dijit/tests/i18n/currency.html | 210 + includes/js/dijit/tests/i18n/date.html | 155 + includes/js/dijit/tests/i18n/digit.html | 294 + includes/js/dijit/tests/i18n/module.js | 18 + includes/js/dijit/tests/i18n/number.html | 136 + includes/js/dijit/tests/i18n/test_i18n.js | 206 + includes/js/dijit/tests/i18n/textbox.html | 173 + includes/js/dijit/tests/i18n/time.html | 207 + includes/js/dijit/tests/images/arrowSmall.gif | Bin 0 -> 54 bytes includes/js/dijit/tests/images/copy.gif | Bin 0 -> 210 bytes includes/js/dijit/tests/images/cut.gif | Bin 0 -> 112 bytes includes/js/dijit/tests/images/flatScreen.gif | Bin 0 -> 824 bytes includes/js/dijit/tests/images/note.gif | Bin 0 -> 617 bytes includes/js/dijit/tests/images/paste.gif | Bin 0 -> 241 bytes includes/js/dijit/tests/images/plus.gif | Bin 0 -> 151 bytes .../js/dijit/tests/images/testsBodyBg.gif | Bin 0 -> 753 bytes includes/js/dijit/tests/images/tube.gif | Bin 0 -> 147 bytes includes/js/dijit/tests/images/tubeTall.gif | Bin 0 -> 256 bytes .../js/dijit/tests/layout/ContentPane.html | 577 + includes/js/dijit/tests/layout/ContentPane.js | 9 + includes/js/dijit/tests/layout/combotab.html | 11 + includes/js/dijit/tests/layout/doc0.html | 12 + includes/js/dijit/tests/layout/doc1.html | 13 + includes/js/dijit/tests/layout/doc2.html | 13 + .../js/dijit/tests/layout/getResponse.php | 57 + includes/js/dijit/tests/layout/tab1.html | 6 + includes/js/dijit/tests/layout/tab2.html | 3 + includes/js/dijit/tests/layout/tab3.html | 39 + includes/js/dijit/tests/layout/tab4.html | 40 + .../tests/layout/test_AccordionContainer.html | 195 + .../tests/layout/test_BorderContainer.html | 163 + .../layout/test_BorderContainer_complex.html | 178 + .../test_BorderContainer_experimental.html | 253 + .../layout/test_BorderContainer_full.html | 56 + .../layout/test_BorderContainer_nested.html | 70 + .../dijit/tests/layout/test_ContentPane.html | 94 + .../dijit/tests/layout/test_LayoutCode.html | 383 + .../tests/layout/test_LayoutContainer.html | 174 + .../tests/layout/test_SplitContainer.html | 116 + .../tests/layout/test_StackContainer.html | 62 + .../layout/test_StackContainer_code.html | 64 + .../dijit/tests/layout/test_TabContainer.html | 183 + .../layout/test_TabContainerTitlePane.html | 75 + .../layout/test_TabContainer_noLayout.html | 104 + .../layout/test_TabContainer_remote.html | 109 + includes/js/dijit/tests/manualTests.html | 12 + includes/js/dijit/tests/manualTests.js | 85 + includes/js/dijit/tests/module.js | 21 + includes/js/dijit/tests/ondijitclick.html | 95 + includes/js/dijit/tests/ondijitclick.js | 9 + includes/js/dijit/tests/runTests.html | 9 + includes/js/dijit/tests/test.html | 37 + includes/js/dijit/tests/test_Calendar.html | 81 + .../js/dijit/tests/test_ColorPalette.html | 53 + includes/js/dijit/tests/test_Declaration.html | 66 + includes/js/dijit/tests/test_Dialog.html | 408 + .../dijit/tests/test_Dialog_focusDestroy.html | 61 + includes/js/dijit/tests/test_Editor.html | 153 + .../js/dijit/tests/test_InlineEditBox.html | 231 + includes/js/dijit/tests/test_Menu.html | 270 + includes/js/dijit/tests/test_ProgressBar.html | 165 + includes/js/dijit/tests/test_TitlePane.html | 126 + includes/js/dijit/tests/test_Toolbar.html | 186 + includes/js/dijit/tests/test_Tooltip.html | 117 + .../js/dijit/tests/test_TooltipDialog.html | 349 + includes/js/dijit/tests/test_Tree.html | 115 + .../test_Tree_Notification_API_Support.html | 287 + includes/js/dijit/tests/test_instantiate.html | 111 + .../js/dijit/tests/tree/test_Tree_DnD.html | 194 + .../tests/tree/test_Tree_Programmatic.html | 40 + .../js/dijit/tests/tree/test_Tree_v1.html | 111 + .../js/dijit/tests/widgetsInTemplate.html | 112 + includes/js/dijit/tests/widgetsInTemplate.js | 9 + includes/js/dijit/themes/a11y/README.txt | 3 + .../themes/a11y/indeterminate_progress.gif | Bin 0 -> 2907 bytes includes/js/dijit/themes/dijit.css | 1205 ++ .../js/dijit/themes/dijit.css.commented.css | 1535 ++ includes/js/dijit/themes/dijit_rtl.css | 140 + .../dijit/themes/dijit_rtl.css.commented.css | 194 + includes/js/dijit/themes/nihilo/Calendar.css | 136 + .../themes/nihilo/Calendar.css.commented.css | 159 + .../js/dijit/themes/nihilo/Calendar_rtl.css | 13 + .../nihilo/Calendar_rtl.css.commented.css | 16 + .../js/dijit/themes/nihilo/ColorPalette.css | 5 + .../nihilo/ColorPalette.css.commented.css | 5 + includes/js/dijit/themes/nihilo/Common.css | 29 + .../themes/nihilo/Common.css.commented.css | 37 + includes/js/dijit/themes/nihilo/Dialog.css | 138 + .../themes/nihilo/Dialog.css.commented.css | 175 + .../js/dijit/themes/nihilo/Dialog_rtl.css | 21 + .../nihilo/Dialog_rtl.css.commented.css | 29 + includes/js/dijit/themes/nihilo/Editor.css | 55 + .../themes/nihilo/Editor.css.commented.css | 60 + .../js/dijit/themes/nihilo/Editor_rtl.css | 7 + .../nihilo/Editor_rtl.css.commented.css | 11 + includes/js/dijit/themes/nihilo/Menu.css | 54 + .../themes/nihilo/Menu.css.commented.css | 63 + includes/js/dijit/themes/nihilo/Menu_rtl.css | 11 + .../themes/nihilo/Menu_rtl.css.commented.css | 15 + .../js/dijit/themes/nihilo/ProgressBar.css | 24 + .../nihilo/ProgressBar.css.commented.css | 33 + includes/js/dijit/themes/nihilo/TitlePane.css | 64 + .../themes/nihilo/TitlePane.css.commented.css | 77 + .../js/dijit/themes/nihilo/TitlePane_rtl.css | 6 + .../nihilo/TitlePane_rtl.css.commented.css | 6 + includes/js/dijit/themes/nihilo/Toolbar.css | 83 + .../themes/nihilo/Toolbar.css.commented.css | 95 + includes/js/dijit/themes/nihilo/Tree.css | 68 + .../themes/nihilo/Tree.css.commented.css | 90 + includes/js/dijit/themes/nihilo/Tree_rtl.css | 30 + .../themes/nihilo/Tree_rtl.css.commented.css | 38 + .../js/dijit/themes/nihilo/form/Button.css | 90 + .../nihilo/form/Button.css.commented.css | 109 + .../dijit/themes/nihilo/form/Button_rtl.css | 3 + .../nihilo/form/Button_rtl.css.commented.css | 3 + .../js/dijit/themes/nihilo/form/Checkbox.css | 42 + .../nihilo/form/Checkbox.css.commented.css | 69 + .../js/dijit/themes/nihilo/form/ComboBox.css | 7 + .../nihilo/form/ComboBox.css.commented.css | 7 + .../js/dijit/themes/nihilo/form/Common.css | 61 + .../nihilo/form/Common.css.commented.css | 82 + .../dijit/themes/nihilo/form/Common_rtl.css | 7 + .../nihilo/form/Common_rtl.css.commented.css | 7 + .../dijit/themes/nihilo/form/RadioButton.css | 42 + .../nihilo/form/RadioButton.css.commented.css | 68 + .../js/dijit/themes/nihilo/form/Slider.css | 112 + .../nihilo/form/Slider.css.commented.css | 136 + .../dijit/themes/nihilo/form/Slider_rtl.css | 27 + .../nihilo/form/Slider_rtl.css.commented.css | 34 + .../js/dijit/themes/nihilo/form/Textarea.css | 11 + .../nihilo/form/Textarea.css.commented.css | 15 + .../dijit/themes/nihilo/form/TimeTextBox.css | 1 + .../nihilo/form/TimeTextBox.css.commented.css | 1 + .../nihilo/images/accordionItemActive.png | Bin 0 -> 148 bytes .../themes/nihilo/images/buttonActive.png | Bin 0 -> 139 bytes .../themes/nihilo/images/buttonDisabled.png | Bin 0 -> 139 bytes .../themes/nihilo/images/buttonEnabled.png | Bin 0 -> 135 bytes .../themes/nihilo/images/buttonHover.png | Bin 0 -> 134 bytes .../js/dijit/themes/nihilo/images/dndCopy.png | Bin 0 -> 777 bytes .../js/dijit/themes/nihilo/images/dndMove.png | Bin 0 -> 726 bytes .../dijit/themes/nihilo/images/dndNoCopy.png | Bin 0 -> 699 bytes .../dijit/themes/nihilo/images/dndNoMove.png | Bin 0 -> 677 bytes .../js/dijit/themes/nihilo/images/editor.gif | Bin 0 -> 3570 bytes .../dijit/themes/nihilo/images/editor_rtl.gif | Bin 0 -> 3570 bytes includes/js/dijit/themes/nihilo/images/no.gif | Bin 0 -> 179 bytes .../nihilo/images/preciseSliderThumb.gif | Bin 0 -> 258 bytes .../nihilo/images/preciseSliderThumb.png | Bin 0 -> 413 bytes .../nihilo/images/preciseSliderThumbFocus.gif | Bin 0 -> 258 bytes .../nihilo/images/preciseSliderThumbFocus.png | Bin 0 -> 434 bytes .../themes/nihilo/images/progressBarAnim.gif | Bin 0 -> 7064 bytes .../themes/nihilo/images/progressBarEmpty.png | Bin 0 -> 314 bytes .../themes/nihilo/images/progressBarFull.png | Bin 0 -> 746 bytes .../themes/nihilo/images/sliderEmpty.png | Bin 0 -> 114 bytes .../nihilo/images/sliderEmptyVertical.png | Bin 0 -> 114 bytes .../dijit/themes/nihilo/images/sliderFull.png | Bin 0 -> 130 bytes .../themes/nihilo/images/sliderFullFocus.png | Bin 0 -> 132 bytes .../nihilo/images/sliderFullVertical.png | Bin 0 -> 126 bytes .../nihilo/images/sliderFullVerticalFocus.png | Bin 0 -> 126 bytes .../themes/nihilo/images/sliderThumb.png | Bin 0 -> 413 bytes .../themes/nihilo/images/sliderThumbFocus.gif | Bin 0 -> 238 bytes .../themes/nihilo/images/sliderThumbFocus.png | Bin 0 -> 421 bytes .../images/splitContainerSizerH-thumb.png | Bin 0 -> 127 bytes .../nihilo/images/splitContainerSizerH.png | Bin 0 -> 121 bytes .../images/splitContainerSizerV-thumb.png | Bin 0 -> 129 bytes .../nihilo/images/splitContainerSizerV.png | Bin 0 -> 116 bytes .../themes/nihilo/images/spriteArrows.gif | Bin 0 -> 446 bytes .../themes/nihilo/images/spriteArrows.png | Bin 0 -> 720 bytes .../themes/nihilo/images/spriteCheckbox.gif | Bin 0 -> 774 bytes .../themes/nihilo/images/spriteCheckbox.png | Bin 0 -> 707 bytes .../themes/nihilo/images/spriteDivIcons.gif | Bin 0 -> 875 bytes .../themes/nihilo/images/spriteDivIcons.png | Bin 0 -> 1062 bytes .../themes/nihilo/images/spriteRadio.gif | Bin 0 -> 1137 bytes .../themes/nihilo/images/spriteRadio.png | Bin 0 -> 1073 bytes .../nihilo/images/spriteRoundedIconsSmall.gif | Bin 0 -> 1863 bytes .../nihilo/images/spriteRoundedIconsSmall.png | Bin 0 -> 2195 bytes .../dijit/themes/nihilo/images/spriteTree.gif | Bin 0 -> 233 bytes .../dijit/themes/nihilo/images/spriteTree.png | Bin 0 -> 337 bytes .../themes/nihilo/images/spriteTree_rtl.gif | Bin 0 -> 233 bytes .../themes/nihilo/images/spriteTree_rtl.png | Bin 0 -> 335 bytes .../themes/nihilo/images/tabBottomActiveC.gif | Bin 0 -> 518 bytes .../nihilo/images/tabBottomActiveSpriteLR.gif | Bin 0 -> 291 bytes .../nihilo/images/tabBottomEnabledC.gif | Bin 0 -> 511 bytes .../images/tabBottomEnabledSpriteLR.gif | Bin 0 -> 266 bytes .../themes/nihilo/images/tabBottomHoverC.gif | Bin 0 -> 542 bytes .../nihilo/images/tabBottomHoverSpriteLR.gif | Bin 0 -> 388 bytes .../nihilo/images/tabContainerSprite.gif | Bin 0 -> 1285 bytes .../themes/nihilo/images/tabLeftChecked.gif | Bin 0 -> 303 bytes .../themes/nihilo/images/tabRightChecked.gif | Bin 0 -> 300 bytes .../dijit/themes/nihilo/images/tabStripe.gif | Bin 0 -> 54 bytes .../themes/nihilo/images/tabStripeBottom.gif | Bin 0 -> 432 bytes .../themes/nihilo/images/tabStripeLeft.gif | Bin 0 -> 432 bytes .../themes/nihilo/images/tabStripeRight.gif | Bin 0 -> 432 bytes .../dijit/themes/nihilo/images/titleBar.png | Bin 0 -> 136 bytes .../themes/nihilo/images/titleBarActive.png | Bin 0 -> 148 bytes .../nihilo/images/tooltipConnectorDown.gif | Bin 0 -> 205 bytes .../nihilo/images/tooltipConnectorDown.png | Bin 0 -> 342 bytes .../nihilo/images/tooltipConnectorLeft.gif | Bin 0 -> 205 bytes .../nihilo/images/tooltipConnectorLeft.png | Bin 0 -> 361 bytes .../nihilo/images/tooltipConnectorRight.gif | Bin 0 -> 204 bytes .../nihilo/images/tooltipConnectorRight.png | Bin 0 -> 205 bytes .../nihilo/images/tooltipConnectorUp.gif | Bin 0 -> 205 bytes .../nihilo/images/tooltipConnectorUp.png | Bin 0 -> 319 bytes .../nihilo/images/treeExpand_loading.gif | Bin 0 -> 662 bytes .../js/dijit/themes/nihilo/images/treeI.gif | Bin 0 -> 71 bytes .../dijit/themes/nihilo/images/treeI_half.gif | Bin 0 -> 65 bytes .../themes/nihilo/images/treeI_half_rtl.gif | Bin 0 -> 66 bytes .../dijit/themes/nihilo/images/treeI_rtl.gif | Bin 0 -> 72 bytes .../nihilo/images/validationInputBg.gif | Bin 0 -> 93 bytes .../nihilo/images/validationInputBg.png | Bin 0 -> 126 bytes .../js/dijit/themes/nihilo/images/warning.png | Bin 0 -> 1275 bytes .../nihilo/layout/AccordionContainer.css | 35 + .../AccordionContainer.css.commented.css | 44 + .../nihilo/layout/AccordionContainer_rtl.css | 3 + .../AccordionContainer_rtl.css.commented.css | 3 + .../themes/nihilo/layout/BorderContainer.css | 27 + .../layout/BorderContainer.css.commented.css | 34 + .../themes/nihilo/layout/SplitContainer.css | 27 + .../layout/SplitContainer.css.commented.css | 34 + .../themes/nihilo/layout/TabContainer.css | 277 + .../layout/TabContainer.css.commented.css | 369 + .../themes/nihilo/layout/TabContainer_rtl.css | 55 + .../layout/TabContainer_rtl.css.commented.css | 69 + includes/js/dijit/themes/nihilo/nihilo.css | 1378 ++ .../themes/nihilo/nihilo.css.commented.css | 39 + .../js/dijit/themes/nihilo/nihilo_rtl.css | 317 + .../nihilo/nihilo_rtl.css.commented.css | 28 + includes/js/dijit/themes/soria/Calendar.css | 136 + .../themes/soria/Calendar.css.commented.css | 159 + .../js/dijit/themes/soria/Calendar_rtl.css | 13 + .../soria/Calendar_rtl.css.commented.css | 16 + .../js/dijit/themes/soria/ColorPalette.css | 5 + .../soria/ColorPalette.css.commented.css | 5 + includes/js/dijit/themes/soria/Common.css | 29 + .../themes/soria/Common.css.commented.css | 36 + includes/js/dijit/themes/soria/Dialog.css | 138 + .../themes/soria/Dialog.css.commented.css | 175 + includes/js/dijit/themes/soria/Dialog_rtl.css | 21 + .../themes/soria/Dialog_rtl.css.commented.css | 29 + includes/js/dijit/themes/soria/Editor.css | 55 + .../themes/soria/Editor.css.commented.css | 60 + includes/js/dijit/themes/soria/Editor_rtl.css | 7 + .../themes/soria/Editor_rtl.css.commented.css | 9 + includes/js/dijit/themes/soria/Menu.css | 54 + .../dijit/themes/soria/Menu.css.commented.css | 63 + includes/js/dijit/themes/soria/Menu_rtl.css | 11 + .../themes/soria/Menu_rtl.css.commented.css | 15 + .../js/dijit/themes/soria/ProgressBar.css | 24 + .../soria/ProgressBar.css.commented.css | 33 + includes/js/dijit/themes/soria/TitlePane.css | 64 + .../themes/soria/TitlePane.css.commented.css | 77 + .../js/dijit/themes/soria/TitlePane_rtl.css | 6 + .../soria/TitlePane_rtl.css.commented.css | 6 + includes/js/dijit/themes/soria/Toolbar.css | 83 + .../themes/soria/Toolbar.css.commented.css | 95 + includes/js/dijit/themes/soria/Tree.css | 68 + .../dijit/themes/soria/Tree.css.commented.css | 90 + includes/js/dijit/themes/soria/Tree_rtl.css | 30 + .../themes/soria/Tree_rtl.css.commented.css | 38 + .../js/dijit/themes/soria/form/Button.css | 90 + .../soria/form/Button.css.commented.css | 109 + .../js/dijit/themes/soria/form/Button_rtl.css | 3 + .../soria/form/Button_rtl.css.commented.css | 3 + .../js/dijit/themes/soria/form/Checkbox.css | 42 + .../soria/form/Checkbox.css.commented.css | 69 + .../js/dijit/themes/soria/form/ComboBox.css | 7 + .../soria/form/ComboBox.css.commented.css | 7 + .../js/dijit/themes/soria/form/Common.css | 61 + .../soria/form/Common.css.commented.css | 82 + .../js/dijit/themes/soria/form/Common_rtl.css | 7 + .../soria/form/Common_rtl.css.commented.css | 7 + .../dijit/themes/soria/form/RadioButton.css | 42 + .../soria/form/RadioButton.css.commented.css | 68 + .../js/dijit/themes/soria/form/Slider.css | 112 + .../soria/form/Slider.css.commented.css | 136 + .../js/dijit/themes/soria/form/Slider_rtl.css | 27 + .../soria/form/Slider_rtl.css.commented.css | 34 + .../js/dijit/themes/soria/form/Textarea.css | 11 + .../soria/form/Textarea.css.commented.css | 15 + .../dijit/themes/soria/form/TimeTextBox.css | 1 + .../soria/form/TimeTextBox.css.commented.css | 1 + .../soria/images/accordionItemActive.gif | Bin 0 -> 174 bytes .../soria/images/accordionItemActive.png | Bin 0 -> 171 bytes .../themes/soria/images/buttonActive.png | Bin 0 -> 187 bytes .../themes/soria/images/buttonDisabled.png | Bin 0 -> 187 bytes .../themes/soria/images/buttonEnabled.png | Bin 0 -> 174 bytes .../dijit/themes/soria/images/buttonHover.png | Bin 0 -> 160 bytes .../js/dijit/themes/soria/images/dndCopy.png | Bin 0 -> 777 bytes .../js/dijit/themes/soria/images/dndMove.png | Bin 0 -> 726 bytes .../dijit/themes/soria/images/dndNoCopy.png | Bin 0 -> 699 bytes .../dijit/themes/soria/images/dndNoMove.png | Bin 0 -> 677 bytes .../js/dijit/themes/soria/images/editor.gif | Bin 0 -> 3570 bytes .../dijit/themes/soria/images/editor_rtl.gif | Bin 0 -> 3570 bytes .../soria/images/preciseSliderThumb.gif | Bin 0 -> 258 bytes .../soria/images/preciseSliderThumb.png | Bin 0 -> 413 bytes .../soria/images/preciseSliderThumbFocus.gif | Bin 0 -> 258 bytes .../soria/images/preciseSliderThumbFocus.png | Bin 0 -> 434 bytes .../themes/soria/images/progressBarAnim.gif | Bin 0 -> 9304 bytes .../themes/soria/images/progressBarEmpty.png | Bin 0 -> 232 bytes .../themes/soria/images/progressBarFull.png | Bin 0 -> 251 bytes .../dijit/themes/soria/images/sliderEmpty.png | Bin 0 -> 114 bytes .../soria/images/sliderEmptyVertical.png | Bin 0 -> 114 bytes .../dijit/themes/soria/images/sliderFull.png | Bin 0 -> 131 bytes .../themes/soria/images/sliderFullFocus.png | Bin 0 -> 146 bytes .../soria/images/sliderFullVertical.png | Bin 0 -> 127 bytes .../soria/images/sliderFullVerticalFocus.png | Bin 0 -> 143 bytes .../dijit/themes/soria/images/sliderThumb.png | Bin 0 -> 413 bytes .../themes/soria/images/sliderThumbFocus.gif | Bin 0 -> 238 bytes .../themes/soria/images/sliderThumbFocus.png | Bin 0 -> 421 bytes .../images/splitContainerSizerH-thumb.png | Bin 0 -> 125 bytes .../soria/images/splitContainerSizerH.png | Bin 0 -> 127 bytes .../images/splitContainerSizerV-thumb.png | Bin 0 -> 121 bytes .../soria/images/splitContainerSizerV.png | Bin 0 -> 124 bytes .../themes/soria/images/spriteArrows.gif | Bin 0 -> 446 bytes .../themes/soria/images/spriteArrows.png | Bin 0 -> 720 bytes .../themes/soria/images/spriteCheckbox.gif | Bin 0 -> 774 bytes .../themes/soria/images/spriteCheckbox.png | Bin 0 -> 707 bytes .../themes/soria/images/spriteDivIcons.gif | Bin 0 -> 884 bytes .../themes/soria/images/spriteDivIcons.png | Bin 0 -> 1114 bytes .../dijit/themes/soria/images/spriteRadio.gif | Bin 0 -> 1137 bytes .../dijit/themes/soria/images/spriteRadio.png | Bin 0 -> 1073 bytes .../soria/images/spriteRoundedIconsSmall.gif | Bin 0 -> 1937 bytes .../soria/images/spriteRoundedIconsSmall.png | Bin 0 -> 3187 bytes .../images/spriteRoundedIconsSmallBl.gif | Bin 0 -> 1907 bytes .../images/spriteRoundedIconsSmallBl.png | Bin 0 -> 3010 bytes .../dijit/themes/soria/images/spriteTree.gif | Bin 0 -> 233 bytes .../dijit/themes/soria/images/spriteTree.png | Bin 0 -> 337 bytes .../themes/soria/images/spriteTree_rtl.gif | Bin 0 -> 233 bytes .../themes/soria/images/spriteTree_rtl.png | Bin 0 -> 335 bytes .../themes/soria/images/tabBottomActiveC.gif | Bin 0 -> 482 bytes .../soria/images/tabBottomActiveSpriteLR.gif | Bin 0 -> 741 bytes .../themes/soria/images/tabBottomEnabledC.gif | Bin 0 -> 337 bytes .../soria/images/tabBottomEnabledSpriteLR.gif | Bin 0 -> 676 bytes .../themes/soria/images/tabBottomHoverC.gif | Bin 0 -> 280 bytes .../soria/images/tabBottomHoverSpriteLR.gif | Bin 0 -> 569 bytes .../soria/images/tabContainerSprite.gif | Bin 0 -> 2570 bytes .../themes/soria/images/tabLeftChecked.gif | Bin 0 -> 795 bytes .../themes/soria/images/tabRightChecked.gif | Bin 0 -> 793 bytes .../dijit/themes/soria/images/tabStripe.gif | Bin 0 -> 54 bytes .../themes/soria/images/tabStripeBottom.gif | Bin 0 -> 54 bytes .../themes/soria/images/tabStripeLeft.gif | Bin 0 -> 54 bytes .../themes/soria/images/tabStripeRight.gif | Bin 0 -> 54 bytes .../js/dijit/themes/soria/images/titleBar.png | Bin 0 -> 175 bytes .../themes/soria/images/titleBarActive.png | Bin 0 -> 171 bytes .../soria/images/tooltipConnectorDown.gif | Bin 0 -> 205 bytes .../soria/images/tooltipConnectorDown.png | Bin 0 -> 342 bytes .../soria/images/tooltipConnectorLeft.gif | Bin 0 -> 205 bytes .../soria/images/tooltipConnectorLeft.png | Bin 0 -> 361 bytes .../soria/images/tooltipConnectorRight.gif | Bin 0 -> 204 bytes .../soria/images/tooltipConnectorRight.png | Bin 0 -> 205 bytes .../soria/images/tooltipConnectorUp.gif | Bin 0 -> 205 bytes .../soria/images/tooltipConnectorUp.png | Bin 0 -> 319 bytes .../soria/images/treeExpand_loading.gif | Bin 0 -> 662 bytes .../js/dijit/themes/soria/images/treeI.gif | Bin 0 -> 71 bytes .../dijit/themes/soria/images/treeI_half.gif | Bin 0 -> 65 bytes .../themes/soria/images/treeI_half_rtl.gif | Bin 0 -> 66 bytes .../dijit/themes/soria/images/treeI_rtl.gif | Bin 0 -> 72 bytes .../themes/soria/images/validationInputBg.gif | Bin 0 -> 93 bytes .../themes/soria/images/validationInputBg.png | Bin 0 -> 126 bytes .../js/dijit/themes/soria/images/warning.png | Bin 0 -> 1275 bytes .../soria/layout/AccordionContainer.css | 39 + .../AccordionContainer.css.commented.css | 48 + .../soria/layout/AccordionContainer_rtl.css | 3 + .../AccordionContainer_rtl.css.commented.css | 3 + .../themes/soria/layout/BorderContainer.css | 27 + .../layout/BorderContainer.css.commented.css | 34 + .../themes/soria/layout/SplitContainer.css | 27 + .../layout/SplitContainer.css.commented.css | 34 + .../themes/soria/layout/TabContainer.css | 281 + .../layout/TabContainer.css.commented.css | 372 + .../themes/soria/layout/TabContainer_rtl.css | 55 + .../layout/TabContainer_rtl.css.commented.css | 69 + includes/js/dijit/themes/soria/soria.css | 1386 ++ .../themes/soria/soria.css.commented.css | 39 + includes/js/dijit/themes/soria/soria_rtl.css | 317 + .../themes/soria/soria_rtl.css.commented.css | 28 + .../js/dijit/themes/templateThemeTest.html | 184 + includes/js/dijit/themes/themeTester.html | 745 + .../themeTesterImages/blackButtonEnabled.gif | Bin 0 -> 151 bytes .../themeTesterImages/blackButtonHover.gif | Bin 0 -> 99 bytes .../js/dijit/themes/themeTesterQuirk.html | 743 + includes/js/dijit/themes/tundra/Calendar.css | 132 + .../themes/tundra/Calendar.css.commented.css | 154 + .../js/dijit/themes/tundra/Calendar_rtl.css | 13 + .../tundra/Calendar_rtl.css.commented.css | 16 + .../js/dijit/themes/tundra/ColorPalette.css | 5 + .../tundra/ColorPalette.css.commented.css | 5 + includes/js/dijit/themes/tundra/Common.css | 37 + .../themes/tundra/Common.css.commented.css | 45 + includes/js/dijit/themes/tundra/Dialog.css | 145 + .../themes/tundra/Dialog.css.commented.css | 179 + .../js/dijit/themes/tundra/Dialog_rtl.css | 21 + .../tundra/Dialog_rtl.css.commented.css | 29 + includes/js/dijit/themes/tundra/Editor.css | 55 + .../themes/tundra/Editor.css.commented.css | 58 + .../js/dijit/themes/tundra/Editor_rtl.css | 7 + .../tundra/Editor_rtl.css.commented.css | 9 + includes/js/dijit/themes/tundra/Menu.css | 45 + .../themes/tundra/Menu.css.commented.css | 54 + includes/js/dijit/themes/tundra/Menu_rtl.css | 7 + .../themes/tundra/Menu_rtl.css.commented.css | 8 + .../js/dijit/themes/tundra/ProgressBar.css | 23 + .../tundra/ProgressBar.css.commented.css | 28 + includes/js/dijit/themes/tundra/TitlePane.css | 55 + .../themes/tundra/TitlePane.css.commented.css | 63 + .../js/dijit/themes/tundra/TitlePane_rtl.css | 6 + .../tundra/TitlePane_rtl.css.commented.css | 6 + includes/js/dijit/themes/tundra/Toolbar.css | 83 + .../themes/tundra/Toolbar.css.commented.css | 95 + includes/js/dijit/themes/tundra/Tree.css | 65 + .../themes/tundra/Tree.css.commented.css | 86 + includes/js/dijit/themes/tundra/Tree_rtl.css | 30 + .../themes/tundra/Tree_rtl.css.commented.css | 37 + .../js/dijit/themes/tundra/form/Button.css | 93 + .../tundra/form/Button.css.commented.css | 113 + .../js/dijit/themes/tundra/form/Checkbox.css | 40 + .../tundra/form/Checkbox.css.commented.css | 47 + .../js/dijit/themes/tundra/form/Common.css | 83 + .../tundra/form/Common.css.commented.css | 126 + .../dijit/themes/tundra/form/RadioButton.css | 41 + .../tundra/form/RadioButton.css.commented.css | 49 + .../js/dijit/themes/tundra/form/Slider.css | 113 + .../tundra/form/Slider.css.commented.css | 134 + .../dijit/themes/tundra/form/Slider_rtl.css | 26 + .../tundra/form/Slider_rtl.css.commented.css | 31 + .../js/dijit/themes/tundra/form/TextArea.css | 7 + .../tundra/form/TextArea.css.commented.css | 10 + .../tundra/images/accordionItemActive.gif | Bin 0 -> 168 bytes .../dijit/themes/tundra/images/arrowDown.gif | Bin 0 -> 49 bytes .../dijit/themes/tundra/images/arrowDown.png | Bin 0 -> 149 bytes .../dijit/themes/tundra/images/arrowLeft.gif | Bin 0 -> 49 bytes .../dijit/themes/tundra/images/arrowLeft.png | Bin 0 -> 126 bytes .../dijit/themes/tundra/images/arrowRight.gif | Bin 0 -> 49 bytes .../dijit/themes/tundra/images/arrowRight.png | Bin 0 -> 129 bytes .../js/dijit/themes/tundra/images/arrowUp.gif | Bin 0 -> 48 bytes .../js/dijit/themes/tundra/images/arrowUp.png | Bin 0 -> 152 bytes .../themes/tundra/images/buttonActive.png | Bin 0 -> 129 bytes .../themes/tundra/images/buttonDisabled.png | Bin 0 -> 135 bytes .../themes/tundra/images/buttonEnabled.png | Bin 0 -> 137 bytes .../themes/tundra/images/buttonHover.png | Bin 0 -> 144 bytes .../themes/tundra/images/calendarDayLabel.png | Bin 0 -> 161 bytes .../tundra/images/calendarMonthLabel.png | Bin 0 -> 162 bytes .../tundra/images/calendarYearLabel.png | Bin 0 -> 172 bytes .../themes/tundra/images/checkboxActive.png | Bin 0 -> 306 bytes .../themes/tundra/images/checkboxDisabled.png | Bin 0 -> 156 bytes .../themes/tundra/images/checkboxEnabled.png | Bin 0 -> 160 bytes .../themes/tundra/images/checkboxHover.png | Bin 0 -> 164 bytes .../dijit/themes/tundra/images/checkmark.gif | Bin 0 -> 2436 bytes .../dijit/themes/tundra/images/checkmark.png | Bin 0 -> 2555 bytes .../tundra/images/checkmarkNoBorder.gif | Bin 0 -> 2028 bytes .../tundra/images/checkmarkNoBorder.png | Bin 0 -> 2222 bytes .../dijit/themes/tundra/images/circleIcon.gif | Bin 0 -> 204 bytes .../dijit/themes/tundra/images/circleIcon.png | Bin 0 -> 2975 bytes .../themes/tundra/images/comboArrowDown.gif | Bin 0 -> 49 bytes .../tundra/images/dijitProgressBarAnim.gif | Bin 0 -> 1676 bytes .../tundra/images/dijitProgressBarAnim.psd | Bin 0 -> 40142 bytes .../js/dijit/themes/tundra/images/dndCopy.png | Bin 0 -> 777 bytes .../js/dijit/themes/tundra/images/dndMove.png | Bin 0 -> 726 bytes .../dijit/themes/tundra/images/dndNoCopy.png | Bin 0 -> 699 bytes .../dijit/themes/tundra/images/dndNoMove.png | Bin 0 -> 677 bytes .../tundra/images/dojoTundraGradientBg.gif | Bin 0 -> 65 bytes .../tundra/images/dojoTundraGradientBg.png | Bin 0 -> 135 bytes .../themes/tundra/images/doubleArrowDown.png | Bin 0 -> 152 bytes .../themes/tundra/images/doubleArrowUp.png | Bin 0 -> 158 bytes .../js/dijit/themes/tundra/images/editor.gif | Bin 0 -> 3570 bytes .../dijit/themes/tundra/images/editor_rtl.gif | Bin 0 -> 3570 bytes .../themes/tundra/images/folderClosed.gif | Bin 0 -> 230 bytes .../themes/tundra/images/folderOpened.gif | Bin 0 -> 339 bytes includes/js/dijit/themes/tundra/images/i.gif | Bin 0 -> 48 bytes .../js/dijit/themes/tundra/images/i_half.gif | Bin 0 -> 63 bytes .../dijit/themes/tundra/images/i_half_rtl.gif | Bin 0 -> 61 bytes .../js/dijit/themes/tundra/images/i_rtl.gif | Bin 0 -> 48 bytes .../js/dijit/themes/tundra/images/leaf.gif | Bin 0 -> 403 bytes .../js/dijit/themes/tundra/images/loading.gif | Bin 0 -> 751 bytes .../js/dijit/themes/tundra/images/menu.png | Bin 0 -> 140 bytes .../themes/tundra/images/minusButton.gif | Bin 0 -> 148 bytes includes/js/dijit/themes/tundra/images/no.gif | Bin 0 -> 179 bytes .../js/dijit/themes/tundra/images/noX.gif | Bin 0 -> 80 bytes .../dijit/themes/tundra/images/plusButton.gif | Bin 0 -> 212 bytes .../themes/tundra/images/popupMenuBg.gif | Bin 0 -> 151 bytes .../tundra/images/preciseSliderThumb.gif | Bin 0 -> 212 bytes .../tundra/images/preciseSliderThumb.png | Bin 0 -> 248 bytes .../tundra/images/preciseSliderThumbFocus.gif | Bin 0 -> 212 bytes .../tundra/images/preciseSliderThumbFocus.png | Bin 0 -> 281 bytes .../tundra/images/progressBarAnim-1.png | Bin 0 -> 288 bytes .../tundra/images/progressBarAnim-2.png | Bin 0 -> 289 bytes .../tundra/images/progressBarAnim-3.png | Bin 0 -> 288 bytes .../tundra/images/progressBarAnim-4.png | Bin 0 -> 287 bytes .../tundra/images/progressBarAnim-5.png | Bin 0 -> 283 bytes .../tundra/images/progressBarAnim-6.png | Bin 0 -> 283 bytes .../tundra/images/progressBarAnim-7.png | Bin 0 -> 284 bytes .../tundra/images/progressBarAnim-8.png | Bin 0 -> 286 bytes .../tundra/images/progressBarAnim-9.png | Bin 0 -> 289 bytes .../themes/tundra/images/progressBarAnim.gif | Bin 0 -> 2624 bytes .../themes/tundra/images/progressBarAnim.psd | Bin 0 -> 40142 bytes .../themes/tundra/images/progressBarEmpty.png | Bin 0 -> 144 bytes .../themes/tundra/images/progressBarFull.png | Bin 0 -> 160 bytes .../tundra/images/radioButtonActive.png | Bin 0 -> 550 bytes .../images/radioButtonActiveDisabled.png | Bin 0 -> 517 bytes .../tundra/images/radioButtonActiveHover.png | Bin 0 -> 646 bytes .../tundra/images/radioButtonDisabled.png | Bin 0 -> 403 bytes .../tundra/images/radioButtonEnabled.png | Bin 0 -> 487 bytes .../themes/tundra/images/radioButtonHover.png | Bin 0 -> 497 bytes .../themes/tundra/images/sliderEmpty.png | Bin 0 -> 124 bytes .../tundra/images/sliderEmptyVertical.png | Bin 0 -> 88 bytes .../dijit/themes/tundra/images/sliderFull.png | Bin 0 -> 135 bytes .../themes/tundra/images/sliderFullFocus.png | Bin 0 -> 163 bytes .../tundra/images/sliderFullVertical.png | Bin 0 -> 99 bytes .../tundra/images/sliderFullVerticalFocus.png | Bin 0 -> 164 bytes .../themes/tundra/images/sliderThumb.png | Bin 0 -> 241 bytes .../themes/tundra/images/sliderThumbFocus.gif | Bin 0 -> 216 bytes .../themes/tundra/images/sliderThumbFocus.png | Bin 0 -> 288 bytes .../themes/tundra/images/smallArrowDown.png | Bin 0 -> 134 bytes .../themes/tundra/images/smallArrowUp.png | Bin 0 -> 134 bytes .../images/splitContainerSizerH-thumb.png | Bin 0 -> 127 bytes .../tundra/images/splitContainerSizerH.png | Bin 0 -> 140 bytes .../images/splitContainerSizerV-thumb.png | Bin 0 -> 129 bytes .../tundra/images/splitContainerSizerV.png | Bin 0 -> 135 bytes .../tundra/images/spriteRoundedIconsSmall.gif | Bin 0 -> 1863 bytes .../tundra/images/spriteRoundedIconsSmall.png | Bin 0 -> 2195 bytes .../dijit/themes/tundra/images/tabActive.png | Bin 0 -> 155 bytes .../dijit/themes/tundra/images/tabClose.gif | Bin 0 -> 193 bytes .../dijit/themes/tundra/images/tabClose.png | Bin 0 -> 220 bytes .../themes/tundra/images/tabCloseHover.gif | Bin 0 -> 193 bytes .../themes/tundra/images/tabCloseHover.png | Bin 0 -> 220 bytes .../themes/tundra/images/tabDisabled.png | Bin 0 -> 139 bytes .../dijit/themes/tundra/images/tabEnabled.png | Bin 0 -> 142 bytes .../dijit/themes/tundra/images/tabHover.gif | Bin 0 -> 156 bytes .../dijit/themes/tundra/images/tabHover.png | Bin 0 -> 154 bytes .../dijit/themes/tundra/images/titleBar.png | Bin 0 -> 143 bytes .../dijit/themes/tundra/images/titleBarBg.gif | Bin 0 -> 97 bytes .../tundra/images/tooltipConnectorDown.gif | Bin 0 -> 324 bytes .../tundra/images/tooltipConnectorDown.png | Bin 0 -> 365 bytes .../tundra/images/tooltipConnectorLeft.gif | Bin 0 -> 325 bytes .../tundra/images/tooltipConnectorLeft.png | Bin 0 -> 356 bytes .../tundra/images/tooltipConnectorRight.gif | Bin 0 -> 327 bytes .../tundra/images/tooltipConnectorRight.png | Bin 0 -> 375 bytes .../tundra/images/tooltipConnectorUp.gif | Bin 0 -> 323 bytes .../tundra/images/tooltipConnectorUp.png | Bin 0 -> 344 bytes .../themes/tundra/images/treeExpand_leaf.gif | Bin 0 -> 839 bytes .../tundra/images/treeExpand_leaf_rtl.gif | Bin 0 -> 841 bytes .../tundra/images/treeExpand_loading.gif | Bin 0 -> 1944 bytes .../themes/tundra/images/treeExpand_minus.gif | Bin 0 -> 211 bytes .../tundra/images/treeExpand_minus_rtl.gif | Bin 0 -> 210 bytes .../themes/tundra/images/treeExpand_mius.gif | Bin 0 -> 211 bytes .../themes/tundra/images/treeExpand_plus.gif | Bin 0 -> 216 bytes .../tundra/images/treeExpand_plus_rtl.gif | Bin 0 -> 215 bytes .../tundra/images/validationInputBg.gif | Bin 0 -> 109 bytes .../tundra/images/validationInputBg.png | Bin 0 -> 165 bytes .../js/dijit/themes/tundra/images/warning.png | Bin 0 -> 1275 bytes .../tundra/layout/AccordionContainer.css | 31 + .../AccordionContainer.css.commented.css | 37 + .../themes/tundra/layout/BorderContainer.css | 27 + .../layout/BorderContainer.css.commented.css | 31 + .../themes/tundra/layout/SplitContainer.css | 31 + .../layout/SplitContainer.css.commented.css | 35 + .../themes/tundra/layout/TabContainer.css | 109 + .../layout/TabContainer.css.commented.css | 138 + .../themes/tundra/layout/TabContainer_rtl.css | 71 + .../layout/TabContainer_rtl.css.commented.css | 89 + includes/js/dijit/themes/tundra/tundra.css | 1213 ++ .../themes/tundra/tundra.css.commented.css | 37 + .../js/dijit/themes/tundra/tundra_rtl.css | 317 + .../tundra/tundra_rtl.css.commented.css | 9 + includes/js/dojo/AdapterRegistry.js | 99 + includes/js/dojo/DeferredList.js | 88 + includes/js/dojo/LICENSE | 195 + includes/js/dojo/NodeList-fx.js | 137 + includes/js/dojo/OpenAjax.js | 194 + includes/js/dojo/_base.js | 13 + includes/js/dojo/_base/Color.js | 156 + includes/js/dojo/_base/Deferred.js | 408 + includes/js/dojo/_base/NodeList.js | 532 + includes/js/dojo/_base/_loader/bootstrap.js | 436 + .../js/dojo/_base/_loader/hostenv_browser.js | 379 + .../js/dojo/_base/_loader/hostenv_rhino.js | 238 + .../_base/_loader/hostenv_spidermonkey.js | 80 + includes/js/dojo/_base/_loader/loader.js | 690 + .../js/dojo/_base/_loader/loader_debug.js | 61 + includes/js/dojo/_base/_loader/loader_xd.js | 631 + includes/js/dojo/_base/array.js | 182 + includes/js/dojo/_base/browser.js | 21 + includes/js/dojo/_base/connect.js | 285 + includes/js/dojo/_base/declare.js | 178 + includes/js/dojo/_base/event.js | 529 + includes/js/dojo/_base/fx.js | 584 + includes/js/dojo/_base/html.js | 1227 ++ includes/js/dojo/_base/json.js | 137 + includes/js/dojo/_base/lang.js | 257 + includes/js/dojo/_base/query.js | 1191 ++ includes/js/dojo/_base/window.js | 145 + includes/js/dojo/_base/xhr.js | 730 + includes/js/dojo/_firebug/LICENSE | 37 + includes/js/dojo/_firebug/errorIcon.png | Bin 0 -> 457 bytes includes/js/dojo/_firebug/firebug.css | 176 + .../dojo/_firebug/firebug.css.commented.css | 222 + includes/js/dojo/_firebug/firebug.js | 1103 ++ includes/js/dojo/_firebug/infoIcon.png | Bin 0 -> 524 bytes includes/js/dojo/_firebug/warningIcon.png | Bin 0 -> 516 bytes includes/js/dojo/back.js | 394 + includes/js/dojo/behavior.js | 185 + includes/js/dojo/build.txt | 126 + includes/js/dojo/cldr/LICENSE | 29 + includes/js/dojo/cldr/README | 18 + includes/js/dojo/cldr/monetary.js | 27 + includes/js/dojo/cldr/nls/currency.js | 1 + includes/js/dojo/cldr/nls/de-de/number.js | 1 + includes/js/dojo/cldr/nls/de/currency.js | 1 + includes/js/dojo/cldr/nls/de/gregorian.js | 1 + includes/js/dojo/cldr/nls/de/number.js | 1 + includes/js/dojo/cldr/nls/en-au/currency.js | 1 + includes/js/dojo/cldr/nls/en-au/gregorian.js | 1 + includes/js/dojo/cldr/nls/en-au/number.js | 1 + includes/js/dojo/cldr/nls/en-ca/currency.js | 1 + includes/js/dojo/cldr/nls/en-ca/gregorian.js | 1 + includes/js/dojo/cldr/nls/en-gb/gregorian.js | 1 + includes/js/dojo/cldr/nls/en-gb/number.js | 1 + includes/js/dojo/cldr/nls/en-us/currency.js | 1 + includes/js/dojo/cldr/nls/en-us/number.js | 1 + includes/js/dojo/cldr/nls/en/currency.js | 1 + includes/js/dojo/cldr/nls/en/gregorian.js | 1 + includes/js/dojo/cldr/nls/en/number.js | 1 + includes/js/dojo/cldr/nls/es-es/gregorian.js | 1 + includes/js/dojo/cldr/nls/es-es/number.js | 1 + includes/js/dojo/cldr/nls/es/currency.js | 1 + includes/js/dojo/cldr/nls/es/gregorian.js | 1 + includes/js/dojo/cldr/nls/es/number.js | 1 + includes/js/dojo/cldr/nls/fr/currency.js | 1 + includes/js/dojo/cldr/nls/fr/gregorian.js | 1 + includes/js/dojo/cldr/nls/fr/number.js | 1 + includes/js/dojo/cldr/nls/gregorian.js | 1 + includes/js/dojo/cldr/nls/it-it/gregorian.js | 1 + includes/js/dojo/cldr/nls/it/currency.js | 1 + includes/js/dojo/cldr/nls/it/gregorian.js | 1 + includes/js/dojo/cldr/nls/it/number.js | 1 + includes/js/dojo/cldr/nls/ja-jp/number.js | 1 + includes/js/dojo/cldr/nls/ja/currency.js | 1 + includes/js/dojo/cldr/nls/ja/gregorian.js | 1 + includes/js/dojo/cldr/nls/ja/number.js | 1 + includes/js/dojo/cldr/nls/ko-kr/gregorian.js | 1 + includes/js/dojo/cldr/nls/ko-kr/number.js | 1 + includes/js/dojo/cldr/nls/ko/currency.js | 1 + includes/js/dojo/cldr/nls/ko/gregorian.js | 1 + includes/js/dojo/cldr/nls/ko/number.js | 1 + includes/js/dojo/cldr/nls/number.js | 1 + includes/js/dojo/cldr/nls/pt-br/gregorian.js | 1 + includes/js/dojo/cldr/nls/pt/currency.js | 1 + includes/js/dojo/cldr/nls/pt/gregorian.js | 1 + includes/js/dojo/cldr/nls/pt/number.js | 1 + includes/js/dojo/cldr/nls/zh-cn/gregorian.js | 1 + includes/js/dojo/cldr/nls/zh-cn/number.js | 1 + includes/js/dojo/cldr/nls/zh-tw/currency.js | 1 + includes/js/dojo/cldr/nls/zh-tw/gregorian.js | 1 + includes/js/dojo/cldr/nls/zh-tw/number.js | 1 + includes/js/dojo/cldr/nls/zh/currency.js | 1 + includes/js/dojo/cldr/nls/zh/gregorian.js | 1 + includes/js/dojo/cldr/nls/zh/number.js | 1 + includes/js/dojo/cldr/supplemental.js | 74 + includes/js/dojo/colors.js | 225 + includes/js/dojo/cookie.js | 95 + includes/js/dojo/currency.js | 97 + includes/js/dojo/data/ItemFileReadStore.js | 765 + includes/js/dojo/data/ItemFileWriteStore.js | 804 + includes/js/dojo/data/api/Identity.js | 107 + includes/js/dojo/data/api/Notification.js | 119 + includes/js/dojo/data/api/Read.js | 506 + includes/js/dojo/data/api/Request.js | 32 + includes/js/dojo/data/api/Write.js | 226 + includes/js/dojo/data/util/filter.js | 69 + includes/js/dojo/data/util/simpleFetch.js | 90 + includes/js/dojo/data/util/sorter.js | 81 + includes/js/dojo/date.js | 343 + includes/js/dojo/date/locale.js | 656 + includes/js/dojo/date/stamp.js | 141 + includes/js/dojo/dnd/Avatar.js | 82 + includes/js/dojo/dnd/Container.js | 311 + includes/js/dojo/dnd/Manager.js | 180 + includes/js/dojo/dnd/Moveable.js | 130 + includes/js/dojo/dnd/Mover.js | 84 + includes/js/dojo/dnd/Selector.js | 244 + includes/js/dojo/dnd/Source.js | 393 + includes/js/dojo/dnd/TimedMoveable.js | 66 + includes/js/dojo/dnd/autoscroll.js | 103 + includes/js/dojo/dnd/common.js | 35 + includes/js/dojo/dnd/move.js | 202 + includes/js/dojo/dojo.js | 20 + includes/js/dojo/dojo.js.uncompressed.js | 8165 ++++++++ includes/js/dojo/fx.js | 415 + includes/js/dojo/i18n.js | 249 + includes/js/dojo/io/iframe.js | 358 + includes/js/dojo/io/script.js | 211 + includes/js/dojo/jaxer.js | 15 + includes/js/dojo/nls/ar/colors.js | 1 + includes/js/dojo/nls/colors.js | 1 + includes/js/dojo/nls/cs/colors.js | 1 + includes/js/dojo/nls/da/colors.js | 1 + includes/js/dojo/nls/de/colors.js | 1 + includes/js/dojo/nls/el/colors.js | 1 + includes/js/dojo/nls/es/colors.js | 1 + includes/js/dojo/nls/fi/colors.js | 1 + includes/js/dojo/nls/fr/colors.js | 1 + includes/js/dojo/nls/he/colors.js | 1 + includes/js/dojo/nls/hu/colors.js | 1 + includes/js/dojo/nls/it/colors.js | 1 + includes/js/dojo/nls/ja/colors.js | 1 + includes/js/dojo/nls/ko/colors.js | 1 + includes/js/dojo/nls/nb/colors.js | 1 + includes/js/dojo/nls/nl/colors.js | 1 + includes/js/dojo/nls/pl/colors.js | 1 + includes/js/dojo/nls/pt-pt/colors.js | 1 + includes/js/dojo/nls/pt/colors.js | 1 + includes/js/dojo/nls/ru/colors.js | 1 + includes/js/dojo/nls/sv/colors.js | 1 + includes/js/dojo/nls/tr/colors.js | 1 + includes/js/dojo/nls/zh-tw/colors.js | 1 + includes/js/dojo/nls/zh/colors.js | 1 + includes/js/dojo/number.js | 551 + includes/js/dojo/parser.js | 277 + includes/js/dojo/regexp.js | 69 + includes/js/dojo/resources/LICENSE | 30 + includes/js/dojo/resources/_modules.js | 36 + includes/js/dojo/resources/blank.gif | Bin 0 -> 43 bytes includes/js/dojo/resources/blank.html | 1 + includes/js/dojo/resources/dnd.css | 9 + .../js/dojo/resources/dnd.css.commented.css | 9 + includes/js/dojo/resources/dojo.css | 100 + .../js/dojo/resources/dojo.css.commented.css | 198 + .../js/dojo/resources/iframe_history.html | 79 + includes/js/dojo/resources/images/dndCopy.png | Bin 0 -> 814 bytes includes/js/dojo/resources/images/dndMove.png | Bin 0 -> 785 bytes .../js/dojo/resources/images/dndNoCopy.png | Bin 0 -> 756 bytes .../js/dojo/resources/images/dndNoMove.png | Bin 0 -> 750 bytes includes/js/dojo/rpc/JsonService.js | 83 + includes/js/dojo/rpc/JsonpService.js | 65 + includes/js/dojo/rpc/RpcService.js | 172 + includes/js/dojo/string.js | 84 + includes/js/dojo/tests.js | 12 + includes/js/dojo/tests/AdapterRegistry.js | 75 + includes/js/dojo/tests/DeferredList.js | 206 + includes/js/dojo/tests/NodeList-fx.html | 150 + includes/js/dojo/tests/TODO | 11 + includes/js/dojo/tests/_base.js | 136 + includes/js/dojo/tests/_base/Color.js | 32 + includes/js/dojo/tests/_base/Deferred.js | 76 + includes/js/dojo/tests/_base/NodeList.html | 370 + .../tests/_base/_loader/addLoadEvents.html | 37 + .../dojo/tests/_base/_loader/afterOnLoad.html | 56 + .../js/dojo/tests/_base/_loader/bootstrap.js | 86 + .../js/dojo/tests/_base/_loader/getText.txt | 1 + .../tests/_base/_loader/hostenv_browser.js | 15 + .../dojo/tests/_base/_loader/hostenv_rhino.js | 17 + .../_base/_loader/hostenv_spidermonkey.js | 15 + .../js/dojo/tests/_base/_loader/loader.js | 52 + .../tests/_base/_loader/scope/scope04.html | 80 + .../_base/_loader/scope/scopeContained.html | 71 + .../_base/_loader/scope/scopeContainedXd.html | 84 + .../_base/_loader/scope/scopeDjConfig.html | 64 + .../_base/_loader/scope/scopeSingle.html | 62 + .../_base/_loader/scope/scopeSingleDaac.html | 63 + includes/js/dojo/tests/_base/array.js | 301 + includes/js/dojo/tests/_base/connect.js | 225 + includes/js/dojo/tests/_base/declare.js | 197 + includes/js/dojo/tests/_base/fx.html | 342 + includes/js/dojo/tests/_base/fx.js | 8 + includes/js/dojo/tests/_base/fx_delay.html | 22 + includes/js/dojo/tests/_base/html.html | 556 + includes/js/dojo/tests/_base/html.js | 12 + includes/js/dojo/tests/_base/html_box.html | 207 + .../js/dojo/tests/_base/html_box_quirks.html | 205 + includes/js/dojo/tests/_base/html_quirks.html | 322 + includes/js/dojo/tests/_base/html_rtl.html | 110 + includes/js/dojo/tests/_base/json.js | 37 + includes/js/dojo/tests/_base/lang.js | 180 + includes/js/dojo/tests/_base/query.html | 154 + includes/js/dojo/tests/_base/query.js | 9 + includes/js/dojo/tests/_base/timeout.php | 7 + includes/js/dojo/tests/_base/xhr.html | 404 + includes/js/dojo/tests/_base/xhr.js | 8 + .../js/dojo/tests/_base/xhrDummyMethod.php | 7 + includes/js/dojo/tests/back-hash.js | 33 + includes/js/dojo/tests/back.html | 107 + includes/js/dojo/tests/back.js | 8 + includes/js/dojo/tests/behavior.html | 106 + includes/js/dojo/tests/behavior.js | 8 + includes/js/dojo/tests/cldr.js | 19 + includes/js/dojo/tests/colors.js | 48 + includes/js/dojo/tests/cookie.html | 84 + includes/js/dojo/tests/cookie.js | 8 + includes/js/dojo/tests/currency.js | 48 + includes/js/dojo/tests/data.js | 12 + .../js/dojo/tests/data/ItemFileReadStore.js | 10 + .../js/dojo/tests/data/ItemFileWriteStore.js | 1402 ++ includes/js/dojo/tests/data/countries.json | 11 + .../tests/data/countries_commentFiltered.json | 12 + .../tests/data/countries_idcollision.json | 10 + .../dojo/tests/data/countries_references.json | 44 + .../tests/data/countries_withBoolean.json | 11 + .../dojo/tests/data/countries_withDates.json | 21 + .../dojo/tests/data/countries_withNull.json | 10 + .../dojo/tests/data/countries_withoutid.json | 10 + .../js/dojo/tests/data/data_multitype.json | 18 + .../tests/data/geography_hierarchy_large.json | 44 + .../tests/data/geography_hierarchy_small.json | 19 + .../data/readOnlyItemFileTestTemplates.js | 2260 +++ .../dojo/tests/data/reference_integrity.json | 27 + includes/js/dojo/tests/data/runTests.html | 9 + includes/js/dojo/tests/data/utils.js | 203 + includes/js/dojo/tests/date.js | 716 + includes/js/dojo/tests/date/locale.js | 398 + includes/js/dojo/tests/date/stamp.js | 94 + includes/js/dojo/tests/dnd/dndDefault.css | 52 + .../tests/dnd/dndDefault.css.commented.css | 69 + includes/js/dojo/tests/dnd/flickr_viewer.html | 168 + .../dojo/tests/dnd/test_box_constraints.html | 61 + .../js/dojo/tests/dnd/test_container.html | 74 + .../dojo/tests/dnd/test_container_markup.html | 67 + .../tests/dnd/test_custom_constraints.html | 51 + includes/js/dojo/tests/dnd/test_dnd.html | 130 + .../js/dojo/tests/dnd/test_dnd_handles.html | 65 + includes/js/dojo/tests/dnd/test_form.html | 103 + includes/js/dojo/tests/dnd/test_moveable.html | 106 + .../dojo/tests/dnd/test_moveable_markup.html | 83 + includes/js/dojo/tests/dnd/test_params.html | 61 + .../tests/dnd/test_parent_constraints.html | 53 + .../dnd/test_parent_constraints_margins.html | 51 + includes/js/dojo/tests/dnd/test_selector.html | 80 + .../dojo/tests/dnd/test_selector_markup.html | 71 + .../dojo/tests/dnd/test_timed_moveable.html | 112 + includes/js/dojo/tests/fx.html | 310 + includes/js/dojo/tests/fx.js | 9 + includes/js/dojo/tests/i18n.js | 88 + includes/js/dojo/tests/io/iframe.html | 124 + includes/js/dojo/tests/io/iframe.js | 8 + includes/js/dojo/tests/io/iframeResponse.html | 8 + .../js/dojo/tests/io/iframeResponse.js.html | 7 + .../js/dojo/tests/io/iframeResponse.json.html | 7 + .../js/dojo/tests/io/iframeResponse.text.html | 7 + .../js/dojo/tests/io/iframeUploadTest.html | 50 + includes/js/dojo/tests/io/script.html | 101 + includes/js/dojo/tests/io/script.js | 8 + includes/js/dojo/tests/io/scriptJsonp.js | 57 + includes/js/dojo/tests/io/scriptSimple.js | 5 + includes/js/dojo/tests/io/scriptTimeout.html | 67 + includes/js/dojo/tests/io/upload.cgi | 60 + includes/js/dojo/tests/manualTests.html | 12 + includes/js/dojo/tests/manualTests.js | 45 + includes/js/dojo/tests/module.js | 29 + includes/js/dojo/tests/nls/ar/salutations.js | 1 + includes/js/dojo/tests/nls/cs/salutations.js | 1 + includes/js/dojo/tests/nls/de/salutations.js | 1 + includes/js/dojo/tests/nls/el/salutations.js | 1 + .../js/dojo/tests/nls/en-au/salutations.js | 1 + .../tests/nls/en-us-hawaii/salutations.js | 1 + .../en-us-new_york-brooklyn/salutations.js | 1 + .../dojo/tests/nls/en-us-texas/salutations.js | 1 + includes/js/dojo/tests/nls/es/salutations.js | 1 + includes/js/dojo/tests/nls/fa/salutations.js | 1 + includes/js/dojo/tests/nls/fr/salutations.js | 1 + includes/js/dojo/tests/nls/he/salutations.js | 1 + includes/js/dojo/tests/nls/hi/salutations.js | 1 + includes/js/dojo/tests/nls/it/salutations.js | 1 + includes/js/dojo/tests/nls/ja/salutations.js | 1 + includes/js/dojo/tests/nls/ko/salutations.js | 1 + includes/js/dojo/tests/nls/pl/salutations.js | 1 + includes/js/dojo/tests/nls/pt/salutations.js | 1 + includes/js/dojo/tests/nls/ru/salutations.js | 1 + includes/js/dojo/tests/nls/salutations.js | 1 + includes/js/dojo/tests/nls/sw/salutations.js | 1 + includes/js/dojo/tests/nls/th/salutations.js | 1 + includes/js/dojo/tests/nls/tr/salutations.js | 1 + includes/js/dojo/tests/nls/yi/salutations.js | 1 + .../js/dojo/tests/nls/zh-cn/salutations.js | 1 + .../js/dojo/tests/nls/zh-tw/salutations.js | 1 + includes/js/dojo/tests/number.js | 966 + includes/js/dojo/tests/parser.html | 241 + includes/js/dojo/tests/parser.js | 8 + .../dojo/tests/resources/ApplicationState.js | 28 + includes/js/dojo/tests/resources/JSON.php | 724 + .../js/dojo/tests/resources/testClass.php | 20 + .../js/dojo/tests/resources/testClass.smd | 40 + .../tests/resources/test_JsonRPCMediator.php | 43 + .../js/dojo/tests/resources/test_css.html | 100 + .../js/dojo/tests/resources/yahoo_smd_v1.smd | 268 + includes/js/dojo/tests/rpc.js | 151 + includes/js/dojo/tests/runTests.html | 9 + includes/js/dojo/tests/string.js | 31 + includes/js/dojo/tests/test_FirebugLite.html | 100 + .../js/dojo/tests/test_FirebugLitePopup.html | 101 + includes/js/dojo/tests/test_fx.html | 107 + includes/js/dojox/LICENSE | 195 + includes/js/dojox/_sql/LICENSE | 9 + includes/js/dojox/_sql/_crypto.js | 443 + includes/js/dojox/_sql/common.js | 538 + .../dojox/_sql/demos/customers/customers.html | 292 + includes/js/dojox/analytics.js | 16 + includes/js/dojox/analytics/README | 134 + includes/js/dojox/analytics/_base.js | 127 + includes/js/dojox/analytics/logger/JSON.php | 724 + .../dojox/analytics/logger/dojoxAnalytics.php | 31 + .../analytics/plugins/consoleMessages.js | 24 + includes/js/dojox/analytics/plugins/dojo.js | 22 + includes/js/dojox/analytics/plugins/idle.js | 34 + .../js/dojox/analytics/plugins/mouseClick.js | 49 + .../js/dojox/analytics/plugins/mouseOver.js | 90 + includes/js/dojox/analytics/plugins/window.js | 34 + .../analytics/profiles/analytics.profile.js | 21 + .../profiles/analyticsInBase.profile.js | 22 + .../dojox/analytics/tests/test_analytics.html | 93 + includes/js/dojox/av.js | 7 + includes/js/dojox/av/README | 40 + includes/js/dojox/av/_base.js | 8 + includes/js/dojox/av/_base/_ieFlash.js | 17 + includes/js/dojox/av/_base/flash.js | 186 + includes/js/dojox/av/_base/quicktime.js | 161 + includes/js/dojox/av/resources/version.mov | Bin 0 -> 1667 bytes includes/js/dojox/av/tests/flash.html | 39 + includes/js/dojox/av/tests/quicktime.html | 24 + includes/js/dojox/av/tests/resources/hfp.swf | Bin 0 -> 13671 bytes includes/js/dojox/charting/Chart2D.js | 341 + includes/js/dojox/charting/Chart3D.js | 86 + includes/js/dojox/charting/Element.js | 49 + includes/js/dojox/charting/README | 31 + includes/js/dojox/charting/Series.js | 20 + includes/js/dojox/charting/Theme.js | 256 + includes/js/dojox/charting/_color.js | 62 + includes/js/dojox/charting/axis2d/Base.js | 31 + includes/js/dojox/charting/axis2d/Default.js | 323 + includes/js/dojox/charting/axis2d/common.js | 75 + includes/js/dojox/charting/plot2d/Areas.js | 14 + includes/js/dojox/charting/plot2d/Bars.js | 89 + includes/js/dojox/charting/plot2d/Base.js | 60 + .../js/dojox/charting/plot2d/ClusteredBars.js | 63 + .../dojox/charting/plot2d/ClusteredColumns.js | 63 + includes/js/dojox/charting/plot2d/Columns.js | 88 + includes/js/dojox/charting/plot2d/Default.js | 173 + includes/js/dojox/charting/plot2d/Grid.js | 116 + includes/js/dojox/charting/plot2d/Lines.js | 13 + includes/js/dojox/charting/plot2d/Markers.js | 13 + .../js/dojox/charting/plot2d/MarkersOnly.js | 14 + includes/js/dojox/charting/plot2d/Pie.js | 199 + includes/js/dojox/charting/plot2d/Scatter.js | 14 + includes/js/dojox/charting/plot2d/Stacked.js | 160 + .../js/dojox/charting/plot2d/StackedAreas.js | 14 + .../js/dojox/charting/plot2d/StackedBars.js | 85 + .../dojox/charting/plot2d/StackedColumns.js | 83 + .../js/dojox/charting/plot2d/StackedLines.js | 13 + includes/js/dojox/charting/plot2d/common.js | 113 + includes/js/dojox/charting/plot3d/Bars.js | 66 + includes/js/dojox/charting/plot3d/Base.js | 23 + .../js/dojox/charting/plot3d/Cylinders.js | 69 + includes/js/dojox/charting/scaler.js | 161 + includes/js/dojox/charting/tests/Theme.js | 71 + includes/js/dojox/charting/tests/_color.js | 82 + includes/js/dojox/charting/tests/charting.js | 12 + .../dojox/charting/tests/data/goog_prices.csv | 796 + .../dojox/charting/tests/data/msft_prices.csv | 796 + .../charting/tests/data/yahoo_prices.csv | 796 + .../js/dojox/charting/tests/runTests.html | 9 + .../js/dojox/charting/tests/test_bars.html | 65 + .../js/dojox/charting/tests/test_chart2d.html | 353 + .../charting/tests/test_chart2d_updating.html | 80 + .../dojox/charting/tests/test_cylinders.html | 65 + .../dojox/charting/tests/test_labels2d.html | 90 + .../js/dojox/charting/tests/test_pie2d.html | 128 + .../js/dojox/charting/tests/test_scaler.html | 97 + .../dojox/charting/tests/test_sparklines.html | 180 + .../dojox/charting/tests/test_widget2d.html | 98 + includes/js/dojox/charting/themes/ET/greys.js | 63 + .../js/dojox/charting/themes/GreySkies.js | 11 + .../js/dojox/charting/themes/PlotKit/README | 11 + .../js/dojox/charting/themes/PlotKit/blue.js | 43 + .../js/dojox/charting/themes/PlotKit/cyan.js | 43 + .../js/dojox/charting/themes/PlotKit/green.js | 43 + .../dojox/charting/themes/PlotKit/orange.js | 43 + .../dojox/charting/themes/PlotKit/purple.js | 43 + .../js/dojox/charting/themes/PlotKit/red.js | 43 + includes/js/dojox/charting/widget/Chart2D.js | 215 + includes/js/dojox/collections.js | 6 + includes/js/dojox/collections/ArrayList.js | 133 + includes/js/dojox/collections/BinaryTree.js | 211 + includes/js/dojox/collections/Dictionary.js | 116 + includes/js/dojox/collections/Queue.js | 74 + includes/js/dojox/collections/README | 39 + includes/js/dojox/collections/Set.js | 89 + includes/js/dojox/collections/SortedList.js | 198 + includes/js/dojox/collections/Stack.js | 72 + includes/js/dojox/collections/_base.js | 100 + .../js/dojox/collections/tests/ArrayList.js | 83 + .../js/dojox/collections/tests/BinaryTree.js | 83 + .../js/dojox/collections/tests/Dictionary.js | 82 + includes/js/dojox/collections/tests/Queue.js | 49 + includes/js/dojox/collections/tests/Set.js | 35 + .../js/dojox/collections/tests/SortedList.js | 168 + includes/js/dojox/collections/tests/Stack.js | 49 + includes/js/dojox/collections/tests/_base.js | 84 + .../js/dojox/collections/tests/collections.js | 19 + .../js/dojox/collections/tests/runTests.html | 9 + includes/js/dojox/color.js | 6 + includes/js/dojox/color/Colorspace.js | 556 + includes/js/dojox/color/Generator.js | 261 + includes/js/dojox/color/README | 41 + includes/js/dojox/color/_base.js | 197 + includes/js/dojox/color/tests/Generator.js | 128 + includes/js/dojox/color/tests/_base.js | 82 + includes/js/dojox/color/tests/color.js | 14 + includes/js/dojox/color/tests/runTests.html | 9 + includes/js/dojox/cometd.js | 7 + includes/js/dojox/cometd/README | 29 + includes/js/dojox/cometd/_base.js | 950 + includes/js/dojox/cometd/timestamp.js | 9 + includes/js/dojox/cometd/timesync.js | 126 + includes/js/dojox/crypto.js | 6 + includes/js/dojox/crypto/Blowfish.js | 10 + includes/js/dojox/crypto/MD5.js | 10 + includes/js/dojox/crypto/README | 12 + includes/js/dojox/crypto/_base.js | 14 + includes/js/dojox/data/AtomReadStore.js | 543 + includes/js/dojox/data/CsvStore.js | 561 + includes/js/dojox/data/FlickrRestStore.js | 471 + includes/js/dojox/data/FlickrStore.js | 257 + includes/js/dojox/data/HtmlStore.js | 531 + includes/js/dojox/data/HtmlTableStore.js | 469 + includes/js/dojox/data/KeyValueStore.js | 381 + includes/js/dojox/data/OpmlStore.js | 515 + includes/js/dojox/data/PicasaStore.js | 254 + includes/js/dojox/data/QueryReadStore.js | 513 + includes/js/dojox/data/README | 89 + includes/js/dojox/data/SnapLogicStore.js | 332 + includes/js/dojox/data/XmlStore.js | 1141 ++ .../dojox/data/demos/demo_DataDemoTable.html | 130 + .../data/demos/demo_FlickrRestStore.html | 275 + .../js/dojox/data/demos/demo_FlickrStore.html | 199 + .../js/dojox/data/demos/demo_LazyLoad.html | 66 + .../js/dojox/data/demos/demo_MultiStores.html | 72 + .../js/dojox/data/demos/demo_PicasaStore.html | 188 + .../demos/demo_QueryReadStore_ComboBox.html | 56 + .../demo_QueryReadStore_FilteringSelect.html | 56 + .../data/demos/demo_QueryReadStore_grid.html | 129 + includes/js/dojox/data/demos/flickrDemo.css | 29 + .../data/demos/flickrDemo.css.commented.css | 35 + includes/js/dojox/data/demos/geography.json | 45 + includes/js/dojox/data/demos/geography.xml | 51 + .../data/demos/geography/Argentina/data.json | 5 + .../data/demos/geography/Brazil/data.json | 5 + .../demos/geography/Canada/Ottawa/data.json | 6 + .../demos/geography/Canada/Toronto/data.json | 6 + .../data/demos/geography/Canada/data.json | 10 + .../data/demos/geography/China/data.json | 4 + .../Commonwealth of Australia/data.json | 5 + .../data/demos/geography/Egypt/data.json | 5 + .../data/demos/geography/France/data.json | 4 + .../data/demos/geography/Germany/data.json | 4 + .../data/demos/geography/India/data.json | 4 + .../data/demos/geography/Italy/data.json | 4 + .../demos/geography/Kenya/Mombasa/data.json | 5 + .../demos/geography/Kenya/Nairobi/data.json | 5 + .../data/demos/geography/Kenya/data.json | 9 + .../geography/Mexico/Guadalajara/data.json | 7 + .../geography/Mexico/Mexico City/data.json | 6 + .../data/demos/geography/Mexico/data.json | 10 + .../data/demos/geography/Mongolia/data.json | 4 + .../data/demos/geography/Russia/data.json | 4 + .../data/demos/geography/Spain/data.json | 4 + .../demos/geography/Sudan/Khartoum/data.json | 5 + .../data/demos/geography/Sudan/data.json | 6 + .../United States of America/data.json | 4 + .../js/dojox/data/demos/geography/root.json | 39 + includes/js/dojox/data/demos/picasaDemo.css | 37 + .../data/demos/picasaDemo.css.commented.css | 44 + .../data/demos/stores/LazyLoadJSIStore.js | 142 + .../js/dojox/data/demos/widgets/FlickrView.js | 36 + .../data/demos/widgets/FlickrViewList.js | 37 + .../js/dojox/data/demos/widgets/PicasaView.js | 37 + .../data/demos/widgets/PicasaViewList.js | 37 + .../demos/widgets/templates/FlickrView.html | 34 + .../widgets/templates/FlickrViewList.html | 2 + .../demos/widgets/templates/PicasaView.html | 35 + .../widgets/templates/PicasaViewList.html | 2 + includes/js/dojox/data/dom.js | 187 + includes/js/dojox/data/jsonPathStore.js | 1191 ++ .../js/dojox/data/tests/QueryReadStore.html | 220 + includes/js/dojox/data/tests/dom.js | 133 + includes/js/dojox/data/tests/ml/divList.html | 14 + .../js/dojox/data/tests/ml/orderedList.html | 16 + includes/js/dojox/data/tests/ml/table.html | 46 + .../ml/test_HtmlStore_declaratively.html | 172 + .../data/tests/ml/test_HtmlStore_remote.html | 115 + .../ml/test_HtmlTableStore_declaratively.html | 120 + .../js/dojox/data/tests/ml/unorderedList.html | 17 + includes/js/dojox/data/tests/module.js | 30 + includes/js/dojox/data/tests/runTests.html | 9 + .../dojox/data/tests/stores/AtomReadStore.js | 641 + .../js/dojox/data/tests/stores/CsvStore.js | 1127 ++ .../data/tests/stores/FlickrRestStore.js | 476 + .../js/dojox/data/tests/stores/FlickrStore.js | 410 + .../js/dojox/data/tests/stores/HtmlStore.js | 804 + .../dojox/data/tests/stores/HtmlTableStore.js | 702 + .../dojox/data/tests/stores/KeyValueStore.js | 1002 + .../js/dojox/data/tests/stores/OpmlStore.js | 1075 + .../dojox/data/tests/stores/QueryReadStore.js | 442 + .../data/tests/stores/QueryReadStore.php | 114 + .../dojox/data/tests/stores/SnapLogicStore.js | 438 + .../js/dojox/data/tests/stores/XmlStore.js | 881 + includes/js/dojox/data/tests/stores/atom1.xml | 848 + .../js/dojox/data/tests/stores/books.html | 118 + includes/js/dojox/data/tests/stores/books.xml | 103 + .../js/dojox/data/tests/stores/books2.html | 43 + .../js/dojox/data/tests/stores/books2.xml | 28 + .../js/dojox/data/tests/stores/books3.html | 14 + .../js/dojox/data/tests/stores/books3.xml | 31 + .../data/tests/stores/books_isbnAttr.xml | 23 + .../data/tests/stores/books_isbnAttr2.xml | 23 + .../js/dojox/data/tests/stores/geography.xml | 51 + .../stores/geography_withspeciallabel.xml | 51 + .../dojox/data/tests/stores/jsonPathStore.js | 604 + .../js/dojox/data/tests/stores/movies.csv | 9 + .../js/dojox/data/tests/stores/movies2.csv | 9 + .../js/dojox/data/tests/stores/patterns.csv | 11 + .../js/dojox/data/tests/stores/properties.js | 10 + .../dojox/data/tests/stores/snap_pipeline.php | 72 + .../tests/test_Tree_vs_jsonPathStore.html | 105 + includes/js/dojox/data/tests/treeTest.json | 10 + includes/js/dojox/date/README | 36 + includes/js/dojox/date/php.js | 312 + includes/js/dojox/date/posix.js | 293 + includes/js/dojox/date/tests/module.js | 12 + includes/js/dojox/date/tests/posix.js | 236 + includes/js/dojox/date/tests/runTests.html | 9 + includes/js/dojox/dtl.js | 6 + includes/js/dojox/dtl/Context.js | 87 + includes/js/dojox/dtl/README | 207 + includes/js/dojox/dtl/_HtmlTemplated.js | 72 + includes/js/dojox/dtl/_Templated.js | 93 + includes/js/dojox/dtl/_base.js | 570 + includes/js/dojox/dtl/contrib/data.js | 89 + includes/js/dojox/dtl/contrib/dijit.js | 220 + includes/js/dojox/dtl/contrib/html.js | 107 + includes/js/dojox/dtl/contrib/objects.js | 15 + .../js/dojox/dtl/demos/demo_Animation.html | 45 + includes/js/dojox/dtl/demos/demo_Blog.html | 96 + includes/js/dojox/dtl/demos/demo_Data.html | 58 + .../js/dojox/dtl/demos/demo_Dijitless.html | 50 + includes/js/dojox/dtl/demos/demo_Events.html | 46 + .../dojox/dtl/demos/demo_HtmlTemplated.html | 40 + includes/js/dojox/dtl/demos/demo_Inline.html | 48 + .../js/dojox/dtl/demos/demo_NodeList.html | 37 + includes/js/dojox/dtl/demos/demo_Table.html | 4072 ++++ .../js/dojox/dtl/demos/demo_Templated.html | 36 + includes/js/dojox/dtl/demos/demo_Tree.html | 33 + .../dojox/dtl/demos/json/blog/get_blog_1.json | 1 + .../dojox/dtl/demos/json/blog/get_blog_3.json | 1 + .../dtl/demos/json/blog/get_blog_list.json | 1 + .../dtl/demos/json/blog/get_page_about.json | 1 + includes/js/dojox/dtl/demos/json/fruit.json | 1 + .../js/dojox/dtl/demos/json/morefruit.json | 1 + .../dojox/dtl/demos/templates/animation.html | 5 + .../dojox/dtl/demos/templates/blog_base.html | 8 + .../dtl/demos/templates/blog_detail.html | 10 + .../dojox/dtl/demos/templates/blog_list.html | 9 + .../dojox/dtl/demos/templates/blog_page.html | 7 + .../dtl/demos/templates/countrychildren.html | 1 + .../js/dojox/dtl/demos/templates/gallery.html | 16 + .../dojox/dtl/demos/templates/nodelist.html | 5 + includes/js/dojox/dtl/ext-dojo/NodeList.js | 33 + includes/js/dojox/dtl/filter/dates.js | 54 + includes/js/dojox/dtl/filter/htmlstrings.js | 59 + includes/js/dojox/dtl/filter/integers.js | 32 + includes/js/dojox/dtl/filter/lists.js | 137 + includes/js/dojox/dtl/filter/logic.js | 34 + includes/js/dojox/dtl/filter/misc.js | 59 + includes/js/dojox/dtl/filter/strings.js | 327 + includes/js/dojox/dtl/html.js | 818 + includes/js/dojox/dtl/render/html.js | 76 + includes/js/dojox/dtl/tag/date.js | 29 + includes/js/dojox/dtl/tag/loader.js | 277 + includes/js/dojox/dtl/tag/logic.js | 272 + includes/js/dojox/dtl/tag/loop.js | 196 + includes/js/dojox/dtl/tag/misc.js | 291 + includes/js/dojox/dtl/tests/context.js | 79 + .../dojox/dtl/tests/demo_Templated_Jaxer.html | 87 + includes/js/dojox/dtl/tests/html/buffer.js | 35 + includes/js/dojox/dtl/tests/html/tag.js | 233 + includes/js/dojox/dtl/tests/html/util.js | 160 + includes/js/dojox/dtl/tests/module.js | 15 + includes/js/dojox/dtl/tests/runTests.html | 9 + .../js/dojox/dtl/tests/templates/hello.html | 1 + .../js/dojox/dtl/tests/templates/pocket.html | 1 + .../js/dojox/dtl/tests/templates/pocket2.html | 1 + includes/js/dojox/dtl/tests/text/filter.js | 740 + includes/js/dojox/dtl/tests/text/load.js | 6 + includes/js/dojox/dtl/tests/text/tag.js | 480 + includes/js/dojox/dtl/utils/date.js | 72 + includes/js/dojox/encoding/LICENSE | 9 + includes/js/dojox/encoding/README | 35 + includes/js/dojox/encoding/_base.js | 7 + includes/js/dojox/encoding/ascii85.js | 63 + includes/js/dojox/encoding/base64.js | 66 + includes/js/dojox/encoding/bits.js | 68 + includes/js/dojox/encoding/compression/lzw.js | 91 + .../js/dojox/encoding/compression/splay.js | 64 + includes/js/dojox/encoding/crypto/Blowfish.js | 481 + includes/js/dojox/encoding/crypto/_base.js | 19 + includes/js/dojox/encoding/digests/MD5.js | 177 + includes/js/dojox/encoding/digests/_base.js | 78 + includes/js/dojox/encoding/easy64.js | 50 + includes/js/dojox/encoding/tests/ascii85.js | 35 + includes/js/dojox/encoding/tests/bits.js | 74 + .../dojox/encoding/tests/compression/_base.js | 12 + .../encoding/tests/compression/colors.js | 156 + .../encoding/tests/compression/colors2.html | 104 + .../encoding/tests/compression/colors2.js | 64 + .../encoding/tests/compression/colors3.html | 104 + .../encoding/tests/compression/colors3.js | 53 + .../dojox/encoding/tests/compression/lzw.js | 54 + .../encoding/tests/compression/runTests.html | 9 + .../dojox/encoding/tests/compression/splay.js | 49 + .../encoding/tests/compression/test.html | 61 + .../dojox/encoding/tests/compression/vq.html | 185 + .../dojox/encoding/tests/crypto/Blowfish.js | 35 + .../js/dojox/encoding/tests/crypto/_base.js | 12 + .../dojox/encoding/tests/crypto/runTests.html | 9 + .../js/dojox/encoding/tests/digests/MD5.js | 26 + .../js/dojox/encoding/tests/digests/_base.js | 12 + .../encoding/tests/digests/runTests.html | 9 + includes/js/dojox/encoding/tests/easy64.js | 35 + includes/js/dojox/encoding/tests/encoding.js | 13 + .../js/dojox/encoding/tests/runTests.html | 9 + includes/js/dojox/flash.js | 6 + .../js/dojox/flash/DojoExternalInterface.as | 168 + includes/js/dojox/flash/ExpressInstall.as | 71 + includes/js/dojox/flash/README | 31 + includes/js/dojox/flash/_base.js | 762 + includes/js/dojox/flash/tests/TestFlash.as | 36 + includes/js/dojox/flash/tests/TestFlash.swf | Bin 0 -> 1863 bytes .../js/dojox/flash/tests/buildFlashTest.sh | 4 + includes/js/dojox/flash/tests/test_flash.html | 15 + includes/js/dojox/flash/tests/test_flash.js | 155 + includes/js/dojox/form/CheckedMultiSelect.js | 223 + includes/js/dojox/form/DropDownSelect.js | 267 + includes/js/dojox/form/PasswordValidator.js | 280 + includes/js/dojox/form/README | 39 + .../js/dojox/form/nls/PasswordValidator.js | 1 + .../form/resources/CheckedMultiSelect.css | 65 + .../CheckedMultiSelect.css.commented.css | 99 + .../form/resources/CheckedMultiSelect.html | 4 + .../dojox/form/resources/DropDownSelect.css | 137 + .../DropDownSelect.css.commented.css | 209 + .../form/resources/PasswordValidator.html | 3 + .../resources/_CheckedMultiSelectItem.html | 4 + .../form/tests/test_CheckedMultiSelect.html | 91 + .../dojox/form/tests/test_DropDownSelect.html | 128 + .../form/tests/test_PasswordValidator.html | 216 + includes/js/dojox/fx.js | 7 + includes/js/dojox/fx/README | 77 + includes/js/dojox/fx/Shadow.js | 151 + includes/js/dojox/fx/_arg.js | 27 + includes/js/dojox/fx/_base.js | 240 + includes/js/dojox/fx/_core.js | 60 + includes/js/dojox/fx/easing.js | 223 + includes/js/dojox/fx/ext-dojo/NodeList.js | 66 + includes/js/dojox/fx/resources/shadowB.png | Bin 0 -> 470 bytes includes/js/dojox/fx/resources/shadowBL.png | Bin 0 -> 272 bytes includes/js/dojox/fx/resources/shadowBR.png | Bin 0 -> 271 bytes includes/js/dojox/fx/resources/shadowL.png | Bin 0 -> 148 bytes includes/js/dojox/fx/resources/shadowR.png | Bin 0 -> 149 bytes includes/js/dojox/fx/resources/shadowT.png | Bin 0 -> 152 bytes includes/js/dojox/fx/resources/shadowTL.png | Bin 0 -> 271 bytes includes/js/dojox/fx/resources/shadowTR.png | Bin 0 -> 287 bytes includes/js/dojox/fx/scroll.js | 40 + includes/js/dojox/fx/style.js | 219 + includes/js/dojox/fx/tests/_animation.css | 97 + .../fx/tests/_animation.css.commented.css | 113 + includes/js/dojox/fx/tests/example_Line.html | 80 + .../fx/tests/example_backgroundPosition.html | 59 + .../fx/tests/example_dojoAnimations.html | 442 + .../dojox/fx/tests/example_easingChart2D.html | 147 + .../js/dojox/fx/tests/images/averycutedog.jpg | Bin 0 -> 40879 bytes includes/js/dojox/fx/tests/images/dot.png | Bin 0 -> 4064 bytes includes/js/dojox/fx/tests/images/longBg.png | Bin 0 -> 12217 bytes .../js/dojox/fx/tests/test_Nodelist-fx.html | 282 + includes/js/dojox/fx/tests/test_Shadow.html | 93 + .../js/dojox/fx/tests/test_animateClass.html | 222 + .../js/dojox/fx/tests/test_crossFade.html | 145 + includes/js/dojox/fx/tests/test_easing.html | 142 + .../js/dojox/fx/tests/test_highlight.html | 45 + includes/js/dojox/fx/tests/test_scroll.html | 98 + includes/js/dojox/fx/tests/test_sizeTo.html | 142 + includes/js/dojox/fx/tests/test_slideBy.html | 75 + includes/js/dojox/fx/tests/test_wipeTo.html | 109 + includes/js/dojox/gfx.js | 40 + includes/js/dojox/gfx/Moveable.js | 101 + includes/js/dojox/gfx/Mover.js | 62 + includes/js/dojox/gfx/README | 102 + includes/js/dojox/gfx/_base.js | 288 + includes/js/dojox/gfx/arc.js | 122 + includes/js/dojox/gfx/attach.js | 7 + includes/js/dojox/gfx/canvas.js | 687 + includes/js/dojox/gfx/canvas_attach.js | 8 + includes/js/dojox/gfx/decompose.js | 139 + includes/js/dojox/gfx/demos/beautify.html | 48 + includes/js/dojox/gfx/demos/butterfly.html | 88 + includes/js/dojox/gfx/demos/career_test.html | 467 + includes/js/dojox/gfx/demos/circles.html | 90 + includes/js/dojox/gfx/demos/clock.html | 253 + includes/js/dojox/gfx/demos/clockWidget.html | 332 + includes/js/dojox/gfx/demos/clock_black.html | 253 + includes/js/dojox/gfx/demos/creator.html | 123 + includes/js/dojox/gfx/demos/data/Lars.json | 1823 ++ includes/js/dojox/gfx/demos/data/Lars.svg | 531 + .../js/dojox/gfx/demos/data/LarsDreaming.json | 1823 ++ .../js/dojox/gfx/demos/data/LarsDreaming.svg | 536 + includes/js/dojox/gfx/demos/data/Nils.json | 717 + includes/js/dojox/gfx/demos/data/Nils.svg | 188 + .../js/dojox/gfx/demos/data/buratino-bg.png | Bin 0 -> 27507 bytes .../js/dojox/gfx/demos/data/buratino-head.png | Bin 0 -> 30696 bytes .../gfx/demos/data/buratino-left-arm.png | Bin 0 -> 9631 bytes .../gfx/demos/data/buratino-left-leg.png | Bin 0 -> 21682 bytes .../gfx/demos/data/buratino-lollipop.png | Bin 0 -> 21976 bytes .../gfx/demos/data/buratino-nose-large.png | Bin 0 -> 4182 bytes .../gfx/demos/data/buratino-nose-medium.png | Bin 0 -> 2587 bytes .../gfx/demos/data/buratino-right-arm.png | Bin 0 -> 13033 bytes .../gfx/demos/data/buratino-right-leg.png | Bin 0 -> 23025 bytes .../dojox/gfx/demos/data/buratino-torso.png | Bin 0 -> 23405 bytes includes/js/dojox/gfx/demos/data/buratino.jpg | Bin 0 -> 33344 bytes .../js/dojox/gfx/demos/data/buratino.json | 12 + includes/js/dojox/gfx/demos/data/svg2gfx.xsl | 72 + .../js/dojox/gfx/demos/data/transform.json | 1567 ++ .../js/dojox/gfx/demos/images/clock_face.jpg | Bin 0 -> 31088 bytes .../gfx/demos/images/clock_face_black.jpg | Bin 0 -> 17347 bytes includes/js/dojox/gfx/demos/inspector.html | 165 + includes/js/dojox/gfx/demos/lion.html | 235 + includes/js/dojox/gfx/demos/roundedPane.html | 191 + includes/js/dojox/gfx/demos/tiger.html | 566 + includes/js/dojox/gfx/demos/tooltip.html | 238 + includes/js/dojox/gfx/fx.js | 281 + includes/js/dojox/gfx/matrix.js | 444 + includes/js/dojox/gfx/move.js | 8 + includes/js/dojox/gfx/path.js | 361 + includes/js/dojox/gfx/shape.js | 691 + includes/js/dojox/gfx/silverlight.js | 693 + includes/js/dojox/gfx/silverlight_attach.js | 87 + includes/js/dojox/gfx/svg.js | 638 + includes/js/dojox/gfx/svg_attach.js | 224 + includes/js/dojox/gfx/tests/decompose.js | 114 + includes/js/dojox/gfx/tests/matrix.js | 228 + includes/js/dojox/gfx/tests/module.js | 13 + includes/js/dojox/gfx/tests/runTests.html | 9 + includes/js/dojox/gfx/tests/test_arc.html | 71 + includes/js/dojox/gfx/tests/test_bezier.html | 85 + .../js/dojox/gfx/tests/test_decompose.html | 54 + includes/js/dojox/gfx/tests/test_fill.html | 47 + includes/js/dojox/gfx/tests/test_fx.html | 113 + includes/js/dojox/gfx/tests/test_gfx.html | 489 + .../js/dojox/gfx/tests/test_gradient.html | 70 + includes/js/dojox/gfx/tests/test_group.html | 73 + includes/js/dojox/gfx/tests/test_image1.html | 74 + includes/js/dojox/gfx/tests/test_image2.html | 50 + .../dojox/gfx/tests/test_linearGradient.html | 80 + .../js/dojox/gfx/tests/test_linestyle.html | 45 + includes/js/dojox/gfx/tests/test_pattern.html | 44 + includes/js/dojox/gfx/tests/test_poly.html | 53 + includes/js/dojox/gfx/tests/test_resize.html | 61 + includes/js/dojox/gfx/tests/test_setPath.html | 76 + includes/js/dojox/gfx/tests/test_tbbox.html | 117 + includes/js/dojox/gfx/tests/test_text.html | 88 + .../js/dojox/gfx/tests/test_textpath.html | 76 + .../js/dojox/gfx/tests/test_transform.html | 98 + includes/js/dojox/gfx/utils.js | 87 + includes/js/dojox/gfx/vml.js | 1165 ++ includes/js/dojox/gfx/vml_attach.js | 362 + includes/js/dojox/gfx3d.js | 11 + includes/js/dojox/gfx3d/README | 36 + includes/js/dojox/gfx3d/_base.js | 19 + includes/js/dojox/gfx3d/gradient.js | 41 + includes/js/dojox/gfx3d/lighting.js | 241 + includes/js/dojox/gfx3d/matrix.js | 339 + includes/js/dojox/gfx3d/object.js | 1092 ++ includes/js/dojox/gfx3d/scheduler.js | 126 + .../dojox/gfx3d/tests/test_camerarotate.html | 93 + .../gfx3d/tests/test_camerarotate_shaded.html | 97 + includes/js/dojox/gfx3d/tests/test_cube.html | 50 + .../js/dojox/gfx3d/tests/test_cylinder.html | 66 + .../js/dojox/gfx3d/tests/test_drawer.html | 92 + includes/js/dojox/gfx3d/tests/test_edges.html | 73 + .../js/dojox/gfx3d/tests/test_matrix.html | 89 + includes/js/dojox/gfx3d/tests/test_orbit.html | 50 + .../js/dojox/gfx3d/tests/test_overlap.html | 69 + .../js/dojox/gfx3d/tests/test_polygon.html | 44 + includes/js/dojox/gfx3d/tests/test_quads.html | 78 + .../js/dojox/gfx3d/tests/test_rotate.html | 123 + includes/js/dojox/gfx3d/tests/test_scene.html | 66 + .../js/dojox/gfx3d/tests/test_triangles.html | 82 + .../js/dojox/gfx3d/tests/test_vector.html | 59 + includes/js/dojox/gfx3d/vector.js | 110 + includes/js/dojox/grid/Grid.js | 363 + includes/js/dojox/grid/README | 39 + includes/js/dojox/grid/VirtualGrid.js | 779 + includes/js/dojox/grid/_data/dijitEditors.js | 170 + includes/js/dojox/grid/_data/editors.js | 239 + includes/js/dojox/grid/_data/fields.js | 104 + includes/js/dojox/grid/_data/model.js | 762 + includes/js/dojox/grid/_grid/Grid.css | 201 + .../dojox/grid/_grid/Grid.css.commented.css | 258 + includes/js/dojox/grid/_grid/Grid_rtl.css | 8 + .../grid/_grid/Grid_rtl.css.commented.css | 10 + includes/js/dojox/grid/_grid/builder.js | 522 + includes/js/dojox/grid/_grid/cell.js | 66 + includes/js/dojox/grid/_grid/drag.js | 113 + includes/js/dojox/grid/_grid/edit.js | 238 + includes/js/dojox/grid/_grid/focus.js | 207 + .../grid/_grid/images/grid_dx_gradient.gif | Bin 0 -> 267 bytes .../grid/_grid/images/grid_sort_down.gif | Bin 0 -> 49 bytes .../dojox/grid/_grid/images/grid_sort_up.gif | Bin 0 -> 48 bytes .../grid/_grid/images/tabEnabled_rotated.png | Bin 0 -> 94 bytes .../grid/_grid/images/tabHover_rotated.png | Bin 0 -> 106 bytes includes/js/dojox/grid/_grid/layout.js | 75 + includes/js/dojox/grid/_grid/lib.js | 254 + includes/js/dojox/grid/_grid/nihiloGrid.css | 211 + .../grid/_grid/nihiloGrid.css.commented.css | 275 + includes/js/dojox/grid/_grid/publicEvents.js | 451 + includes/js/dojox/grid/_grid/rowbar.js | 53 + includes/js/dojox/grid/_grid/rows.js | 66 + includes/js/dojox/grid/_grid/scroller.js | 489 + includes/js/dojox/grid/_grid/selection.js | 215 + includes/js/dojox/grid/_grid/soriaGrid.css | 212 + .../grid/_grid/soriaGrid.css.commented.css | 276 + includes/js/dojox/grid/_grid/tundraGrid.css | 215 + .../grid/_grid/tundraGrid.css.commented.css | 281 + includes/js/dojox/grid/_grid/view.js | 336 + includes/js/dojox/grid/_grid/views.js | 277 + .../js/dojox/grid/resources/GridView.html | 12 + .../js/dojox/grid/resources/VirtualGrid.html | 5 + includes/js/dojox/grid/tests/databaseModel.js | 337 + .../js/dojox/grid/tests/images/closed.gif | Bin 0 -> 907 bytes .../js/dojox/grid/tests/images/flatScreen.gif | Bin 0 -> 824 bytes includes/js/dojox/grid/tests/images/open.gif | Bin 0 -> 907 bytes .../js/dojox/grid/tests/support/books.xml | 103 + includes/js/dojox/grid/tests/support/data.php | 379 + .../js/dojox/grid/tests/support/geography.xml | 51 + includes/js/dojox/grid/tests/support/json.php | 794 + .../js/dojox/grid/tests/support/movies.csv | 9 + .../js/dojox/grid/tests/support/test_data.js | 30 + .../grid/tests/support/test_data_objects.js | 31 + .../js/dojox/grid/tests/support/testtbl.sql | 944 + .../dojox/grid/tests/support/yahoo_search.js | 131 + .../grid/tests/test_change_structure.html | 124 + .../js/dojox/grid/tests/test_custom_sort.html | 86 + .../dojox/grid/tests/test_dojo_data_edit.html | 124 + .../grid/tests/test_dojo_data_empty.html | 63 + .../grid/tests/test_dojo_data_model.html | 84 + .../test_dojo_data_model_EmptyResultSet.html | 57 + .../test_dojo_data_model_multiStores.html | 291 + .../test_dojo_data_model_processError.html | 65 + .../tests/test_dojo_data_notification.html | 114 + includes/js/dojox/grid/tests/test_edit.html | 149 + .../dojox/grid/tests/test_edit_canEdit.html | 156 + .../js/dojox/grid/tests/test_edit_dijit.html | 137 + includes/js/dojox/grid/tests/test_events.html | 174 + includes/js/dojox/grid/tests/test_expand.html | 107 + includes/js/dojox/grid/tests/test_grid.html | 69 + .../js/dojox/grid/tests/test_grid_dlg.html | 88 + .../grid/tests/test_grid_headerHeight.html | 84 + .../js/dojox/grid/tests/test_grid_layout.html | 112 + .../test_grid_layout_LayoutContainer.html | 87 + .../test_grid_layout_borderContainer.html | 98 + .../tests/test_grid_object_model_change.html | 86 + .../grid/tests/test_grid_programmatic.html | 65 + .../tests/test_grid_programmatic_layout.html | 74 + .../js/dojox/grid/tests/test_grid_rtl.html | 71 + .../js/dojox/grid/tests/test_grid_themes.html | 118 + .../grid/tests/test_grid_tooltip_menu.html | 161 + .../js/dojox/grid/tests/test_keyboard.html | 90 + includes/js/dojox/grid/tests/test_markup.html | 112 + .../js/dojox/grid/tests/test_mysql_edit.html | 155 + includes/js/dojox/grid/tests/test_sizing.html | 175 + .../dojox/grid/tests/test_sizing_100rows.html | 168 + .../grid/tests/test_sizing_ResizeHandle.html | 113 + .../js/dojox/grid/tests/test_styling.html | 131 + .../js/dojox/grid/tests/test_subgrid.html | 179 + .../js/dojox/grid/tests/test_tundra_edit.html | 139 + .../dojox/grid/tests/test_yahoo_images.html | 148 + .../dojox/grid/tests/test_yahoo_search.html | 141 + includes/js/dojox/grid/tests/yahooSearch.js | 137 + includes/js/dojox/help/README | 35 + includes/js/dojox/help/_base.js | 473 + includes/js/dojox/help/console.js | 80 + .../js/dojox/help/demos/demo_Console.html | 33 + includes/js/dojox/highlight.js | 6 + includes/js/dojox/highlight/README | 31 + includes/js/dojox/highlight/_base.js | 406 + includes/js/dojox/highlight/languages/_all.js | 11 + .../js/dojox/highlight/languages/_dynamic.js | 11 + .../js/dojox/highlight/languages/_static.js | 10 + includes/js/dojox/highlight/languages/_www.js | 12 + includes/js/dojox/highlight/languages/cpp.js | 53 + includes/js/dojox/highlight/languages/css.js | 96 + .../js/dojox/highlight/languages/delphi.js | 122 + .../js/dojox/highlight/languages/django.js | 97 + includes/js/dojox/highlight/languages/html.js | 70 + .../dojox/highlight/languages/javascript.js | 55 + .../highlight/languages/pygments/_html.js | 25 + .../highlight/languages/pygments/_www.js | 12 + .../dojox/highlight/languages/pygments/css.js | 211 + .../highlight/languages/pygments/html.js | 101 + .../languages/pygments/javascript.js | 152 + .../dojox/highlight/languages/pygments/xml.js | 79 + .../js/dojox/highlight/languages/python.js | 102 + includes/js/dojox/highlight/languages/sql.js | 101 + includes/js/dojox/highlight/languages/xml.js | 69 + .../dojox/highlight/resources/highlight.css | 51 + .../resources/highlight.css.commented.css | 58 + .../highlight/resources/pygments/autumn.css | 22 + .../pygments/autumn.css.commented.css | 28 + .../highlight/resources/pygments/borland.css | 11 + .../pygments/borland.css.commented.css | 17 + .../highlight/resources/pygments/colorful.css | 37 + .../pygments/colorful.css.commented.css | 43 + .../highlight/resources/pygments/default.css | 28 + .../pygments/default.css.commented.css | 35 + .../highlight/resources/pygments/emacs.css | 29 + .../pygments/emacs.css.commented.css | 36 + .../highlight/resources/pygments/friendly.css | 29 + .../pygments/friendly.css.commented.css | 36 + .../highlight/resources/pygments/fruity.css | 14 + .../pygments/fruity.css.commented.css | 20 + .../highlight/resources/pygments/manni.css | 30 + .../pygments/manni.css.commented.css | 37 + .../highlight/resources/pygments/murphy.css | 37 + .../pygments/murphy.css.commented.css | 43 + .../highlight/resources/pygments/native.css | 21 + .../pygments/native.css.commented.css | 28 + .../highlight/resources/pygments/pastie.css | 30 + .../pygments/pastie.css.commented.css | 36 + .../highlight/resources/pygments/perldoc.css | 23 + .../pygments/perldoc.css.commented.css | 30 + .../highlight/resources/pygments/trac.css | 20 + .../resources/pygments/trac.css.commented.css | 26 + .../dojox/highlight/tests/test_highlight.html | 327 + .../dojox/highlight/tests/test_pygments.html | 142 + includes/js/dojox/image/Gallery.js | 182 + includes/js/dojox/image/Lightbox.js | 451 + includes/js/dojox/image/Magnifier.js | 75 + includes/js/dojox/image/MagnifierLite.js | 126 + includes/js/dojox/image/README | 66 + includes/js/dojox/image/SlideShow.js | 598 + includes/js/dojox/image/ThumbnailPicker.js | 535 + .../js/dojox/image/resources/Gallery.html | 4 + .../js/dojox/image/resources/Lightbox.html | 15 + .../js/dojox/image/resources/Magnifier.css | 5 + .../resources/Magnifier.css.commented.css | 5 + .../js/dojox/image/resources/SlideShow.html | 14 + .../image/resources/ThumbnailPicker.html | 11 + includes/js/dojox/image/resources/image.css | 283 + .../image/resources/image.css.commented.css | 345 + .../dojox/image/resources/images/buttons.gif | Bin 0 -> 4620 bytes .../dojox/image/resources/images/buttons.png | Bin 0 -> 9259 bytes .../js/dojox/image/resources/images/close.png | Bin 0 -> 675 bytes .../image/resources/images/close_dark.png | Bin 0 -> 711 bytes .../js/dojox/image/resources/images/left.png | Bin 0 -> 626 bytes .../dojox/image/resources/images/loading.gif | Bin 0 -> 4178 bytes .../js/dojox/image/resources/images/right.png | Bin 0 -> 621 bytes .../dojox/image/resources/images/warning.png | Bin 0 -> 995 bytes includes/js/dojox/image/tests/images.json | 32 + .../js/dojox/image/tests/images/extraWide.jpg | Bin 0 -> 49250 bytes .../js/dojox/image/tests/images/huuuge.png | Bin 0 -> 37958 bytes .../dojox/image/tests/images/imageHoriz.jpg | Bin 0 -> 47693 bytes .../dojox/image/tests/images/imageHoriz2.jpg | Bin 0 -> 77176 bytes .../js/dojox/image/tests/images/imageVert.jpg | Bin 0 -> 71533 bytes .../js/dojox/image/tests/images/spanke.jpg | Bin 0 -> 302741 bytes .../js/dojox/image/tests/images/square.jpg | Bin 0 -> 82010 bytes .../js/dojox/image/tests/test_Gallery.html | 67 + .../js/dojox/image/tests/test_Lightbox.html | 105 + .../js/dojox/image/tests/test_Magnifier.html | 98 + .../dojox/image/tests/test_MagnifierLite.html | 91 + .../js/dojox/image/tests/test_SlideShow.html | 68 + .../image/tests/test_ThumbnailPicker.html | 134 + includes/js/dojox/io/README | 45 + includes/js/dojox/io/proxy/README | 82 + includes/js/dojox/io/proxy/tests/frag.xml | 4 + includes/js/dojox/io/proxy/tests/xip.html | 62 + includes/js/dojox/io/proxy/xip.js | 441 + includes/js/dojox/io/proxy/xip_client.html | 102 + includes/js/dojox/io/proxy/xip_server.html | 382 + includes/js/dojox/io/xhrMultiPart.js | 81 + includes/js/dojox/jsonPath.js | 6 + includes/js/dojox/jsonPath/README | 125 + includes/js/dojox/jsonPath/query.js | 163 + includes/js/dojox/jsonPath/tests/jsonPath.js | 211 + includes/js/dojox/jsonPath/tests/module.js | 12 + .../js/dojox/jsonPath/tests/runTests.html | 9 + includes/js/dojox/lang/LICENSE | 21 + includes/js/dojox/lang/README | 37 + includes/js/dojox/lang/functional.js | 9 + includes/js/dojox/lang/functional/array.js | 113 + includes/js/dojox/lang/functional/curry.js | 96 + includes/js/dojox/lang/functional/fold.js | 87 + includes/js/dojox/lang/functional/lambda.js | 110 + includes/js/dojox/lang/functional/listcomp.js | 54 + includes/js/dojox/lang/functional/object.js | 48 + includes/js/dojox/lang/functional/reversed.js | 79 + includes/js/dojox/lang/functional/scan.js | 84 + includes/js/dojox/lang/functional/sequence.js | 38 + includes/js/dojox/lang/functional/zip.js | 45 + includes/js/dojox/lang/tests/array.js | 84 + includes/js/dojox/lang/tests/curry.js | 31 + includes/js/dojox/lang/tests/fold.js | 64 + includes/js/dojox/lang/tests/fun_perf.html | 176 + includes/js/dojox/lang/tests/lambda.js | 24 + includes/js/dojox/lang/tests/listcomp.js | 28 + includes/js/dojox/lang/tests/main.js | 17 + includes/js/dojox/lang/tests/misc.js | 31 + includes/js/dojox/lang/tests/runTests.html | 9 + includes/js/dojox/lang/utils.js | 54 + includes/js/dojox/layout/BorderContainer.js | 7 + includes/js/dojox/layout/ContentPane.js | 479 + includes/js/dojox/layout/DragPane.js | 65 + includes/js/dojox/layout/ExpandoPane.js | 208 + includes/js/dojox/layout/FloatingPane.js | 394 + includes/js/dojox/layout/README | 75 + includes/js/dojox/layout/RadioGroup.js | 233 + includes/js/dojox/layout/ResizeHandle.js | 271 + includes/js/dojox/layout/ScrollPane.js | 114 + .../js/dojox/layout/resources/ExpandoPane.css | 99 + .../resources/ExpandoPane.css.commented.css | 116 + .../dojox/layout/resources/ExpandoPane.html | 9 + .../dojox/layout/resources/FloatingPane.css | 152 + .../resources/FloatingPane.css.commented.css | 183 + .../dojox/layout/resources/FloatingPane.html | 14 + .../js/dojox/layout/resources/RadioGroup.css | 40 + .../resources/RadioGroup.css.commented.css | 45 + .../dojox/layout/resources/ResizeHandle.css | 28 + .../resources/ResizeHandle.css.commented.css | 34 + .../js/dojox/layout/resources/ScrollPane.css | 21 + .../resources/ScrollPane.css.commented.css | 24 + .../js/dojox/layout/resources/ScrollPane.html | 6 + .../dojox/layout/resources/icons/resize.png | Bin 0 -> 319 bytes .../js/dojox/layout/tests/ContentPane.html | 1059 + .../js/dojox/layout/tests/_bottomPane.html | 53 + includes/js/dojox/layout/tests/_expando.css | 477 + .../layout/tests/_expando.css.commented.css | 64 + includes/js/dojox/layout/tests/_floating.html | 48 + includes/js/dojox/layout/tests/_lorem.html | 11 + includes/js/dojox/layout/tests/_script.html | 9 + includes/js/dojox/layout/tests/doc0.html | 14 + .../js/dojox/layout/tests/images/blank.gif | Bin 0 -> 43 bytes .../js/dojox/layout/tests/images/dojoLogo.png | Bin 0 -> 14712 bytes .../layout/tests/images/gridUnderlay.png | Bin 0 -> 915 bytes .../dojox/layout/tests/images/testImage.gif | Bin 0 -> 14171 bytes .../dojox/layout/tests/remote/getResponse.php | 108 + .../js/dojox/layout/tests/test_DragPane.html | 93 + .../dojox/layout/tests/test_ExpandoPane.html | 307 + .../layout/tests/test_ExpandoPane_code.html | 98 + .../layout/tests/test_ExpandoPane_more.html | 114 + .../dojox/layout/tests/test_FloatingPane.html | 167 + .../dojox/layout/tests/test_RadioGroup.html | 61 + .../dojox/layout/tests/test_ResizeHandle.html | 134 + .../dojox/layout/tests/test_ScrollPane.html | 129 + .../layout/tests/test_ScrollPaneSingle.html | 71 + .../dojox/layout/tests/test_SizingPane.html | 170 + includes/js/dojox/math.js | 6 + includes/js/dojox/math/README | 38 + includes/js/dojox/math/_base.js | 122 + includes/js/dojox/math/curves.js | 193 + includes/js/dojox/math/matrix.js | 294 + includes/js/dojox/off.js | 6 + includes/js/dojox/off/README | 28 + includes/js/dojox/off/_common.js | 559 + includes/js/dojox/off/docs/bookmarklets.html | 10 + includes/js/dojox/off/files.js | 454 + includes/js/dojox/off/network_check.txt | 1 + includes/js/dojox/off/offline.js | 20 + .../js/dojox/off/offline.js.uncompressed.js | 5910 ++++++ includes/js/dojox/off/resources/checkmark.png | Bin 0 -> 27329 bytes includes/js/dojox/off/resources/greenball.png | Bin 0 -> 27414 bytes includes/js/dojox/off/resources/learnhow.html | 43 + includes/js/dojox/off/resources/learnhow.js | 43 + .../js/dojox/off/resources/offline-widget.css | 88 + .../offline-widget.css.commented.css | 112 + .../dojox/off/resources/offline-widget.html | 40 + includes/js/dojox/off/resources/redball.png | Bin 0 -> 27409 bytes includes/js/dojox/off/resources/roller.gif | Bin 0 -> 7462 bytes includes/js/dojox/off/sync.js | 690 + includes/js/dojox/off/ui.js | 622 + includes/js/dojox/presentation.js | 6 + includes/js/dojox/presentation/README | 72 + includes/js/dojox/presentation/_base.js | 557 + .../js/dojox/presentation/resources/Show.css | 100 + .../resources/Show.css.commented.css | 110 + .../js/dojox/presentation/resources/Show.html | 12 + .../dojox/presentation/resources/Slide.html | 4 + .../presentation/resources/icons/down.png | Bin 0 -> 469 bytes .../presentation/resources/icons/next.png | Bin 0 -> 470 bytes .../presentation/resources/icons/prev.png | Bin 0 -> 460 bytes .../dojox/presentation/resources/icons/up.png | Bin 0 -> 464 bytes .../js/dojox/presentation/tests/_ext1.html | 21 + .../presentation/tests/test_presentation.html | 162 + includes/js/dojox/resources/README.template | 36 + includes/js/dojox/resources/_modules.js | 204 + includes/js/dojox/resources/manualTests.html | 12 + includes/js/dojox/resources/manualTests.js | 211 + includes/js/dojox/rpc/CouchDBRestStore.js | 87 + includes/js/dojox/rpc/JsonRPC.js | 58 + includes/js/dojox/rpc/JsonReferencing.js | 265 + includes/js/dojox/rpc/JsonRestStore.js | 661 + includes/js/dojox/rpc/PersevereRestStore.js | 39 + includes/js/dojox/rpc/README | 52 + includes/js/dojox/rpc/Rest.js | 90 + includes/js/dojox/rpc/SMDLibrary/yahoo.smd | 493 + includes/js/dojox/rpc/Service.js | 293 + .../rpc/demos/demo_JsonRestStore_CouchDB.html | 125 + .../demos/demo_JsonRestStore_Persevere.html | 65 + .../js/dojox/rpc/demos/documentation.html | 33 + .../rpc/demos/templates/documentation.html | 8 + .../js/dojox/rpc/demos/templates/yahoo.html | 31 + includes/js/dojox/rpc/demos/yahoo.html | 39 + includes/js/dojox/rpc/documentation.smd | 30 + includes/js/dojox/rpc/test.txt | 0 .../js/dojox/rpc/tests/JsonReferencing.js | 30 + includes/js/dojox/rpc/tests/Service.js | 702 + includes/js/dojox/rpc/tests/Yahoo.js | 317 + includes/js/dojox/rpc/tests/libraryTests.js | 12 + includes/js/dojox/rpc/tests/module.js | 13 + .../js/dojox/rpc/tests/resources/JSON.php | 724 + .../js/dojox/rpc/tests/resources/bigQuery | 1 + .../js/dojox/rpc/tests/resources/bigQuery5 | 1 + .../js/dojox/rpc/tests/resources/echo.php | 7 + .../js/dojox/rpc/tests/resources/echoJson.php | 8 + .../dojox/rpc/tests/resources/fakestore.php | 36 + .../dojox/rpc/tests/resources/jsonRpc10.php | 47 + .../dojox/rpc/tests/resources/jsonRpc11.php | 52 + .../dojox/rpc/tests/resources/jsonRpc12.php | 53 + .../tests/resources/jsonRpcPostGetEcho.php | 38 + .../dojox/rpc/tests/resources/jsonpEcho.php | 23 + .../dojox/rpc/tests/resources/jsonpEcho.phps | 23 + .../rpc/tests/resources/jsonpJsonRpcEcho.php | 37 + includes/js/dojox/rpc/tests/resources/obj1 | 1 + .../dojox/rpc/tests/resources/obj1testArray | 1 + includes/js/dojox/rpc/tests/resources/obj3 | 1 + includes/js/dojox/rpc/tests/resources/obj4 | 1 + includes/js/dojox/rpc/tests/resources/query | 6 + .../js/dojox/rpc/tests/resources/rawEcho.php | 5 + includes/js/dojox/rpc/tests/resources/res | 1 + .../js/dojox/rpc/tests/resources/store.php | 24 + .../js/dojox/rpc/tests/resources/test.smd | 189 + .../js/dojox/rpc/tests/runLibraryTests.html | 9 + includes/js/dojox/rpc/tests/runTests.html | 9 + .../dojox/rpc/tests/stores/JsonRestStore.js | 237 + .../tests/test_dojo_data_model_persevere.html | 146 + includes/js/dojox/sketch.js | 13 + includes/js/dojox/sketch/Anchor.js | 61 + includes/js/dojox/sketch/Annotation.js | 223 + .../js/dojox/sketch/DoubleArrowAnnotation.js | 200 + includes/js/dojox/sketch/Figure.js | 493 + includes/js/dojox/sketch/LeadAnnotation.js | 141 + .../js/dojox/sketch/PreexistingAnnotation.js | 121 + includes/js/dojox/sketch/README | 58 + .../js/dojox/sketch/SingleArrowAnnotation.js | 183 + includes/js/dojox/sketch/Slider.js | 31 + includes/js/dojox/sketch/Toolbar.js | 96 + .../js/dojox/sketch/UnderlineAnnotation.js | 82 + includes/js/dojox/sketch/UndoStack.js | 104 + includes/js/dojox/sketch/_Plugin.js | 83 + .../dojox/sketch/resources/images/icons.gif | Bin 0 -> 600 bytes includes/js/dojox/sketch/resources/sketch.css | 17 + .../sketch/resources/sketch.css.commented.css | 17 + includes/js/dojox/sketch/tests/annotation.svg | 1 + .../js/dojox/sketch/tests/images/figure2.gif | Bin 0 -> 40349 bytes .../dojox/sketch/tests/images/testsBodyBg.gif | Bin 0 -> 753 bytes includes/js/dojox/sketch/tests/test_full.html | 66 + includes/js/dojox/sql.js | 6 + includes/js/dojox/storage.js | 6 + .../js/dojox/storage/AirDBStorageProvider.js | 252 + .../AirEncryptedLocalStorageProvider.js | 221 + .../dojox/storage/AirFileStorageProvider.js | 232 + .../js/dojox/storage/FlashStorageProvider.js | 346 + .../js/dojox/storage/GearsStorageProvider.js | 320 + includes/js/dojox/storage/Provider.js | 331 + includes/js/dojox/storage/README | 76 + includes/js/dojox/storage/Storage.as | 399 + includes/js/dojox/storage/Storage.swf | Bin 0 -> 3256 bytes .../js/dojox/storage/WhatWGStorageProvider.js | 278 + includes/js/dojox/storage/_common.js | 20 + .../js/dojox/storage/buildFlashStorage.sh | 4 + .../js/dojox/storage/demos/helloworld.html | 90 + includes/js/dojox/storage/manager.js | 261 + includes/js/dojox/storage/storage_dialog.fla | Bin 0 -> 344064 bytes .../storage/tests/resources/testBook.txt | 7104 +++++++ .../dojox/storage/tests/resources/testXML.xml | 203 + .../js/dojox/storage/tests/test_storage.html | 189 + .../js/dojox/storage/tests/test_storage.js | 493 + includes/js/dojox/string/Builder.js | 101 + includes/js/dojox/string/README | 39 + includes/js/dojox/string/sprintf.js | 406 + includes/js/dojox/string/tests/Builder.js | 91 + .../js/dojox/string/tests/BuilderPerf.html | 403 + includes/js/dojox/string/tests/PerfFun.html | 260 + includes/js/dojox/string/tests/lipsum.js | 133 + includes/js/dojox/string/tests/notes.txt | 153 + includes/js/dojox/string/tests/peller.html | 78 + includes/js/dojox/string/tests/runTests.html | 9 + includes/js/dojox/string/tests/sprintf.js | 277 + includes/js/dojox/string/tests/string.js | 10 + includes/js/dojox/string/tokenize.js | 42 + includes/js/dojox/timing.js | 6 + includes/js/dojox/timing/README | 58 + includes/js/dojox/timing/Sequence.js | 145 + includes/js/dojox/timing/Streamer.js | 94 + includes/js/dojox/timing/ThreadPool.js | 157 + includes/js/dojox/timing/_base.js | 58 + .../js/dojox/timing/tests/test_Sequence.html | 80 + .../dojox/timing/tests/test_ThreadPool.html | 16 + includes/js/dojox/uuid.js | 6 + includes/js/dojox/uuid/README | 43 + includes/js/dojox/uuid/Uuid.js | 200 + includes/js/dojox/uuid/_base.js | 245 + includes/js/dojox/uuid/generateRandomUuid.js | 56 + .../js/dojox/uuid/generateTimeBasedUuid.js | 290 + includes/js/dojox/uuid/tests/runTests.html | 10 + includes/js/dojox/uuid/tests/uuid.js | 377 + includes/js/dojox/validate.js | 6 + includes/js/dojox/validate/README | 37 + includes/js/dojox/validate/_base.js | 183 + includes/js/dojox/validate/ca.js | 44 + includes/js/dojox/validate/check.js | 261 + includes/js/dojox/validate/creditCard.js | 92 + includes/js/dojox/validate/isbn.js | 37 + includes/js/dojox/validate/regexp.js | 331 + .../js/dojox/validate/tests/creditcard.js | 119 + includes/js/dojox/validate/tests/module.js | 14 + .../js/dojox/validate/tests/runTests.html | 9 + includes/js/dojox/validate/tests/validate.js | 316 + includes/js/dojox/validate/us.js | 67 + includes/js/dojox/validate/web.js | 89 + includes/js/dojox/widget/ColorPicker.js | 284 + .../dojox/widget/ColorPicker/ColorPicker.css | 78 + .../ColorPicker/ColorPicker.css.commented.css | 89 + .../dojox/widget/ColorPicker/ColorPicker.html | 31 + .../dojox/widget/ColorPicker/images/hue.png | Bin 0 -> 1991 bytes .../widget/ColorPicker/images/hueHandle.png | Bin 0 -> 280 bytes .../ColorPicker/images/pickerPointer.png | Bin 0 -> 228 bytes .../widget/ColorPicker/images/underlay.png | Bin 0 -> 10788 bytes includes/js/dojox/widget/FileInput.js | 75 + .../js/dojox/widget/FileInput/FileInput.css | 70 + .../FileInput/FileInput.css.commented.css | 79 + .../js/dojox/widget/FileInput/FileInput.html | 9 + .../dojox/widget/FileInput/FileInputAuto.html | 9 + .../js/dojox/widget/FileInput/ReceiveFile.php | 37 + includes/js/dojox/widget/FileInputAuto.js | 185 + includes/js/dojox/widget/FisheyeList.js | 708 + .../dojox/widget/FisheyeList/FisheyeList.css | 24 + .../FisheyeList/FisheyeList.css.commented.css | 28 + includes/js/dojox/widget/FisheyeLite.js | 135 + includes/js/dojox/widget/Iterator.js | 177 + includes/js/dojox/widget/Loader.js | 103 + includes/js/dojox/widget/Loader/Loader.css | 24 + .../widget/Loader/Loader.css.commented.css | 27 + includes/js/dojox/widget/Loader/README | 39 + includes/js/dojox/widget/Loader/honey.php | 27 + .../js/dojox/widget/Loader/icons/loading.gif | Bin 0 -> 751 bytes includes/js/dojox/widget/MultiComboBox.js | 61 + includes/js/dojox/widget/README | 84 + includes/js/dojox/widget/Rating.js | 90 + includes/js/dojox/widget/Rating/Rating.css | 20 + .../widget/Rating/Rating.css.commented.css | 24 + .../js/dojox/widget/Rating/rating_empty.gif | Bin 0 -> 934 bytes .../js/dojox/widget/Rating/rating_empty.png | Bin 0 -> 482 bytes .../js/dojox/widget/Rating/rating_full.gif | Bin 0 -> 936 bytes .../js/dojox/widget/Rating/rating_full.png | Bin 0 -> 483 bytes .../js/dojox/widget/Rating/rating_half.png | Bin 0 -> 541 bytes includes/js/dojox/widget/SortList.js | 151 + .../js/dojox/widget/SortList/SortList.css | 57 + .../SortList/SortList.css.commented.css | 64 + .../js/dojox/widget/SortList/SortList.html | 9 + includes/js/dojox/widget/TimeSpinner.js | 48 + includes/js/dojox/widget/Toaster.js | 268 + includes/js/dojox/widget/Toaster/Toaster.css | 39 + .../widget/Toaster/Toaster.css.commented.css | 47 + includes/js/dojox/widget/Wizard.js | 192 + includes/js/dojox/widget/Wizard/Wizard.css | 19 + .../widget/Wizard/Wizard.css.commented.css | 22 + includes/js/dojox/widget/Wizard/Wizard.html | 9 + includes/js/dojox/widget/nls/Wizard.js | 1 + includes/js/dojox/widget/nls/ar/Wizard.js | 1 + includes/js/dojox/widget/nls/cs/Wizard.js | 1 + includes/js/dojox/widget/nls/da/Wizard.js | 1 + includes/js/dojox/widget/nls/de/Wizard.js | 1 + includes/js/dojox/widget/nls/el/Wizard.js | 1 + includes/js/dojox/widget/nls/es/Wizard.js | 1 + includes/js/dojox/widget/nls/fi/Wizard.js | 1 + includes/js/dojox/widget/nls/fr/Wizard.js | 1 + includes/js/dojox/widget/nls/he/Wizard.js | 1 + includes/js/dojox/widget/nls/hu/Wizard.js | 1 + includes/js/dojox/widget/nls/it/Wizard.js | 1 + includes/js/dojox/widget/nls/ja/Wizard.js | 1 + includes/js/dojox/widget/nls/ko/Wizard.js | 1 + includes/js/dojox/widget/nls/nb/Wizard.js | 1 + includes/js/dojox/widget/nls/nl/Wizard.js | 1 + includes/js/dojox/widget/nls/pl/Wizard.js | 1 + includes/js/dojox/widget/nls/pt-pt/Wizard.js | 1 + includes/js/dojox/widget/nls/pt/Wizard.js | 1 + includes/js/dojox/widget/nls/ru/Wizard.js | 1 + includes/js/dojox/widget/nls/sv/Wizard.js | 1 + includes/js/dojox/widget/nls/tr/Wizard.js | 1 + includes/js/dojox/widget/nls/zh-tw/Wizard.js | 1 + includes/js/dojox/widget/nls/zh/Wizard.js | 1 + includes/js/dojox/widget/tests/_tags.json | 100 + .../widget/tests/demo_FisheyeList-orig.html | 111 + .../dojox/widget/tests/demo_FisheyeList.html | 117 + .../dojox/widget/tests/demo_FisheyeLite.html | 175 + .../dojox/widget/tests/images/fisheye_1.png | Bin 0 -> 3799 bytes .../dojox/widget/tests/images/fisheye_2.png | Bin 0 -> 4479 bytes .../dojox/widget/tests/images/fisheye_3.png | Bin 0 -> 4321 bytes .../dojox/widget/tests/images/fisheye_4.png | Bin 0 -> 4389 bytes .../widget/tests/images/icon_browser.png | Bin 0 -> 18619 bytes .../widget/tests/images/icon_calendar.png | Bin 0 -> 10822 bytes .../dojox/widget/tests/images/icon_email.png | Bin 0 -> 17133 bytes .../widget/tests/images/icon_texteditor.png | Bin 0 -> 25271 bytes .../dojox/widget/tests/images/icon_update.png | Bin 0 -> 21984 bytes .../dojox/widget/tests/images/icon_users.png | Bin 0 -> 24802 bytes .../widget/tests/images/rating_empty.gif | Bin 0 -> 1277 bytes .../widget/tests/images/rating_empty.png | Bin 0 -> 2031 bytes .../dojox/widget/tests/images/rating_full.gif | Bin 0 -> 1314 bytes .../dojox/widget/tests/images/rating_full.png | Bin 0 -> 2241 bytes .../dojox/widget/tests/test_ColorPicker.html | 41 + .../js/dojox/widget/tests/test_FileInput.html | 115 + .../dojox/widget/tests/test_FisheyeList.html | 144 + .../dojox/widget/tests/test_FisheyeLite.html | 257 + .../js/dojox/widget/tests/test_Iterator.html | 73 + .../js/dojox/widget/tests/test_Loader.html | 81 + .../widget/tests/test_MultiComboBox.html | 70 + .../js/dojox/widget/tests/test_Rating.html | 91 + .../js/dojox/widget/tests/test_SortList.html | 74 + .../dojox/widget/tests/test_TimeSpinner.html | 87 + .../js/dojox/widget/tests/test_Toaster.html | 147 + .../js/dojox/widget/tests/test_Wizard.html | 118 + includes/js/dojox/wire.js | 7 + includes/js/dojox/wire/CompositeWire.js | 103 + includes/js/dojox/wire/DataWire.js | 179 + includes/js/dojox/wire/README | 53 + includes/js/dojox/wire/TableAdapter.js | 88 + includes/js/dojox/wire/TextAdapter.js | 88 + includes/js/dojox/wire/TreeAdapter.js | 188 + includes/js/dojox/wire/Wire.js | 336 + includes/js/dojox/wire/XmlWire.js | 244 + includes/js/dojox/wire/_base.js | 195 + .../js/dojox/wire/demos/TableContainer.css | 25 + .../demos/TableContainer.css.commented.css | 30 + .../js/dojox/wire/demos/TableContainer.js | 68 + .../js/dojox/wire/demos/WidgetRepeater.js | 33 + .../js/dojox/wire/demos/markup/countries.json | 43 + .../demos/markup/demo_ActionChaining.html | 108 + .../wire/demos/markup/demo_ActionWiring.html | 142 + .../demos/markup/demo_BasicChildWire.html | 78 + .../demos/markup/demo_BasicColumnWiring.html | 90 + .../demos/markup/demo_ConditionalActions.html | 221 + .../demos/markup/demo_FlickrStoreWire.html | 281 + .../wire/demos/markup/demo_TopicWiring.html | 78 + .../js/dojox/wire/demos/markup/flickrDemo.css | 29 + .../demos/markup/flickrDemo.css.commented.css | 35 + .../js/dojox/wire/demos/markup/states.json | 56 + includes/js/dojox/wire/ml/Action.js | 225 + includes/js/dojox/wire/ml/Data.js | 143 + includes/js/dojox/wire/ml/DataStore.js | 116 + includes/js/dojox/wire/ml/Invocation.js | 171 + includes/js/dojox/wire/ml/Service.js | 340 + includes/js/dojox/wire/ml/Transfer.js | 359 + includes/js/dojox/wire/ml/util.js | 295 + .../js/dojox/wire/tests/markup/Action.html | 147 + includes/js/dojox/wire/tests/markup/Data.html | 105 + .../js/dojox/wire/tests/markup/DataStore.html | 66 + .../js/dojox/wire/tests/markup/DataStore.xml | 18 + .../dojox/wire/tests/markup/Invocation.html | 53 + .../js/dojox/wire/tests/markup/Service.html | 84 + .../dojox/wire/tests/markup/Service/JSON.smd | 11 + .../dojox/wire/tests/markup/Service/XML.smd | 11 + .../js/dojox/wire/tests/markup/Service/a.json | 5 + .../js/dojox/wire/tests/markup/Service/a.xml | 5 + .../js/dojox/wire/tests/markup/Transfer.html | 157 + includes/js/dojox/wire/tests/module.js | 13 + .../wire/tests/programmatic/CompositeWire.js | 51 + .../tests/programmatic/ConverterDynamic.js | 12 + .../dojox/wire/tests/programmatic/DataWire.js | 25 + .../wire/tests/programmatic/TableAdapter.js | 24 + .../wire/tests/programmatic/TextAdapter.js | 25 + .../wire/tests/programmatic/TreeAdapter.js | 29 + .../js/dojox/wire/tests/programmatic/Wire.js | 123 + .../dojox/wire/tests/programmatic/XmlWire.js | 32 + .../js/dojox/wire/tests/programmatic/_base.js | 111 + includes/js/dojox/wire/tests/runTests.html | 9 + includes/js/dojox/wire/tests/wire.js | 18 + includes/js/dojox/wire/tests/wireml.js | 18 + includes/js/dojox/xml/DomParser.js | 379 + includes/js/dojox/xml/README | 40 + includes/js/util/doh/LICENSE | 195 + includes/js/util/doh/README | 12 + includes/js/util/doh/_browserRunner.js | 465 + includes/js/util/doh/_rhinoRunner.js | 17 + includes/js/util/doh/_sounds/LICENSE | 10 + includes/js/util/doh/_sounds/doh.wav | Bin 0 -> 2878 bytes includes/js/util/doh/_sounds/dohaaa.wav | Bin 0 -> 14318 bytes includes/js/util/doh/_sounds/woohoo.wav | Bin 0 -> 3814 bytes includes/js/util/doh/runner.html | 283 + includes/js/util/doh/runner.js | 948 + includes/js/util/doh/runner.sh | 3 + includes/js/util/doh/small_logo.png | Bin 0 -> 1893 bytes scuttle.css | 10 + templates/editbookmark.tpl.php | 12 +- templates/top.inc.php | 74 +- 2431 files changed, 301410 insertions(+), 33 deletions(-) create mode 100644 ajax/gettags.php create mode 100644 includes/js/dijit/ColorPalette.js create mode 100644 includes/js/dijit/Declaration.js create mode 100644 includes/js/dijit/Dialog.js create mode 100644 includes/js/dijit/Editor.js create mode 100644 includes/js/dijit/InlineEditBox.js create mode 100644 includes/js/dijit/LICENSE create mode 100644 includes/js/dijit/Menu.js create mode 100644 includes/js/dijit/ProgressBar.js create mode 100644 includes/js/dijit/TitlePane.js create mode 100644 includes/js/dijit/Toolbar.js create mode 100644 includes/js/dijit/Tooltip.js create mode 100644 includes/js/dijit/Tree.js create mode 100644 includes/js/dijit/_Calendar.js create mode 100644 includes/js/dijit/_Container.js create mode 100644 includes/js/dijit/_Templated.js create mode 100644 includes/js/dijit/_TimePicker.js create mode 100644 includes/js/dijit/_Widget.js create mode 100644 includes/js/dijit/_base.js create mode 100644 includes/js/dijit/_base/bidi.js create mode 100644 includes/js/dijit/_base/focus.js create mode 100644 includes/js/dijit/_base/manager.js create mode 100644 includes/js/dijit/_base/place.js create mode 100644 includes/js/dijit/_base/popup.js create mode 100644 includes/js/dijit/_base/scroll.js create mode 100644 includes/js/dijit/_base/sniff.js create mode 100644 includes/js/dijit/_base/typematic.js create mode 100644 includes/js/dijit/_base/wai.js create mode 100644 includes/js/dijit/_base/window.js create mode 100644 includes/js/dijit/_editor/RichText.js create mode 100644 includes/js/dijit/_editor/_Plugin.js create mode 100644 includes/js/dijit/_editor/html.js create mode 100644 includes/js/dijit/_editor/nls/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/ar/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/ar/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/ar/commands.js create mode 100644 includes/js/dijit/_editor/nls/commands.js create mode 100644 includes/js/dijit/_editor/nls/cs/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/cs/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/cs/commands.js create mode 100644 includes/js/dijit/_editor/nls/da/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/da/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/da/commands.js create mode 100644 includes/js/dijit/_editor/nls/de/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/de/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/de/commands.js create mode 100644 includes/js/dijit/_editor/nls/el/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/el/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/el/commands.js create mode 100644 includes/js/dijit/_editor/nls/es/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/es/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/es/commands.js create mode 100644 includes/js/dijit/_editor/nls/fi/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/fi/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/fi/commands.js create mode 100644 includes/js/dijit/_editor/nls/fr/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/fr/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/fr/commands.js create mode 100644 includes/js/dijit/_editor/nls/he/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/he/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/he/commands.js create mode 100644 includes/js/dijit/_editor/nls/hu/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/hu/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/hu/commands.js create mode 100644 includes/js/dijit/_editor/nls/it/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/it/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/it/commands.js create mode 100644 includes/js/dijit/_editor/nls/ja/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/ja/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/ja/commands.js create mode 100644 includes/js/dijit/_editor/nls/ko/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/ko/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/ko/commands.js create mode 100644 includes/js/dijit/_editor/nls/nb/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/nb/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/nb/commands.js create mode 100644 includes/js/dijit/_editor/nls/nl/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/nl/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/nl/commands.js create mode 100644 includes/js/dijit/_editor/nls/pl/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/pl/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/pl/commands.js create mode 100644 includes/js/dijit/_editor/nls/pt-pt/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/pt-pt/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/pt-pt/commands.js create mode 100644 includes/js/dijit/_editor/nls/pt/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/pt/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/pt/commands.js create mode 100644 includes/js/dijit/_editor/nls/ru/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/ru/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/ru/commands.js create mode 100644 includes/js/dijit/_editor/nls/sv/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/sv/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/sv/commands.js create mode 100644 includes/js/dijit/_editor/nls/tr/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/tr/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/tr/commands.js create mode 100644 includes/js/dijit/_editor/nls/zh-tw/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/zh-tw/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/zh-tw/commands.js create mode 100644 includes/js/dijit/_editor/nls/zh/FontChoice.js create mode 100644 includes/js/dijit/_editor/nls/zh/LinkDialog.js create mode 100644 includes/js/dijit/_editor/nls/zh/commands.js create mode 100644 includes/js/dijit/_editor/plugins/AlwaysShowToolbar.js create mode 100644 includes/js/dijit/_editor/plugins/EnterKeyHandling.js create mode 100644 includes/js/dijit/_editor/plugins/FontChoice.js create mode 100644 includes/js/dijit/_editor/plugins/LinkDialog.js create mode 100644 includes/js/dijit/_editor/plugins/TextColor.js create mode 100644 includes/js/dijit/_editor/plugins/ToggleDir.js create mode 100644 includes/js/dijit/_editor/range.js create mode 100644 includes/js/dijit/_editor/selection.js create mode 100644 includes/js/dijit/_tree/Node.html create mode 100644 includes/js/dijit/_tree/Tree.html create mode 100644 includes/js/dijit/_tree/dndContainer.js create mode 100644 includes/js/dijit/_tree/dndSelector.js create mode 100644 includes/js/dijit/_tree/dndSource.js create mode 100644 includes/js/dijit/_tree/model.js create mode 100644 includes/js/dijit/bench/benchReceive.php create mode 100644 includes/js/dijit/bench/benchTool.html create mode 100644 includes/js/dijit/bench/create_widgets.html create mode 100644 includes/js/dijit/bench/test_Button-programmatic.html create mode 100644 includes/js/dijit/bench/test_button-results.html create mode 100644 includes/js/dijit/bench/widget_construction_test.php create mode 100644 includes/js/dijit/changes.txt create mode 100644 includes/js/dijit/demos/chat.html create mode 100644 includes/js/dijit/demos/chat/chat.css create mode 100644 includes/js/dijit/demos/chat/chat.css.commented.css create mode 100644 includes/js/dijit/demos/chat/client.html create mode 100644 includes/js/dijit/demos/chat/community.html create mode 100644 includes/js/dijit/demos/chat/operator.html create mode 100644 includes/js/dijit/demos/chat/room.js create mode 100644 includes/js/dijit/demos/form.html create mode 100644 includes/js/dijit/demos/i18n.html create mode 100644 includes/js/dijit/demos/i18n/continents.json create mode 100644 includes/js/dijit/demos/i18n/data.json create mode 100644 includes/js/dijit/demos/i18n/flags.css create mode 100644 includes/js/dijit/demos/i18n/flags.css.commented.css create mode 100644 includes/js/dijit/demos/i18n/flags.png create mode 100644 includes/js/dijit/demos/i18n/generate.html create mode 100644 includes/js/dijit/demos/i18n/langCountryMap.json create mode 100644 includes/js/dijit/demos/i18n/languages.json create mode 100644 includes/js/dijit/demos/i18n/languages.sh create mode 100644 includes/js/dijit/demos/i18n/sprite.html create mode 100644 includes/js/dijit/demos/mail.html create mode 100644 includes/js/dijit/demos/mail/icons.gif create mode 100644 includes/js/dijit/demos/mail/icons.png create mode 100644 includes/js/dijit/demos/mail/mail.css create mode 100644 includes/js/dijit/demos/mail/mail.css.commented.css create mode 100644 includes/js/dijit/demos/mail/mail.json create mode 100644 includes/js/dijit/demos/mail/newMail.html create mode 100644 includes/js/dijit/demos/nihao.html create mode 100644 includes/js/dijit/demos/nihao/nls/en/helloworld.js create mode 100644 includes/js/dijit/demos/nihao/nls/fr/helloworld.js create mode 100644 includes/js/dijit/demos/nihao/nls/helloworld.js create mode 100644 includes/js/dijit/demos/nihao/nls/zh/helloworld.js create mode 100644 includes/js/dijit/dijit-all.js create mode 100644 includes/js/dijit/dijit-all.js.uncompressed.js create mode 100644 includes/js/dijit/dijit.js create mode 100644 includes/js/dijit/dijit.js.uncompressed.js create mode 100644 includes/js/dijit/form/Button.js create mode 100644 includes/js/dijit/form/CheckBox.js create mode 100644 includes/js/dijit/form/ComboBox.js create mode 100644 includes/js/dijit/form/CurrencyTextBox.js create mode 100644 includes/js/dijit/form/DateTextBox.js create mode 100644 includes/js/dijit/form/FilteringSelect.js create mode 100644 includes/js/dijit/form/Form.js create mode 100644 includes/js/dijit/form/MultiSelect.js create mode 100644 includes/js/dijit/form/NumberSpinner.js create mode 100644 includes/js/dijit/form/NumberTextBox.js create mode 100644 includes/js/dijit/form/SimpleTextarea.js create mode 100644 includes/js/dijit/form/Slider.js create mode 100644 includes/js/dijit/form/TextBox.js create mode 100644 includes/js/dijit/form/Textarea.js create mode 100644 includes/js/dijit/form/TimeTextBox.js create mode 100644 includes/js/dijit/form/ValidationTextBox.js create mode 100644 includes/js/dijit/form/_DateTimeTextBox.js create mode 100644 includes/js/dijit/form/_FormWidget.js create mode 100644 includes/js/dijit/form/_Spinner.js create mode 100644 includes/js/dijit/form/nls/ComboBox.js create mode 100644 includes/js/dijit/form/nls/Textarea.js create mode 100644 includes/js/dijit/form/nls/ar/ComboBox.js create mode 100644 includes/js/dijit/form/nls/ar/Textarea.js create mode 100644 includes/js/dijit/form/nls/ar/validate.js create mode 100644 includes/js/dijit/form/nls/cs/ComboBox.js create mode 100644 includes/js/dijit/form/nls/cs/Textarea.js create mode 100644 includes/js/dijit/form/nls/cs/validate.js create mode 100644 includes/js/dijit/form/nls/da/ComboBox.js create mode 100644 includes/js/dijit/form/nls/da/Textarea.js create mode 100644 includes/js/dijit/form/nls/da/validate.js create mode 100644 includes/js/dijit/form/nls/de/ComboBox.js create mode 100644 includes/js/dijit/form/nls/de/Textarea.js create mode 100644 includes/js/dijit/form/nls/de/validate.js create mode 100644 includes/js/dijit/form/nls/el/ComboBox.js create mode 100644 includes/js/dijit/form/nls/el/Textarea.js create mode 100644 includes/js/dijit/form/nls/el/validate.js create mode 100644 includes/js/dijit/form/nls/es/ComboBox.js create mode 100644 includes/js/dijit/form/nls/es/Textarea.js create mode 100644 includes/js/dijit/form/nls/es/validate.js create mode 100644 includes/js/dijit/form/nls/fi/ComboBox.js create mode 100644 includes/js/dijit/form/nls/fi/Textarea.js create mode 100644 includes/js/dijit/form/nls/fi/validate.js create mode 100644 includes/js/dijit/form/nls/fr/ComboBox.js create mode 100644 includes/js/dijit/form/nls/fr/Textarea.js create mode 100644 includes/js/dijit/form/nls/fr/validate.js create mode 100644 includes/js/dijit/form/nls/he/ComboBox.js create mode 100644 includes/js/dijit/form/nls/he/Textarea.js create mode 100644 includes/js/dijit/form/nls/he/validate.js create mode 100644 includes/js/dijit/form/nls/hu/ComboBox.js create mode 100644 includes/js/dijit/form/nls/hu/Textarea.js create mode 100644 includes/js/dijit/form/nls/hu/validate.js create mode 100644 includes/js/dijit/form/nls/it/ComboBox.js create mode 100644 includes/js/dijit/form/nls/it/Textarea.js create mode 100644 includes/js/dijit/form/nls/it/validate.js create mode 100644 includes/js/dijit/form/nls/ja/ComboBox.js create mode 100644 includes/js/dijit/form/nls/ja/Textarea.js create mode 100644 includes/js/dijit/form/nls/ja/validate.js create mode 100644 includes/js/dijit/form/nls/ko/ComboBox.js create mode 100644 includes/js/dijit/form/nls/ko/Textarea.js create mode 100644 includes/js/dijit/form/nls/ko/validate.js create mode 100644 includes/js/dijit/form/nls/nb/ComboBox.js create mode 100644 includes/js/dijit/form/nls/nb/Textarea.js create mode 100644 includes/js/dijit/form/nls/nb/validate.js create mode 100644 includes/js/dijit/form/nls/nl/ComboBox.js create mode 100644 includes/js/dijit/form/nls/nl/Textarea.js create mode 100644 includes/js/dijit/form/nls/nl/validate.js create mode 100644 includes/js/dijit/form/nls/pl/ComboBox.js create mode 100644 includes/js/dijit/form/nls/pl/Textarea.js create mode 100644 includes/js/dijit/form/nls/pl/validate.js create mode 100644 includes/js/dijit/form/nls/pt-pt/ComboBox.js create mode 100644 includes/js/dijit/form/nls/pt-pt/Textarea.js create mode 100644 includes/js/dijit/form/nls/pt-pt/validate.js create mode 100644 includes/js/dijit/form/nls/pt/ComboBox.js create mode 100644 includes/js/dijit/form/nls/pt/Textarea.js create mode 100644 includes/js/dijit/form/nls/pt/validate.js create mode 100644 includes/js/dijit/form/nls/ru/ComboBox.js create mode 100644 includes/js/dijit/form/nls/ru/Textarea.js create mode 100644 includes/js/dijit/form/nls/ru/validate.js create mode 100644 includes/js/dijit/form/nls/sv/ComboBox.js create mode 100644 includes/js/dijit/form/nls/sv/Textarea.js create mode 100644 includes/js/dijit/form/nls/sv/validate.js create mode 100644 includes/js/dijit/form/nls/tr/ComboBox.js create mode 100644 includes/js/dijit/form/nls/tr/Textarea.js create mode 100644 includes/js/dijit/form/nls/tr/validate.js create mode 100644 includes/js/dijit/form/nls/validate.js create mode 100644 includes/js/dijit/form/nls/zh-tw/ComboBox.js create mode 100644 includes/js/dijit/form/nls/zh-tw/Textarea.js create mode 100644 includes/js/dijit/form/nls/zh-tw/validate.js create mode 100644 includes/js/dijit/form/nls/zh/ComboBox.js create mode 100644 includes/js/dijit/form/nls/zh/Textarea.js create mode 100644 includes/js/dijit/form/nls/zh/validate.js create mode 100644 includes/js/dijit/form/templates/Button.html create mode 100644 includes/js/dijit/form/templates/CheckBox.html create mode 100644 includes/js/dijit/form/templates/ComboBox.html create mode 100644 includes/js/dijit/form/templates/ComboButton.html create mode 100644 includes/js/dijit/form/templates/DropDownButton.html create mode 100644 includes/js/dijit/form/templates/HorizontalSlider.html create mode 100644 includes/js/dijit/form/templates/InlineEditBox.html create mode 100644 includes/js/dijit/form/templates/Spinner.html create mode 100644 includes/js/dijit/form/templates/TextBox.html create mode 100644 includes/js/dijit/form/templates/TimePicker.html create mode 100644 includes/js/dijit/form/templates/ValidationTextBox.html create mode 100644 includes/js/dijit/form/templates/VerticalSlider.html create mode 100644 includes/js/dijit/layout/AccordionContainer.js create mode 100644 includes/js/dijit/layout/BorderContainer.js create mode 100644 includes/js/dijit/layout/ContentPane.js create mode 100644 includes/js/dijit/layout/LayoutContainer.js create mode 100644 includes/js/dijit/layout/LinkPane.js create mode 100644 includes/js/dijit/layout/SplitContainer.js create mode 100644 includes/js/dijit/layout/StackContainer.js create mode 100644 includes/js/dijit/layout/TabContainer.js create mode 100644 includes/js/dijit/layout/_LayoutWidget.js create mode 100644 includes/js/dijit/layout/templates/AccordionPane.html create mode 100644 includes/js/dijit/layout/templates/TabContainer.html create mode 100644 includes/js/dijit/layout/templates/TooltipDialog.html create mode 100644 includes/js/dijit/layout/templates/_TabButton.html create mode 100644 includes/js/dijit/nls/ar/common.js create mode 100644 includes/js/dijit/nls/ar/loading.js create mode 100644 includes/js/dijit/nls/common.js create mode 100644 includes/js/dijit/nls/cs/common.js create mode 100644 includes/js/dijit/nls/cs/loading.js create mode 100644 includes/js/dijit/nls/da/common.js create mode 100644 includes/js/dijit/nls/da/loading.js create mode 100644 includes/js/dijit/nls/de/common.js create mode 100644 includes/js/dijit/nls/de/loading.js create mode 100644 includes/js/dijit/nls/dijit-all_ROOT.js create mode 100644 includes/js/dijit/nls/dijit-all_ar.js create mode 100644 includes/js/dijit/nls/dijit-all_cs.js create mode 100644 includes/js/dijit/nls/dijit-all_da.js create mode 100644 includes/js/dijit/nls/dijit-all_de-de.js create mode 100644 includes/js/dijit/nls/dijit-all_de.js create mode 100644 includes/js/dijit/nls/dijit-all_el.js create mode 100644 includes/js/dijit/nls/dijit-all_en-gb.js create mode 100644 includes/js/dijit/nls/dijit-all_en-us.js create mode 100644 includes/js/dijit/nls/dijit-all_en.js create mode 100644 includes/js/dijit/nls/dijit-all_es-es.js create mode 100644 includes/js/dijit/nls/dijit-all_es.js create mode 100644 includes/js/dijit/nls/dijit-all_fi-fi.js create mode 100644 includes/js/dijit/nls/dijit-all_fi.js create mode 100644 includes/js/dijit/nls/dijit-all_fr-fr.js create mode 100644 includes/js/dijit/nls/dijit-all_fr.js create mode 100644 includes/js/dijit/nls/dijit-all_he-il.js create mode 100644 includes/js/dijit/nls/dijit-all_he.js create mode 100644 includes/js/dijit/nls/dijit-all_hu.js create mode 100644 includes/js/dijit/nls/dijit-all_it-it.js create mode 100644 includes/js/dijit/nls/dijit-all_it.js create mode 100644 includes/js/dijit/nls/dijit-all_ja-jp.js create mode 100644 includes/js/dijit/nls/dijit-all_ja.js create mode 100644 includes/js/dijit/nls/dijit-all_ko-kr.js create mode 100644 includes/js/dijit/nls/dijit-all_ko.js create mode 100644 includes/js/dijit/nls/dijit-all_nl-nl.js create mode 100644 includes/js/dijit/nls/dijit-all_nl.js create mode 100644 includes/js/dijit/nls/dijit-all_no.js create mode 100644 includes/js/dijit/nls/dijit-all_pl.js create mode 100644 includes/js/dijit/nls/dijit-all_pt-br.js create mode 100644 includes/js/dijit/nls/dijit-all_pt-pt.js create mode 100644 includes/js/dijit/nls/dijit-all_pt.js create mode 100644 includes/js/dijit/nls/dijit-all_ru.js create mode 100644 includes/js/dijit/nls/dijit-all_sv.js create mode 100644 includes/js/dijit/nls/dijit-all_tr.js create mode 100644 includes/js/dijit/nls/dijit-all_xx.js create mode 100644 includes/js/dijit/nls/dijit-all_zh-cn.js create mode 100644 includes/js/dijit/nls/dijit-all_zh-tw.js create mode 100644 includes/js/dijit/nls/dijit-all_zh.js create mode 100644 includes/js/dijit/nls/el/common.js create mode 100644 includes/js/dijit/nls/el/loading.js create mode 100644 includes/js/dijit/nls/es/common.js create mode 100644 includes/js/dijit/nls/es/loading.js create mode 100644 includes/js/dijit/nls/fi/common.js create mode 100644 includes/js/dijit/nls/fi/loading.js create mode 100644 includes/js/dijit/nls/fr/common.js create mode 100644 includes/js/dijit/nls/fr/loading.js create mode 100644 includes/js/dijit/nls/he/common.js create mode 100644 includes/js/dijit/nls/he/loading.js create mode 100644 includes/js/dijit/nls/hu/common.js create mode 100644 includes/js/dijit/nls/hu/loading.js create mode 100644 includes/js/dijit/nls/it/common.js create mode 100644 includes/js/dijit/nls/it/loading.js create mode 100644 includes/js/dijit/nls/ja/common.js create mode 100644 includes/js/dijit/nls/ja/loading.js create mode 100644 includes/js/dijit/nls/ko/common.js create mode 100644 includes/js/dijit/nls/ko/loading.js create mode 100644 includes/js/dijit/nls/loading.js create mode 100644 includes/js/dijit/nls/nb/common.js create mode 100644 includes/js/dijit/nls/nb/loading.js create mode 100644 includes/js/dijit/nls/nl/common.js create mode 100644 includes/js/dijit/nls/nl/loading.js create mode 100644 includes/js/dijit/nls/pl/common.js create mode 100644 includes/js/dijit/nls/pl/loading.js create mode 100644 includes/js/dijit/nls/pt-pt/common.js create mode 100644 includes/js/dijit/nls/pt-pt/loading.js create mode 100644 includes/js/dijit/nls/pt/common.js create mode 100644 includes/js/dijit/nls/pt/loading.js create mode 100644 includes/js/dijit/nls/ru/common.js create mode 100644 includes/js/dijit/nls/ru/loading.js create mode 100644 includes/js/dijit/nls/sv/common.js create mode 100644 includes/js/dijit/nls/sv/loading.js create mode 100644 includes/js/dijit/nls/tr/common.js create mode 100644 includes/js/dijit/nls/tr/loading.js create mode 100644 includes/js/dijit/nls/zh-tw/common.js create mode 100644 includes/js/dijit/nls/zh-tw/loading.js create mode 100644 includes/js/dijit/nls/zh/common.js create mode 100644 includes/js/dijit/nls/zh/loading.js create mode 100644 includes/js/dijit/resources/_modules.js create mode 100644 includes/js/dijit/templates/Calendar.html create mode 100644 includes/js/dijit/templates/ColorPalette.html create mode 100644 includes/js/dijit/templates/Dialog.html create mode 100644 includes/js/dijit/templates/InlineEditBox.html create mode 100644 includes/js/dijit/templates/ProgressBar.html create mode 100644 includes/js/dijit/templates/TitlePane.html create mode 100644 includes/js/dijit/templates/Tooltip.html create mode 100644 includes/js/dijit/templates/buttons/bg-fade.png create mode 100644 includes/js/dijit/templates/colors3x4.png create mode 100644 includes/js/dijit/templates/colors7x10.png create mode 100644 includes/js/dijit/tests/Container.html create mode 100644 includes/js/dijit/tests/Container.js create mode 100644 includes/js/dijit/tests/_Templated.html create mode 100644 includes/js/dijit/tests/_Templated.js create mode 100644 includes/js/dijit/tests/_altCalendar.html create mode 100644 includes/js/dijit/tests/_base/manager.html create mode 100644 includes/js/dijit/tests/_base/manager.js create mode 100644 includes/js/dijit/tests/_base/test_FocusManager.html create mode 100644 includes/js/dijit/tests/_base/test_focusWidget.html create mode 100644 includes/js/dijit/tests/_base/test_placeStrict.html create mode 100644 includes/js/dijit/tests/_base/test_typematic.html create mode 100644 includes/js/dijit/tests/_base/viewport.html create mode 100644 includes/js/dijit/tests/_base/viewport.js create mode 100644 includes/js/dijit/tests/_base/viewportStrict.html create mode 100644 includes/js/dijit/tests/_base/wai.html create mode 100644 includes/js/dijit/tests/_base/wai.js create mode 100644 includes/js/dijit/tests/_data/categories.json create mode 100644 includes/js/dijit/tests/_data/categoriesNested.json create mode 100644 includes/js/dijit/tests/_data/countries.json create mode 100644 includes/js/dijit/tests/_data/dijits.json create mode 100644 includes/js/dijit/tests/_data/states.json create mode 100644 includes/js/dijit/tests/_data/treeTest.json create mode 100644 includes/js/dijit/tests/_editor/test_6112.html create mode 100644 includes/js/dijit/tests/_editor/test_CustomPlugin.html create mode 100644 includes/js/dijit/tests/_editor/test_RichText.html create mode 100644 includes/js/dijit/tests/_editor/test_ToggleDir.html create mode 100644 includes/js/dijit/tests/_editor/test_richtext.css create mode 100644 includes/js/dijit/tests/_editor/test_richtext.css.commented.css create mode 100644 includes/js/dijit/tests/_programaticTest.html create mode 100644 includes/js/dijit/tests/_testCommon.js create mode 100644 includes/js/dijit/tests/css/dijitTests.css create mode 100644 includes/js/dijit/tests/css/dijitTests.css.commented.css create mode 100644 includes/js/dijit/tests/form/Form.html create mode 100644 includes/js/dijit/tests/form/Form.js create mode 100644 includes/js/dijit/tests/form/images/Alabama.jpg create mode 100644 includes/js/dijit/tests/form/test_Button.html create mode 100644 includes/js/dijit/tests/form/test_CheckBox.html create mode 100644 includes/js/dijit/tests/form/test_ComboBox.html create mode 100644 includes/js/dijit/tests/form/test_ComboBox_destroy.html create mode 100644 includes/js/dijit/tests/form/test_DateTextBox.html create mode 100644 includes/js/dijit/tests/form/test_FilteringSelect.html create mode 100644 includes/js/dijit/tests/form/test_Form_onsubmit.html create mode 100644 includes/js/dijit/tests/form/test_MultiSelect.html create mode 100644 includes/js/dijit/tests/form/test_SimpleTextarea.html create mode 100644 includes/js/dijit/tests/form/test_Slider.html create mode 100644 includes/js/dijit/tests/form/test_Spinner.html create mode 100644 includes/js/dijit/tests/form/test_Textarea.html create mode 100644 includes/js/dijit/tests/form/test_TimeTextBox.html create mode 100644 includes/js/dijit/tests/form/test_validate.html create mode 100644 includes/js/dijit/tests/i18n/README create mode 100644 includes/js/dijit/tests/i18n/currency.html create mode 100644 includes/js/dijit/tests/i18n/date.html create mode 100644 includes/js/dijit/tests/i18n/digit.html create mode 100644 includes/js/dijit/tests/i18n/module.js create mode 100644 includes/js/dijit/tests/i18n/number.html create mode 100644 includes/js/dijit/tests/i18n/test_i18n.js create mode 100644 includes/js/dijit/tests/i18n/textbox.html create mode 100644 includes/js/dijit/tests/i18n/time.html create mode 100644 includes/js/dijit/tests/images/arrowSmall.gif create mode 100644 includes/js/dijit/tests/images/copy.gif create mode 100644 includes/js/dijit/tests/images/cut.gif create mode 100644 includes/js/dijit/tests/images/flatScreen.gif create mode 100644 includes/js/dijit/tests/images/note.gif create mode 100644 includes/js/dijit/tests/images/paste.gif create mode 100644 includes/js/dijit/tests/images/plus.gif create mode 100644 includes/js/dijit/tests/images/testsBodyBg.gif create mode 100644 includes/js/dijit/tests/images/tube.gif create mode 100644 includes/js/dijit/tests/images/tubeTall.gif create mode 100644 includes/js/dijit/tests/layout/ContentPane.html create mode 100644 includes/js/dijit/tests/layout/ContentPane.js create mode 100644 includes/js/dijit/tests/layout/combotab.html create mode 100644 includes/js/dijit/tests/layout/doc0.html create mode 100644 includes/js/dijit/tests/layout/doc1.html create mode 100644 includes/js/dijit/tests/layout/doc2.html create mode 100644 includes/js/dijit/tests/layout/getResponse.php create mode 100644 includes/js/dijit/tests/layout/tab1.html create mode 100644 includes/js/dijit/tests/layout/tab2.html create mode 100644 includes/js/dijit/tests/layout/tab3.html create mode 100644 includes/js/dijit/tests/layout/tab4.html create mode 100644 includes/js/dijit/tests/layout/test_AccordionContainer.html create mode 100644 includes/js/dijit/tests/layout/test_BorderContainer.html create mode 100644 includes/js/dijit/tests/layout/test_BorderContainer_complex.html create mode 100644 includes/js/dijit/tests/layout/test_BorderContainer_experimental.html create mode 100644 includes/js/dijit/tests/layout/test_BorderContainer_full.html create mode 100644 includes/js/dijit/tests/layout/test_BorderContainer_nested.html create mode 100644 includes/js/dijit/tests/layout/test_ContentPane.html create mode 100644 includes/js/dijit/tests/layout/test_LayoutCode.html create mode 100644 includes/js/dijit/tests/layout/test_LayoutContainer.html create mode 100644 includes/js/dijit/tests/layout/test_SplitContainer.html create mode 100644 includes/js/dijit/tests/layout/test_StackContainer.html create mode 100644 includes/js/dijit/tests/layout/test_StackContainer_code.html create mode 100644 includes/js/dijit/tests/layout/test_TabContainer.html create mode 100644 includes/js/dijit/tests/layout/test_TabContainerTitlePane.html create mode 100644 includes/js/dijit/tests/layout/test_TabContainer_noLayout.html create mode 100644 includes/js/dijit/tests/layout/test_TabContainer_remote.html create mode 100644 includes/js/dijit/tests/manualTests.html create mode 100644 includes/js/dijit/tests/manualTests.js create mode 100644 includes/js/dijit/tests/module.js create mode 100644 includes/js/dijit/tests/ondijitclick.html create mode 100644 includes/js/dijit/tests/ondijitclick.js create mode 100644 includes/js/dijit/tests/runTests.html create mode 100644 includes/js/dijit/tests/test.html create mode 100644 includes/js/dijit/tests/test_Calendar.html create mode 100644 includes/js/dijit/tests/test_ColorPalette.html create mode 100644 includes/js/dijit/tests/test_Declaration.html create mode 100644 includes/js/dijit/tests/test_Dialog.html create mode 100644 includes/js/dijit/tests/test_Dialog_focusDestroy.html create mode 100644 includes/js/dijit/tests/test_Editor.html create mode 100644 includes/js/dijit/tests/test_InlineEditBox.html create mode 100644 includes/js/dijit/tests/test_Menu.html create mode 100644 includes/js/dijit/tests/test_ProgressBar.html create mode 100644 includes/js/dijit/tests/test_TitlePane.html create mode 100644 includes/js/dijit/tests/test_Toolbar.html create mode 100644 includes/js/dijit/tests/test_Tooltip.html create mode 100644 includes/js/dijit/tests/test_TooltipDialog.html create mode 100644 includes/js/dijit/tests/test_Tree.html create mode 100644 includes/js/dijit/tests/test_Tree_Notification_API_Support.html create mode 100644 includes/js/dijit/tests/test_instantiate.html create mode 100644 includes/js/dijit/tests/tree/test_Tree_DnD.html create mode 100644 includes/js/dijit/tests/tree/test_Tree_Programmatic.html create mode 100644 includes/js/dijit/tests/tree/test_Tree_v1.html create mode 100644 includes/js/dijit/tests/widgetsInTemplate.html create mode 100644 includes/js/dijit/tests/widgetsInTemplate.js create mode 100644 includes/js/dijit/themes/a11y/README.txt create mode 100644 includes/js/dijit/themes/a11y/indeterminate_progress.gif create mode 100644 includes/js/dijit/themes/dijit.css create mode 100644 includes/js/dijit/themes/dijit.css.commented.css create mode 100644 includes/js/dijit/themes/dijit_rtl.css create mode 100644 includes/js/dijit/themes/dijit_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Calendar.css create mode 100644 includes/js/dijit/themes/nihilo/Calendar.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Calendar_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/Calendar_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/ColorPalette.css create mode 100644 includes/js/dijit/themes/nihilo/ColorPalette.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Common.css create mode 100644 includes/js/dijit/themes/nihilo/Common.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Dialog.css create mode 100644 includes/js/dijit/themes/nihilo/Dialog.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Dialog_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/Dialog_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Editor.css create mode 100644 includes/js/dijit/themes/nihilo/Editor.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Editor_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/Editor_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Menu.css create mode 100644 includes/js/dijit/themes/nihilo/Menu.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Menu_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/Menu_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/ProgressBar.css create mode 100644 includes/js/dijit/themes/nihilo/ProgressBar.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/TitlePane.css create mode 100644 includes/js/dijit/themes/nihilo/TitlePane.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/TitlePane_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/TitlePane_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Toolbar.css create mode 100644 includes/js/dijit/themes/nihilo/Toolbar.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Tree.css create mode 100644 includes/js/dijit/themes/nihilo/Tree.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/Tree_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/Tree_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Button.css create mode 100644 includes/js/dijit/themes/nihilo/form/Button.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Button_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/form/Button_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Checkbox.css create mode 100644 includes/js/dijit/themes/nihilo/form/Checkbox.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/ComboBox.css create mode 100644 includes/js/dijit/themes/nihilo/form/ComboBox.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Common.css create mode 100644 includes/js/dijit/themes/nihilo/form/Common.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Common_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/form/Common_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/RadioButton.css create mode 100644 includes/js/dijit/themes/nihilo/form/RadioButton.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Slider.css create mode 100644 includes/js/dijit/themes/nihilo/form/Slider.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Slider_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/form/Slider_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/Textarea.css create mode 100644 includes/js/dijit/themes/nihilo/form/Textarea.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/form/TimeTextBox.css create mode 100644 includes/js/dijit/themes/nihilo/form/TimeTextBox.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/images/accordionItemActive.png create mode 100644 includes/js/dijit/themes/nihilo/images/buttonActive.png create mode 100644 includes/js/dijit/themes/nihilo/images/buttonDisabled.png create mode 100644 includes/js/dijit/themes/nihilo/images/buttonEnabled.png create mode 100644 includes/js/dijit/themes/nihilo/images/buttonHover.png create mode 100644 includes/js/dijit/themes/nihilo/images/dndCopy.png create mode 100644 includes/js/dijit/themes/nihilo/images/dndMove.png create mode 100644 includes/js/dijit/themes/nihilo/images/dndNoCopy.png create mode 100644 includes/js/dijit/themes/nihilo/images/dndNoMove.png create mode 100644 includes/js/dijit/themes/nihilo/images/editor.gif create mode 100644 includes/js/dijit/themes/nihilo/images/editor_rtl.gif create mode 100644 includes/js/dijit/themes/nihilo/images/no.gif create mode 100644 includes/js/dijit/themes/nihilo/images/preciseSliderThumb.gif create mode 100644 includes/js/dijit/themes/nihilo/images/preciseSliderThumb.png create mode 100644 includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/nihilo/images/preciseSliderThumbFocus.png create mode 100644 includes/js/dijit/themes/nihilo/images/progressBarAnim.gif create mode 100644 includes/js/dijit/themes/nihilo/images/progressBarEmpty.png create mode 100644 includes/js/dijit/themes/nihilo/images/progressBarFull.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderEmpty.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderEmptyVertical.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderFull.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderFullFocus.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderFullVertical.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderFullVerticalFocus.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderThumb.png create mode 100644 includes/js/dijit/themes/nihilo/images/sliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/nihilo/images/sliderThumbFocus.png create mode 100644 includes/js/dijit/themes/nihilo/images/splitContainerSizerH-thumb.png create mode 100644 includes/js/dijit/themes/nihilo/images/splitContainerSizerH.png create mode 100644 includes/js/dijit/themes/nihilo/images/splitContainerSizerV-thumb.png create mode 100644 includes/js/dijit/themes/nihilo/images/splitContainerSizerV.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteArrows.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteArrows.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteCheckbox.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteCheckbox.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteDivIcons.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteDivIcons.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteRadio.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteRadio.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteRoundedIconsSmall.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteTree.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteTree.png create mode 100644 includes/js/dijit/themes/nihilo/images/spriteTree_rtl.gif create mode 100644 includes/js/dijit/themes/nihilo/images/spriteTree_rtl.png create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomActiveC.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomEnabledC.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomHoverC.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabContainerSprite.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabLeftChecked.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabRightChecked.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabStripe.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabStripeBottom.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabStripeLeft.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tabStripeRight.gif create mode 100644 includes/js/dijit/themes/nihilo/images/titleBar.png create mode 100644 includes/js/dijit/themes/nihilo/images/titleBarActive.png create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorDown.png create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorLeft.png create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorRight.png create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.gif create mode 100644 includes/js/dijit/themes/nihilo/images/tooltipConnectorUp.png create mode 100644 includes/js/dijit/themes/nihilo/images/treeExpand_loading.gif create mode 100644 includes/js/dijit/themes/nihilo/images/treeI.gif create mode 100644 includes/js/dijit/themes/nihilo/images/treeI_half.gif create mode 100644 includes/js/dijit/themes/nihilo/images/treeI_half_rtl.gif create mode 100644 includes/js/dijit/themes/nihilo/images/treeI_rtl.gif create mode 100644 includes/js/dijit/themes/nihilo/images/validationInputBg.gif create mode 100644 includes/js/dijit/themes/nihilo/images/validationInputBg.png create mode 100644 includes/js/dijit/themes/nihilo/images/warning.png create mode 100644 includes/js/dijit/themes/nihilo/layout/AccordionContainer.css create mode 100644 includes/js/dijit/themes/nihilo/layout/AccordionContainer.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/layout/AccordionContainer_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/layout/BorderContainer.css create mode 100644 includes/js/dijit/themes/nihilo/layout/BorderContainer.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/layout/SplitContainer.css create mode 100644 includes/js/dijit/themes/nihilo/layout/SplitContainer.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/layout/TabContainer.css create mode 100644 includes/js/dijit/themes/nihilo/layout/TabContainer.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/layout/TabContainer_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/nihilo.css create mode 100644 includes/js/dijit/themes/nihilo/nihilo.css.commented.css create mode 100644 includes/js/dijit/themes/nihilo/nihilo_rtl.css create mode 100644 includes/js/dijit/themes/nihilo/nihilo_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Calendar.css create mode 100644 includes/js/dijit/themes/soria/Calendar.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Calendar_rtl.css create mode 100644 includes/js/dijit/themes/soria/Calendar_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/ColorPalette.css create mode 100644 includes/js/dijit/themes/soria/ColorPalette.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Common.css create mode 100644 includes/js/dijit/themes/soria/Common.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Dialog.css create mode 100644 includes/js/dijit/themes/soria/Dialog.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Dialog_rtl.css create mode 100644 includes/js/dijit/themes/soria/Dialog_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Editor.css create mode 100644 includes/js/dijit/themes/soria/Editor.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Editor_rtl.css create mode 100644 includes/js/dijit/themes/soria/Editor_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Menu.css create mode 100644 includes/js/dijit/themes/soria/Menu.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Menu_rtl.css create mode 100644 includes/js/dijit/themes/soria/Menu_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/ProgressBar.css create mode 100644 includes/js/dijit/themes/soria/ProgressBar.css.commented.css create mode 100644 includes/js/dijit/themes/soria/TitlePane.css create mode 100644 includes/js/dijit/themes/soria/TitlePane.css.commented.css create mode 100644 includes/js/dijit/themes/soria/TitlePane_rtl.css create mode 100644 includes/js/dijit/themes/soria/TitlePane_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Toolbar.css create mode 100644 includes/js/dijit/themes/soria/Toolbar.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Tree.css create mode 100644 includes/js/dijit/themes/soria/Tree.css.commented.css create mode 100644 includes/js/dijit/themes/soria/Tree_rtl.css create mode 100644 includes/js/dijit/themes/soria/Tree_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Button.css create mode 100644 includes/js/dijit/themes/soria/form/Button.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Button_rtl.css create mode 100644 includes/js/dijit/themes/soria/form/Button_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Checkbox.css create mode 100644 includes/js/dijit/themes/soria/form/Checkbox.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/ComboBox.css create mode 100644 includes/js/dijit/themes/soria/form/ComboBox.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Common.css create mode 100644 includes/js/dijit/themes/soria/form/Common.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Common_rtl.css create mode 100644 includes/js/dijit/themes/soria/form/Common_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/RadioButton.css create mode 100644 includes/js/dijit/themes/soria/form/RadioButton.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Slider.css create mode 100644 includes/js/dijit/themes/soria/form/Slider.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Slider_rtl.css create mode 100644 includes/js/dijit/themes/soria/form/Slider_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/Textarea.css create mode 100644 includes/js/dijit/themes/soria/form/Textarea.css.commented.css create mode 100644 includes/js/dijit/themes/soria/form/TimeTextBox.css create mode 100644 includes/js/dijit/themes/soria/form/TimeTextBox.css.commented.css create mode 100644 includes/js/dijit/themes/soria/images/accordionItemActive.gif create mode 100644 includes/js/dijit/themes/soria/images/accordionItemActive.png create mode 100644 includes/js/dijit/themes/soria/images/buttonActive.png create mode 100644 includes/js/dijit/themes/soria/images/buttonDisabled.png create mode 100644 includes/js/dijit/themes/soria/images/buttonEnabled.png create mode 100644 includes/js/dijit/themes/soria/images/buttonHover.png create mode 100644 includes/js/dijit/themes/soria/images/dndCopy.png create mode 100644 includes/js/dijit/themes/soria/images/dndMove.png create mode 100644 includes/js/dijit/themes/soria/images/dndNoCopy.png create mode 100644 includes/js/dijit/themes/soria/images/dndNoMove.png create mode 100644 includes/js/dijit/themes/soria/images/editor.gif create mode 100644 includes/js/dijit/themes/soria/images/editor_rtl.gif create mode 100644 includes/js/dijit/themes/soria/images/preciseSliderThumb.gif create mode 100644 includes/js/dijit/themes/soria/images/preciseSliderThumb.png create mode 100644 includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/soria/images/preciseSliderThumbFocus.png create mode 100644 includes/js/dijit/themes/soria/images/progressBarAnim.gif create mode 100644 includes/js/dijit/themes/soria/images/progressBarEmpty.png create mode 100644 includes/js/dijit/themes/soria/images/progressBarFull.png create mode 100644 includes/js/dijit/themes/soria/images/sliderEmpty.png create mode 100644 includes/js/dijit/themes/soria/images/sliderEmptyVertical.png create mode 100644 includes/js/dijit/themes/soria/images/sliderFull.png create mode 100644 includes/js/dijit/themes/soria/images/sliderFullFocus.png create mode 100644 includes/js/dijit/themes/soria/images/sliderFullVertical.png create mode 100644 includes/js/dijit/themes/soria/images/sliderFullVerticalFocus.png create mode 100644 includes/js/dijit/themes/soria/images/sliderThumb.png create mode 100644 includes/js/dijit/themes/soria/images/sliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/soria/images/sliderThumbFocus.png create mode 100644 includes/js/dijit/themes/soria/images/splitContainerSizerH-thumb.png create mode 100644 includes/js/dijit/themes/soria/images/splitContainerSizerH.png create mode 100644 includes/js/dijit/themes/soria/images/splitContainerSizerV-thumb.png create mode 100644 includes/js/dijit/themes/soria/images/splitContainerSizerV.png create mode 100644 includes/js/dijit/themes/soria/images/spriteArrows.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteArrows.png create mode 100644 includes/js/dijit/themes/soria/images/spriteCheckbox.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteCheckbox.png create mode 100644 includes/js/dijit/themes/soria/images/spriteDivIcons.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteDivIcons.png create mode 100644 includes/js/dijit/themes/soria/images/spriteRadio.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteRadio.png create mode 100644 includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteRoundedIconsSmall.png create mode 100644 includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteRoundedIconsSmallBl.png create mode 100644 includes/js/dijit/themes/soria/images/spriteTree.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteTree.png create mode 100644 includes/js/dijit/themes/soria/images/spriteTree_rtl.gif create mode 100644 includes/js/dijit/themes/soria/images/spriteTree_rtl.png create mode 100644 includes/js/dijit/themes/soria/images/tabBottomActiveC.gif create mode 100644 includes/js/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif create mode 100644 includes/js/dijit/themes/soria/images/tabBottomEnabledC.gif create mode 100644 includes/js/dijit/themes/soria/images/tabBottomEnabledSpriteLR.gif create mode 100644 includes/js/dijit/themes/soria/images/tabBottomHoverC.gif create mode 100644 includes/js/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif create mode 100644 includes/js/dijit/themes/soria/images/tabContainerSprite.gif create mode 100644 includes/js/dijit/themes/soria/images/tabLeftChecked.gif create mode 100644 includes/js/dijit/themes/soria/images/tabRightChecked.gif create mode 100644 includes/js/dijit/themes/soria/images/tabStripe.gif create mode 100644 includes/js/dijit/themes/soria/images/tabStripeBottom.gif create mode 100644 includes/js/dijit/themes/soria/images/tabStripeLeft.gif create mode 100644 includes/js/dijit/themes/soria/images/tabStripeRight.gif create mode 100644 includes/js/dijit/themes/soria/images/titleBar.png create mode 100644 includes/js/dijit/themes/soria/images/titleBarActive.png create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorDown.gif create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorDown.png create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorLeft.gif create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorLeft.png create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorRight.gif create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorRight.png create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorUp.gif create mode 100644 includes/js/dijit/themes/soria/images/tooltipConnectorUp.png create mode 100644 includes/js/dijit/themes/soria/images/treeExpand_loading.gif create mode 100644 includes/js/dijit/themes/soria/images/treeI.gif create mode 100644 includes/js/dijit/themes/soria/images/treeI_half.gif create mode 100644 includes/js/dijit/themes/soria/images/treeI_half_rtl.gif create mode 100644 includes/js/dijit/themes/soria/images/treeI_rtl.gif create mode 100644 includes/js/dijit/themes/soria/images/validationInputBg.gif create mode 100644 includes/js/dijit/themes/soria/images/validationInputBg.png create mode 100644 includes/js/dijit/themes/soria/images/warning.png create mode 100644 includes/js/dijit/themes/soria/layout/AccordionContainer.css create mode 100644 includes/js/dijit/themes/soria/layout/AccordionContainer.css.commented.css create mode 100644 includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css create mode 100644 includes/js/dijit/themes/soria/layout/AccordionContainer_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/layout/BorderContainer.css create mode 100644 includes/js/dijit/themes/soria/layout/BorderContainer.css.commented.css create mode 100644 includes/js/dijit/themes/soria/layout/SplitContainer.css create mode 100644 includes/js/dijit/themes/soria/layout/SplitContainer.css.commented.css create mode 100644 includes/js/dijit/themes/soria/layout/TabContainer.css create mode 100644 includes/js/dijit/themes/soria/layout/TabContainer.css.commented.css create mode 100644 includes/js/dijit/themes/soria/layout/TabContainer_rtl.css create mode 100644 includes/js/dijit/themes/soria/layout/TabContainer_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/soria/soria.css create mode 100644 includes/js/dijit/themes/soria/soria.css.commented.css create mode 100644 includes/js/dijit/themes/soria/soria_rtl.css create mode 100644 includes/js/dijit/themes/soria/soria_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/templateThemeTest.html create mode 100644 includes/js/dijit/themes/themeTester.html create mode 100644 includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif create mode 100644 includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif create mode 100644 includes/js/dijit/themes/themeTesterQuirk.html create mode 100644 includes/js/dijit/themes/tundra/Calendar.css create mode 100644 includes/js/dijit/themes/tundra/Calendar.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Calendar_rtl.css create mode 100644 includes/js/dijit/themes/tundra/Calendar_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/ColorPalette.css create mode 100644 includes/js/dijit/themes/tundra/ColorPalette.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Common.css create mode 100644 includes/js/dijit/themes/tundra/Common.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Dialog.css create mode 100644 includes/js/dijit/themes/tundra/Dialog.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Dialog_rtl.css create mode 100644 includes/js/dijit/themes/tundra/Dialog_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Editor.css create mode 100644 includes/js/dijit/themes/tundra/Editor.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Editor_rtl.css create mode 100644 includes/js/dijit/themes/tundra/Editor_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Menu.css create mode 100644 includes/js/dijit/themes/tundra/Menu.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Menu_rtl.css create mode 100644 includes/js/dijit/themes/tundra/Menu_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/ProgressBar.css create mode 100644 includes/js/dijit/themes/tundra/ProgressBar.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/TitlePane.css create mode 100644 includes/js/dijit/themes/tundra/TitlePane.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/TitlePane_rtl.css create mode 100644 includes/js/dijit/themes/tundra/TitlePane_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Toolbar.css create mode 100644 includes/js/dijit/themes/tundra/Toolbar.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Tree.css create mode 100644 includes/js/dijit/themes/tundra/Tree.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/Tree_rtl.css create mode 100644 includes/js/dijit/themes/tundra/Tree_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/Button.css create mode 100644 includes/js/dijit/themes/tundra/form/Button.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/Checkbox.css create mode 100644 includes/js/dijit/themes/tundra/form/Checkbox.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/Common.css create mode 100644 includes/js/dijit/themes/tundra/form/Common.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/RadioButton.css create mode 100644 includes/js/dijit/themes/tundra/form/RadioButton.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/Slider.css create mode 100644 includes/js/dijit/themes/tundra/form/Slider.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/Slider_rtl.css create mode 100644 includes/js/dijit/themes/tundra/form/Slider_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/form/TextArea.css create mode 100644 includes/js/dijit/themes/tundra/form/TextArea.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/images/accordionItemActive.gif create mode 100644 includes/js/dijit/themes/tundra/images/arrowDown.gif create mode 100644 includes/js/dijit/themes/tundra/images/arrowDown.png create mode 100644 includes/js/dijit/themes/tundra/images/arrowLeft.gif create mode 100644 includes/js/dijit/themes/tundra/images/arrowLeft.png create mode 100644 includes/js/dijit/themes/tundra/images/arrowRight.gif create mode 100644 includes/js/dijit/themes/tundra/images/arrowRight.png create mode 100644 includes/js/dijit/themes/tundra/images/arrowUp.gif create mode 100644 includes/js/dijit/themes/tundra/images/arrowUp.png create mode 100644 includes/js/dijit/themes/tundra/images/buttonActive.png create mode 100644 includes/js/dijit/themes/tundra/images/buttonDisabled.png create mode 100644 includes/js/dijit/themes/tundra/images/buttonEnabled.png create mode 100644 includes/js/dijit/themes/tundra/images/buttonHover.png create mode 100644 includes/js/dijit/themes/tundra/images/calendarDayLabel.png create mode 100644 includes/js/dijit/themes/tundra/images/calendarMonthLabel.png create mode 100644 includes/js/dijit/themes/tundra/images/calendarYearLabel.png create mode 100644 includes/js/dijit/themes/tundra/images/checkboxActive.png create mode 100644 includes/js/dijit/themes/tundra/images/checkboxDisabled.png create mode 100644 includes/js/dijit/themes/tundra/images/checkboxEnabled.png create mode 100644 includes/js/dijit/themes/tundra/images/checkboxHover.png create mode 100644 includes/js/dijit/themes/tundra/images/checkmark.gif create mode 100644 includes/js/dijit/themes/tundra/images/checkmark.png create mode 100644 includes/js/dijit/themes/tundra/images/checkmarkNoBorder.gif create mode 100644 includes/js/dijit/themes/tundra/images/checkmarkNoBorder.png create mode 100644 includes/js/dijit/themes/tundra/images/circleIcon.gif create mode 100644 includes/js/dijit/themes/tundra/images/circleIcon.png create mode 100644 includes/js/dijit/themes/tundra/images/comboArrowDown.gif create mode 100644 includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.gif create mode 100644 includes/js/dijit/themes/tundra/images/dijitProgressBarAnim.psd create mode 100644 includes/js/dijit/themes/tundra/images/dndCopy.png create mode 100644 includes/js/dijit/themes/tundra/images/dndMove.png create mode 100644 includes/js/dijit/themes/tundra/images/dndNoCopy.png create mode 100644 includes/js/dijit/themes/tundra/images/dndNoMove.png create mode 100644 includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.gif create mode 100644 includes/js/dijit/themes/tundra/images/dojoTundraGradientBg.png create mode 100644 includes/js/dijit/themes/tundra/images/doubleArrowDown.png create mode 100644 includes/js/dijit/themes/tundra/images/doubleArrowUp.png create mode 100644 includes/js/dijit/themes/tundra/images/editor.gif create mode 100644 includes/js/dijit/themes/tundra/images/editor_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/folderClosed.gif create mode 100644 includes/js/dijit/themes/tundra/images/folderOpened.gif create mode 100644 includes/js/dijit/themes/tundra/images/i.gif create mode 100644 includes/js/dijit/themes/tundra/images/i_half.gif create mode 100644 includes/js/dijit/themes/tundra/images/i_half_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/i_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/leaf.gif create mode 100644 includes/js/dijit/themes/tundra/images/loading.gif create mode 100644 includes/js/dijit/themes/tundra/images/menu.png create mode 100644 includes/js/dijit/themes/tundra/images/minusButton.gif create mode 100644 includes/js/dijit/themes/tundra/images/no.gif create mode 100644 includes/js/dijit/themes/tundra/images/noX.gif create mode 100644 includes/js/dijit/themes/tundra/images/plusButton.gif create mode 100644 includes/js/dijit/themes/tundra/images/popupMenuBg.gif create mode 100644 includes/js/dijit/themes/tundra/images/preciseSliderThumb.gif create mode 100644 includes/js/dijit/themes/tundra/images/preciseSliderThumb.png create mode 100644 includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/tundra/images/preciseSliderThumbFocus.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-1.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-2.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-3.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-4.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-5.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-6.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-7.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-8.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim-9.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim.gif create mode 100644 includes/js/dijit/themes/tundra/images/progressBarAnim.psd create mode 100644 includes/js/dijit/themes/tundra/images/progressBarEmpty.png create mode 100644 includes/js/dijit/themes/tundra/images/progressBarFull.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonActive.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonActiveDisabled.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonActiveHover.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonDisabled.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonEnabled.png create mode 100644 includes/js/dijit/themes/tundra/images/radioButtonHover.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderEmpty.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderEmptyVertical.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderFull.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderFullFocus.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderFullVertical.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderFullVerticalFocus.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderThumb.png create mode 100644 includes/js/dijit/themes/tundra/images/sliderThumbFocus.gif create mode 100644 includes/js/dijit/themes/tundra/images/sliderThumbFocus.png create mode 100644 includes/js/dijit/themes/tundra/images/smallArrowDown.png create mode 100644 includes/js/dijit/themes/tundra/images/smallArrowUp.png create mode 100644 includes/js/dijit/themes/tundra/images/splitContainerSizerH-thumb.png create mode 100644 includes/js/dijit/themes/tundra/images/splitContainerSizerH.png create mode 100644 includes/js/dijit/themes/tundra/images/splitContainerSizerV-thumb.png create mode 100644 includes/js/dijit/themes/tundra/images/splitContainerSizerV.png create mode 100644 includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.gif create mode 100644 includes/js/dijit/themes/tundra/images/spriteRoundedIconsSmall.png create mode 100644 includes/js/dijit/themes/tundra/images/tabActive.png create mode 100644 includes/js/dijit/themes/tundra/images/tabClose.gif create mode 100644 includes/js/dijit/themes/tundra/images/tabClose.png create mode 100644 includes/js/dijit/themes/tundra/images/tabCloseHover.gif create mode 100644 includes/js/dijit/themes/tundra/images/tabCloseHover.png create mode 100644 includes/js/dijit/themes/tundra/images/tabDisabled.png create mode 100644 includes/js/dijit/themes/tundra/images/tabEnabled.png create mode 100644 includes/js/dijit/themes/tundra/images/tabHover.gif create mode 100644 includes/js/dijit/themes/tundra/images/tabHover.png create mode 100644 includes/js/dijit/themes/tundra/images/titleBar.png create mode 100644 includes/js/dijit/themes/tundra/images/titleBarBg.gif create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorDown.gif create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorDown.png create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.gif create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorLeft.png create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorRight.gif create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorRight.png create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorUp.gif create mode 100644 includes/js/dijit/themes/tundra/images/tooltipConnectorUp.png create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_leaf.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_leaf_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_loading.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_minus.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_minus_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_mius.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_plus.gif create mode 100644 includes/js/dijit/themes/tundra/images/treeExpand_plus_rtl.gif create mode 100644 includes/js/dijit/themes/tundra/images/validationInputBg.gif create mode 100644 includes/js/dijit/themes/tundra/images/validationInputBg.png create mode 100644 includes/js/dijit/themes/tundra/images/warning.png create mode 100644 includes/js/dijit/themes/tundra/layout/AccordionContainer.css create mode 100644 includes/js/dijit/themes/tundra/layout/AccordionContainer.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/layout/BorderContainer.css create mode 100644 includes/js/dijit/themes/tundra/layout/BorderContainer.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/layout/SplitContainer.css create mode 100644 includes/js/dijit/themes/tundra/layout/SplitContainer.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/layout/TabContainer.css create mode 100644 includes/js/dijit/themes/tundra/layout/TabContainer.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css create mode 100644 includes/js/dijit/themes/tundra/layout/TabContainer_rtl.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/tundra.css create mode 100644 includes/js/dijit/themes/tundra/tundra.css.commented.css create mode 100644 includes/js/dijit/themes/tundra/tundra_rtl.css create mode 100644 includes/js/dijit/themes/tundra/tundra_rtl.css.commented.css create mode 100644 includes/js/dojo/AdapterRegistry.js create mode 100644 includes/js/dojo/DeferredList.js create mode 100644 includes/js/dojo/LICENSE create mode 100644 includes/js/dojo/NodeList-fx.js create mode 100644 includes/js/dojo/OpenAjax.js create mode 100644 includes/js/dojo/_base.js create mode 100644 includes/js/dojo/_base/Color.js create mode 100644 includes/js/dojo/_base/Deferred.js create mode 100644 includes/js/dojo/_base/NodeList.js create mode 100644 includes/js/dojo/_base/_loader/bootstrap.js create mode 100644 includes/js/dojo/_base/_loader/hostenv_browser.js create mode 100644 includes/js/dojo/_base/_loader/hostenv_rhino.js create mode 100644 includes/js/dojo/_base/_loader/hostenv_spidermonkey.js create mode 100644 includes/js/dojo/_base/_loader/loader.js create mode 100644 includes/js/dojo/_base/_loader/loader_debug.js create mode 100644 includes/js/dojo/_base/_loader/loader_xd.js create mode 100644 includes/js/dojo/_base/array.js create mode 100644 includes/js/dojo/_base/browser.js create mode 100644 includes/js/dojo/_base/connect.js create mode 100644 includes/js/dojo/_base/declare.js create mode 100644 includes/js/dojo/_base/event.js create mode 100644 includes/js/dojo/_base/fx.js create mode 100644 includes/js/dojo/_base/html.js create mode 100644 includes/js/dojo/_base/json.js create mode 100644 includes/js/dojo/_base/lang.js create mode 100644 includes/js/dojo/_base/query.js create mode 100644 includes/js/dojo/_base/window.js create mode 100644 includes/js/dojo/_base/xhr.js create mode 100644 includes/js/dojo/_firebug/LICENSE create mode 100644 includes/js/dojo/_firebug/errorIcon.png create mode 100644 includes/js/dojo/_firebug/firebug.css create mode 100644 includes/js/dojo/_firebug/firebug.css.commented.css create mode 100644 includes/js/dojo/_firebug/firebug.js create mode 100644 includes/js/dojo/_firebug/infoIcon.png create mode 100644 includes/js/dojo/_firebug/warningIcon.png create mode 100644 includes/js/dojo/back.js create mode 100644 includes/js/dojo/behavior.js create mode 100644 includes/js/dojo/build.txt create mode 100644 includes/js/dojo/cldr/LICENSE create mode 100644 includes/js/dojo/cldr/README create mode 100644 includes/js/dojo/cldr/monetary.js create mode 100644 includes/js/dojo/cldr/nls/currency.js create mode 100644 includes/js/dojo/cldr/nls/de-de/number.js create mode 100644 includes/js/dojo/cldr/nls/de/currency.js create mode 100644 includes/js/dojo/cldr/nls/de/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/de/number.js create mode 100644 includes/js/dojo/cldr/nls/en-au/currency.js create mode 100644 includes/js/dojo/cldr/nls/en-au/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/en-au/number.js create mode 100644 includes/js/dojo/cldr/nls/en-ca/currency.js create mode 100644 includes/js/dojo/cldr/nls/en-ca/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/en-gb/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/en-gb/number.js create mode 100644 includes/js/dojo/cldr/nls/en-us/currency.js create mode 100644 includes/js/dojo/cldr/nls/en-us/number.js create mode 100644 includes/js/dojo/cldr/nls/en/currency.js create mode 100644 includes/js/dojo/cldr/nls/en/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/en/number.js create mode 100644 includes/js/dojo/cldr/nls/es-es/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/es-es/number.js create mode 100644 includes/js/dojo/cldr/nls/es/currency.js create mode 100644 includes/js/dojo/cldr/nls/es/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/es/number.js create mode 100644 includes/js/dojo/cldr/nls/fr/currency.js create mode 100644 includes/js/dojo/cldr/nls/fr/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/fr/number.js create mode 100644 includes/js/dojo/cldr/nls/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/it-it/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/it/currency.js create mode 100644 includes/js/dojo/cldr/nls/it/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/it/number.js create mode 100644 includes/js/dojo/cldr/nls/ja-jp/number.js create mode 100644 includes/js/dojo/cldr/nls/ja/currency.js create mode 100644 includes/js/dojo/cldr/nls/ja/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/ja/number.js create mode 100644 includes/js/dojo/cldr/nls/ko-kr/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/ko-kr/number.js create mode 100644 includes/js/dojo/cldr/nls/ko/currency.js create mode 100644 includes/js/dojo/cldr/nls/ko/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/ko/number.js create mode 100644 includes/js/dojo/cldr/nls/number.js create mode 100644 includes/js/dojo/cldr/nls/pt-br/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/pt/currency.js create mode 100644 includes/js/dojo/cldr/nls/pt/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/pt/number.js create mode 100644 includes/js/dojo/cldr/nls/zh-cn/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/zh-cn/number.js create mode 100644 includes/js/dojo/cldr/nls/zh-tw/currency.js create mode 100644 includes/js/dojo/cldr/nls/zh-tw/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/zh-tw/number.js create mode 100644 includes/js/dojo/cldr/nls/zh/currency.js create mode 100644 includes/js/dojo/cldr/nls/zh/gregorian.js create mode 100644 includes/js/dojo/cldr/nls/zh/number.js create mode 100644 includes/js/dojo/cldr/supplemental.js create mode 100644 includes/js/dojo/colors.js create mode 100644 includes/js/dojo/cookie.js create mode 100644 includes/js/dojo/currency.js create mode 100644 includes/js/dojo/data/ItemFileReadStore.js create mode 100644 includes/js/dojo/data/ItemFileWriteStore.js create mode 100644 includes/js/dojo/data/api/Identity.js create mode 100644 includes/js/dojo/data/api/Notification.js create mode 100644 includes/js/dojo/data/api/Read.js create mode 100644 includes/js/dojo/data/api/Request.js create mode 100644 includes/js/dojo/data/api/Write.js create mode 100644 includes/js/dojo/data/util/filter.js create mode 100644 includes/js/dojo/data/util/simpleFetch.js create mode 100644 includes/js/dojo/data/util/sorter.js create mode 100644 includes/js/dojo/date.js create mode 100644 includes/js/dojo/date/locale.js create mode 100644 includes/js/dojo/date/stamp.js create mode 100644 includes/js/dojo/dnd/Avatar.js create mode 100644 includes/js/dojo/dnd/Container.js create mode 100644 includes/js/dojo/dnd/Manager.js create mode 100644 includes/js/dojo/dnd/Moveable.js create mode 100644 includes/js/dojo/dnd/Mover.js create mode 100644 includes/js/dojo/dnd/Selector.js create mode 100644 includes/js/dojo/dnd/Source.js create mode 100644 includes/js/dojo/dnd/TimedMoveable.js create mode 100644 includes/js/dojo/dnd/autoscroll.js create mode 100644 includes/js/dojo/dnd/common.js create mode 100644 includes/js/dojo/dnd/move.js create mode 100644 includes/js/dojo/dojo.js create mode 100644 includes/js/dojo/dojo.js.uncompressed.js create mode 100644 includes/js/dojo/fx.js create mode 100644 includes/js/dojo/i18n.js create mode 100644 includes/js/dojo/io/iframe.js create mode 100644 includes/js/dojo/io/script.js create mode 100644 includes/js/dojo/jaxer.js create mode 100644 includes/js/dojo/nls/ar/colors.js create mode 100644 includes/js/dojo/nls/colors.js create mode 100644 includes/js/dojo/nls/cs/colors.js create mode 100644 includes/js/dojo/nls/da/colors.js create mode 100644 includes/js/dojo/nls/de/colors.js create mode 100644 includes/js/dojo/nls/el/colors.js create mode 100644 includes/js/dojo/nls/es/colors.js create mode 100644 includes/js/dojo/nls/fi/colors.js create mode 100644 includes/js/dojo/nls/fr/colors.js create mode 100644 includes/js/dojo/nls/he/colors.js create mode 100644 includes/js/dojo/nls/hu/colors.js create mode 100644 includes/js/dojo/nls/it/colors.js create mode 100644 includes/js/dojo/nls/ja/colors.js create mode 100644 includes/js/dojo/nls/ko/colors.js create mode 100644 includes/js/dojo/nls/nb/colors.js create mode 100644 includes/js/dojo/nls/nl/colors.js create mode 100644 includes/js/dojo/nls/pl/colors.js create mode 100644 includes/js/dojo/nls/pt-pt/colors.js create mode 100644 includes/js/dojo/nls/pt/colors.js create mode 100644 includes/js/dojo/nls/ru/colors.js create mode 100644 includes/js/dojo/nls/sv/colors.js create mode 100644 includes/js/dojo/nls/tr/colors.js create mode 100644 includes/js/dojo/nls/zh-tw/colors.js create mode 100644 includes/js/dojo/nls/zh/colors.js create mode 100644 includes/js/dojo/number.js create mode 100644 includes/js/dojo/parser.js create mode 100644 includes/js/dojo/regexp.js create mode 100644 includes/js/dojo/resources/LICENSE create mode 100644 includes/js/dojo/resources/_modules.js create mode 100644 includes/js/dojo/resources/blank.gif create mode 100644 includes/js/dojo/resources/blank.html create mode 100644 includes/js/dojo/resources/dnd.css create mode 100644 includes/js/dojo/resources/dnd.css.commented.css create mode 100644 includes/js/dojo/resources/dojo.css create mode 100644 includes/js/dojo/resources/dojo.css.commented.css create mode 100644 includes/js/dojo/resources/iframe_history.html create mode 100644 includes/js/dojo/resources/images/dndCopy.png create mode 100644 includes/js/dojo/resources/images/dndMove.png create mode 100644 includes/js/dojo/resources/images/dndNoCopy.png create mode 100644 includes/js/dojo/resources/images/dndNoMove.png create mode 100644 includes/js/dojo/rpc/JsonService.js create mode 100644 includes/js/dojo/rpc/JsonpService.js create mode 100644 includes/js/dojo/rpc/RpcService.js create mode 100644 includes/js/dojo/string.js create mode 100644 includes/js/dojo/tests.js create mode 100644 includes/js/dojo/tests/AdapterRegistry.js create mode 100644 includes/js/dojo/tests/DeferredList.js create mode 100644 includes/js/dojo/tests/NodeList-fx.html create mode 100644 includes/js/dojo/tests/TODO create mode 100644 includes/js/dojo/tests/_base.js create mode 100644 includes/js/dojo/tests/_base/Color.js create mode 100644 includes/js/dojo/tests/_base/Deferred.js create mode 100644 includes/js/dojo/tests/_base/NodeList.html create mode 100644 includes/js/dojo/tests/_base/_loader/addLoadEvents.html create mode 100644 includes/js/dojo/tests/_base/_loader/afterOnLoad.html create mode 100644 includes/js/dojo/tests/_base/_loader/bootstrap.js create mode 100644 includes/js/dojo/tests/_base/_loader/getText.txt create mode 100644 includes/js/dojo/tests/_base/_loader/hostenv_browser.js create mode 100644 includes/js/dojo/tests/_base/_loader/hostenv_rhino.js create mode 100644 includes/js/dojo/tests/_base/_loader/hostenv_spidermonkey.js create mode 100644 includes/js/dojo/tests/_base/_loader/loader.js create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scope04.html create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scopeContained.html create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scopeContainedXd.html create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scopeDjConfig.html create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scopeSingle.html create mode 100644 includes/js/dojo/tests/_base/_loader/scope/scopeSingleDaac.html create mode 100644 includes/js/dojo/tests/_base/array.js create mode 100644 includes/js/dojo/tests/_base/connect.js create mode 100644 includes/js/dojo/tests/_base/declare.js create mode 100644 includes/js/dojo/tests/_base/fx.html create mode 100644 includes/js/dojo/tests/_base/fx.js create mode 100644 includes/js/dojo/tests/_base/fx_delay.html create mode 100644 includes/js/dojo/tests/_base/html.html create mode 100644 includes/js/dojo/tests/_base/html.js create mode 100644 includes/js/dojo/tests/_base/html_box.html create mode 100644 includes/js/dojo/tests/_base/html_box_quirks.html create mode 100644 includes/js/dojo/tests/_base/html_quirks.html create mode 100644 includes/js/dojo/tests/_base/html_rtl.html create mode 100644 includes/js/dojo/tests/_base/json.js create mode 100644 includes/js/dojo/tests/_base/lang.js create mode 100644 includes/js/dojo/tests/_base/query.html create mode 100644 includes/js/dojo/tests/_base/query.js create mode 100644 includes/js/dojo/tests/_base/timeout.php create mode 100644 includes/js/dojo/tests/_base/xhr.html create mode 100644 includes/js/dojo/tests/_base/xhr.js create mode 100644 includes/js/dojo/tests/_base/xhrDummyMethod.php create mode 100644 includes/js/dojo/tests/back-hash.js create mode 100644 includes/js/dojo/tests/back.html create mode 100644 includes/js/dojo/tests/back.js create mode 100644 includes/js/dojo/tests/behavior.html create mode 100644 includes/js/dojo/tests/behavior.js create mode 100644 includes/js/dojo/tests/cldr.js create mode 100644 includes/js/dojo/tests/colors.js create mode 100644 includes/js/dojo/tests/cookie.html create mode 100644 includes/js/dojo/tests/cookie.js create mode 100644 includes/js/dojo/tests/currency.js create mode 100644 includes/js/dojo/tests/data.js create mode 100644 includes/js/dojo/tests/data/ItemFileReadStore.js create mode 100644 includes/js/dojo/tests/data/ItemFileWriteStore.js create mode 100644 includes/js/dojo/tests/data/countries.json create mode 100644 includes/js/dojo/tests/data/countries_commentFiltered.json create mode 100644 includes/js/dojo/tests/data/countries_idcollision.json create mode 100644 includes/js/dojo/tests/data/countries_references.json create mode 100644 includes/js/dojo/tests/data/countries_withBoolean.json create mode 100644 includes/js/dojo/tests/data/countries_withDates.json create mode 100644 includes/js/dojo/tests/data/countries_withNull.json create mode 100644 includes/js/dojo/tests/data/countries_withoutid.json create mode 100644 includes/js/dojo/tests/data/data_multitype.json create mode 100644 includes/js/dojo/tests/data/geography_hierarchy_large.json create mode 100644 includes/js/dojo/tests/data/geography_hierarchy_small.json create mode 100644 includes/js/dojo/tests/data/readOnlyItemFileTestTemplates.js create mode 100644 includes/js/dojo/tests/data/reference_integrity.json create mode 100644 includes/js/dojo/tests/data/runTests.html create mode 100644 includes/js/dojo/tests/data/utils.js create mode 100644 includes/js/dojo/tests/date.js create mode 100644 includes/js/dojo/tests/date/locale.js create mode 100644 includes/js/dojo/tests/date/stamp.js create mode 100644 includes/js/dojo/tests/dnd/dndDefault.css create mode 100644 includes/js/dojo/tests/dnd/dndDefault.css.commented.css create mode 100644 includes/js/dojo/tests/dnd/flickr_viewer.html create mode 100644 includes/js/dojo/tests/dnd/test_box_constraints.html create mode 100644 includes/js/dojo/tests/dnd/test_container.html create mode 100644 includes/js/dojo/tests/dnd/test_container_markup.html create mode 100644 includes/js/dojo/tests/dnd/test_custom_constraints.html create mode 100644 includes/js/dojo/tests/dnd/test_dnd.html create mode 100644 includes/js/dojo/tests/dnd/test_dnd_handles.html create mode 100644 includes/js/dojo/tests/dnd/test_form.html create mode 100644 includes/js/dojo/tests/dnd/test_moveable.html create mode 100644 includes/js/dojo/tests/dnd/test_moveable_markup.html create mode 100644 includes/js/dojo/tests/dnd/test_params.html create mode 100644 includes/js/dojo/tests/dnd/test_parent_constraints.html create mode 100644 includes/js/dojo/tests/dnd/test_parent_constraints_margins.html create mode 100644 includes/js/dojo/tests/dnd/test_selector.html create mode 100644 includes/js/dojo/tests/dnd/test_selector_markup.html create mode 100644 includes/js/dojo/tests/dnd/test_timed_moveable.html create mode 100644 includes/js/dojo/tests/fx.html create mode 100644 includes/js/dojo/tests/fx.js create mode 100644 includes/js/dojo/tests/i18n.js create mode 100644 includes/js/dojo/tests/io/iframe.html create mode 100644 includes/js/dojo/tests/io/iframe.js create mode 100644 includes/js/dojo/tests/io/iframeResponse.html create mode 100644 includes/js/dojo/tests/io/iframeResponse.js.html create mode 100644 includes/js/dojo/tests/io/iframeResponse.json.html create mode 100644 includes/js/dojo/tests/io/iframeResponse.text.html create mode 100644 includes/js/dojo/tests/io/iframeUploadTest.html create mode 100644 includes/js/dojo/tests/io/script.html create mode 100644 includes/js/dojo/tests/io/script.js create mode 100644 includes/js/dojo/tests/io/scriptJsonp.js create mode 100644 includes/js/dojo/tests/io/scriptSimple.js create mode 100644 includes/js/dojo/tests/io/scriptTimeout.html create mode 100644 includes/js/dojo/tests/io/upload.cgi create mode 100644 includes/js/dojo/tests/manualTests.html create mode 100644 includes/js/dojo/tests/manualTests.js create mode 100644 includes/js/dojo/tests/module.js create mode 100644 includes/js/dojo/tests/nls/ar/salutations.js create mode 100644 includes/js/dojo/tests/nls/cs/salutations.js create mode 100644 includes/js/dojo/tests/nls/de/salutations.js create mode 100644 includes/js/dojo/tests/nls/el/salutations.js create mode 100644 includes/js/dojo/tests/nls/en-au/salutations.js create mode 100644 includes/js/dojo/tests/nls/en-us-hawaii/salutations.js create mode 100644 includes/js/dojo/tests/nls/en-us-new_york-brooklyn/salutations.js create mode 100644 includes/js/dojo/tests/nls/en-us-texas/salutations.js create mode 100644 includes/js/dojo/tests/nls/es/salutations.js create mode 100644 includes/js/dojo/tests/nls/fa/salutations.js create mode 100644 includes/js/dojo/tests/nls/fr/salutations.js create mode 100644 includes/js/dojo/tests/nls/he/salutations.js create mode 100644 includes/js/dojo/tests/nls/hi/salutations.js create mode 100644 includes/js/dojo/tests/nls/it/salutations.js create mode 100644 includes/js/dojo/tests/nls/ja/salutations.js create mode 100644 includes/js/dojo/tests/nls/ko/salutations.js create mode 100644 includes/js/dojo/tests/nls/pl/salutations.js create mode 100644 includes/js/dojo/tests/nls/pt/salutations.js create mode 100644 includes/js/dojo/tests/nls/ru/salutations.js create mode 100644 includes/js/dojo/tests/nls/salutations.js create mode 100644 includes/js/dojo/tests/nls/sw/salutations.js create mode 100644 includes/js/dojo/tests/nls/th/salutations.js create mode 100644 includes/js/dojo/tests/nls/tr/salutations.js create mode 100644 includes/js/dojo/tests/nls/yi/salutations.js create mode 100644 includes/js/dojo/tests/nls/zh-cn/salutations.js create mode 100644 includes/js/dojo/tests/nls/zh-tw/salutations.js create mode 100644 includes/js/dojo/tests/number.js create mode 100644 includes/js/dojo/tests/parser.html create mode 100644 includes/js/dojo/tests/parser.js create mode 100644 includes/js/dojo/tests/resources/ApplicationState.js create mode 100644 includes/js/dojo/tests/resources/JSON.php create mode 100644 includes/js/dojo/tests/resources/testClass.php create mode 100644 includes/js/dojo/tests/resources/testClass.smd create mode 100644 includes/js/dojo/tests/resources/test_JsonRPCMediator.php create mode 100644 includes/js/dojo/tests/resources/test_css.html create mode 100644 includes/js/dojo/tests/resources/yahoo_smd_v1.smd create mode 100644 includes/js/dojo/tests/rpc.js create mode 100644 includes/js/dojo/tests/runTests.html create mode 100644 includes/js/dojo/tests/string.js create mode 100644 includes/js/dojo/tests/test_FirebugLite.html create mode 100644 includes/js/dojo/tests/test_FirebugLitePopup.html create mode 100644 includes/js/dojo/tests/test_fx.html create mode 100644 includes/js/dojox/LICENSE create mode 100644 includes/js/dojox/_sql/LICENSE create mode 100644 includes/js/dojox/_sql/_crypto.js create mode 100644 includes/js/dojox/_sql/common.js create mode 100644 includes/js/dojox/_sql/demos/customers/customers.html create mode 100644 includes/js/dojox/analytics.js create mode 100644 includes/js/dojox/analytics/README create mode 100644 includes/js/dojox/analytics/_base.js create mode 100644 includes/js/dojox/analytics/logger/JSON.php create mode 100644 includes/js/dojox/analytics/logger/dojoxAnalytics.php create mode 100644 includes/js/dojox/analytics/plugins/consoleMessages.js create mode 100644 includes/js/dojox/analytics/plugins/dojo.js create mode 100644 includes/js/dojox/analytics/plugins/idle.js create mode 100644 includes/js/dojox/analytics/plugins/mouseClick.js create mode 100644 includes/js/dojox/analytics/plugins/mouseOver.js create mode 100644 includes/js/dojox/analytics/plugins/window.js create mode 100644 includes/js/dojox/analytics/profiles/analytics.profile.js create mode 100644 includes/js/dojox/analytics/profiles/analyticsInBase.profile.js create mode 100644 includes/js/dojox/analytics/tests/test_analytics.html create mode 100644 includes/js/dojox/av.js create mode 100644 includes/js/dojox/av/README create mode 100644 includes/js/dojox/av/_base.js create mode 100644 includes/js/dojox/av/_base/_ieFlash.js create mode 100644 includes/js/dojox/av/_base/flash.js create mode 100644 includes/js/dojox/av/_base/quicktime.js create mode 100644 includes/js/dojox/av/resources/version.mov create mode 100644 includes/js/dojox/av/tests/flash.html create mode 100644 includes/js/dojox/av/tests/quicktime.html create mode 100644 includes/js/dojox/av/tests/resources/hfp.swf create mode 100644 includes/js/dojox/charting/Chart2D.js create mode 100644 includes/js/dojox/charting/Chart3D.js create mode 100644 includes/js/dojox/charting/Element.js create mode 100644 includes/js/dojox/charting/README create mode 100644 includes/js/dojox/charting/Series.js create mode 100644 includes/js/dojox/charting/Theme.js create mode 100644 includes/js/dojox/charting/_color.js create mode 100644 includes/js/dojox/charting/axis2d/Base.js create mode 100644 includes/js/dojox/charting/axis2d/Default.js create mode 100644 includes/js/dojox/charting/axis2d/common.js create mode 100644 includes/js/dojox/charting/plot2d/Areas.js create mode 100644 includes/js/dojox/charting/plot2d/Bars.js create mode 100644 includes/js/dojox/charting/plot2d/Base.js create mode 100644 includes/js/dojox/charting/plot2d/ClusteredBars.js create mode 100644 includes/js/dojox/charting/plot2d/ClusteredColumns.js create mode 100644 includes/js/dojox/charting/plot2d/Columns.js create mode 100644 includes/js/dojox/charting/plot2d/Default.js create mode 100644 includes/js/dojox/charting/plot2d/Grid.js create mode 100644 includes/js/dojox/charting/plot2d/Lines.js create mode 100644 includes/js/dojox/charting/plot2d/Markers.js create mode 100644 includes/js/dojox/charting/plot2d/MarkersOnly.js create mode 100644 includes/js/dojox/charting/plot2d/Pie.js create mode 100644 includes/js/dojox/charting/plot2d/Scatter.js create mode 100644 includes/js/dojox/charting/plot2d/Stacked.js create mode 100644 includes/js/dojox/charting/plot2d/StackedAreas.js create mode 100644 includes/js/dojox/charting/plot2d/StackedBars.js create mode 100644 includes/js/dojox/charting/plot2d/StackedColumns.js create mode 100644 includes/js/dojox/charting/plot2d/StackedLines.js create mode 100644 includes/js/dojox/charting/plot2d/common.js create mode 100644 includes/js/dojox/charting/plot3d/Bars.js create mode 100644 includes/js/dojox/charting/plot3d/Base.js create mode 100644 includes/js/dojox/charting/plot3d/Cylinders.js create mode 100644 includes/js/dojox/charting/scaler.js create mode 100644 includes/js/dojox/charting/tests/Theme.js create mode 100644 includes/js/dojox/charting/tests/_color.js create mode 100644 includes/js/dojox/charting/tests/charting.js create mode 100644 includes/js/dojox/charting/tests/data/goog_prices.csv create mode 100644 includes/js/dojox/charting/tests/data/msft_prices.csv create mode 100644 includes/js/dojox/charting/tests/data/yahoo_prices.csv create mode 100644 includes/js/dojox/charting/tests/runTests.html create mode 100644 includes/js/dojox/charting/tests/test_bars.html create mode 100644 includes/js/dojox/charting/tests/test_chart2d.html create mode 100644 includes/js/dojox/charting/tests/test_chart2d_updating.html create mode 100644 includes/js/dojox/charting/tests/test_cylinders.html create mode 100644 includes/js/dojox/charting/tests/test_labels2d.html create mode 100644 includes/js/dojox/charting/tests/test_pie2d.html create mode 100644 includes/js/dojox/charting/tests/test_scaler.html create mode 100644 includes/js/dojox/charting/tests/test_sparklines.html create mode 100644 includes/js/dojox/charting/tests/test_widget2d.html create mode 100644 includes/js/dojox/charting/themes/ET/greys.js create mode 100644 includes/js/dojox/charting/themes/GreySkies.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/README create mode 100644 includes/js/dojox/charting/themes/PlotKit/blue.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/cyan.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/green.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/orange.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/purple.js create mode 100644 includes/js/dojox/charting/themes/PlotKit/red.js create mode 100644 includes/js/dojox/charting/widget/Chart2D.js create mode 100644 includes/js/dojox/collections.js create mode 100644 includes/js/dojox/collections/ArrayList.js create mode 100644 includes/js/dojox/collections/BinaryTree.js create mode 100644 includes/js/dojox/collections/Dictionary.js create mode 100644 includes/js/dojox/collections/Queue.js create mode 100644 includes/js/dojox/collections/README create mode 100644 includes/js/dojox/collections/Set.js create mode 100644 includes/js/dojox/collections/SortedList.js create mode 100644 includes/js/dojox/collections/Stack.js create mode 100644 includes/js/dojox/collections/_base.js create mode 100644 includes/js/dojox/collections/tests/ArrayList.js create mode 100644 includes/js/dojox/collections/tests/BinaryTree.js create mode 100644 includes/js/dojox/collections/tests/Dictionary.js create mode 100644 includes/js/dojox/collections/tests/Queue.js create mode 100644 includes/js/dojox/collections/tests/Set.js create mode 100644 includes/js/dojox/collections/tests/SortedList.js create mode 100644 includes/js/dojox/collections/tests/Stack.js create mode 100644 includes/js/dojox/collections/tests/_base.js create mode 100644 includes/js/dojox/collections/tests/collections.js create mode 100644 includes/js/dojox/collections/tests/runTests.html create mode 100644 includes/js/dojox/color.js create mode 100644 includes/js/dojox/color/Colorspace.js create mode 100644 includes/js/dojox/color/Generator.js create mode 100644 includes/js/dojox/color/README create mode 100644 includes/js/dojox/color/_base.js create mode 100644 includes/js/dojox/color/tests/Generator.js create mode 100644 includes/js/dojox/color/tests/_base.js create mode 100644 includes/js/dojox/color/tests/color.js create mode 100644 includes/js/dojox/color/tests/runTests.html create mode 100644 includes/js/dojox/cometd.js create mode 100644 includes/js/dojox/cometd/README create mode 100644 includes/js/dojox/cometd/_base.js create mode 100644 includes/js/dojox/cometd/timestamp.js create mode 100644 includes/js/dojox/cometd/timesync.js create mode 100644 includes/js/dojox/crypto.js create mode 100644 includes/js/dojox/crypto/Blowfish.js create mode 100644 includes/js/dojox/crypto/MD5.js create mode 100644 includes/js/dojox/crypto/README create mode 100644 includes/js/dojox/crypto/_base.js create mode 100644 includes/js/dojox/data/AtomReadStore.js create mode 100644 includes/js/dojox/data/CsvStore.js create mode 100644 includes/js/dojox/data/FlickrRestStore.js create mode 100644 includes/js/dojox/data/FlickrStore.js create mode 100644 includes/js/dojox/data/HtmlStore.js create mode 100644 includes/js/dojox/data/HtmlTableStore.js create mode 100644 includes/js/dojox/data/KeyValueStore.js create mode 100644 includes/js/dojox/data/OpmlStore.js create mode 100644 includes/js/dojox/data/PicasaStore.js create mode 100644 includes/js/dojox/data/QueryReadStore.js create mode 100644 includes/js/dojox/data/README create mode 100644 includes/js/dojox/data/SnapLogicStore.js create mode 100644 includes/js/dojox/data/XmlStore.js create mode 100644 includes/js/dojox/data/demos/demo_DataDemoTable.html create mode 100644 includes/js/dojox/data/demos/demo_FlickrRestStore.html create mode 100644 includes/js/dojox/data/demos/demo_FlickrStore.html create mode 100644 includes/js/dojox/data/demos/demo_LazyLoad.html create mode 100644 includes/js/dojox/data/demos/demo_MultiStores.html create mode 100644 includes/js/dojox/data/demos/demo_PicasaStore.html create mode 100644 includes/js/dojox/data/demos/demo_QueryReadStore_ComboBox.html create mode 100644 includes/js/dojox/data/demos/demo_QueryReadStore_FilteringSelect.html create mode 100644 includes/js/dojox/data/demos/demo_QueryReadStore_grid.html create mode 100644 includes/js/dojox/data/demos/flickrDemo.css create mode 100644 includes/js/dojox/data/demos/flickrDemo.css.commented.css create mode 100644 includes/js/dojox/data/demos/geography.json create mode 100644 includes/js/dojox/data/demos/geography.xml create mode 100644 includes/js/dojox/data/demos/geography/Argentina/data.json create mode 100644 includes/js/dojox/data/demos/geography/Brazil/data.json create mode 100644 includes/js/dojox/data/demos/geography/Canada/Ottawa/data.json create mode 100644 includes/js/dojox/data/demos/geography/Canada/Toronto/data.json create mode 100644 includes/js/dojox/data/demos/geography/Canada/data.json create mode 100644 includes/js/dojox/data/demos/geography/China/data.json create mode 100644 includes/js/dojox/data/demos/geography/Commonwealth of Australia/data.json create mode 100644 includes/js/dojox/data/demos/geography/Egypt/data.json create mode 100644 includes/js/dojox/data/demos/geography/France/data.json create mode 100644 includes/js/dojox/data/demos/geography/Germany/data.json create mode 100644 includes/js/dojox/data/demos/geography/India/data.json create mode 100644 includes/js/dojox/data/demos/geography/Italy/data.json create mode 100644 includes/js/dojox/data/demos/geography/Kenya/Mombasa/data.json create mode 100644 includes/js/dojox/data/demos/geography/Kenya/Nairobi/data.json create mode 100644 includes/js/dojox/data/demos/geography/Kenya/data.json create mode 100644 includes/js/dojox/data/demos/geography/Mexico/Guadalajara/data.json create mode 100644 includes/js/dojox/data/demos/geography/Mexico/Mexico City/data.json create mode 100644 includes/js/dojox/data/demos/geography/Mexico/data.json create mode 100644 includes/js/dojox/data/demos/geography/Mongolia/data.json create mode 100644 includes/js/dojox/data/demos/geography/Russia/data.json create mode 100644 includes/js/dojox/data/demos/geography/Spain/data.json create mode 100644 includes/js/dojox/data/demos/geography/Sudan/Khartoum/data.json create mode 100644 includes/js/dojox/data/demos/geography/Sudan/data.json create mode 100644 includes/js/dojox/data/demos/geography/United States of America/data.json create mode 100644 includes/js/dojox/data/demos/geography/root.json create mode 100644 includes/js/dojox/data/demos/picasaDemo.css create mode 100644 includes/js/dojox/data/demos/picasaDemo.css.commented.css create mode 100644 includes/js/dojox/data/demos/stores/LazyLoadJSIStore.js create mode 100644 includes/js/dojox/data/demos/widgets/FlickrView.js create mode 100644 includes/js/dojox/data/demos/widgets/FlickrViewList.js create mode 100644 includes/js/dojox/data/demos/widgets/PicasaView.js create mode 100644 includes/js/dojox/data/demos/widgets/PicasaViewList.js create mode 100644 includes/js/dojox/data/demos/widgets/templates/FlickrView.html create mode 100644 includes/js/dojox/data/demos/widgets/templates/FlickrViewList.html create mode 100644 includes/js/dojox/data/demos/widgets/templates/PicasaView.html create mode 100644 includes/js/dojox/data/demos/widgets/templates/PicasaViewList.html create mode 100644 includes/js/dojox/data/dom.js create mode 100644 includes/js/dojox/data/jsonPathStore.js create mode 100644 includes/js/dojox/data/tests/QueryReadStore.html create mode 100644 includes/js/dojox/data/tests/dom.js create mode 100644 includes/js/dojox/data/tests/ml/divList.html create mode 100644 includes/js/dojox/data/tests/ml/orderedList.html create mode 100644 includes/js/dojox/data/tests/ml/table.html create mode 100644 includes/js/dojox/data/tests/ml/test_HtmlStore_declaratively.html create mode 100644 includes/js/dojox/data/tests/ml/test_HtmlStore_remote.html create mode 100644 includes/js/dojox/data/tests/ml/test_HtmlTableStore_declaratively.html create mode 100644 includes/js/dojox/data/tests/ml/unorderedList.html create mode 100644 includes/js/dojox/data/tests/module.js create mode 100644 includes/js/dojox/data/tests/runTests.html create mode 100644 includes/js/dojox/data/tests/stores/AtomReadStore.js create mode 100644 includes/js/dojox/data/tests/stores/CsvStore.js create mode 100644 includes/js/dojox/data/tests/stores/FlickrRestStore.js create mode 100644 includes/js/dojox/data/tests/stores/FlickrStore.js create mode 100644 includes/js/dojox/data/tests/stores/HtmlStore.js create mode 100644 includes/js/dojox/data/tests/stores/HtmlTableStore.js create mode 100644 includes/js/dojox/data/tests/stores/KeyValueStore.js create mode 100644 includes/js/dojox/data/tests/stores/OpmlStore.js create mode 100644 includes/js/dojox/data/tests/stores/QueryReadStore.js create mode 100644 includes/js/dojox/data/tests/stores/QueryReadStore.php create mode 100644 includes/js/dojox/data/tests/stores/SnapLogicStore.js create mode 100644 includes/js/dojox/data/tests/stores/XmlStore.js create mode 100644 includes/js/dojox/data/tests/stores/atom1.xml create mode 100644 includes/js/dojox/data/tests/stores/books.html create mode 100644 includes/js/dojox/data/tests/stores/books.xml create mode 100644 includes/js/dojox/data/tests/stores/books2.html create mode 100644 includes/js/dojox/data/tests/stores/books2.xml create mode 100644 includes/js/dojox/data/tests/stores/books3.html create mode 100644 includes/js/dojox/data/tests/stores/books3.xml create mode 100644 includes/js/dojox/data/tests/stores/books_isbnAttr.xml create mode 100644 includes/js/dojox/data/tests/stores/books_isbnAttr2.xml create mode 100644 includes/js/dojox/data/tests/stores/geography.xml create mode 100644 includes/js/dojox/data/tests/stores/geography_withspeciallabel.xml create mode 100644 includes/js/dojox/data/tests/stores/jsonPathStore.js create mode 100644 includes/js/dojox/data/tests/stores/movies.csv create mode 100644 includes/js/dojox/data/tests/stores/movies2.csv create mode 100644 includes/js/dojox/data/tests/stores/patterns.csv create mode 100644 includes/js/dojox/data/tests/stores/properties.js create mode 100644 includes/js/dojox/data/tests/stores/snap_pipeline.php create mode 100644 includes/js/dojox/data/tests/test_Tree_vs_jsonPathStore.html create mode 100644 includes/js/dojox/data/tests/treeTest.json create mode 100644 includes/js/dojox/date/README create mode 100644 includes/js/dojox/date/php.js create mode 100644 includes/js/dojox/date/posix.js create mode 100644 includes/js/dojox/date/tests/module.js create mode 100644 includes/js/dojox/date/tests/posix.js create mode 100644 includes/js/dojox/date/tests/runTests.html create mode 100644 includes/js/dojox/dtl.js create mode 100644 includes/js/dojox/dtl/Context.js create mode 100644 includes/js/dojox/dtl/README create mode 100644 includes/js/dojox/dtl/_HtmlTemplated.js create mode 100644 includes/js/dojox/dtl/_Templated.js create mode 100644 includes/js/dojox/dtl/_base.js create mode 100644 includes/js/dojox/dtl/contrib/data.js create mode 100644 includes/js/dojox/dtl/contrib/dijit.js create mode 100644 includes/js/dojox/dtl/contrib/html.js create mode 100644 includes/js/dojox/dtl/contrib/objects.js create mode 100644 includes/js/dojox/dtl/demos/demo_Animation.html create mode 100644 includes/js/dojox/dtl/demos/demo_Blog.html create mode 100644 includes/js/dojox/dtl/demos/demo_Data.html create mode 100644 includes/js/dojox/dtl/demos/demo_Dijitless.html create mode 100644 includes/js/dojox/dtl/demos/demo_Events.html create mode 100644 includes/js/dojox/dtl/demos/demo_HtmlTemplated.html create mode 100644 includes/js/dojox/dtl/demos/demo_Inline.html create mode 100644 includes/js/dojox/dtl/demos/demo_NodeList.html create mode 100644 includes/js/dojox/dtl/demos/demo_Table.html create mode 100644 includes/js/dojox/dtl/demos/demo_Templated.html create mode 100644 includes/js/dojox/dtl/demos/demo_Tree.html create mode 100644 includes/js/dojox/dtl/demos/json/blog/get_blog_1.json create mode 100644 includes/js/dojox/dtl/demos/json/blog/get_blog_3.json create mode 100644 includes/js/dojox/dtl/demos/json/blog/get_blog_list.json create mode 100644 includes/js/dojox/dtl/demos/json/blog/get_page_about.json create mode 100644 includes/js/dojox/dtl/demos/json/fruit.json create mode 100644 includes/js/dojox/dtl/demos/json/morefruit.json create mode 100644 includes/js/dojox/dtl/demos/templates/animation.html create mode 100644 includes/js/dojox/dtl/demos/templates/blog_base.html create mode 100644 includes/js/dojox/dtl/demos/templates/blog_detail.html create mode 100644 includes/js/dojox/dtl/demos/templates/blog_list.html create mode 100644 includes/js/dojox/dtl/demos/templates/blog_page.html create mode 100644 includes/js/dojox/dtl/demos/templates/countrychildren.html create mode 100644 includes/js/dojox/dtl/demos/templates/gallery.html create mode 100644 includes/js/dojox/dtl/demos/templates/nodelist.html create mode 100644 includes/js/dojox/dtl/ext-dojo/NodeList.js create mode 100644 includes/js/dojox/dtl/filter/dates.js create mode 100644 includes/js/dojox/dtl/filter/htmlstrings.js create mode 100644 includes/js/dojox/dtl/filter/integers.js create mode 100644 includes/js/dojox/dtl/filter/lists.js create mode 100644 includes/js/dojox/dtl/filter/logic.js create mode 100644 includes/js/dojox/dtl/filter/misc.js create mode 100644 includes/js/dojox/dtl/filter/strings.js create mode 100644 includes/js/dojox/dtl/html.js create mode 100644 includes/js/dojox/dtl/render/html.js create mode 100644 includes/js/dojox/dtl/tag/date.js create mode 100644 includes/js/dojox/dtl/tag/loader.js create mode 100644 includes/js/dojox/dtl/tag/logic.js create mode 100644 includes/js/dojox/dtl/tag/loop.js create mode 100644 includes/js/dojox/dtl/tag/misc.js create mode 100644 includes/js/dojox/dtl/tests/context.js create mode 100644 includes/js/dojox/dtl/tests/demo_Templated_Jaxer.html create mode 100644 includes/js/dojox/dtl/tests/html/buffer.js create mode 100644 includes/js/dojox/dtl/tests/html/tag.js create mode 100644 includes/js/dojox/dtl/tests/html/util.js create mode 100644 includes/js/dojox/dtl/tests/module.js create mode 100644 includes/js/dojox/dtl/tests/runTests.html create mode 100644 includes/js/dojox/dtl/tests/templates/hello.html create mode 100644 includes/js/dojox/dtl/tests/templates/pocket.html create mode 100644 includes/js/dojox/dtl/tests/templates/pocket2.html create mode 100644 includes/js/dojox/dtl/tests/text/filter.js create mode 100644 includes/js/dojox/dtl/tests/text/load.js create mode 100644 includes/js/dojox/dtl/tests/text/tag.js create mode 100644 includes/js/dojox/dtl/utils/date.js create mode 100644 includes/js/dojox/encoding/LICENSE create mode 100644 includes/js/dojox/encoding/README create mode 100644 includes/js/dojox/encoding/_base.js create mode 100644 includes/js/dojox/encoding/ascii85.js create mode 100644 includes/js/dojox/encoding/base64.js create mode 100644 includes/js/dojox/encoding/bits.js create mode 100644 includes/js/dojox/encoding/compression/lzw.js create mode 100644 includes/js/dojox/encoding/compression/splay.js create mode 100644 includes/js/dojox/encoding/crypto/Blowfish.js create mode 100644 includes/js/dojox/encoding/crypto/_base.js create mode 100644 includes/js/dojox/encoding/digests/MD5.js create mode 100644 includes/js/dojox/encoding/digests/_base.js create mode 100644 includes/js/dojox/encoding/easy64.js create mode 100644 includes/js/dojox/encoding/tests/ascii85.js create mode 100644 includes/js/dojox/encoding/tests/bits.js create mode 100644 includes/js/dojox/encoding/tests/compression/_base.js create mode 100644 includes/js/dojox/encoding/tests/compression/colors.js create mode 100644 includes/js/dojox/encoding/tests/compression/colors2.html create mode 100644 includes/js/dojox/encoding/tests/compression/colors2.js create mode 100644 includes/js/dojox/encoding/tests/compression/colors3.html create mode 100644 includes/js/dojox/encoding/tests/compression/colors3.js create mode 100644 includes/js/dojox/encoding/tests/compression/lzw.js create mode 100644 includes/js/dojox/encoding/tests/compression/runTests.html create mode 100644 includes/js/dojox/encoding/tests/compression/splay.js create mode 100644 includes/js/dojox/encoding/tests/compression/test.html create mode 100644 includes/js/dojox/encoding/tests/compression/vq.html create mode 100644 includes/js/dojox/encoding/tests/crypto/Blowfish.js create mode 100644 includes/js/dojox/encoding/tests/crypto/_base.js create mode 100644 includes/js/dojox/encoding/tests/crypto/runTests.html create mode 100644 includes/js/dojox/encoding/tests/digests/MD5.js create mode 100644 includes/js/dojox/encoding/tests/digests/_base.js create mode 100644 includes/js/dojox/encoding/tests/digests/runTests.html create mode 100644 includes/js/dojox/encoding/tests/easy64.js create mode 100644 includes/js/dojox/encoding/tests/encoding.js create mode 100644 includes/js/dojox/encoding/tests/runTests.html create mode 100644 includes/js/dojox/flash.js create mode 100644 includes/js/dojox/flash/DojoExternalInterface.as create mode 100644 includes/js/dojox/flash/ExpressInstall.as create mode 100644 includes/js/dojox/flash/README create mode 100644 includes/js/dojox/flash/_base.js create mode 100644 includes/js/dojox/flash/tests/TestFlash.as create mode 100644 includes/js/dojox/flash/tests/TestFlash.swf create mode 100644 includes/js/dojox/flash/tests/buildFlashTest.sh create mode 100644 includes/js/dojox/flash/tests/test_flash.html create mode 100644 includes/js/dojox/flash/tests/test_flash.js create mode 100644 includes/js/dojox/form/CheckedMultiSelect.js create mode 100644 includes/js/dojox/form/DropDownSelect.js create mode 100644 includes/js/dojox/form/PasswordValidator.js create mode 100644 includes/js/dojox/form/README create mode 100644 includes/js/dojox/form/nls/PasswordValidator.js create mode 100644 includes/js/dojox/form/resources/CheckedMultiSelect.css create mode 100644 includes/js/dojox/form/resources/CheckedMultiSelect.css.commented.css create mode 100644 includes/js/dojox/form/resources/CheckedMultiSelect.html create mode 100644 includes/js/dojox/form/resources/DropDownSelect.css create mode 100644 includes/js/dojox/form/resources/DropDownSelect.css.commented.css create mode 100644 includes/js/dojox/form/resources/PasswordValidator.html create mode 100644 includes/js/dojox/form/resources/_CheckedMultiSelectItem.html create mode 100644 includes/js/dojox/form/tests/test_CheckedMultiSelect.html create mode 100644 includes/js/dojox/form/tests/test_DropDownSelect.html create mode 100644 includes/js/dojox/form/tests/test_PasswordValidator.html create mode 100644 includes/js/dojox/fx.js create mode 100644 includes/js/dojox/fx/README create mode 100644 includes/js/dojox/fx/Shadow.js create mode 100644 includes/js/dojox/fx/_arg.js create mode 100644 includes/js/dojox/fx/_base.js create mode 100644 includes/js/dojox/fx/_core.js create mode 100644 includes/js/dojox/fx/easing.js create mode 100644 includes/js/dojox/fx/ext-dojo/NodeList.js create mode 100644 includes/js/dojox/fx/resources/shadowB.png create mode 100644 includes/js/dojox/fx/resources/shadowBL.png create mode 100644 includes/js/dojox/fx/resources/shadowBR.png create mode 100644 includes/js/dojox/fx/resources/shadowL.png create mode 100644 includes/js/dojox/fx/resources/shadowR.png create mode 100644 includes/js/dojox/fx/resources/shadowT.png create mode 100644 includes/js/dojox/fx/resources/shadowTL.png create mode 100644 includes/js/dojox/fx/resources/shadowTR.png create mode 100644 includes/js/dojox/fx/scroll.js create mode 100644 includes/js/dojox/fx/style.js create mode 100644 includes/js/dojox/fx/tests/_animation.css create mode 100644 includes/js/dojox/fx/tests/_animation.css.commented.css create mode 100644 includes/js/dojox/fx/tests/example_Line.html create mode 100644 includes/js/dojox/fx/tests/example_backgroundPosition.html create mode 100644 includes/js/dojox/fx/tests/example_dojoAnimations.html create mode 100644 includes/js/dojox/fx/tests/example_easingChart2D.html create mode 100644 includes/js/dojox/fx/tests/images/averycutedog.jpg create mode 100644 includes/js/dojox/fx/tests/images/dot.png create mode 100644 includes/js/dojox/fx/tests/images/longBg.png create mode 100644 includes/js/dojox/fx/tests/test_Nodelist-fx.html create mode 100644 includes/js/dojox/fx/tests/test_Shadow.html create mode 100644 includes/js/dojox/fx/tests/test_animateClass.html create mode 100644 includes/js/dojox/fx/tests/test_crossFade.html create mode 100644 includes/js/dojox/fx/tests/test_easing.html create mode 100644 includes/js/dojox/fx/tests/test_highlight.html create mode 100644 includes/js/dojox/fx/tests/test_scroll.html create mode 100644 includes/js/dojox/fx/tests/test_sizeTo.html create mode 100644 includes/js/dojox/fx/tests/test_slideBy.html create mode 100644 includes/js/dojox/fx/tests/test_wipeTo.html create mode 100644 includes/js/dojox/gfx.js create mode 100644 includes/js/dojox/gfx/Moveable.js create mode 100644 includes/js/dojox/gfx/Mover.js create mode 100644 includes/js/dojox/gfx/README create mode 100644 includes/js/dojox/gfx/_base.js create mode 100644 includes/js/dojox/gfx/arc.js create mode 100644 includes/js/dojox/gfx/attach.js create mode 100644 includes/js/dojox/gfx/canvas.js create mode 100644 includes/js/dojox/gfx/canvas_attach.js create mode 100644 includes/js/dojox/gfx/decompose.js create mode 100644 includes/js/dojox/gfx/demos/beautify.html create mode 100644 includes/js/dojox/gfx/demos/butterfly.html create mode 100644 includes/js/dojox/gfx/demos/career_test.html create mode 100644 includes/js/dojox/gfx/demos/circles.html create mode 100644 includes/js/dojox/gfx/demos/clock.html create mode 100644 includes/js/dojox/gfx/demos/clockWidget.html create mode 100644 includes/js/dojox/gfx/demos/clock_black.html create mode 100644 includes/js/dojox/gfx/demos/creator.html create mode 100644 includes/js/dojox/gfx/demos/data/Lars.json create mode 100644 includes/js/dojox/gfx/demos/data/Lars.svg create mode 100644 includes/js/dojox/gfx/demos/data/LarsDreaming.json create mode 100644 includes/js/dojox/gfx/demos/data/LarsDreaming.svg create mode 100644 includes/js/dojox/gfx/demos/data/Nils.json create mode 100644 includes/js/dojox/gfx/demos/data/Nils.svg create mode 100644 includes/js/dojox/gfx/demos/data/buratino-bg.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-head.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-left-arm.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-left-leg.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-lollipop.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-nose-large.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-nose-medium.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-right-arm.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-right-leg.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino-torso.png create mode 100644 includes/js/dojox/gfx/demos/data/buratino.jpg create mode 100644 includes/js/dojox/gfx/demos/data/buratino.json create mode 100644 includes/js/dojox/gfx/demos/data/svg2gfx.xsl create mode 100644 includes/js/dojox/gfx/demos/data/transform.json create mode 100644 includes/js/dojox/gfx/demos/images/clock_face.jpg create mode 100644 includes/js/dojox/gfx/demos/images/clock_face_black.jpg create mode 100644 includes/js/dojox/gfx/demos/inspector.html create mode 100644 includes/js/dojox/gfx/demos/lion.html create mode 100644 includes/js/dojox/gfx/demos/roundedPane.html create mode 100644 includes/js/dojox/gfx/demos/tiger.html create mode 100644 includes/js/dojox/gfx/demos/tooltip.html create mode 100644 includes/js/dojox/gfx/fx.js create mode 100644 includes/js/dojox/gfx/matrix.js create mode 100644 includes/js/dojox/gfx/move.js create mode 100644 includes/js/dojox/gfx/path.js create mode 100644 includes/js/dojox/gfx/shape.js create mode 100644 includes/js/dojox/gfx/silverlight.js create mode 100644 includes/js/dojox/gfx/silverlight_attach.js create mode 100644 includes/js/dojox/gfx/svg.js create mode 100644 includes/js/dojox/gfx/svg_attach.js create mode 100644 includes/js/dojox/gfx/tests/decompose.js create mode 100644 includes/js/dojox/gfx/tests/matrix.js create mode 100644 includes/js/dojox/gfx/tests/module.js create mode 100644 includes/js/dojox/gfx/tests/runTests.html create mode 100644 includes/js/dojox/gfx/tests/test_arc.html create mode 100644 includes/js/dojox/gfx/tests/test_bezier.html create mode 100644 includes/js/dojox/gfx/tests/test_decompose.html create mode 100644 includes/js/dojox/gfx/tests/test_fill.html create mode 100644 includes/js/dojox/gfx/tests/test_fx.html create mode 100644 includes/js/dojox/gfx/tests/test_gfx.html create mode 100644 includes/js/dojox/gfx/tests/test_gradient.html create mode 100644 includes/js/dojox/gfx/tests/test_group.html create mode 100644 includes/js/dojox/gfx/tests/test_image1.html create mode 100644 includes/js/dojox/gfx/tests/test_image2.html create mode 100644 includes/js/dojox/gfx/tests/test_linearGradient.html create mode 100644 includes/js/dojox/gfx/tests/test_linestyle.html create mode 100644 includes/js/dojox/gfx/tests/test_pattern.html create mode 100644 includes/js/dojox/gfx/tests/test_poly.html create mode 100644 includes/js/dojox/gfx/tests/test_resize.html create mode 100644 includes/js/dojox/gfx/tests/test_setPath.html create mode 100644 includes/js/dojox/gfx/tests/test_tbbox.html create mode 100644 includes/js/dojox/gfx/tests/test_text.html create mode 100644 includes/js/dojox/gfx/tests/test_textpath.html create mode 100644 includes/js/dojox/gfx/tests/test_transform.html create mode 100644 includes/js/dojox/gfx/utils.js create mode 100644 includes/js/dojox/gfx/vml.js create mode 100644 includes/js/dojox/gfx/vml_attach.js create mode 100644 includes/js/dojox/gfx3d.js create mode 100644 includes/js/dojox/gfx3d/README create mode 100644 includes/js/dojox/gfx3d/_base.js create mode 100644 includes/js/dojox/gfx3d/gradient.js create mode 100644 includes/js/dojox/gfx3d/lighting.js create mode 100644 includes/js/dojox/gfx3d/matrix.js create mode 100644 includes/js/dojox/gfx3d/object.js create mode 100644 includes/js/dojox/gfx3d/scheduler.js create mode 100644 includes/js/dojox/gfx3d/tests/test_camerarotate.html create mode 100644 includes/js/dojox/gfx3d/tests/test_camerarotate_shaded.html create mode 100644 includes/js/dojox/gfx3d/tests/test_cube.html create mode 100644 includes/js/dojox/gfx3d/tests/test_cylinder.html create mode 100644 includes/js/dojox/gfx3d/tests/test_drawer.html create mode 100644 includes/js/dojox/gfx3d/tests/test_edges.html create mode 100644 includes/js/dojox/gfx3d/tests/test_matrix.html create mode 100644 includes/js/dojox/gfx3d/tests/test_orbit.html create mode 100644 includes/js/dojox/gfx3d/tests/test_overlap.html create mode 100644 includes/js/dojox/gfx3d/tests/test_polygon.html create mode 100644 includes/js/dojox/gfx3d/tests/test_quads.html create mode 100644 includes/js/dojox/gfx3d/tests/test_rotate.html create mode 100644 includes/js/dojox/gfx3d/tests/test_scene.html create mode 100644 includes/js/dojox/gfx3d/tests/test_triangles.html create mode 100644 includes/js/dojox/gfx3d/tests/test_vector.html create mode 100644 includes/js/dojox/gfx3d/vector.js create mode 100644 includes/js/dojox/grid/Grid.js create mode 100644 includes/js/dojox/grid/README create mode 100644 includes/js/dojox/grid/VirtualGrid.js create mode 100644 includes/js/dojox/grid/_data/dijitEditors.js create mode 100644 includes/js/dojox/grid/_data/editors.js create mode 100644 includes/js/dojox/grid/_data/fields.js create mode 100644 includes/js/dojox/grid/_data/model.js create mode 100644 includes/js/dojox/grid/_grid/Grid.css create mode 100644 includes/js/dojox/grid/_grid/Grid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/Grid_rtl.css create mode 100644 includes/js/dojox/grid/_grid/Grid_rtl.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/builder.js create mode 100644 includes/js/dojox/grid/_grid/cell.js create mode 100644 includes/js/dojox/grid/_grid/drag.js create mode 100644 includes/js/dojox/grid/_grid/edit.js create mode 100644 includes/js/dojox/grid/_grid/focus.js create mode 100644 includes/js/dojox/grid/_grid/images/grid_dx_gradient.gif create mode 100644 includes/js/dojox/grid/_grid/images/grid_sort_down.gif create mode 100644 includes/js/dojox/grid/_grid/images/grid_sort_up.gif create mode 100644 includes/js/dojox/grid/_grid/images/tabEnabled_rotated.png create mode 100644 includes/js/dojox/grid/_grid/images/tabHover_rotated.png create mode 100644 includes/js/dojox/grid/_grid/layout.js create mode 100644 includes/js/dojox/grid/_grid/lib.js create mode 100644 includes/js/dojox/grid/_grid/nihiloGrid.css create mode 100644 includes/js/dojox/grid/_grid/nihiloGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/publicEvents.js create mode 100644 includes/js/dojox/grid/_grid/rowbar.js create mode 100644 includes/js/dojox/grid/_grid/rows.js create mode 100644 includes/js/dojox/grid/_grid/scroller.js create mode 100644 includes/js/dojox/grid/_grid/selection.js create mode 100644 includes/js/dojox/grid/_grid/soriaGrid.css create mode 100644 includes/js/dojox/grid/_grid/soriaGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/tundraGrid.css create mode 100644 includes/js/dojox/grid/_grid/tundraGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/view.js create mode 100644 includes/js/dojox/grid/_grid/views.js create mode 100644 includes/js/dojox/grid/resources/GridView.html create mode 100644 includes/js/dojox/grid/resources/VirtualGrid.html create mode 100644 includes/js/dojox/grid/tests/databaseModel.js create mode 100644 includes/js/dojox/grid/tests/images/closed.gif create mode 100644 includes/js/dojox/grid/tests/images/flatScreen.gif create mode 100644 includes/js/dojox/grid/tests/images/open.gif create mode 100644 includes/js/dojox/grid/tests/support/books.xml create mode 100644 includes/js/dojox/grid/tests/support/data.php create mode 100644 includes/js/dojox/grid/tests/support/geography.xml create mode 100644 includes/js/dojox/grid/tests/support/json.php create mode 100644 includes/js/dojox/grid/tests/support/movies.csv create mode 100644 includes/js/dojox/grid/tests/support/test_data.js create mode 100644 includes/js/dojox/grid/tests/support/test_data_objects.js create mode 100644 includes/js/dojox/grid/tests/support/testtbl.sql create mode 100644 includes/js/dojox/grid/tests/support/yahoo_search.js create mode 100644 includes/js/dojox/grid/tests/test_change_structure.html create mode 100644 includes/js/dojox/grid/tests/test_custom_sort.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_edit.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_empty.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_multiStores.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_processError.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_notification.html create mode 100644 includes/js/dojox/grid/tests/test_edit.html create mode 100644 includes/js/dojox/grid/tests/test_edit_canEdit.html create mode 100644 includes/js/dojox/grid/tests/test_edit_dijit.html create mode 100644 includes/js/dojox/grid/tests/test_events.html create mode 100644 includes/js/dojox/grid/tests/test_expand.html create mode 100644 includes/js/dojox/grid/tests/test_grid.html create mode 100644 includes/js/dojox/grid/tests/test_grid_dlg.html create mode 100644 includes/js/dojox/grid/tests/test_grid_headerHeight.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout_LayoutContainer.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout_borderContainer.html create mode 100644 includes/js/dojox/grid/tests/test_grid_object_model_change.html create mode 100644 includes/js/dojox/grid/tests/test_grid_programmatic.html create mode 100644 includes/js/dojox/grid/tests/test_grid_programmatic_layout.html create mode 100644 includes/js/dojox/grid/tests/test_grid_rtl.html create mode 100644 includes/js/dojox/grid/tests/test_grid_themes.html create mode 100644 includes/js/dojox/grid/tests/test_grid_tooltip_menu.html create mode 100644 includes/js/dojox/grid/tests/test_keyboard.html create mode 100644 includes/js/dojox/grid/tests/test_markup.html create mode 100644 includes/js/dojox/grid/tests/test_mysql_edit.html create mode 100644 includes/js/dojox/grid/tests/test_sizing.html create mode 100644 includes/js/dojox/grid/tests/test_sizing_100rows.html create mode 100644 includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html create mode 100644 includes/js/dojox/grid/tests/test_styling.html create mode 100644 includes/js/dojox/grid/tests/test_subgrid.html create mode 100644 includes/js/dojox/grid/tests/test_tundra_edit.html create mode 100644 includes/js/dojox/grid/tests/test_yahoo_images.html create mode 100644 includes/js/dojox/grid/tests/test_yahoo_search.html create mode 100644 includes/js/dojox/grid/tests/yahooSearch.js create mode 100644 includes/js/dojox/help/README create mode 100644 includes/js/dojox/help/_base.js create mode 100644 includes/js/dojox/help/console.js create mode 100644 includes/js/dojox/help/demos/demo_Console.html create mode 100644 includes/js/dojox/highlight.js create mode 100644 includes/js/dojox/highlight/README create mode 100644 includes/js/dojox/highlight/_base.js create mode 100644 includes/js/dojox/highlight/languages/_all.js create mode 100644 includes/js/dojox/highlight/languages/_dynamic.js create mode 100644 includes/js/dojox/highlight/languages/_static.js create mode 100644 includes/js/dojox/highlight/languages/_www.js create mode 100644 includes/js/dojox/highlight/languages/cpp.js create mode 100644 includes/js/dojox/highlight/languages/css.js create mode 100644 includes/js/dojox/highlight/languages/delphi.js create mode 100644 includes/js/dojox/highlight/languages/django.js create mode 100644 includes/js/dojox/highlight/languages/html.js create mode 100644 includes/js/dojox/highlight/languages/javascript.js create mode 100644 includes/js/dojox/highlight/languages/pygments/_html.js create mode 100644 includes/js/dojox/highlight/languages/pygments/_www.js create mode 100644 includes/js/dojox/highlight/languages/pygments/css.js create mode 100644 includes/js/dojox/highlight/languages/pygments/html.js create mode 100644 includes/js/dojox/highlight/languages/pygments/javascript.js create mode 100644 includes/js/dojox/highlight/languages/pygments/xml.js create mode 100644 includes/js/dojox/highlight/languages/python.js create mode 100644 includes/js/dojox/highlight/languages/sql.js create mode 100644 includes/js/dojox/highlight/languages/xml.js create mode 100644 includes/js/dojox/highlight/resources/highlight.css create mode 100644 includes/js/dojox/highlight/resources/highlight.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/autumn.css create mode 100644 includes/js/dojox/highlight/resources/pygments/autumn.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/borland.css create mode 100644 includes/js/dojox/highlight/resources/pygments/borland.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/colorful.css create mode 100644 includes/js/dojox/highlight/resources/pygments/colorful.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/default.css create mode 100644 includes/js/dojox/highlight/resources/pygments/default.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/emacs.css create mode 100644 includes/js/dojox/highlight/resources/pygments/emacs.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/friendly.css create mode 100644 includes/js/dojox/highlight/resources/pygments/friendly.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/fruity.css create mode 100644 includes/js/dojox/highlight/resources/pygments/fruity.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/manni.css create mode 100644 includes/js/dojox/highlight/resources/pygments/manni.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/murphy.css create mode 100644 includes/js/dojox/highlight/resources/pygments/murphy.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/native.css create mode 100644 includes/js/dojox/highlight/resources/pygments/native.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/pastie.css create mode 100644 includes/js/dojox/highlight/resources/pygments/pastie.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/perldoc.css create mode 100644 includes/js/dojox/highlight/resources/pygments/perldoc.css.commented.css create mode 100644 includes/js/dojox/highlight/resources/pygments/trac.css create mode 100644 includes/js/dojox/highlight/resources/pygments/trac.css.commented.css create mode 100644 includes/js/dojox/highlight/tests/test_highlight.html create mode 100644 includes/js/dojox/highlight/tests/test_pygments.html create mode 100644 includes/js/dojox/image/Gallery.js create mode 100644 includes/js/dojox/image/Lightbox.js create mode 100644 includes/js/dojox/image/Magnifier.js create mode 100644 includes/js/dojox/image/MagnifierLite.js create mode 100644 includes/js/dojox/image/README create mode 100644 includes/js/dojox/image/SlideShow.js create mode 100644 includes/js/dojox/image/ThumbnailPicker.js create mode 100644 includes/js/dojox/image/resources/Gallery.html create mode 100644 includes/js/dojox/image/resources/Lightbox.html create mode 100644 includes/js/dojox/image/resources/Magnifier.css create mode 100644 includes/js/dojox/image/resources/Magnifier.css.commented.css create mode 100644 includes/js/dojox/image/resources/SlideShow.html create mode 100644 includes/js/dojox/image/resources/ThumbnailPicker.html create mode 100644 includes/js/dojox/image/resources/image.css create mode 100644 includes/js/dojox/image/resources/image.css.commented.css create mode 100644 includes/js/dojox/image/resources/images/buttons.gif create mode 100644 includes/js/dojox/image/resources/images/buttons.png create mode 100644 includes/js/dojox/image/resources/images/close.png create mode 100644 includes/js/dojox/image/resources/images/close_dark.png create mode 100644 includes/js/dojox/image/resources/images/left.png create mode 100644 includes/js/dojox/image/resources/images/loading.gif create mode 100644 includes/js/dojox/image/resources/images/right.png create mode 100644 includes/js/dojox/image/resources/images/warning.png create mode 100644 includes/js/dojox/image/tests/images.json create mode 100644 includes/js/dojox/image/tests/images/extraWide.jpg create mode 100644 includes/js/dojox/image/tests/images/huuuge.png create mode 100644 includes/js/dojox/image/tests/images/imageHoriz.jpg create mode 100644 includes/js/dojox/image/tests/images/imageHoriz2.jpg create mode 100644 includes/js/dojox/image/tests/images/imageVert.jpg create mode 100644 includes/js/dojox/image/tests/images/spanke.jpg create mode 100644 includes/js/dojox/image/tests/images/square.jpg create mode 100644 includes/js/dojox/image/tests/test_Gallery.html create mode 100644 includes/js/dojox/image/tests/test_Lightbox.html create mode 100644 includes/js/dojox/image/tests/test_Magnifier.html create mode 100644 includes/js/dojox/image/tests/test_MagnifierLite.html create mode 100644 includes/js/dojox/image/tests/test_SlideShow.html create mode 100644 includes/js/dojox/image/tests/test_ThumbnailPicker.html create mode 100644 includes/js/dojox/io/README create mode 100644 includes/js/dojox/io/proxy/README create mode 100644 includes/js/dojox/io/proxy/tests/frag.xml create mode 100644 includes/js/dojox/io/proxy/tests/xip.html create mode 100644 includes/js/dojox/io/proxy/xip.js create mode 100644 includes/js/dojox/io/proxy/xip_client.html create mode 100644 includes/js/dojox/io/proxy/xip_server.html create mode 100644 includes/js/dojox/io/xhrMultiPart.js create mode 100644 includes/js/dojox/jsonPath.js create mode 100644 includes/js/dojox/jsonPath/README create mode 100644 includes/js/dojox/jsonPath/query.js create mode 100644 includes/js/dojox/jsonPath/tests/jsonPath.js create mode 100644 includes/js/dojox/jsonPath/tests/module.js create mode 100644 includes/js/dojox/jsonPath/tests/runTests.html create mode 100644 includes/js/dojox/lang/LICENSE create mode 100644 includes/js/dojox/lang/README create mode 100644 includes/js/dojox/lang/functional.js create mode 100644 includes/js/dojox/lang/functional/array.js create mode 100644 includes/js/dojox/lang/functional/curry.js create mode 100644 includes/js/dojox/lang/functional/fold.js create mode 100644 includes/js/dojox/lang/functional/lambda.js create mode 100644 includes/js/dojox/lang/functional/listcomp.js create mode 100644 includes/js/dojox/lang/functional/object.js create mode 100644 includes/js/dojox/lang/functional/reversed.js create mode 100644 includes/js/dojox/lang/functional/scan.js create mode 100644 includes/js/dojox/lang/functional/sequence.js create mode 100644 includes/js/dojox/lang/functional/zip.js create mode 100644 includes/js/dojox/lang/tests/array.js create mode 100644 includes/js/dojox/lang/tests/curry.js create mode 100644 includes/js/dojox/lang/tests/fold.js create mode 100644 includes/js/dojox/lang/tests/fun_perf.html create mode 100644 includes/js/dojox/lang/tests/lambda.js create mode 100644 includes/js/dojox/lang/tests/listcomp.js create mode 100644 includes/js/dojox/lang/tests/main.js create mode 100644 includes/js/dojox/lang/tests/misc.js create mode 100644 includes/js/dojox/lang/tests/runTests.html create mode 100644 includes/js/dojox/lang/utils.js create mode 100644 includes/js/dojox/layout/BorderContainer.js create mode 100644 includes/js/dojox/layout/ContentPane.js create mode 100644 includes/js/dojox/layout/DragPane.js create mode 100644 includes/js/dojox/layout/ExpandoPane.js create mode 100644 includes/js/dojox/layout/FloatingPane.js create mode 100644 includes/js/dojox/layout/README create mode 100644 includes/js/dojox/layout/RadioGroup.js create mode 100644 includes/js/dojox/layout/ResizeHandle.js create mode 100644 includes/js/dojox/layout/ScrollPane.js create mode 100644 includes/js/dojox/layout/resources/ExpandoPane.css create mode 100644 includes/js/dojox/layout/resources/ExpandoPane.css.commented.css create mode 100644 includes/js/dojox/layout/resources/ExpandoPane.html create mode 100644 includes/js/dojox/layout/resources/FloatingPane.css create mode 100644 includes/js/dojox/layout/resources/FloatingPane.css.commented.css create mode 100644 includes/js/dojox/layout/resources/FloatingPane.html create mode 100644 includes/js/dojox/layout/resources/RadioGroup.css create mode 100644 includes/js/dojox/layout/resources/RadioGroup.css.commented.css create mode 100644 includes/js/dojox/layout/resources/ResizeHandle.css create mode 100644 includes/js/dojox/layout/resources/ResizeHandle.css.commented.css create mode 100644 includes/js/dojox/layout/resources/ScrollPane.css create mode 100644 includes/js/dojox/layout/resources/ScrollPane.css.commented.css create mode 100644 includes/js/dojox/layout/resources/ScrollPane.html create mode 100644 includes/js/dojox/layout/resources/icons/resize.png create mode 100644 includes/js/dojox/layout/tests/ContentPane.html create mode 100644 includes/js/dojox/layout/tests/_bottomPane.html create mode 100644 includes/js/dojox/layout/tests/_expando.css create mode 100644 includes/js/dojox/layout/tests/_expando.css.commented.css create mode 100644 includes/js/dojox/layout/tests/_floating.html create mode 100644 includes/js/dojox/layout/tests/_lorem.html create mode 100644 includes/js/dojox/layout/tests/_script.html create mode 100644 includes/js/dojox/layout/tests/doc0.html create mode 100644 includes/js/dojox/layout/tests/images/blank.gif create mode 100644 includes/js/dojox/layout/tests/images/dojoLogo.png create mode 100644 includes/js/dojox/layout/tests/images/gridUnderlay.png create mode 100644 includes/js/dojox/layout/tests/images/testImage.gif create mode 100644 includes/js/dojox/layout/tests/remote/getResponse.php create mode 100644 includes/js/dojox/layout/tests/test_DragPane.html create mode 100644 includes/js/dojox/layout/tests/test_ExpandoPane.html create mode 100644 includes/js/dojox/layout/tests/test_ExpandoPane_code.html create mode 100644 includes/js/dojox/layout/tests/test_ExpandoPane_more.html create mode 100644 includes/js/dojox/layout/tests/test_FloatingPane.html create mode 100644 includes/js/dojox/layout/tests/test_RadioGroup.html create mode 100644 includes/js/dojox/layout/tests/test_ResizeHandle.html create mode 100644 includes/js/dojox/layout/tests/test_ScrollPane.html create mode 100644 includes/js/dojox/layout/tests/test_ScrollPaneSingle.html create mode 100644 includes/js/dojox/layout/tests/test_SizingPane.html create mode 100644 includes/js/dojox/math.js create mode 100644 includes/js/dojox/math/README create mode 100644 includes/js/dojox/math/_base.js create mode 100644 includes/js/dojox/math/curves.js create mode 100644 includes/js/dojox/math/matrix.js create mode 100644 includes/js/dojox/off.js create mode 100644 includes/js/dojox/off/README create mode 100644 includes/js/dojox/off/_common.js create mode 100644 includes/js/dojox/off/docs/bookmarklets.html create mode 100644 includes/js/dojox/off/files.js create mode 100644 includes/js/dojox/off/network_check.txt create mode 100644 includes/js/dojox/off/offline.js create mode 100644 includes/js/dojox/off/offline.js.uncompressed.js create mode 100644 includes/js/dojox/off/resources/checkmark.png create mode 100644 includes/js/dojox/off/resources/greenball.png create mode 100644 includes/js/dojox/off/resources/learnhow.html create mode 100644 includes/js/dojox/off/resources/learnhow.js create mode 100644 includes/js/dojox/off/resources/offline-widget.css create mode 100644 includes/js/dojox/off/resources/offline-widget.css.commented.css create mode 100644 includes/js/dojox/off/resources/offline-widget.html create mode 100644 includes/js/dojox/off/resources/redball.png create mode 100644 includes/js/dojox/off/resources/roller.gif create mode 100644 includes/js/dojox/off/sync.js create mode 100644 includes/js/dojox/off/ui.js create mode 100644 includes/js/dojox/presentation.js create mode 100644 includes/js/dojox/presentation/README create mode 100644 includes/js/dojox/presentation/_base.js create mode 100644 includes/js/dojox/presentation/resources/Show.css create mode 100644 includes/js/dojox/presentation/resources/Show.css.commented.css create mode 100644 includes/js/dojox/presentation/resources/Show.html create mode 100644 includes/js/dojox/presentation/resources/Slide.html create mode 100644 includes/js/dojox/presentation/resources/icons/down.png create mode 100644 includes/js/dojox/presentation/resources/icons/next.png create mode 100644 includes/js/dojox/presentation/resources/icons/prev.png create mode 100644 includes/js/dojox/presentation/resources/icons/up.png create mode 100644 includes/js/dojox/presentation/tests/_ext1.html create mode 100644 includes/js/dojox/presentation/tests/test_presentation.html create mode 100644 includes/js/dojox/resources/README.template create mode 100644 includes/js/dojox/resources/_modules.js create mode 100644 includes/js/dojox/resources/manualTests.html create mode 100644 includes/js/dojox/resources/manualTests.js create mode 100644 includes/js/dojox/rpc/CouchDBRestStore.js create mode 100644 includes/js/dojox/rpc/JsonRPC.js create mode 100644 includes/js/dojox/rpc/JsonReferencing.js create mode 100644 includes/js/dojox/rpc/JsonRestStore.js create mode 100644 includes/js/dojox/rpc/PersevereRestStore.js create mode 100644 includes/js/dojox/rpc/README create mode 100644 includes/js/dojox/rpc/Rest.js create mode 100644 includes/js/dojox/rpc/SMDLibrary/yahoo.smd create mode 100644 includes/js/dojox/rpc/Service.js create mode 100644 includes/js/dojox/rpc/demos/demo_JsonRestStore_CouchDB.html create mode 100644 includes/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html create mode 100644 includes/js/dojox/rpc/demos/documentation.html create mode 100644 includes/js/dojox/rpc/demos/templates/documentation.html create mode 100644 includes/js/dojox/rpc/demos/templates/yahoo.html create mode 100644 includes/js/dojox/rpc/demos/yahoo.html create mode 100644 includes/js/dojox/rpc/documentation.smd create mode 100644 includes/js/dojox/rpc/test.txt create mode 100644 includes/js/dojox/rpc/tests/JsonReferencing.js create mode 100644 includes/js/dojox/rpc/tests/Service.js create mode 100644 includes/js/dojox/rpc/tests/Yahoo.js create mode 100644 includes/js/dojox/rpc/tests/libraryTests.js create mode 100644 includes/js/dojox/rpc/tests/module.js create mode 100644 includes/js/dojox/rpc/tests/resources/JSON.php create mode 100644 includes/js/dojox/rpc/tests/resources/bigQuery create mode 100644 includes/js/dojox/rpc/tests/resources/bigQuery5 create mode 100644 includes/js/dojox/rpc/tests/resources/echo.php create mode 100644 includes/js/dojox/rpc/tests/resources/echoJson.php create mode 100644 includes/js/dojox/rpc/tests/resources/fakestore.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonRpc10.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonRpc11.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonRpc12.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonpEcho.php create mode 100644 includes/js/dojox/rpc/tests/resources/jsonpEcho.phps create mode 100644 includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php create mode 100644 includes/js/dojox/rpc/tests/resources/obj1 create mode 100644 includes/js/dojox/rpc/tests/resources/obj1testArray create mode 100644 includes/js/dojox/rpc/tests/resources/obj3 create mode 100644 includes/js/dojox/rpc/tests/resources/obj4 create mode 100644 includes/js/dojox/rpc/tests/resources/query create mode 100644 includes/js/dojox/rpc/tests/resources/rawEcho.php create mode 100644 includes/js/dojox/rpc/tests/resources/res create mode 100644 includes/js/dojox/rpc/tests/resources/store.php create mode 100644 includes/js/dojox/rpc/tests/resources/test.smd create mode 100644 includes/js/dojox/rpc/tests/runLibraryTests.html create mode 100644 includes/js/dojox/rpc/tests/runTests.html create mode 100644 includes/js/dojox/rpc/tests/stores/JsonRestStore.js create mode 100644 includes/js/dojox/rpc/tests/test_dojo_data_model_persevere.html create mode 100644 includes/js/dojox/sketch.js create mode 100644 includes/js/dojox/sketch/Anchor.js create mode 100644 includes/js/dojox/sketch/Annotation.js create mode 100644 includes/js/dojox/sketch/DoubleArrowAnnotation.js create mode 100644 includes/js/dojox/sketch/Figure.js create mode 100644 includes/js/dojox/sketch/LeadAnnotation.js create mode 100644 includes/js/dojox/sketch/PreexistingAnnotation.js create mode 100644 includes/js/dojox/sketch/README create mode 100644 includes/js/dojox/sketch/SingleArrowAnnotation.js create mode 100644 includes/js/dojox/sketch/Slider.js create mode 100644 includes/js/dojox/sketch/Toolbar.js create mode 100644 includes/js/dojox/sketch/UnderlineAnnotation.js create mode 100644 includes/js/dojox/sketch/UndoStack.js create mode 100644 includes/js/dojox/sketch/_Plugin.js create mode 100644 includes/js/dojox/sketch/resources/images/icons.gif create mode 100644 includes/js/dojox/sketch/resources/sketch.css create mode 100644 includes/js/dojox/sketch/resources/sketch.css.commented.css create mode 100644 includes/js/dojox/sketch/tests/annotation.svg create mode 100644 includes/js/dojox/sketch/tests/images/figure2.gif create mode 100644 includes/js/dojox/sketch/tests/images/testsBodyBg.gif create mode 100644 includes/js/dojox/sketch/tests/test_full.html create mode 100644 includes/js/dojox/sql.js create mode 100644 includes/js/dojox/storage.js create mode 100644 includes/js/dojox/storage/AirDBStorageProvider.js create mode 100644 includes/js/dojox/storage/AirEncryptedLocalStorageProvider.js create mode 100644 includes/js/dojox/storage/AirFileStorageProvider.js create mode 100644 includes/js/dojox/storage/FlashStorageProvider.js create mode 100644 includes/js/dojox/storage/GearsStorageProvider.js create mode 100644 includes/js/dojox/storage/Provider.js create mode 100644 includes/js/dojox/storage/README create mode 100644 includes/js/dojox/storage/Storage.as create mode 100644 includes/js/dojox/storage/Storage.swf create mode 100644 includes/js/dojox/storage/WhatWGStorageProvider.js create mode 100644 includes/js/dojox/storage/_common.js create mode 100644 includes/js/dojox/storage/buildFlashStorage.sh create mode 100644 includes/js/dojox/storage/demos/helloworld.html create mode 100644 includes/js/dojox/storage/manager.js create mode 100644 includes/js/dojox/storage/storage_dialog.fla create mode 100644 includes/js/dojox/storage/tests/resources/testBook.txt create mode 100644 includes/js/dojox/storage/tests/resources/testXML.xml create mode 100644 includes/js/dojox/storage/tests/test_storage.html create mode 100644 includes/js/dojox/storage/tests/test_storage.js create mode 100644 includes/js/dojox/string/Builder.js create mode 100644 includes/js/dojox/string/README create mode 100644 includes/js/dojox/string/sprintf.js create mode 100644 includes/js/dojox/string/tests/Builder.js create mode 100644 includes/js/dojox/string/tests/BuilderPerf.html create mode 100644 includes/js/dojox/string/tests/PerfFun.html create mode 100644 includes/js/dojox/string/tests/lipsum.js create mode 100644 includes/js/dojox/string/tests/notes.txt create mode 100644 includes/js/dojox/string/tests/peller.html create mode 100644 includes/js/dojox/string/tests/runTests.html create mode 100644 includes/js/dojox/string/tests/sprintf.js create mode 100644 includes/js/dojox/string/tests/string.js create mode 100644 includes/js/dojox/string/tokenize.js create mode 100644 includes/js/dojox/timing.js create mode 100644 includes/js/dojox/timing/README create mode 100644 includes/js/dojox/timing/Sequence.js create mode 100644 includes/js/dojox/timing/Streamer.js create mode 100644 includes/js/dojox/timing/ThreadPool.js create mode 100644 includes/js/dojox/timing/_base.js create mode 100644 includes/js/dojox/timing/tests/test_Sequence.html create mode 100644 includes/js/dojox/timing/tests/test_ThreadPool.html create mode 100644 includes/js/dojox/uuid.js create mode 100644 includes/js/dojox/uuid/README create mode 100644 includes/js/dojox/uuid/Uuid.js create mode 100644 includes/js/dojox/uuid/_base.js create mode 100644 includes/js/dojox/uuid/generateRandomUuid.js create mode 100644 includes/js/dojox/uuid/generateTimeBasedUuid.js create mode 100644 includes/js/dojox/uuid/tests/runTests.html create mode 100644 includes/js/dojox/uuid/tests/uuid.js create mode 100644 includes/js/dojox/validate.js create mode 100644 includes/js/dojox/validate/README create mode 100644 includes/js/dojox/validate/_base.js create mode 100644 includes/js/dojox/validate/ca.js create mode 100644 includes/js/dojox/validate/check.js create mode 100644 includes/js/dojox/validate/creditCard.js create mode 100644 includes/js/dojox/validate/isbn.js create mode 100644 includes/js/dojox/validate/regexp.js create mode 100644 includes/js/dojox/validate/tests/creditcard.js create mode 100644 includes/js/dojox/validate/tests/module.js create mode 100644 includes/js/dojox/validate/tests/runTests.html create mode 100644 includes/js/dojox/validate/tests/validate.js create mode 100644 includes/js/dojox/validate/us.js create mode 100644 includes/js/dojox/validate/web.js create mode 100644 includes/js/dojox/widget/ColorPicker.js create mode 100644 includes/js/dojox/widget/ColorPicker/ColorPicker.css create mode 100644 includes/js/dojox/widget/ColorPicker/ColorPicker.css.commented.css create mode 100644 includes/js/dojox/widget/ColorPicker/ColorPicker.html create mode 100644 includes/js/dojox/widget/ColorPicker/images/hue.png create mode 100644 includes/js/dojox/widget/ColorPicker/images/hueHandle.png create mode 100644 includes/js/dojox/widget/ColorPicker/images/pickerPointer.png create mode 100644 includes/js/dojox/widget/ColorPicker/images/underlay.png create mode 100644 includes/js/dojox/widget/FileInput.js create mode 100644 includes/js/dojox/widget/FileInput/FileInput.css create mode 100644 includes/js/dojox/widget/FileInput/FileInput.css.commented.css create mode 100644 includes/js/dojox/widget/FileInput/FileInput.html create mode 100644 includes/js/dojox/widget/FileInput/FileInputAuto.html create mode 100644 includes/js/dojox/widget/FileInput/ReceiveFile.php create mode 100644 includes/js/dojox/widget/FileInputAuto.js create mode 100644 includes/js/dojox/widget/FisheyeList.js create mode 100644 includes/js/dojox/widget/FisheyeList/FisheyeList.css create mode 100644 includes/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css create mode 100644 includes/js/dojox/widget/FisheyeLite.js create mode 100644 includes/js/dojox/widget/Iterator.js create mode 100644 includes/js/dojox/widget/Loader.js create mode 100644 includes/js/dojox/widget/Loader/Loader.css create mode 100644 includes/js/dojox/widget/Loader/Loader.css.commented.css create mode 100644 includes/js/dojox/widget/Loader/README create mode 100644 includes/js/dojox/widget/Loader/honey.php create mode 100644 includes/js/dojox/widget/Loader/icons/loading.gif create mode 100644 includes/js/dojox/widget/MultiComboBox.js create mode 100644 includes/js/dojox/widget/README create mode 100644 includes/js/dojox/widget/Rating.js create mode 100644 includes/js/dojox/widget/Rating/Rating.css create mode 100644 includes/js/dojox/widget/Rating/Rating.css.commented.css create mode 100644 includes/js/dojox/widget/Rating/rating_empty.gif create mode 100644 includes/js/dojox/widget/Rating/rating_empty.png create mode 100644 includes/js/dojox/widget/Rating/rating_full.gif create mode 100644 includes/js/dojox/widget/Rating/rating_full.png create mode 100644 includes/js/dojox/widget/Rating/rating_half.png create mode 100644 includes/js/dojox/widget/SortList.js create mode 100644 includes/js/dojox/widget/SortList/SortList.css create mode 100644 includes/js/dojox/widget/SortList/SortList.css.commented.css create mode 100644 includes/js/dojox/widget/SortList/SortList.html create mode 100644 includes/js/dojox/widget/TimeSpinner.js create mode 100644 includes/js/dojox/widget/Toaster.js create mode 100644 includes/js/dojox/widget/Toaster/Toaster.css create mode 100644 includes/js/dojox/widget/Toaster/Toaster.css.commented.css create mode 100644 includes/js/dojox/widget/Wizard.js create mode 100644 includes/js/dojox/widget/Wizard/Wizard.css create mode 100644 includes/js/dojox/widget/Wizard/Wizard.css.commented.css create mode 100644 includes/js/dojox/widget/Wizard/Wizard.html create mode 100644 includes/js/dojox/widget/nls/Wizard.js create mode 100644 includes/js/dojox/widget/nls/ar/Wizard.js create mode 100644 includes/js/dojox/widget/nls/cs/Wizard.js create mode 100644 includes/js/dojox/widget/nls/da/Wizard.js create mode 100644 includes/js/dojox/widget/nls/de/Wizard.js create mode 100644 includes/js/dojox/widget/nls/el/Wizard.js create mode 100644 includes/js/dojox/widget/nls/es/Wizard.js create mode 100644 includes/js/dojox/widget/nls/fi/Wizard.js create mode 100644 includes/js/dojox/widget/nls/fr/Wizard.js create mode 100644 includes/js/dojox/widget/nls/he/Wizard.js create mode 100644 includes/js/dojox/widget/nls/hu/Wizard.js create mode 100644 includes/js/dojox/widget/nls/it/Wizard.js create mode 100644 includes/js/dojox/widget/nls/ja/Wizard.js create mode 100644 includes/js/dojox/widget/nls/ko/Wizard.js create mode 100644 includes/js/dojox/widget/nls/nb/Wizard.js create mode 100644 includes/js/dojox/widget/nls/nl/Wizard.js create mode 100644 includes/js/dojox/widget/nls/pl/Wizard.js create mode 100644 includes/js/dojox/widget/nls/pt-pt/Wizard.js create mode 100644 includes/js/dojox/widget/nls/pt/Wizard.js create mode 100644 includes/js/dojox/widget/nls/ru/Wizard.js create mode 100644 includes/js/dojox/widget/nls/sv/Wizard.js create mode 100644 includes/js/dojox/widget/nls/tr/Wizard.js create mode 100644 includes/js/dojox/widget/nls/zh-tw/Wizard.js create mode 100644 includes/js/dojox/widget/nls/zh/Wizard.js create mode 100644 includes/js/dojox/widget/tests/_tags.json create mode 100644 includes/js/dojox/widget/tests/demo_FisheyeList-orig.html create mode 100644 includes/js/dojox/widget/tests/demo_FisheyeList.html create mode 100644 includes/js/dojox/widget/tests/demo_FisheyeLite.html create mode 100644 includes/js/dojox/widget/tests/images/fisheye_1.png create mode 100644 includes/js/dojox/widget/tests/images/fisheye_2.png create mode 100644 includes/js/dojox/widget/tests/images/fisheye_3.png create mode 100644 includes/js/dojox/widget/tests/images/fisheye_4.png create mode 100644 includes/js/dojox/widget/tests/images/icon_browser.png create mode 100644 includes/js/dojox/widget/tests/images/icon_calendar.png create mode 100644 includes/js/dojox/widget/tests/images/icon_email.png create mode 100644 includes/js/dojox/widget/tests/images/icon_texteditor.png create mode 100644 includes/js/dojox/widget/tests/images/icon_update.png create mode 100644 includes/js/dojox/widget/tests/images/icon_users.png create mode 100644 includes/js/dojox/widget/tests/images/rating_empty.gif create mode 100644 includes/js/dojox/widget/tests/images/rating_empty.png create mode 100644 includes/js/dojox/widget/tests/images/rating_full.gif create mode 100644 includes/js/dojox/widget/tests/images/rating_full.png create mode 100644 includes/js/dojox/widget/tests/test_ColorPicker.html create mode 100644 includes/js/dojox/widget/tests/test_FileInput.html create mode 100644 includes/js/dojox/widget/tests/test_FisheyeList.html create mode 100644 includes/js/dojox/widget/tests/test_FisheyeLite.html create mode 100644 includes/js/dojox/widget/tests/test_Iterator.html create mode 100644 includes/js/dojox/widget/tests/test_Loader.html create mode 100644 includes/js/dojox/widget/tests/test_MultiComboBox.html create mode 100644 includes/js/dojox/widget/tests/test_Rating.html create mode 100644 includes/js/dojox/widget/tests/test_SortList.html create mode 100644 includes/js/dojox/widget/tests/test_TimeSpinner.html create mode 100644 includes/js/dojox/widget/tests/test_Toaster.html create mode 100644 includes/js/dojox/widget/tests/test_Wizard.html create mode 100644 includes/js/dojox/wire.js create mode 100644 includes/js/dojox/wire/CompositeWire.js create mode 100644 includes/js/dojox/wire/DataWire.js create mode 100644 includes/js/dojox/wire/README create mode 100644 includes/js/dojox/wire/TableAdapter.js create mode 100644 includes/js/dojox/wire/TextAdapter.js create mode 100644 includes/js/dojox/wire/TreeAdapter.js create mode 100644 includes/js/dojox/wire/Wire.js create mode 100644 includes/js/dojox/wire/XmlWire.js create mode 100644 includes/js/dojox/wire/_base.js create mode 100644 includes/js/dojox/wire/demos/TableContainer.css create mode 100644 includes/js/dojox/wire/demos/TableContainer.css.commented.css create mode 100644 includes/js/dojox/wire/demos/TableContainer.js create mode 100644 includes/js/dojox/wire/demos/WidgetRepeater.js create mode 100644 includes/js/dojox/wire/demos/markup/countries.json create mode 100644 includes/js/dojox/wire/demos/markup/demo_ActionChaining.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_ActionWiring.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_BasicChildWire.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_ConditionalActions.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html create mode 100644 includes/js/dojox/wire/demos/markup/demo_TopicWiring.html create mode 100644 includes/js/dojox/wire/demos/markup/flickrDemo.css create mode 100644 includes/js/dojox/wire/demos/markup/flickrDemo.css.commented.css create mode 100644 includes/js/dojox/wire/demos/markup/states.json create mode 100644 includes/js/dojox/wire/ml/Action.js create mode 100644 includes/js/dojox/wire/ml/Data.js create mode 100644 includes/js/dojox/wire/ml/DataStore.js create mode 100644 includes/js/dojox/wire/ml/Invocation.js create mode 100644 includes/js/dojox/wire/ml/Service.js create mode 100644 includes/js/dojox/wire/ml/Transfer.js create mode 100644 includes/js/dojox/wire/ml/util.js create mode 100644 includes/js/dojox/wire/tests/markup/Action.html create mode 100644 includes/js/dojox/wire/tests/markup/Data.html create mode 100644 includes/js/dojox/wire/tests/markup/DataStore.html create mode 100644 includes/js/dojox/wire/tests/markup/DataStore.xml create mode 100644 includes/js/dojox/wire/tests/markup/Invocation.html create mode 100644 includes/js/dojox/wire/tests/markup/Service.html create mode 100644 includes/js/dojox/wire/tests/markup/Service/JSON.smd create mode 100644 includes/js/dojox/wire/tests/markup/Service/XML.smd create mode 100644 includes/js/dojox/wire/tests/markup/Service/a.json create mode 100644 includes/js/dojox/wire/tests/markup/Service/a.xml create mode 100644 includes/js/dojox/wire/tests/markup/Transfer.html create mode 100644 includes/js/dojox/wire/tests/module.js create mode 100644 includes/js/dojox/wire/tests/programmatic/CompositeWire.js create mode 100644 includes/js/dojox/wire/tests/programmatic/ConverterDynamic.js create mode 100644 includes/js/dojox/wire/tests/programmatic/DataWire.js create mode 100644 includes/js/dojox/wire/tests/programmatic/TableAdapter.js create mode 100644 includes/js/dojox/wire/tests/programmatic/TextAdapter.js create mode 100644 includes/js/dojox/wire/tests/programmatic/TreeAdapter.js create mode 100644 includes/js/dojox/wire/tests/programmatic/Wire.js create mode 100644 includes/js/dojox/wire/tests/programmatic/XmlWire.js create mode 100644 includes/js/dojox/wire/tests/programmatic/_base.js create mode 100644 includes/js/dojox/wire/tests/runTests.html create mode 100644 includes/js/dojox/wire/tests/wire.js create mode 100644 includes/js/dojox/wire/tests/wireml.js create mode 100644 includes/js/dojox/xml/DomParser.js create mode 100644 includes/js/dojox/xml/README create mode 100644 includes/js/util/doh/LICENSE create mode 100644 includes/js/util/doh/README create mode 100644 includes/js/util/doh/_browserRunner.js create mode 100644 includes/js/util/doh/_rhinoRunner.js create mode 100644 includes/js/util/doh/_sounds/LICENSE create mode 100644 includes/js/util/doh/_sounds/doh.wav create mode 100644 includes/js/util/doh/_sounds/dohaaa.wav create mode 100644 includes/js/util/doh/_sounds/woohoo.wav create mode 100644 includes/js/util/doh/runner.html create mode 100644 includes/js/util/doh/runner.js create mode 100644 includes/js/util/doh/runner.sh create mode 100644 includes/js/util/doh/small_logo.png diff --git a/ajax/gettags.php b/ajax/gettags.php new file mode 100644 index 0000000..167c63d --- /dev/null +++ b/ajax/gettags.php @@ -0,0 +1,51 @@ +isLoggedOn()) { + $loggedon = true; + $currentUser = $userservice->getCurrentUser(); + $currentUserID = $userservice->getCurrentUserId(); + $currentUsername = $currentUser[$userservice->getFieldName('username')]; +} + +?> + +{identifier:"tag", +items: [ +getPopularTags($currentUserID, 1000, $currentUserID); + foreach($listTags as $t) { + echo "{tag: \"".$t['tag']."\"},"; + } +?> +]} + + + + 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: + // |
+ // + // 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:"
\n\t
\n\t\t\n\t
\t\n
\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 + + + + +
+

Dojo Benchmark Tool

+ +
+
+ + Class:

+ Count:

+ + Method: + + +

+ Run Test + +
+ +
+ +
+

+ * The results of these tests are important to us. Please feel free to submit your dataSet + to Dojotoolkit.org. Your privacy will be respected. + +

+
+
+ + +
+
+
+
+ +

Results:

+ + + 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 @@ + + + + PROGRAMMATIC - Dojo Widget Creation Test + + + + + + + + Pass ?count=100 in the query string to change the number of widgets.
+ Pass ?class=form.Button in the query string to change the widget class. +

+ +
+
+ + + 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 @@ + + + + PROGRAMMATIC - Dojo Button 100 Test + + + + + + +

Creating dojot.form.buttons programmatically

+

+ +
+ +
+Pass "?count=n" in the query string to change the number of buttons. + + + + + 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 @@ + + + +

Widget instantiation timing test results

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Computer/OSBrowserParsingProgrammatic
10050010001005001000
MacBook Pro 2.16
OS 10.4 2GB RAM
FF (2.0.0.3)3031724350519510062266
Safari (2.04)192146044631428952403
WebKit Nightly (21223)110540109685458940
Dell Precision 2.13 PPro
XP SP 2 - 2GB RAM
FF (2.0.0.3)282126624842508901766
IE7 (7.0.5730.11)3032079517220311402422
+ + +

If you want to play:

+

+
    +
  1. Run the following tests: + +
    + Change the "count=" to 100, 500, 1000 for each. +

    + Restart the browser between each test/count. Run each test 3 times and record the smallest number. +
  2. +
  3. Record your tests in the copy of this file in SVN: dijit/bench/test_Button-results.html and check it in. Reference ticket #2968.
  4. +
+ 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 @@ + + + + + test of various synchronous page searching methods + + + + + +

This page contains a huge number of nodes, most of which are "chaff".

+

Here's the relative timings for this page

+
+ + + + + +
var dlg = new blah.ext.LayoutDialog(config.id || blah.util.Dom.generateId(), {
+				autoCreate : true,
+				minWidth:400,
+				minHeight:300,
+				
+				syncHeightBeforeShow: true,
+				shadow:true,
+				fixedcenter: true,
+				center:{autoScroll:false},
+				east:{split:true,initialSize:150,minSize:150,maxSize:250}
+			});
+			dlg.setTitle('Choose an Image');
+			dlg.getEl().addClass('ychooser-dlg');

+
var animated = new blah.ext.Resizable('animated', {
+			    width: 200,
+			    height: 100,
+			    minWidth:100,
+			    minHeight:50,
+			    animate:true,
+			    easing: YAHOO.util.Easing.backIn,
+			    duration:.6
+			});
+

The standard Lorem Ipsum passage, used since the 1500s

+

+ "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." +

+ +

Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC

+ +

+ "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?" +

+ +

1914 translation by H. Rackham

+ +

+ "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?" +

+ + +
+ + + + + + +
+
+ chaff! +
+ + +
item2
+ + +
+ + + +
item
+ + + + + + 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
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 @@ + + + + Chat Demo Starter + + + + + + + + + + +
+

Dojo chat demo preabmle ...

+

+ There are two examples of chat, using cometd as a backend and Dojo's + dojox.cometd client as a transport. +

+

+ The first, a simple public chat room, that any live participants + that happen to be online will be able to communicate. +

+
Join Group Chat
+

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 ... +

+
+
Client Page
+
Operator Page
+
+

the Chatroom widget source can be found here.

+
+ + 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 @@ + + + Sample built in tech-support demonstration | The Dojo Toolkit + + + + + + + +

I am a Sample page

+

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.

+ +

Need help?

+ + + +

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.

+

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.

+

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.

+ + + + + 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 @@ + + + Cometd chat / Operator Page + + + + + + + + + +
+
+
+
+

Dojo community chat demo

+

NON-WORKING PROTOTYPE

+ + + +
+
+
+
+ bottom. (input area) +
+
+
+
+ Name: + +
+ + 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 @@ + + + Cometd chat / Operator Page + + + + + + + +

Tech Support Operator Page:

+ +
+ +
+

Welcome Operator

+

It is your job to respond to incoming Support Requests. Sit here, and watch the screen.

+

Please Login as an operator: +

+ Name: +

+
+ +
+
+ + 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: '
' + +'
' + +'
' + +'
' + +'${prompt} ' + +'
' + +'' + +'
' + +'
', + + 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,'>'); + 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 += ""+from+" "+text+"
"; + this._last=""; + }else{ + this.chatNode.innerHTML += ""+from+" "+text+"
"; + 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 @@ + + + + Dojo Form Widgets Test + + + + + + + +
+ +

Job Application Form

+

This is just a little demo of dijit's form widgets

+
+
+ + As you type in the text below, notice how your input is auto + corrected and also the auto completion on the state field. + + Name And Address +
+
+ + +
+ + + +
+ + + + + + + + + +
+ + + + +
+ +
+ Custom checkboxes and radio buttons... + Desired position +
+
+ +
+ + + +
+ + +
+ + +
+
+ +
+ slider and spinner ... + Education and Experience +
+
+ + + + + + + +
+ + + + +
    +
  1. high school
  2. +
  3. college
  4. +
  5. masters
  6. +
  7. PhD
  8. +
+
+
+ + + +
+
+ +
+ Rich text editor that expands as you type in text + +
+
+ +
+ +
+ Text area that expands as you type in text + +
+
+ +
+ +
+ +
+
+ + + 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 @@ + + + + Dijit I18N Demo + + + + + + + + + + +
+
+ + + +
+ +

Dijit I18N Demo (locale= dir=)

+ + + + + + +
+
+ + + + + + +
+
+

+ 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. +

+ + +

Some form controls:

+ + + +
+ + +
+ + +
+ + + +
+ + +
+ + 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 0000000000000000000000000000000000000000..e8eaace10d880236a5c0fadaa875769a94de304e GIT binary patch literal 47275 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 + + + + + + + + +

Country / Language JSON Database Generator

+

push step #1 then wait, then step #2

+ + + +

JSON

+ + + +

Country names, flags, and ISO code

+

data taken from wikipedia ISO 3166-1 site

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Official country names used by the ISO 3166/MANumericAlpha-3Alpha-2Local ISO codes
 Afghanistan004AFGAFISO 3166-2:AF
 Ã…land Islands248ALAAXISO 3166-2:AX
 Albania008ALBALISO 3166-2:AL
 Algeria012DZADZISO 3166-2:DZ
 American Samoa016ASMASISO 3166-2:AS
 Andorra020ANDISO 3166-2:AD
 Angola024AGOAOISO 3166-2:AO
 Anguilla660AIAAIISO 3166-2:AI
 Antarctica010ATAAQISO 3166-2:AQ
 Antigua and Barbuda028ATGAGISO 3166-2:AG
 Argentina032ARGARISO 3166-2:AR
 Armenia051ARMAMISO 3166-2:AM
 Aruba533ABWAWISO 3166-2:AW
 Australia036AUSAUISO 3166-2:AU
 Austria040AUTATISO 3166-2:AT
 Azerbaijan031AZEAZISO 3166-2:AZ
 Bahamas044BHSBSISO 3166-2:BS
 Bahrain048BHRBHISO 3166-2:BH
 Bangladesh050BGDBDISO 3166-2:BD
 Barbados052BRBBBISO 3166-2:BB
 Belarus112BLRBYISO 3166-2:BY
 Belgium056BELBEISO 3166-2:BE
 Belize084BLZBZISO 3166-2:BZ
 Benin204BENBJISO 3166-2:BJ
 Bermuda060BMUBMISO 3166-2:BM
 Bhutan064BTNBTISO 3166-2:BT
 Bolivia068BOLBOISO 3166-2:BO
 Bosnia and Herzegovina070BIHBAISO 3166-2:BA
 Botswana072BWABWISO 3166-2:BW
 Bouvet Island074BVTBVISO 3166-2:BV
 Brazil076BRABRISO 3166-2:BR
 British Indian Ocean Territory086IOTIOISO 3166-2:IO
 Brunei Darussalam096BRNBNISO 3166-2:BN
 Bulgaria100BGRBGISO 3166-2:BG
 Burkina Faso854BFABFISO 3166-2:BF
 Burundi108BDIBIISO 3166-2:BI
 Cambodia116KHMKHISO 3166-2:KH
 Cameroon120CMRCMISO 3166-2:CM
 Canada124CANCAISO 3166-2:CA
 Cape Verde132CPVCVISO 3166-2:CV
 Cayman Islands136CYMKYISO 3166-2:KY
 Central African Republic140CAFCFISO 3166-2:CF
 Chad148TCDTDISO 3166-2:TD
 Chile152CHLCLISO 3166-2:CL
 China156CHNCNISO 3166-2:CN
 Christmas Island162CXRCXISO 3166-2:CX
 Cocos (Keeling) Islands166CCKCCISO 3166-2:CC
 Colombia170COLCOISO 3166-2:CO
 Comoros174COMKMISO 3166-2:KM
 Congo178COGCGISO 3166-2:CG
 Congo, Democratic Republic of the180CODCDISO 3166-2:CD
 Cook Islands184COKCKISO 3166-2:CK
 Costa Rica188CRICRISO 3166-2:CR
 Côte d'Ivoire384CIVCIISO 3166-2:CI
 Croatia191HRVHRISO 3166-2:HR
 Cuba192CUBCUISO 3166-2:CU
 Cyprus196CYPCYISO 3166-2:CY
 Czech Republic203CZECZISO 3166-2:CZ
 Denmark208DNKDKISO 3166-2:DK
 Djibouti262DJIDJISO 3166-2:DJ
 Dominica212DMADMISO 3166-2:DM
 Dominican Republic214DOMDOISO 3166-2:DO
 Ecuador218ECUECISO 3166-2:EC
 Egypt818EGYEGISO 3166-2:EG
 El Salvador222SLVSVISO 3166-2:SV
 Equatorial Guinea226GNQGQISO 3166-2:GQ
 Eritrea232ERIERISO 3166-2:ER
 Estonia233ESTEEISO 3166-2:EE
 Ethiopia231ETHETISO 3166-2:ET
 Falkland Islands (Malvinas)238FLKFKISO 3166-2:FK
 Faroe Islands234FROFOISO 3166-2:FO
 Fiji242FJIFJISO 3166-2:FJ
 Finland246FINFIISO 3166-2:FI
 France250FRAFRISO 3166-2:FR
 French Guiana254GUFGFISO 3166-2:GF
 French Polynesia258PYFPFISO 3166-2:PF
 French Southern Territories260ATFTFISO 3166-2:TF
 Gabon266GABGAISO 3166-2:GA
 Gambia270GMBGMISO 3166-2:GM
 Georgia268GEOGEISO 3166-2:GE
 Germany276DEUDEISO 3166-2:DE
 Ghana288GHAGHISO 3166-2:GH
 Gibraltar292GIBGIISO 3166-2:GI
 Greece300GRCGRISO 3166-2:GR
 Greenland304GRLGLISO 3166-2:GL
 Grenada308GRDGDISO 3166-2:GD
 Guadeloupe[2]312GLPGPISO 3166-2:GP
 Guam316GUMGUISO 3166-2:GU
 Guatemala320GTMGTISO 3166-2:GT
 Guernsey831GGYGGISO 3166-2:GG
 Guinea324GINGNISO 3166-2:GN
 Guinea-Bissau624GNBGWISO 3166-2:GW
 Guyana328GUYGYISO 3166-2:GY
 Haiti332HTIHTISO 3166-2:HT
 Heard Island and McDonald Islands334HMDHMISO 3166-2:HM
 Holy See (Vatican City State)336VATVAISO 3166-2:VA
 Honduras340HNDHNISO 3166-2:HN
 Hong Kong344HKGHKISO 3166-2:HK
 Hungary348HUNHUISO 3166-2:HU
 Iceland352ISLISISO 3166-2:IS
 India356INDINISO 3166-2:IN
 Indonesia360IDNIDISO 3166-2:ID
 Iran, Islamic Republic of364IRNIRISO 3166-2:IR
 Iraq368IRQIQISO 3166-2:IQ
 Ireland372IRLIEISO 3166-2:IE
 Isle of Man833IMNIMISO 3166-2:IM
 Israel376ISRILISO 3166-2:IL
 Italy380ITAITISO 3166-2:IT
 Jamaica388JAMJMISO 3166-2:JM
 Japan392JPNJPISO 3166-2:JP
 Jersey832JEYJEISO 3166-2:JE
 Jordan400JORJOISO 3166-2:JO
 Kazakhstan398KAZKZISO 3166-2:KZ
 Kenya404KENKEISO 3166-2:KE
 Kiribati296KIRKIISO 3166-2:KI
 Korea, Democratic People's Republic of408PRKKPISO 3166-2:KP
 Korea, Republic of410KORKRISO 3166-2:KR
 Kuwait414KWTKWISO 3166-2:KW
 Kyrgyzstan417KGZKGISO 3166-2:KG
 Lao People's Democratic Republic418LAOLAISO 3166-2:LA
 Latvia428LVALVISO 3166-2:LV
 Lebanon422LBNLBISO 3166-2:LB
 Lesotho426LSOLSISO 3166-2:LS
 Liberia430LBRLRISO 3166-2:LR
 Libyan Arab Jamahiriya434LBYLYISO 3166-2:LY
 Liechtenstein438LIELIISO 3166-2:LI
 Lithuania440LTULTISO 3166-2:LT
 Luxembourg442LUXLUISO 3166-2:LU
 Macao446MACMOISO 3166-2:MO
 Macedonia, the former Yugoslav Republic of807MKDMKISO 3166-2:MK
 Madagascar450MDGMGISO 3166-2:MG
 Malawi454MWIMWISO 3166-2:MW
 Malaysia458MYSMYISO 3166-2:MY
 Maldives462MDVMVISO 3166-2:MV
 Mali466MLIMLISO 3166-2:ML
 Malta470MLTMTISO 3166-2:MT
 Marshall Islands584MHLMHISO 3166-2:MH
 Martinique474MTQMQISO 3166-2:MQ
 Mauritania478MRTMRISO 3166-2:MR
 Mauritius480MUSMUISO 3166-2:MU
 Mayotte175MYTYTISO 3166-2:YT
 Mexico484MEXMXISO 3166-2:MX
 Micronesia, Federated States of583FSMFMISO 3166-2:FM
 Moldova, Republic of498MDAMDISO 3166-2:MD
 Monaco492MCOMCISO 3166-2:MC
 Mongolia496MNGMNISO 3166-2:MN
 Montenegro499MNEMEISO 3166-2:ME
 Montserrat500MSRMSISO 3166-2:MS
 Morocco504MARMAISO 3166-2:MA
 Mozambique508MOZMZISO 3166-2:MZ
 Myanmar104MMRMMISO 3166-2:MM
 Namibia516NAMNAISO 3166-2:NA
 Nauru520NRUNRISO 3166-2:NR
 Nepal524NPLNPISO 3166-2:NP
 Netherlands528NLDNLISO 3166-2:NL
 Netherlands Antilles530ANTANISO 3166-2:AN
 New Caledonia540NCLNCISO 3166-2:NC
 New Zealand554NZLNZISO 3166-2:NZ
 Nicaragua558NICNIISO 3166-2:NI
 Niger562NERNEISO 3166-2:NE
 Nigeria566NGANGISO 3166-2:NG
 Niue570NIUNUISO 3166-2:NU
 Norfolk Island574NFKNFISO 3166-2:NF
 Northern Mariana Islands580MNPMPISO 3166-2:MP
 Norway578NORNOISO 3166-2:NO
 Oman512OMNOMISO 3166-2:OM
 Pakistan586PAKPKISO 3166-2:PK
 Palau585PLWPWISO 3166-2:PW
 Palestinian Territory, Occupied275PSEPSISO 3166-2:PS
 Panama591PANPAISO 3166-2:PA
 Papua New Guinea598PNGPGISO 3166-2:PG
 Paraguay600PRYPYISO 3166-2:PY
 Peru604PERPEISO 3166-2:PE
 Philippines608PHLPHISO 3166-2:PH
 Pitcairn612PCNPNISO 3166-2:PN
 Poland616POLPLISO 3166-2:PL
 Portugal620PRTPTISO 3166-2:PT
 Puerto Rico630PRIPRISO 3166-2:PR
 Qatar634QATQAISO 3166-2:QA
 Réunion638REUREISO 3166-2:RE
 Romania642ROUROISO 3166-2:RO
 Russian Federation643RUSRUISO 3166-2:RU
 Rwanda646RWARWISO 3166-2:RW
 Saint Helena654SHNSHISO 3166-2:SH
 Saint Kitts and Nevis659KNAKNISO 3166-2:KN
 Saint Lucia662LCALCISO 3166-2:LC
 Saint Pierre and Miquelon666SPMPMISO 3166-2:PM
 Saint Vincent and the Grenadines670VCTVCISO 3166-2:VC
 Samoa882WSMWSISO 3166-2:WS
 San Marino674SMRSMISO 3166-2:SM
 Sao Tome and Principe678STPSTISO 3166-2:ST
 Saudi Arabia682SAUSAISO 3166-2:SA
 Senegal686SENSNISO 3166-2:SN
 Serbia688SRBRSISO 3166-2:RS
 Seychelles690SYCSCISO 3166-2:SC
 Sierra Leone694SLESLISO 3166-2:SL
 Singapore702SGPSGISO 3166-2:SG
 Slovakia703SVKSKISO 3166-2:SK
 Slovenia705SVNSIISO 3166-2:SI
 Solomon Islands090SLBSBISO 3166-2:SB
 Somalia706SOMSOISO 3166-2:SO
 South Africa710ZAFZAISO 3166-2:ZA
 South Georgia and the South Sandwich Islands239SGSGSISO 3166-2:GS
 Spain724ESPESISO 3166-2:ES
 Sri Lanka144LKALKISO 3166-2:LK
 Sudan736SDNSDISO 3166-2:SD
 Suriname740SURSRISO 3166-2:SR
 Svalbard and Jan Mayen744SJMSJISO 3166-2:SJ
 Swaziland748SWZSZISO 3166-2:SZ
 Sweden752SWESEISO 3166-2:SE
 Switzerland756CHECHISO 3166-2:CH
 Syrian Arab Republic760SYRSYISO 3166-2:SY
 Taiwan, Province of China158TWNTWISO 3166-2:TW
 Tajikistan762TJKTJISO 3166-2:TJ
 Tanzania, United Republic of834TZATZISO 3166-2:TZ
 Thailand764THATHISO 3166-2:TH
 Timor-Leste626TLSTLISO 3166-2:TL
 Togo768TGOTGISO 3166-2:TG
 Tokelau772TKLTKISO 3166-2:TK
 Tonga776TONTOISO 3166-2:TO
 Trinidad and Tobago780TTOTTISO 3166-2:TT
 Tunisia788TUNTNISO 3166-2:TN
 Turkey792TURTRISO 3166-2:TR
 Turkmenistan795TKMTMISO 3166-2:TM
 Turks and Caicos Islands796TCATCISO 3166-2:TC
 Tuvalu798TUVTVISO 3166-2:TV
 Uganda800UGAUGISO 3166-2:UG
 Ukraine804UKRUAISO 3166-2:UA
 United Arab Emirates784AREAEISO 3166-2:AE
 United Kingdom826GBRGBISO 3166-2:GB
 United States840USAUSISO 3166-2:US
 United States Minor Outlying Islands581UMIUMISO 3166-2:UM
 Uruguay858URYUYISO 3166-2:UY
 Uzbekistan860UZBUZISO 3166-2:UZ
 Vanuatu548VUTVUISO 3166-2:VU
 Venezuela862VENVEISO 3166-2:VE
 Viet Nam704VNMVNISO 3166-2:VN
 Virgin Islands, British092VGBVGISO 3166-2:VG
 Virgin Islands, U.S.850VIRVIISO 3166-2:VI
 Wallis and Futuna876WLFWFISO 3166-2:WF
 Western Sahara732ESHEHISO 3166-2:EH
 Yemen887YEMYEISO 3166-2:YE
 Zambia894ZMBZMISO 3166-2:ZM
 Zimbabwe716ZWEZWISO 3166-2:ZW
+ + +

Country Continent Mapping

+

abstracted from wikipedia continent country page

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Africa Algeria – Algiers
Africa Angola – Luanda
Africa Benin – Porto-Novo (seat of government at Cotonou)
Africa Botswana – Gaborone
Africa Burkina Faso – Ouagadougou
Africa Burundi – Bujumbura
Africa Cameroon – Yaoundé
Africa Cape Verde – Praia
Africa Central African Republic – Bangui
Africa Chad – N'Djamena
Africa Comoros – Moroni
Africa Congo, Democratic Republic of (also known as Congo-Kinshasa, formerly known as Zaire) – Kinshasa
Africa Congo, Republic of (also known as Congo-Brazzaville) – Brazzaville
Africa Côte d'Ivoire (commonly known as Ivory Coast) – Yamoussoukro (seat of government at Abidjan)
Africa Djibouti – Djibouti
Africa Egypt – Cairo
Africa Equatorial Guinea – Malabo
Africa Eritrea – Asmara
Africa Ethiopia – Addis Ababa
Africa Gabon – Libreville
Africa Gambia – Banjul
Africa Ghana – Accra
Africa Guinea – Conakry
Africa Guinea-Bissau – Bissau
Africa Kenya – Nairobi
Africa Lesotho – Maseru
Africa Liberia – Monrovia
Africa Libya – Tripoli
Africa Madagascar – Antananarivo
Africa Malawi – Lilongwe
Africa Mali – Bamako
Africa Mauritania – Nouakchott
Africa Mauritius – Port Louis
Africa Mayotte (overseas territory of France) – Mamoudzou
Africa Morocco – Rabat
Africa Mozambique – Maputo
Africa Namibia – Windhoek
Africa Niger – Niamey
Africa Nigeria – Abuja
Africa Réunion (overseas department of France) – Saint-Denis
Africa Rwanda – Kigali
Africa Saint Helena (overseas territory of the United Kingdom) – Jamestown
Africa Sao Tome and Principe – São Tomé
Africa Senegal – Dakar
Africa Seychelles – Victoria
Africa Sierra Leone – Freetown
Africa Somalia – Mogadishu
Africa South Africa – Pretoria (administrative), Cape Town (legislative), Bloemfontein (judicial)
Africa Sudan – Khartoum
Africa Swaziland – Mbabane (administrative), Lobamba (royal and legislative)
Africa Tanzania – Dodoma (seat of government at Dar es Salaam)
Africa Togo – Lomé
Africa Tunisia – Tunis
Africa Uganda – Kampala
Africa Western Sahara – El Aaiún (unofficial)
Africa Zambia – Lusaka
Africa Zimbabwe – Harare
Asia Afghanistan – Kabul
Asia Armenia[2] – Yerevan
Asia Azerbaijan[2] – Baku
Asia Bahrain – Manama
Asia Bangladesh – Dhaka
Asia Bhutan – Thimphu
Asia British Indian Ocean Territory[3] (overseas territory of the United Kingdom)
Asia Brunei – Bandar Seri Begawan
Asia Cambodia – Phnom Penh
Asia China, People's Republic of – Beijing
Asia China, Republic of (commonly known as Taiwan) – Taipei
Asia Christmas Island[4] (overseas territory of Australia)
Asia Cocos (Keeling) Islands[4] (overseas territory of Australia)
Asia Cyprus[2] – Nicosia
Asia Georgia[2] – Tbilisi
Asia Hong Kong (special administrative region of the People's Republic of China)
Asia India – New Delhi
Asia Indonesia – Jakarta
Asia Iran – Tehran
Asia Iraq – Baghdad
Asia Israel – Jerusalem
Asia Japan – Tokyo
Asia Jordan – Amman
Asia Kazakhstan – Astana
Asia Korea, Democratic People's Republic of (commonly known as North Korea) – Pyongyang
Asia Korea, Republic of (commonly known as South Korea) – Seoul
Asia Kuwait – Kuwait City
Asia Kyrgyzstan – Bishkek
Asia Laos – Vientiane
Asia Lebanon – Beirut
Asia Macau (special administrative region of the People's Republic of China)
Asia Malaysia – Kuala Lumpur (seat of government at Putrajaya)
Asia Maldives – Malé
Asia Mongolia – Ulaanbaatar
Asia Myanmar (formerly known as Burma) – Naypyidaw
Asia Nepal – Kathmandu
Asia Oman – Muscat
Asia Pakistan – Islamabad
Asia Palestinian territories (collectively the territories of the West Bank and the Gaza Strip)
Asia Philippines – Manila
Asia Qatar – Doha
Asia Saudi Arabia – Riyadh
Asia Singapore – Singapore[5]
Asia Sri Lanka – Sri Jayawardenepura
Asia Syria – Damascus
Asia Tajikistan – Dushanbe
Asia Thailand – Bangkok
Asia Timor-Leste (commonly known as East Timor) – Dili
Asia Turkey[2] – Ankara
Asia Turkmenistan – Ashgabat
Asia United Arab Emirates – Abu Dhabi
Asia Uzbekistan – Tashkent
Asia Vietnam – Hanoi
Asia Yemen – Sana'a
Europe Albania – Tirana
Europe Andorra – Andorra la Vella
Europe Austria – Vienna
Europe Belarus – Minsk
Europe Belgium – Brussels
Europe Bosnia and Herzegovina – Sarajevo
Europe Bulgaria – Sofia
Europe Croatia – Zagreb
Europe Czech Republic – Prague
Europe Denmark – Copenhagen
Europe Estonia – Tallinn
Europe Faroe Islands (overseas territory of Denmark) – Tórshavn
Europe Finland – Helsinki
Europe France – Paris
Europe Germany – Berlin
Europe Gibraltar (overseas territory of the United Kingdom) – Gibraltar[5]
Europe Greece – Athens
Europe Guernsey (British crown dependency) – Saint Peter Port
Europe Hungary – Budapest
Europe Iceland – Reykjavík
Europe Ireland – Dublin
Europe Isle of Man (British crown dependency) – Douglas
Europe Italy – Rome
Europe Jersey (British crown dependency) – Saint Helier
Europe Latvia – Riga
Europe Liechtenstein – Vaduz
Europe Lithuania – Vilnius
Europe Luxembourg – Luxembourg
Europe Macedonia – Skopje
Europe Malta – Valletta
Europe Moldova – ChiÅŸinău
Europe Monaco – Monaco[5]
Europe Montenegro – Podgorica
Europe Netherlands – Amsterdam (seat of government at The Hague)
Europe Norway – Oslo
Europe Poland – Warsaw
Europe Portugal – Lisbon
Europe Romania – Bucharest
Europe Russia[6] – Moscow
Europe San Marino – San Marino
Europe Serbia – Belgrade
Europe Slovakia – Bratislava
Europe Slovenia – Ljubljana
Europe Spain – Madrid
Europe Sweden – Stockholm
Europe Switzerland – Berne
Europe Ukraine – Kiev
Europe United Kingdom – London
Europe Vatican City – Vatican City[5]
North America Anguilla (overseas territory of the United Kingdom) – The Valley
North America Antigua and Barbuda – Saint John's
North America Aruba (overseas country in the Kingdom of the Netherlands) – Oranjestad
North America Bahamas – Nassau
North America Barbados – Bridgetown
North America Belize – Belmopan
North America Bermuda (overseas territory of the United Kingdom) – Hamilton
North America British Virgin Islands (overseas territory of the United Kingdom) – Road Town
North America Canada – Ottawa
North America Cayman Islands (overseas territory of the United Kingdom) – George Town
North America Clipperton Island (overseas territory of France)
North America Costa Rica – San José
North America Cuba – Havana
North America Dominica – Roseau
North America Dominican Republic – Santo Domingo
North America El Salvador – San Salvador
North America Greenland (overseas territory of Denmark) – Nuuk
North America Grenada – Saint George's
North America Guadeloupe (overseas department of France) – Basse-Terre
North America Guatemala – Guatemala City
North America Haiti – Port-au-Prince
North America Honduras – Tegucigalpa
North America Jamaica – Kingston
North America Martinique (overseas department of France) – Fort-de-France
North America Mexico – Mexico City
North America Montserrat (overseas territory of the United Kingdom) – Plymouth (seat of government at Brades)
North America Navassa Island (overseas territory of the United States)
North America Netherlands Antilles (overseas country in the Kingdom of the Netherlands) – Willemstad
North America Nicaragua – Managua
North America Panama – Panama City
North America Puerto Rico (overseas territory of the United States) – San Juan
North America Saint Barthelemy (overseas territory of France) – Gustavia
North America Saint Kitts and Nevis – Basseterre
North America Saint Lucia – Castries
North America Saint Martin (overseas territory of France) – Marigot
North America Saint Pierre and Miquelon (overseas territory of France) – Saint-Pierre
North America Saint Vincent and the Grenadines – Kingstown
North America Trinidad and Tobago – Port of Spain
North America Turks and Caicos Islands (overseas territory of the United Kingdom) – Cockburn Town
North America United States – Washington, D.C.
North America United States Virgin Islands (overseas territory of the United States) – Charlotte Amalie
South America Argentina – Buenos Aires
South America Bolivia – Sucre (seat of government at La Paz)
South America Brazil – Brasília
South America Chile – Santiago
South America Colombia – Bogotá
South America Ecuador – Quito
South America Falkland Islands (overseas territory of the United Kingdom) – Stanley
South America French Guiana (overseas department of France) – Cayenne
South America Guyana – Georgetown
South America Paraguay – Asunción
South America Peru – Lima
South America Suriname – Paramaribo
South America Uruguay – Montevideo
South America Venezuela – Caracas
Oceania American Samoa (overseas territory of the United States) – Pago Pago (seat of government at Fagatogo)
Oceania Australia – Canberra
Oceania Baker Island (overseas territory of the United States)
Oceania Cook Islands (territory in free association with New Zealand) – Avarua
Oceania Fiji – Suva
Oceania French Polynesia (overseas territory of France) – Papeete
Oceania Guam (overseas territory of the United States) – HagÃ¥tña
Oceania Howland Island (overseas territory of the United States)
Oceania Jarvis Island (overseas territory of the United States)
Oceania Johnston Atoll (overseas territory of the United States)
Oceania Kingman Reef (overseas territory of the United States)
Oceania Kiribati – South Tarawa
Oceania Marshall Islands – Majuro
Oceania Micronesia – Palikir
Oceania Midway Atoll (overseas territory of the United States)
Oceania Nauru – no official capital (seat of government at Yaren)
Oceania New Caledonia (overseas territory of France) – Nouméa
Oceania New Zealand – Wellington
Oceania Niue (territory in free association with New Zealand) – Alofi
Oceania Norfolk Island (overseas territory of Australia) – Kingston
Oceania Northern Mariana Islands (overseas territory of the United States) – Saipan
Oceania Palau – Melekeok
Oceania Palmyra Atoll (overseas territory of the United States)
Oceania Papua New Guinea – Port Moresby
Oceania Pitcairn Islands (overseas territory of the United Kingdom) – Adamstown
Oceania Samoa – Apia
Oceania Solomon Islands – Honiara
Oceania Tokelau (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)
Oceania Tonga – Nuku'alofa
Oceania Tuvalu – Funafuti
Oceania Vanuatu – Port Vila
Oceania Wake Island (overseas territory of the United States)
Oceania Wallis and Futuna (overseas territory of France) – Mata-Utu
Antarctica Bouvet Island (overseas territory of Norway)
Antarctica French Southern Territories (overseas territory of France)
Antarctica Heard Island and McDonald Islands (overseas territory of Australia)
Antarctica South Georgia and the South Sandwich Islands[7] (overseas territory of the United Kingdom)
+ + + 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 ']' ${lang}.xml |head -1 |sed -e 's/.*]*>/name: "/' -e 's/<\/language>/",/' + + # names of other langauges (in this language) + grep '' ${lang}.xml |sed -e 's/.*/",/' -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 @@ + + + + + + + + + + +

Flag Sprite/CSS Generator

+ + +

Sprite

+
+
+
+ +

CSS

+ + + +

Country names, flags, and ISO code

+

data taken from wikipedia ISO 3166-1 site

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Official country names used by the ISO 3166/MANumericAlpha-3Alpha-2Local ISO codes
Flag of Afghanistan Afghanistan004AFGAFISO 3166-2:AF
Flag of Ã…land Ã…land Islands248ALAAXISO 3166-2:AX
Flag of Albania Albania008ALBALISO 3166-2:AL
Flag of Algeria Algeria012DZADZISO 3166-2:DZ
Flag of American Samoa American Samoa016ASMASISO 3166-2:AS
Flag of Andorra Andorra020ANDISO 3166-2:AD
Flag of Angola Angola024AGOAOISO 3166-2:AO
Flag of Anguilla Anguilla660AIAAIISO 3166-2:AI
Flag of Antarctica Antarctica010ATAAQISO 3166-2:AQ
Flag of Antigua and Barbuda Antigua and Barbuda028ATGAGISO 3166-2:AG
Flag of Argentina Argentina032ARGARISO 3166-2:AR
Flag of Armenia Armenia051ARMAMISO 3166-2:AM
Flag of Aruba Aruba533ABWAWISO 3166-2:AW
Flag of Australia Australia036AUSAUISO 3166-2:AU
Flag of Austria Austria040AUTATISO 3166-2:AT
Flag of Azerbaijan Azerbaijan031AZEAZISO 3166-2:AZ
Flag of the Bahamas Bahamas044BHSBSISO 3166-2:BS
Flag of Bahrain Bahrain048BHRBHISO 3166-2:BH
Flag of Bangladesh Bangladesh050BGDBDISO 3166-2:BD
Flag of Barbados Barbados052BRBBBISO 3166-2:BB
Flag of Belarus Belarus112BLRBYISO 3166-2:BY
Flag of Belgium Belgium056BELBEISO 3166-2:BE
Flag of Belize Belize084BLZBZISO 3166-2:BZ
Flag of Benin Benin204BENBJISO 3166-2:BJ
Flag of Bermuda Bermuda060BMUBMISO 3166-2:BM
Flag of Bhutan Bhutan064BTNBTISO 3166-2:BT
Flag of Bolivia Bolivia068BOLBOISO 3166-2:BO
Flag of Bosnia and Herzegovina Bosnia and Herzegovina070BIHBAISO 3166-2:BA
Flag of Botswana Botswana072BWABWISO 3166-2:BW
Flag of Bouvet Island Bouvet Island074BVTBVISO 3166-2:BV
Flag of Brazil Brazil076BRABRISO 3166-2:BR
Flag of British Indian Ocean Territory British Indian Ocean Territory086IOTIOISO 3166-2:IO
Flag of Brunei Brunei Darussalam096BRNBNISO 3166-2:BN
Flag of Bulgaria Bulgaria100BGRBGISO 3166-2:BG
Flag of Burkina Faso Burkina Faso854BFABFISO 3166-2:BF
Flag of Burundi Burundi108BDIBIISO 3166-2:BI
Flag of Cambodia Cambodia116KHMKHISO 3166-2:KH
Flag of Cameroon Cameroon120CMRCMISO 3166-2:CM
Flag of Canada Canada124CANCAISO 3166-2:CA
Flag of Cape Verde Cape Verde132CPVCVISO 3166-2:CV
Flag of Cayman Islands Cayman Islands136CYMKYISO 3166-2:KY
Flag of the Central African Republic Central African Republic140CAFCFISO 3166-2:CF
Flag of Chad Chad148TCDTDISO 3166-2:TD
Flag of Chile Chile152CHLCLISO 3166-2:CL
Flag of the People's Republic of China China156CHNCNISO 3166-2:CN
Flag of Christmas Island Christmas Island162CXRCXISO 3166-2:CX
Flag of the Cocos (Keeling) Islands Cocos (Keeling) Islands166CCKCCISO 3166-2:CC
Flag of Colombia Colombia170COLCOISO 3166-2:CO
Flag of the Comoros Comoros174COMKMISO 3166-2:KM
Flag of the Republic of the Congo Congo178COGCGISO 3166-2:CG
Flag of the Democratic Republic of the Congo Congo, Democratic Republic of the180CODCDISO 3166-2:CD
Flag of the Cook Islands Cook Islands184COKCKISO 3166-2:CK
Flag of Costa Rica Costa Rica188CRICRISO 3166-2:CR
Flag of Côte d'Ivoire Côte d'Ivoire384CIVCIISO 3166-2:CI
Flag of Croatia Croatia191HRVHRISO 3166-2:HR
Flag of Cuba Cuba192CUBCUISO 3166-2:CU
Flag of Cyprus Cyprus196CYPCYISO 3166-2:CY
Flag of the Czech Republic Czech Republic203CZECZISO 3166-2:CZ
Flag of Denmark Denmark208DNKDKISO 3166-2:DK
Flag of Djibouti Djibouti262DJIDJISO 3166-2:DJ
Flag of Dominica Dominica212DMADMISO 3166-2:DM
Flag of the Dominican Republic Dominican Republic214DOMDOISO 3166-2:DO
Flag of Ecuador Ecuador218ECUECISO 3166-2:EC
Flag of Egypt Egypt818EGYEGISO 3166-2:EG
Flag of El Salvador El Salvador222SLVSVISO 3166-2:SV
Flag of Equatorial Guinea Equatorial Guinea226GNQGQISO 3166-2:GQ
Flag of Eritrea Eritrea232ERIERISO 3166-2:ER
Flag of Estonia Estonia233ESTEEISO 3166-2:EE
Flag of Ethiopia Ethiopia231ETHETISO 3166-2:ET
Flag of the Falkland Islands Falkland Islands (Malvinas)238FLKFKISO 3166-2:FK
Flag of the Faroe Islands Faroe Islands234FROFOISO 3166-2:FO
Flag of Fiji Fiji242FJIFJISO 3166-2:FJ
Flag of Finland Finland246FINFIISO 3166-2:FI
Flag of France France250FRAFRISO 3166-2:FR
Flag of French Guiana French Guiana254GUFGFISO 3166-2:GF
Flag of French Polynesia French Polynesia258PYFPFISO 3166-2:PF
Flag of the French Southern and Antarctic Lands French Southern Territories260ATFTFISO 3166-2:TF
Flag of Gabon Gabon266GABGAISO 3166-2:GA
Flag of The Gambia Gambia270GMBGMISO 3166-2:GM
Flag of Georgia (country) Georgia268GEOGEISO 3166-2:GE
Flag of Germany Germany276DEUDEISO 3166-2:DE
Flag of Ghana Ghana288GHAGHISO 3166-2:GH
Flag of Gibraltar Gibraltar292GIBGIISO 3166-2:GI
Flag of Greece Greece300GRCGRISO 3166-2:GR
Flag of Greenland Greenland304GRLGLISO 3166-2:GL
Flag of Grenada Grenada308GRDGDISO 3166-2:GD
Flag of Guadeloupe Guadeloupe[2]312GLPGPISO 3166-2:GP
Flag of Guam Guam316GUMGUISO 3166-2:GU
Flag of Guatemala Guatemala320GTMGTISO 3166-2:GT
Flag of Guernsey Guernsey831GGYGGISO 3166-2:GG
Flag of Guinea Guinea324GINGNISO 3166-2:GN
Flag of Guinea-Bissau Guinea-Bissau624GNBGWISO 3166-2:GW
Flag of Guyana Guyana328GUYGYISO 3166-2:GY
Flag of Haiti Haiti332HTIHTISO 3166-2:HT
Flag of Heard Island and McDonald Islands Heard Island and McDonald Islands334HMDHMISO 3166-2:HM
Flag of the Vatican City Holy See (Vatican City State)336VATVAISO 3166-2:VA
Flag of Honduras Honduras340HNDHNISO 3166-2:HN
Flag of Hong Kong Hong Kong344HKGHKISO 3166-2:HK
Flag of Hungary Hungary348HUNHUISO 3166-2:HU
Flag of Iceland Iceland352ISLISISO 3166-2:IS
Flag of India India356INDINISO 3166-2:IN
Flag of Indonesia Indonesia360IDNIDISO 3166-2:ID
Flag of Iran Iran, Islamic Republic of364IRNIRISO 3166-2:IR
Flag of Iraq Iraq368IRQIQISO 3166-2:IQ
Flag of Ireland Ireland372IRLIEISO 3166-2:IE
Flag of the Isle of Man Isle of Man833IMNIMISO 3166-2:IM
Flag of Israel Israel376ISRILISO 3166-2:IL
Flag of Italy Italy380ITAITISO 3166-2:IT
Flag of Jamaica Jamaica388JAMJMISO 3166-2:JM
Flag of Japan Japan392JPNJPISO 3166-2:JP
Flag of Jersey Jersey832JEYJEISO 3166-2:JE
Flag of Jordan Jordan400JORJOISO 3166-2:JO
Flag of Kazakhstan Kazakhstan398KAZKZISO 3166-2:KZ
Flag of Kenya Kenya404KENKEISO 3166-2:KE
Flag of Kiribati Kiribati296KIRKIISO 3166-2:KI
Flag of North Korea Korea, Democratic People's Republic of408PRKKPISO 3166-2:KP
Flag of South Korea Korea, Republic of410KORKRISO 3166-2:KR
Flag of Kuwait Kuwait414KWTKWISO 3166-2:KW
Flag of Kyrgyzstan Kyrgyzstan417KGZKGISO 3166-2:KG
Flag of Laos Lao People's Democratic Republic418LAOLAISO 3166-2:LA
Flag of Latvia Latvia428LVALVISO 3166-2:LV
Flag of Lebanon Lebanon422LBNLBISO 3166-2:LB
Flag of Lesotho Lesotho426LSOLSISO 3166-2:LS
Flag of Liberia Liberia430LBRLRISO 3166-2:LR
Flag of Libya Libyan Arab Jamahiriya434LBYLYISO 3166-2:LY
Flag of Liechtenstein Liechtenstein438LIELIISO 3166-2:LI
Flag of Lithuania Lithuania440LTULTISO 3166-2:LT
Flag of Luxembourg Luxembourg442LUXLUISO 3166-2:LU
Flag of Macau Macao446MACMOISO 3166-2:MO
Flag of the Republic of Macedonia Macedonia, the former Yugoslav Republic of807MKDMKISO 3166-2:MK
Flag of Madagascar Madagascar450MDGMGISO 3166-2:MG
Flag of Malawi Malawi454MWIMWISO 3166-2:MW
Flag of Malaysia Malaysia458MYSMYISO 3166-2:MY
Flag of the Maldives Maldives462MDVMVISO 3166-2:MV
Flag of Mali Mali466MLIMLISO 3166-2:ML
Flag of Malta Malta470MLTMTISO 3166-2:MT
Flag of the Marshall Islands Marshall Islands584MHLMHISO 3166-2:MH
Flag of Martinique Martinique474MTQMQISO 3166-2:MQ
Flag of Mauritania Mauritania478MRTMRISO 3166-2:MR
Flag of Mauritius Mauritius480MUSMUISO 3166-2:MU
Flag of Mayotte Mayotte175MYTYTISO 3166-2:YT
Flag of Mexico Mexico484MEXMXISO 3166-2:MX
Flag of the Federated States of Micronesia Micronesia, Federated States of583FSMFMISO 3166-2:FM
Flag of Moldova Moldova, Republic of498MDAMDISO 3166-2:MD
Flag of Monaco Monaco492MCOMCISO 3166-2:MC
Flag of Mongolia Mongolia496MNGMNISO 3166-2:MN
Flag of Montenegro Montenegro499MNEMEISO 3166-2:ME
Flag of Montserrat Montserrat500MSRMSISO 3166-2:MS
Flag of Morocco Morocco504MARMAISO 3166-2:MA
Flag of Mozambique Mozambique508MOZMZISO 3166-2:MZ
Flag of Myanmar Myanmar104MMRMMISO 3166-2:MM
Flag of Namibia Namibia516NAMNAISO 3166-2:NA
Flag of Nauru Nauru520NRUNRISO 3166-2:NR
Flag of Nepal Nepal524NPLNPISO 3166-2:NP
Flag of the Netherlands Netherlands528NLDNLISO 3166-2:NL
Flag of the Netherlands Antilles Netherlands Antilles530ANTANISO 3166-2:AN
Flag of New Caledonia New Caledonia540NCLNCISO 3166-2:NC
Flag of New Zealand New Zealand554NZLNZISO 3166-2:NZ
Flag of Nicaragua Nicaragua558NICNIISO 3166-2:NI
Flag of Niger Niger562NERNEISO 3166-2:NE
Flag of Nigeria Nigeria566NGANGISO 3166-2:NG
Flag of Niue Niue570NIUNUISO 3166-2:NU
Flag of Norfolk Island Norfolk Island574NFKNFISO 3166-2:NF
Flag of the Northern Mariana Islands Northern Mariana Islands580MNPMPISO 3166-2:MP
Flag of Norway Norway578NORNOISO 3166-2:NO
Flag of Oman Oman512OMNOMISO 3166-2:OM
Flag of Pakistan Pakistan586PAKPKISO 3166-2:PK
Flag of Palau Palau585PLWPWISO 3166-2:PW
Palestinian flag Palestinian Territory, Occupied275PSEPSISO 3166-2:PS
Flag of Panama Panama591PANPAISO 3166-2:PA
Flag of Papua New Guinea Papua New Guinea598PNGPGISO 3166-2:PG
Flag of Paraguay Paraguay600PRYPYISO 3166-2:PY
Flag of Peru Peru604PERPEISO 3166-2:PE
Flag of the Philippines Philippines608PHLPHISO 3166-2:PH
Flag of the Pitcairn Islands Pitcairn612PCNPNISO 3166-2:PN
Flag of Poland Poland616POLPLISO 3166-2:PL
Flag of Portugal Portugal620PRTPTISO 3166-2:PT
Flag of Puerto Rico Puerto Rico630PRIPRISO 3166-2:PR
Flag of Qatar Qatar634QATQAISO 3166-2:QA
Flag of Réunion Réunion638REUREISO 3166-2:RE
Flag of Romania Romania642ROUROISO 3166-2:RO
Flag of Russia Russian Federation643RUSRUISO 3166-2:RU
Flag of Rwanda Rwanda646RWARWISO 3166-2:RW
Flag of Saint Helena Saint Helena654SHNSHISO 3166-2:SH
Flag of Saint Kitts and Nevis Saint Kitts and Nevis659KNAKNISO 3166-2:KN
Flag of Saint Lucia Saint Lucia662LCALCISO 3166-2:LC
Flag of Saint Pierre and Miquelon Saint Pierre and Miquelon666SPMPMISO 3166-2:PM
Flag of Saint Vincent and the Grenadines Saint Vincent and the Grenadines670VCTVCISO 3166-2:VC
Flag of Samoa Samoa882WSMWSISO 3166-2:WS
Flag of San Marino San Marino674SMRSMISO 3166-2:SM
Flag of São Tomé and Príncipe Sao Tome and Principe678STPSTISO 3166-2:ST
Flag of Saudi Arabia Saudi Arabia682SAUSAISO 3166-2:SA
Flag of Senegal Senegal686SENSNISO 3166-2:SN
Flag of Serbia Serbia688SRBRSISO 3166-2:RS
Flag of the Seychelles Seychelles690SYCSCISO 3166-2:SC
Flag of Sierra Leone Sierra Leone694SLESLISO 3166-2:SL
Flag of Singapore Singapore702SGPSGISO 3166-2:SG
Flag of Slovakia Slovakia703SVKSKISO 3166-2:SK
Flag of Slovenia Slovenia705SVNSIISO 3166-2:SI
Flag of the Solomon Islands Solomon Islands090SLBSBISO 3166-2:SB
Flag of Somalia Somalia706SOMSOISO 3166-2:SO
Flag of South Africa South Africa710ZAFZAISO 3166-2:ZA
Flag of South Georgia and the South Sandwich Islands South Georgia and the South Sandwich Islands239SGSGSISO 3166-2:GS
Flag of Spain Spain724ESPESISO 3166-2:ES
Flag of Sri Lanka Sri Lanka144LKALKISO 3166-2:LK
Flag of Sudan Sudan736SDNSDISO 3166-2:SD
Flag of Suriname Suriname740SURSRISO 3166-2:SR
Flag of Svalbard and Jan Mayen Svalbard and Jan Mayen744SJMSJISO 3166-2:SJ
Flag of Swaziland Swaziland748SWZSZISO 3166-2:SZ
Flag of Sweden Sweden752SWESEISO 3166-2:SE
Flag of Switzerland Switzerland756CHECHISO 3166-2:CH
Flag of Syria Syrian Arab Republic760SYRSYISO 3166-2:SY
Flag of the Republic of China Taiwan, Province of China158TWNTWISO 3166-2:TW
Flag of Tajikistan Tajikistan762TJKTJISO 3166-2:TJ
Flag of Tanzania Tanzania, United Republic of834TZATZISO 3166-2:TZ
Flag of Thailand Thailand764THATHISO 3166-2:TH
Flag of East Timor Timor-Leste626TLSTLISO 3166-2:TL
Flag of Togo Togo768TGOTGISO 3166-2:TG
Flag of Tokelau Tokelau772TKLTKISO 3166-2:TK
Flag of Tonga Tonga776TONTOISO 3166-2:TO
Flag of Trinidad and Tobago Trinidad and Tobago780TTOTTISO 3166-2:TT
Flag of Tunisia Tunisia788TUNTNISO 3166-2:TN
Flag of Turkey Turkey792TURTRISO 3166-2:TR
Flag of Turkmenistan Turkmenistan795TKMTMISO 3166-2:TM
Flag of the Turks and Caicos Islands Turks and Caicos Islands796TCATCISO 3166-2:TC
Flag of Tuvalu Tuvalu798TUVTVISO 3166-2:TV
Flag of Uganda Uganda800UGAUGISO 3166-2:UG
Flag of Ukraine Ukraine804UKRUAISO 3166-2:UA
Flag of the United Arab Emirates United Arab Emirates784AREAEISO 3166-2:AE
Flag of the United Kingdom United Kingdom826GBRGBISO 3166-2:GB
Flag of the United States United States840USAUSISO 3166-2:US
Flag of United States Minor Outlying Islands United States Minor Outlying Islands581UMIUMISO 3166-2:UM
Flag of Uruguay Uruguay858URYUYISO 3166-2:UY
Flag of Uzbekistan Uzbekistan860UZBUZISO 3166-2:UZ
Flag of Vanuatu Vanuatu548VUTVUISO 3166-2:VU
Flag of Venezuela Venezuela862VENVEISO 3166-2:VE
Flag of Vietnam Viet Nam704VNMVNISO 3166-2:VN
Flag of the British Virgin Islands Virgin Islands, British092VGBVGISO 3166-2:VG
Flag of the United States Virgin Islands Virgin Islands, U.S.850VIRVIISO 3166-2:VI
Flag of Wallis and Futuna Wallis and Futuna876WLFWFISO 3166-2:WF
Flag of Western Sahara Western Sahara732ESHEHISO 3166-2:EH
Flag of Yemen Yemen887YEMYEISO 3166-2:YE
Flag of Zambia Zambia894ZMBZMISO 3166-2:ZM
Flag of Zimbabwe Zimbabwe716ZWEZWISO 3166-2:ZW
+ +

Country Continent Mapping

+

abstracted from wikipedia continent country page

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AfricaFlag of Algeria Algeria – Algiers
AfricaFlag of Angola Angola – Luanda
AfricaFlag of Benin Benin – Porto-Novo (seat of government at Cotonou)
AfricaFlag of Botswana Botswana – Gaborone
AfricaFlag of Burkina Faso Burkina Faso – Ouagadougou
AfricaFlag of Burundi Burundi – Bujumbura
AfricaFlag of Cameroon Cameroon – Yaoundé
AfricaFlag of Cape Verde Cape Verde – Praia
AfricaFlag of the Central African Republic Central African Republic – Bangui
AfricaFlag of Chad Chad – N'Djamena
AfricaFlag of the Comoros Comoros – Moroni
AfricaFlag of the Democratic Republic of the Congo Congo, Democratic Republic of (also known as Congo-Kinshasa, formerly known as Zaire) – Kinshasa
AfricaFlag of the Republic of the Congo Congo, Republic of (also known as Congo-Brazzaville) – Brazzaville
AfricaFlag of Côte d'Ivoire Côte d'Ivoire (commonly known as Ivory Coast) – Yamoussoukro (seat of government at Abidjan)
AfricaFlag of Djibouti Djibouti – Djibouti
AfricaFlag of Egypt Egypt – Cairo
AfricaFlag of Equatorial Guinea Equatorial Guinea – Malabo
AfricaFlag of Eritrea Eritrea – Asmara
AfricaFlag of Ethiopia Ethiopia – Addis Ababa
AfricaFlag of Gabon Gabon – Libreville
AfricaFlag of The Gambia Gambia – Banjul
AfricaFlag of Ghana Ghana – Accra
AfricaFlag of Guinea Guinea – Conakry
AfricaFlag of Guinea-Bissau Guinea-Bissau – Bissau
AfricaFlag of Kenya Kenya – Nairobi
AfricaFlag of Lesotho Lesotho – Maseru
AfricaFlag of Liberia Liberia – Monrovia
AfricaFlag of Libya Libya – Tripoli
AfricaFlag of Madagascar Madagascar – Antananarivo
AfricaFlag of Malawi Malawi – Lilongwe
AfricaFlag of Mali Mali – Bamako
AfricaFlag of Mauritania Mauritania – Nouakchott
AfricaFlag of Mauritius Mauritius – Port Louis
AfricaFlag of Mayotte Mayotte (overseas territory of France) – Mamoudzou
AfricaFlag of Morocco Morocco – Rabat
AfricaFlag of Mozambique Mozambique – Maputo
AfricaFlag of Namibia Namibia – Windhoek
AfricaFlag of Niger Niger – Niamey
AfricaFlag of Nigeria Nigeria – Abuja
AfricaFlag of Réunion Réunion (overseas department of France) – Saint-Denis
AfricaFlag of Rwanda Rwanda – Kigali
AfricaFlag of Saint Helena Saint Helena (overseas territory of the United Kingdom) – Jamestown
AfricaFlag of São Tomé and Príncipe Sao Tome and Principe – São Tomé
AfricaFlag of Senegal Senegal – Dakar
AfricaFlag of the Seychelles Seychelles – Victoria
AfricaFlag of Sierra Leone Sierra Leone – Freetown
AfricaFlag of Somalia Somalia – Mogadishu
AfricaFlag of South Africa South Africa – Pretoria (administrative), Cape Town (legislative), Bloemfontein (judicial)
AfricaFlag of Sudan Sudan – Khartoum
AfricaFlag of Swaziland Swaziland – Mbabane (administrative), Lobamba (royal and legislative)
AfricaFlag of Tanzania Tanzania – Dodoma (seat of government at Dar es Salaam)
AfricaFlag of Togo Togo – Lomé
AfricaFlag of Tunisia Tunisia – Tunis
AfricaFlag of Uganda Uganda – Kampala
AfricaFlag of Western Sahara Western Sahara – El Aaiún (unofficial)
AfricaFlag of Zambia Zambia – Lusaka
AfricaFlag of Zimbabwe Zimbabwe – Harare
AsiaFlag of Afghanistan Afghanistan – Kabul
AsiaFlag of Armenia Armenia[2] – Yerevan
AsiaFlag of Azerbaijan Azerbaijan[2] – Baku
AsiaFlag of Bahrain Bahrain – Manama
AsiaFlag of Bangladesh Bangladesh – Dhaka
AsiaFlag of Bhutan Bhutan – Thimphu
AsiaFlag of British Indian Ocean Territory British Indian Ocean Territory[3] (overseas territory of the United Kingdom)
AsiaFlag of Brunei Brunei – Bandar Seri Begawan
AsiaFlag of Cambodia Cambodia – Phnom Penh
AsiaFlag of the People's Republic of China China, People's Republic of – Beijing
AsiaFlag of the Republic of China China, Republic of (commonly known as Taiwan) – Taipei
AsiaFlag of Christmas Island Christmas Island[4] (overseas territory of Australia)
AsiaFlag of the Cocos (Keeling) Islands Cocos (Keeling) Islands[4] (overseas territory of Australia)
AsiaFlag of Cyprus Cyprus[2] – Nicosia
AsiaFlag of Georgia (country) Georgia[2] – Tbilisi
AsiaFlag of Hong Kong Hong Kong (special administrative region of the People's Republic of China)
AsiaFlag of India India – New Delhi
AsiaFlag of Indonesia Indonesia – Jakarta
AsiaFlag of Iran Iran – Tehran
AsiaFlag of Iraq Iraq – Baghdad
AsiaFlag of Israel Israel – Jerusalem
AsiaFlag of Japan Japan – Tokyo
AsiaFlag of Jordan Jordan – Amman
AsiaFlag of Kazakhstan Kazakhstan – Astana
AsiaFlag of North Korea Korea, Democratic People's Republic of (commonly known as North Korea) – Pyongyang
AsiaFlag of South Korea Korea, Republic of (commonly known as South Korea) – Seoul
AsiaFlag of Kuwait Kuwait – Kuwait City
AsiaFlag of Kyrgyzstan Kyrgyzstan – Bishkek
AsiaFlag of Laos Laos – Vientiane
AsiaFlag of Lebanon Lebanon – Beirut
AsiaFlag of Macau Macau (special administrative region of the People's Republic of China)
AsiaFlag of Malaysia Malaysia – Kuala Lumpur (seat of government at Putrajaya)
AsiaFlag of the Maldives Maldives – Malé
AsiaFlag of Mongolia Mongolia – Ulaanbaatar
AsiaFlag of Myanmar Myanmar (formerly known as Burma) – Naypyidaw
AsiaFlag of Nepal Nepal – Kathmandu
AsiaFlag of Oman Oman – Muscat
AsiaFlag of Pakistan Pakistan – Islamabad
AsiaPalestinian flag Palestinian territories (collectively the territories of the West Bank and the Gaza Strip)
AsiaFlag of the Philippines Philippines – Manila
AsiaFlag of Qatar Qatar – Doha
AsiaFlag of Saudi Arabia Saudi Arabia – Riyadh
AsiaFlag of Singapore Singapore – Singapore[5]
AsiaFlag of Sri Lanka Sri Lanka – Sri Jayawardenepura
AsiaFlag of Syria Syria – Damascus
AsiaFlag of Tajikistan Tajikistan – Dushanbe
AsiaFlag of Thailand Thailand – Bangkok
AsiaFlag of East Timor Timor-Leste (commonly known as East Timor) – Dili
AsiaFlag of Turkey Turkey[2] – Ankara
AsiaFlag of Turkmenistan Turkmenistan – Ashgabat
AsiaFlag of the United Arab Emirates United Arab Emirates – Abu Dhabi
AsiaFlag of Uzbekistan Uzbekistan – Tashkent
AsiaFlag of Vietnam Vietnam – Hanoi
AsiaFlag of Yemen Yemen – Sana'a
EuropeFlag of Albania Albania – Tirana
EuropeFlag of Andorra Andorra – Andorra la Vella
EuropeFlag of Austria Austria – Vienna
EuropeFlag of Belarus Belarus – Minsk
EuropeFlag of Belgium Belgium – Brussels
EuropeFlag of Bosnia and Herzegovina Bosnia and Herzegovina – Sarajevo
EuropeFlag of Bulgaria Bulgaria – Sofia
EuropeFlag of Croatia Croatia – Zagreb
EuropeFlag of the Czech Republic Czech Republic – Prague
EuropeFlag of Denmark Denmark – Copenhagen
EuropeFlag of Estonia Estonia – Tallinn
EuropeFlag of the Faroe Islands Faroe Islands (overseas territory of Denmark) – Tórshavn
EuropeFlag of Finland Finland – Helsinki
EuropeFlag of France France – Paris
EuropeFlag of Germany Germany – Berlin
EuropeFlag of Gibraltar Gibraltar (overseas territory of the United Kingdom) – Gibraltar[5]
EuropeFlag of Greece Greece – Athens
EuropeFlag of Guernsey Guernsey (British crown dependency) – Saint Peter Port
EuropeFlag of Hungary Hungary – Budapest
EuropeFlag of Iceland Iceland – Reykjavík
EuropeFlag of Ireland Ireland – Dublin
EuropeFlag of the Isle of Man Isle of Man (British crown dependency) – Douglas
EuropeFlag of Italy Italy – Rome
EuropeFlag of Jersey Jersey (British crown dependency) – Saint Helier
EuropeFlag of Latvia Latvia – Riga
EuropeFlag of Liechtenstein Liechtenstein – Vaduz
EuropeFlag of Lithuania Lithuania – Vilnius
EuropeFlag of Luxembourg Luxembourg – Luxembourg
EuropeFlag of the Republic of Macedonia Macedonia – Skopje
EuropeFlag of Malta Malta – Valletta
EuropeFlag of Moldova Moldova – ChiÅŸinău
EuropeFlag of Monaco Monaco – Monaco[5]
EuropeFlag of Montenegro Montenegro – Podgorica
EuropeFlag of the Netherlands Netherlands – Amsterdam (seat of government at The Hague)
EuropeFlag of Norway Norway – Oslo
EuropeFlag of Poland Poland – Warsaw
EuropeFlag of Portugal Portugal – Lisbon
EuropeFlag of Romania Romania – Bucharest
EuropeFlag of Russia Russia[6] – Moscow
EuropeFlag of San Marino San Marino – San Marino
EuropeFlag of Serbia Serbia – Belgrade
EuropeFlag of Slovakia Slovakia – Bratislava
EuropeFlag of Slovenia Slovenia – Ljubljana
EuropeFlag of Spain Spain – Madrid
EuropeFlag of Sweden Sweden – Stockholm
EuropeFlag of Switzerland Switzerland – Berne
EuropeFlag of Ukraine Ukraine – Kiev
EuropeFlag of the United Kingdom United Kingdom – London
EuropeFlag of the Vatican City Vatican City – Vatican City[5]
North AmericaFlag of Anguilla Anguilla (overseas territory of the United Kingdom) – The Valley
North AmericaFlag of Antigua and Barbuda Antigua and Barbuda – Saint John's
North AmericaFlag of Aruba Aruba (overseas country in the Kingdom of the Netherlands) – Oranjestad
North AmericaFlag of the Bahamas Bahamas – Nassau
North AmericaFlag of Barbados Barbados – Bridgetown
North AmericaFlag of Belize Belize – Belmopan
North AmericaFlag of Bermuda Bermuda (overseas territory of the United Kingdom) – Hamilton
North AmericaFlag of the British Virgin Islands British Virgin Islands (overseas territory of the United Kingdom) – Road Town
North AmericaFlag of Canada Canada – Ottawa
North AmericaFlag of Cayman Islands Cayman Islands (overseas territory of the United Kingdom) – George Town
North AmericaFlag of France Clipperton Island (overseas territory of France)
North AmericaFlag of Costa Rica Costa Rica – San José
North AmericaFlag of Cuba Cuba – Havana
North AmericaFlag of Dominica Dominica – Roseau
North AmericaFlag of the Dominican Republic Dominican Republic – Santo Domingo
North AmericaFlag of El Salvador El Salvador – San Salvador
North AmericaFlag of Greenland Greenland (overseas territory of Denmark) – Nuuk
North AmericaFlag of Grenada Grenada – Saint George's
North AmericaFlag of Guadeloupe Guadeloupe (overseas department of France) – Basse-Terre
North AmericaFlag of Guatemala Guatemala – Guatemala City
North AmericaFlag of Haiti Haiti – Port-au-Prince
North AmericaFlag of Honduras Honduras – Tegucigalpa
North AmericaFlag of Jamaica Jamaica – Kingston
North AmericaFlag of Martinique Martinique (overseas department of France) – Fort-de-France
North AmericaFlag of Mexico Mexico – Mexico City
North AmericaFlag of Montserrat Montserrat (overseas territory of the United Kingdom) – Plymouth (seat of government at Brades)
North AmericaFlag of Navassa Island Navassa Island (overseas territory of the United States)
North AmericaFlag of the Netherlands Antilles Netherlands Antilles (overseas country in the Kingdom of the Netherlands) – Willemstad
North AmericaFlag of Nicaragua Nicaragua – Managua
North AmericaFlag of Panama Panama – Panama City
North AmericaFlag of Puerto Rico Puerto Rico (overseas territory of the United States) – San Juan
North AmericaFlag of Saint Barthelemy Saint Barthelemy (overseas territory of France) – Gustavia
North AmericaFlag of Saint Kitts and Nevis Saint Kitts and Nevis – Basseterre
North AmericaFlag of Saint Lucia Saint Lucia – Castries
North AmericaFlag of Saint Martin (France) Saint Martin (overseas territory of France) – Marigot
North AmericaFlag of Saint Pierre and Miquelon Saint Pierre and Miquelon (overseas territory of France) – Saint-Pierre
North AmericaFlag of Saint Vincent and the Grenadines Saint Vincent and the Grenadines – Kingstown
North AmericaFlag of Trinidad and Tobago Trinidad and Tobago – Port of Spain
North AmericaFlag of the Turks and Caicos Islands Turks and Caicos Islands (overseas territory of the United Kingdom) – Cockburn Town
North AmericaFlag of the United States United States – Washington, D.C.
North AmericaFlag of the United States Virgin Islands United States Virgin Islands (overseas territory of the United States) – Charlotte Amalie
South AmericaFlag of Argentina Argentina – Buenos Aires
South AmericaFlag of Bolivia Bolivia – Sucre (seat of government at La Paz)
South AmericaFlag of Brazil Brazil – Brasília
South AmericaFlag of Chile Chile – Santiago
South AmericaFlag of Colombia Colombia – Bogotá
South AmericaFlag of Ecuador Ecuador – Quito
South AmericaFlag of the Falkland Islands Falkland Islands (overseas territory of the United Kingdom) – Stanley
South AmericaFlag of French Guiana French Guiana (overseas department of France) – Cayenne
South AmericaFlag of Guyana Guyana – Georgetown
South AmericaFlag of Paraguay Paraguay – Asunción
South AmericaFlag of Peru Peru – Lima
South AmericaFlag of Suriname Suriname – Paramaribo
South AmericaFlag of Uruguay Uruguay – Montevideo
South AmericaFlag of Venezuela Venezuela – Caracas
OceaniaFlag of American Samoa American Samoa (overseas territory of the United States) – Pago Pago (seat of government at Fagatogo)
OceaniaFlag of Australia Australia – Canberra
OceaniaFlag of the United States Baker Island (overseas territory of the United States)
OceaniaFlag of the Cook Islands Cook Islands (territory in free association with New Zealand) – Avarua
OceaniaFlag of Fiji Fiji – Suva
OceaniaFlag of French Polynesia French Polynesia (overseas territory of France) – Papeete
OceaniaFlag of Guam Guam (overseas territory of the United States) – HagÃ¥tña
OceaniaFlag of the United States Howland Island (overseas territory of the United States)
OceaniaFlag of the United States Jarvis Island (overseas territory of the United States)
OceaniaFlag of the United States Johnston Atoll (overseas territory of the United States)
OceaniaFlag of the United States Kingman Reef (overseas territory of the United States)
OceaniaFlag of Kiribati Kiribati – South Tarawa
OceaniaFlag of the Marshall Islands Marshall Islands – Majuro
OceaniaFlag of the Federated States of Micronesia Micronesia – Palikir
OceaniaFlag of the United States Midway Atoll (overseas territory of the United States)
OceaniaFlag of Nauru Nauru – no official capital (seat of government at Yaren)
OceaniaFlag of New Caledonia New Caledonia (overseas territory of France) – Nouméa
OceaniaFlag of New Zealand New Zealand – Wellington
OceaniaFlag of Niue Niue (territory in free association with New Zealand) – Alofi
OceaniaFlag of Norfolk Island Norfolk Island (overseas territory of Australia) – Kingston
OceaniaFlag of the Northern Mariana Islands Northern Mariana Islands (overseas territory of the United States) – Saipan
OceaniaFlag of Palau Palau – Melekeok
OceaniaFlag of the United States Palmyra Atoll (overseas territory of the United States)
OceaniaFlag of Papua New Guinea Papua New Guinea – Port Moresby
OceaniaFlag of the Pitcairn Islands Pitcairn Islands (overseas territory of the United Kingdom) – Adamstown
OceaniaFlag of Samoa Samoa – Apia
OceaniaFlag of the Solomon Islands Solomon Islands – Honiara
OceaniaFlag of Tokelau Tokelau (overseas territory of New Zealand) – no official capital (each atoll has its own administrative centre)
OceaniaFlag of Tonga Tonga – Nuku'alofa
OceaniaFlag of Tuvalu Tuvalu – Funafuti
OceaniaFlag of Vanuatu Vanuatu – Port Vila
OceaniaFlag of the United States Wake Island (overseas territory of the United States)
OceaniaFlag of Wallis and Futuna Wallis and Futuna (overseas territory of France) – Mata-Utu
AntarcticaFlag of Bouvet Island Bouvet Island (overseas territory of Norway)
AntarcticaFlag of the French Southern and Antarctic Lands French Southern Territories (overseas territory of France)
AntarcticaFlag of Heard Island and McDonald Islands Heard Island and McDonald Islands (overseas territory of Australia)
AntarcticaFlag of South Georgia and the South Sandwich Islands South Georgia and the South Sandwich Islands[7] (overseas territory of the United Kingdom)
+ + + 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 @@ + + + + Demo Mail Application + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+ + + +
+ +
+ + +
+
+
+ + +
+ + +
+
+ + Get Mail +
    +
  • Yahoo
  • +
  • GMail
  • +
+
+ Click to download new mail. + + + Click to compose new message. + + +
Set various options
+
+ +
+ +
+
+
+
+ + +
+
+
+ + + + +
+
+ + +
+ + + +
+ + +
+

+ This is a simple application mockup showing some of the dojo widgets: +

+
    +
  • layout widgets: BorderContainer, AccordionContainer
  • +
  • TooltipDialog, Tooltip
  • +
  • Tree
  • +
  • form widgets: Button, DropDownButton, ComboButton, FilteringSelect, ComboBox
  • +
  • Editor
  • +
+

+ 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. + +

+

+ -- Bill +

+
+ +
+
+ + +
+ +
+ + + + + + + + +
+
+
+ + +
+
+
+
+
+
+
+ + diff --git a/includes/js/dijit/demos/mail/icons.gif b/includes/js/dijit/demos/mail/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0b1760ac7efccdfbfd561d068eaf5264ff22f7d GIT binary patch literal 1757 zcmV<31|s=KNk%w1Vb=f>0Oo%H^VZfll0p0X`rGFB+lYuWhCb=Ew2GUo!O`xvwzgdA zQ`qL(tHasT)6?$7#bWJQr&eBikEr77`P|&xLgP8>>+9Fz^=s;5I?6XtW_jkSs%CkK zGA54yP1r)lRs2+^z`({M@P!p@$vETGmkvD)4f`7 zenMDn;+~$o&h1OcNyyyG!NI{>)mF^f@^Ytp{PgrWuspBLv}&G*JfA~^uBKw0Y%qX5 zx3sI2o~&wushz2@zR>Q-*YSmzt8R#_-|6^pgOSeM^MaPDYk!q)g`R4IrE!O!OJRFy z@LSow&0eQ$Y*WFZg$hH zxyg8ca*dsUuZY8VgvqnUREBZ9fs*g_@PC=ZU3QbW%k2OE|NsC0A^8LW004ggEC2ui z0M`H#000O7fPaF6goTEOh>41ejE# ze64&Li>iaHuCS@AuCKAUwU2%az`z2FP=3b8$i`5IvVyd&ww8K{&416jiW(#!+}uEl zxn6tYdsn%L;pFA#hw0?zuIR4f@9cieDDcIxW$osvgV$3^}rCPDV<2s3_2bX;YGfFoMv4Yy>v~hkk4ryTOAx6KGBN_+f~T zhbVCWGbz`}tqU%GVR(x(p!9#4jtG?A>hA1-!@ z8%Kt`t@7o@ng@PDp?YV4{iG8MYk}9URpF2NQ50-XRDoXaR!`La1K^i_lO*RXy-vVhF*}nBam9J{aNu zdOQl^m1@SYrW$HF95_I2HyTkz3n?(r#}e>$=8qt6dFaOtPnGE*nue&EA)AMwu|NSQ zq6my(j3H*+c!L~pr3G1TNks}fD$>IfD=^W66GF%^LjV!cIDi~*kPycmf)dK)Alsbc zhm^($5a5A;-k4+)PZZEZ045foL?K{AVJ4h}#5(I!wyycqA87Cpz#1|H8!Qt61W=eE z0PPUaKsyM4L$iDeazLp#J~(Khh|o|#2nvMYL<|Zj5Q7bg956>W+}MG@wVOH#f@+`| zL!}{Bz+kTtI#j^`4d+rw;?rnyz}1=jB8j2Ft+$&0|F>>NYz(w31QkxD`LYM4}?*9 z5lEfzcdnE+Rg~g}xDLDjwUCpZ$mAD< zaX|pDCISEmBzW$E2BNw!dLLjPT_7?9dUQw$u|vSRg3u+}U7!GNz@L@=6sVasuMmD> zAPltRKF8B%}B0z;A5^z1UD*y^$D6LYNDn~&$0|%!?tt3H6icB<~6RUMa z4t7w6A{?QITt-AAzR-(&D*z1{Av6%+@KYej!wwDM0R3ge0E&o!9{0#cI_wb<2MDAU ztgwYGl%NEBES|IkNk~H?l8=C7WFZfk$VSvajg2VA7>Ah1PU`VG5j1dw>Ohc#5x52f zW9Vce1ONaBfJ79qjHM)|;fPPz(q*!Qgadl$5!U7Mm%t3BFo$^>2Yg@=fdBwI?Nd;3 literal 0 HcmV?d00001 diff --git a/includes/js/dijit/demos/mail/icons.png b/includes/js/dijit/demos/mail/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..f333fbea54399cc5ff044ebd0f486cc1d637cf4c GIT binary patch literal 2908 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's do it tomorrow instead.

Adam" }, + { type: 'message', id: 'node1.2', folder: 'inbox', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18", + text: + "

Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet:

" + }, + { 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?

You can navigate around this demo with arrows and tabs ...

Regards,
Carrey" + }, + { type: 'message', id: 'node1.4', folder: 'inbox', label: "paint", sender: "David Davis", sent: "2005-12-16", text: + "

what color is good for the new office?

Let me know soon

" + }, + { type: 'message', id: 'node2.1', folder: 'deleted', label: "today's meeting", sender: "Madam Marlen", sent: "2005-12-19", + text: "Today's meeting is cancelled.
Let's do it tomorrow instead.

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?
The deadline is next Friday. " }, + { type: 'message', id: 'node2.4', folder: 'deleted', label: "paint", sender: "Daniel Dooey", sent: "2005-12-16", text: + "

what color is good for the new office?

Let me know soon

" + }, + { type: 'message', id: 'node3.1', folder: 'work', label: "today's meeting", sender: "Bob Baxter", sent: "2005-12-19", + text: "Today's meeting is cancelled.
Unnecessary.

Bob" }, + { type: 'message', id: 'node3.2', folder: 'work', label: "remaining work", sender: "Bob Baxter", sent: "2005-12-18", text: " Are we still on schedule?
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?

  • Fresh Choice
  • Starbucks
  • Dominos


Let me know..." + }, + { type: 'message', id: 'node3.4', folder: 'work', label: "paint", sender: "Bob Baxter", sent: "2005-12-16", text: + "

what color is good for the new office?

Let me know soon

" + }, + { type: 'message', id: 'node4.1', folder: 'fun', label: "today's meeting", sender: "Jack Jackson", sent: "2005-12-19", + text: "Today's meeting is cancelled.
Let's do it friday instead.

Joe" }, + { type: 'message', id: 'node4.2', folder: 'fun', label: "remaining work", sender: "Jack Jackson", sent: "2005-12-18", + text: + "

Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet:

" + }, + { 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?

  • Indian
  • Mexican
  • Chinese
  • Japanese
  • Pizza


Let me know..." + }, + { type: 'message', id: 'node4.4', folder: 'fun', label: "paint", sender: "Jack Jackson", sent: "2005-12-16", text: + "

what color is good for the new office?

Let me know soon

" + }, + + { type: 'message', id: 'node5.1', folder: 'deleted', label: "today's meeting", sender: "Jill Jones", sent: "2005-12-19", + text: "Today's meeting is cancelled.
Let's do it thursday instead.

Jill" }, + { type: 'message', id: 'node5.2', folder: 'deleted', label: "remaining work", sender: "Jill Jones", sent: "2005-12-18", + text: + "

Hey, we need to talk about who's gonna do all the left over work. Pick a day you want to meet:

" + }, + { 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?

  • McDonalds
  • Burger King
  • KFC


Let me know..." + }, + { type: 'message', id: 'node5.4', folder: 'deleted', label: "paint", sender: "Jill Jones", sent: "2005-12-16", text: + "

what color is good for the new office?

Let me know soon

" + } + ] +} 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 @@ + 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 @@ + + + + + Dojo Globalization Hello World + + + + + + + + + + + +

Dojo Globalization Hello World

+

+ + +

+
+

+

+ + +

+

+ + \ 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_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:"
\n\t
\n\t\t\n\t
\t\n
\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-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,"}")+"";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.clientXv.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientYv.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&&rxb.w-w){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}}if(ry>0&&ryb.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${loadingState}",errorMessage:"${errorState}",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(/]*>\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:"
",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:"
",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:"
\n\t
\n\t${title}\n\t\n\t\tx\n\t\n\t
\n\t\t
\n
\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:"
\n\t
\n\t\t
\n\t
\n\t
\n
\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/gm,">").replace(/"/gm,""");if(!_184){str=str.replace(/'/gm,"'");}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]"+dijit._editor.getChildrenHtml(node)+"";}else{_186+=" />";}break;case 3:_186=dijit._editor.escapeXml(node.nodeValue,true);break;case 8:_186="";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("");}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+">content";}else{_1a0+="<"+_1a1+">
  • content
  • ";}}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=" ";}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="
    ";}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="
    "+html+"
    ";}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()?"":"",(dojo.isMoz?""+this._localizedIframeTitles.iframeEditTitle+"":""),"",this._applyEditingAreaStyleSheets(),""+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+="";}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("
    ");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,"")==" "){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=" ";}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:/(?:(]+))/gi,_hrefInARegex:/(?:(]+))/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:"
    "+"
    ",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:"
    ",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:"
    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 @@ +
    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 @@ +

    Χ
    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 @@ +
    ${label}
    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 @@ +
    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 @@ +
    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 @@ +
    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 @@ +
     

    Χ
    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 @@ + \ 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 @@ +
    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 @@ +

    Χ
    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 @@ +
    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: + // |
    + // |
    + // |
    ...
    + // |
    + // |
    + // |

    This is some text

    + // || ... + // |
    + // + // 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:"
    ${title}
    \n
    \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: + // | + // |
    + // |
    header text
    + // |
    table of contents
    + // |
    client area
    + // |
    + // + // 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: '
    ', + + 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('new content') + // + // 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 .... + 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: "${loadingState}", + + // errorMessage: String + // Message that shows if an error occurs + errorMessage: "${errorState}", + + // 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 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(/]*>\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: + // | + // |
    + // |
    header text
    + // |
    table of contents
    + // |
    client area
    + // |
    + // | + // | 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 `
    ` and ``) + // become the title of the widget (used for TabContainer, AccordionContainer, etc.) + // example: + // my title + + // I'm using a template because the user may specify the input as + // title, in which case we need to get rid of the + // because we don't want a link. + templateString: '
    ', + + 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: "", + + // 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 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:"
    \n\t
    \n\t
    \n
    \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: "
    ", + + // 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:"
    \n
    \n
    \n\t ${!label}\n\t \n\t x\n\t \n
    \n
    \n
    \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
    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 @@ +
    ${title}
    +
    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 @@ +
    +
    +
    +
    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 @@ +
    +
    +
    +
    +
    +
    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 @@ +
    +
    +
    + ${!label} + + x + +
    +
    +
    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 @@ + + + + + + + + + + + + + + + + + + + + + +
    +
    -
    +
    +
    +
    +
    +
    +
    +
    +

    + + + +

    +
    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 @@ +
    +
    + +
    +
    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 @@ +
    +
    + ${title} + + x + +
    +
    +
    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 @@ + 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 @@ +
     
     
    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 @@ +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    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 @@ +
    +
    +
    +
    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 0000000000000000000000000000000000000000..5d74aad603e28eac545fd100d240af2c3035e7dd GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)7|6Oc4mXLbNcv7|ftIx;X^yK%)o!U)KhEOCt} z3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Dc{?CIhdQgJKEruZ2TbKZd?4dNRN zjEwkv?@p1lEBR|XK~CDV=7OYM&|A5){}%6ZFXg|_Rdpq~`CR7WHh!zaoF2?95)AH# WS=4$pDr$koF?hQAxvX}1&9E$f_CL@emVqm{fgy>-P{NJzDx(8~VJ{nFE`tL@FPly;klMI_ z`^+rUZY{RuOPBU~d`@6cXo%=1IL1k4NIv_DXdu>eMQQvneod-&91YPmu#vuP7kzAU}VZD$!c>0y3ehf zNs6(7L5ep5nVS1~(ZxC94h)I8qAOOf4o*3FcDDINouxT_Sz=MEm3j|Zu8Pc9+wkSf zbCGRYDuzdB?u8eNgQqk_hRpjs%k`GH$9Oc}LIy#5Ug a%nUOxAIU3V@M!|3Uj|QCKbLh*2~7YDx(J^D literal 0 HcmV?d00001 diff --git a/includes/js/dijit/templates/colors7x10.png b/includes/js/dijit/templates/colors7x10.png new file mode 100644 index 0000000000000000000000000000000000000000..77d22ce3fa5eb7ad7b1c8f3edd441c0356900c4a GIT binary patch literal 2641 zcmd6pX;4#F6vr>CF+i~;BbzKzgj8+31K{NX947&YG6Z0X48S%f0Ll>=0XK;7e{GJo*4{@40&~nF zg$p$`MyE)ISfa#XazEEs9!OlD)xr?t0&yvlw}BPdoGRObSCJ`_iUn%?tsFA$tOSre zE#oInRRjGIYQ_=0yb+3~Jdj=`w>hbO(!7AFtmK3u&ORKL^0W(z$h|0JWrx_Hh^RZC zk++>Oa!HA?V3}AIjvqBA;;!t*A9(tdW=uPF*^BA_ec=V=fMMID&OshxfgNTD7&@Xq zU;Q4pR(6#Y$F&x!YzIKXh;^9Qg4dP;(zilxs>*O;l4TgfZK*6choR79JJ}Szn zHY@NNe}|vIr4k7#W9yqJhD8x>2n))?FXHkmmcpZ=BQe$i0vG+}x(3v9QJ-J2{gP;} zu;rvqpi&%RD$D*PVhF$6ZQsY`a`9CUeya>B$tqPRQHHqeaSy(z|6(Vvd{<9rX2C6< z9{$y#;cgsy=?K99yYRzAbW-Q&UVdV0L^iIdo!2owO`4r{(ck{1)r8R$eqhpaEe;Lt zsFG!9&1F;(R{JCeow1RGW-hPm|MA-AF%xFKG?_`y!;A#Xc1XKeyKC$daCe%D3>xmy zMRR50{iW>MDQbCxFTC9(;FbfmZz9P{j+*o>n;W@ihP0s)WF2#b6p)CI@^;;~@4Sw4 z_z*9#RgpfQqa*Thaw?qR)Ten-hHh76m7HkJbW2C7uXNguB+Pl$71N&+dr1|+q37z| zX{$@c{eCK56#qXGtMRX*FIwYJz3*Z)unRp%M;GQS!B)dAk{9lrj);vFgHB6)A_jZD zF*tVrS^8Zu`*?m_Bd3wQGrD>z+(*DKZS;*YEqg-k6L1^YeS>_OWXQA56HC=J;H|z~ zvBe0ROAwAQo%{v{{iND)T<+)Ei6%)|S#Be_^JodjDfC;sk%2Uy*NtPfB~vvS!P1>J z>UQipf<_+H}-|;ve7g8E*bYoGuP6j-bmjDlWGr>4=^* zl5-EreL6&_S@&Z%#tIgDC9>ArBrUr`NP3w9p7rt1N&YPyguIY}0E1RRq*4GxYFKIN zNs^T;z~uL&5FmtAfp#pB(6uxTGrN~Z5;+(u$^uEu!;%4poHD-ZdUG>iOz&-CLOj;p zES%YBP~%A%IvhvqwLxih1NFgiOegu_D@US1-W*Oy4@iz-F!_udUkK@p6{&;+= zySqE5ore-gN-x?Rb8%=}Uc%};LaP3+#*<9FyibM(PnZ~>a_WQ%eUEkjYql!_i20&Y zPT4yE2%G9(uPJ$pgvWRI1BL8by;x%R8kMC~{Xp9Y{w#%MO4D2^Y=Ny~zs62>U6{IE z76m~HX4Y@lA0#aB)Z86O!ymM;}sT=1f54!c;$Z~pL}zw5FgMx!aqCC7hR zsLd_o^z1VA!rppMpn49PTUbo75*C|R?3D)e{KRMLy=g1rY#{Y_&)6T;*7ks*5SxdH9KMb#DRjFZK2rFYq-9v3JQ1iw^S5ZD{X8t zFE(s)D4a39aJ8u2{3?1sWOB@mF=_Y34tXexO?!JZ`Ix4?zee9}1LomW$eW6{*ud6v zJRo|HwT~>mE=$mtn1CQ~H^}hr-uh2y5Lnos`)Ki~h6Q7)u|Nv^l5DI?`&oPs9{+%& Moty1XHsq6k0WA&Nj{pDw literal 0 HcmV?d00001 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 @@ + + + + + Container + + + + + + +
    +
    +
    +
    +
    + + + 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 @@ + + + _Templated tests + + + + + +

    _Templated test

    +
    +
    +
    +
    +
    +
    +
    + + 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 @@ + + + + + + + + + + + + + + + + + + + + +
    + - + + + +
    +
    +
    +
    +
    +
    +

    + + «» + +

    +
    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 @@ + + + + Dijit manager unit test + + + + + + + +

    Dijit Manager Unit Test

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    + +
    picture of a flat-screen monitor
    + + example area + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + + + +
    + +
    +
    +
    + +
    + +
    + +
    + + + + + + +
    + +
    + + + + +
    + +
    + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + + + +
    + +
    + +
    + +
    + + + +
    + + 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 @@ + + + + dijit.focus Test + + + + + + + +

    Focus/Selection Save/Restore Test

    +

    This is for testing whether focus and selection are restored by the focus manager

    +
    +
    +
    +
    + +
    + + + + + + 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 @@ + + + + dijit.focus Test + + + + + + + + +

    Widget Focus Test

    +

    + This is for testing code to detect onBlur and onFocus on a widget level.
    + Focused widgets' borders will turn red.
    + Also, heck the console log for focus and blur events on widgets. +

    + +
    +
    +
    + +
    +
    + + + + +
    +
    +
    +
    + +
    + +
    +
    + + +
    + + +
    + push me + +
    +
    +
    + + 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 @@ + + + + + + dijit.place tests + + + + + + + +

    Test dijit.place

    +

    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.
    +

    All the text below is just filler text...
    + +

    + +
    + + TextBox class, tabIndex=2, Attributes: {trim: true, ucFirst: true, class: 'medium'}, First letter of each word is upper case. +
    +
    + +
    + +
    + + TextBox class, Attributes: {trim: true, uppercase: true, class: 'medium'}, all letters converted to upper case. +
    +
    + +
    + +
    + + TextBox class, tabIndex=1, Attributes: {trim: true, digit: true, class: 'small'}, all but digits extracted. +
    +
    + +
    + +
    + + ValidationTextBox class, + Attributes: {lowercase: true, required: true}. Displays a prompt message if field is missing. +
    +
    + +
    + +
    + + IntegerTextBox class, + Attributes: {required: true, min:-20000, max:+20000 }, Enter feet above sea level with a sign. +
    +
    + +
    + +
    + + CurrencyTextBox class, + Attributes: {fractional: true}. Enter whole and cents. Currency symbol is optional. +
    +
    + USD +
    + +
    + EUR +
    + + +
    + + DateTextBox class, + Attributes: {locale: "en-us", required: true}. Works for leap years +
    +
    + +
    + +
    + + DateTextBox class, + Attributes: {locale: "de-de", min:2006-01-01, max:2006-12-31}. Works for leap years +
    +
    + +
    + +
    + + TimeTextBox class, + Attributes: {formatLength: "medium", required: true, trim: true} +
    +
    + +
    + +
    + + TimeTextBox class, + Attributes: {displayFormat:"HH:mm:ss", required: true, trim: true} +
    +
    + +
    + + +
    + + RegexpTextBox class, + Attributes: {required: true} +
    +
    + +
    + +
    + + (just a test that type attribute is obeyed) +
    +
    + +
    + +
    + + value: null should show up as empty +
    +
    + +
    + + + +
    + + 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 @@ + + + + Typematic Test + + + + + + + +

    Dijit typematic tests

    + Press and hold the ctrl+F10 keys to see a's typed (constant rate) in the input field,
    + or left-mouse click the button and hold down to see b's typed (increasing rate) in the input field.
    + + + + 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 @@ + + + dijit.getViewport() test + + + + + + + +
    +

    dijit.getViewport() test

    +
    padding div
    + + +
      +
    1. check results div below to see that before adding text, document is smaller than viewport +
    2. 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 +
    3. resize browser window and click the "recompute size" button; reported viewport size should change +
    4. scroll the window and click "recompute size" to see that the scroll position is taken into effect +
    +
    +
    + + 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 @@ + + + + dijit.getViewport() test + + + + + + + +
    +

    dijit.getViewport() test

    +
    padding div
    + + +
      +
    1. check results div below to see that before adding text, document is smaller than viewport +
    2. 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 +
    3. resize browser window and click the "recompute size" button; reported viewport size should change +
    4. scroll the window and click "recompute size" to see that the scroll position is taken into effect +
    +
    +
    + + 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 @@ + + + Dijit wai unit test + + + + +
    +
    +
    + +
    + + 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 (

    ,

    , , 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
    ","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
    \n
    \n
    ...<\/div>\n<\/div>\n
    \n

    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('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 + + + + + + + + + + +

    Rich Text Test

    + +
    +

    test case for bug #6112

    + +
    + + 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 @@ + + + + Editor Custom Plugin Test/Tutorial + + + + + + + + +

    + This editor should have my custom create link plugin +

    + + \ 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 @@ + + + + + Rich Text System Test + + + + + + + + + + + + +

    Rich Text Test

    + +
    +

    thud

    + + + +
    + +
    +

    blah

    +
    +
      +
    • Right click on the client area of the page (ctrl-click for Macintosh). Menu should open.
    • +
    • Right click on each of the form controls above. Menu should open.
    • +
    • Right click near the righthand window border. Menu should open to the left of the pointer.
    • +
    • Right click near the bottom window border. Menu should open above the pointer.
    • +
    +
    +

    ..after

    +
    + + + 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 @@ + + + + Editor Test2 + + + + + + + + +
    + +
    + + 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 @@ + + + + Dijit raw programatic test suite | The Dojo Toolkit + + + + + + + + + + +
    + + + 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'); + document.write(''); + + 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 += "Tests:
    "; + d.forEach(themes,function(t){ + str += ''+ + ''+ + ''+ + ''+ + // too many potential locales to list, use &locale=[lang] to set + ''; + }); + str += ''; + str += ''; + node.innerHTML = str + "
    '+t+'rtla11ya11y+rtl
    jump to: themeTester
    or: tests folder
    "; + } +})(); 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 @@ + + + + + Form unit test + + + + + + + +

    Form Widget Unit Test

    +

    + The form widget takes data in a form and serializes/deserializes it, so + it can be submitted as a JSON string of nested objects. +

    +
    Currently only widgets are supported, not raw elements.
    + +
    + + + +

    Just HTML text

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionNameForm node/widget
    DateTextBox inside contentpanefoo.bar.baz.quux +
    + +
    +
    Layoutcontainer +
    +
    DateTextBox 1available.from + +
    DateTextBox 2available.to + +
    ComboBoxplop.combo + +
    CheckBox widgetcb2 + 1 + 2 + 3 + 4 +
    Radio widgetr2 + 1 + 2 + 3 + 4 +
    Multi-selectms1 + +
    Hidden inputh1 + +
    Auto-sizing textareat1 + +
    Fixed size textareast1 + +
    Editor widgetrichtext + +
    File uploadfilename + +
    + + + + + +
    + + + + 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 0000000000000000000000000000000000000000..f2018e664ea57288aa4f667ae884378478e80dff GIT binary patch literal 4585 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 literal 0 HcmV?d00001 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 @@ + + + + Dojo Button Widget Test + + + + + + + + + +

    Dijit Button Test

    +

    Simple, drop down & combo buttons

    +

    + Buttons can do an action, display a menu, or both: +

    +
    + + tooltip on button +
    + Edit! +
    +
    Cut
    +
    Copy
    +
    Paste
    +
    +
    + Submenu + +
    +
    +
    +
    + Color + +
    +
    + Save + +
    + +
    +
    +

    Buttons with no text label

    +

    Buttons have showLabel=false so text is not displayed. Should have title attribute displayed on mouse over

    +
    + +
    + Color + +
    +
    + Save + +
    +
    +
    +

    Toggle buttons

    +

    The button CSS as well as the icon CSS can change on toggle

    +
    + + +
    +
    +

    Sizing

    +

    Short button, tall buttons, big buttons, small buttons... + These buttons size to their content (just like <button>).

    +
    + + + + +
    +
    +
    +

    Customized buttons

    +

    Dojo users can customize styles. Here's an example:

    + +
    + + + +
    +
    +

    Toggling the display test

    +

    + (Ticket #403) +

    +
    + +
    + +
    +

    Programatically changing buttons

    +

    clicking the buttons below will change the buttons above

    + +
    + + + +
    +

    Button instantiated via javacript:

    +
    + +

    DropDownButton instantiated via javacript:

    + + + + + + + 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 @@ + + + + CheckBox Widget Demo + + + + + + + + + +

    Dijit CheckBox Test

    +

    + Here are some checkboxes. Try clicking, and hovering, tabbing, and using the space bar to select: +

    + + +
    + + +
    + + +
    + + + "onChange" handler updates: [] +
    + + +
    + + +
    + + +
    +
    + +
    + + + + + + + "onChange" handler updates: [] +
    +

    + Here are some radio buttons. Try clicking, and hovering, tabbing, and arrowing +

    +

    + Radio group #1: + + + + + + +

    +

    + Radio group #2: (no default value, and has breaks)
    + +
    + +
    + +
    + (Note if using keyboard: tab to navigate, and use arrow or space to select) +

    +

    + Radio group #3 (native radio buttons): + + + + + + +

    + +
    + + + + 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 @@ + + + + Dojo ComboBox Widget Test + + + + + + + + + + +

    Dojo ComboBox Widget Test

    +

    +A ComboBox is like a text <input> 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. +

    +
    + +

    ComboBox #1: inlined data, autoComplete=false, default value of Iowa, pageSize=30

    + (200% Courier font): + +
    onChange: + + + +
    + +
    + +
    + +

    ComboBox #2: url, autoComplete=true:

    + (8pt font): + + Value: +
    + (150% font): + + Hey look, this one is kind of useful. +
    + +

    ComboBox #3: initially disabled, url, autoComplete=false:

    + + + Value: +
    + +
    +
    +

    ComboBox #4: url, autoComplete=false required=true:

    + + + Value: +
    +

    A ComboBox with no arrow

    + +
    +

    A combo created by createWidget

    + +
    +

    A ComboBox with an initial query. (Limits list to items with type = country.)

    + +
    + + + +
    +

    +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: +

    + + +

    Some tests:

    +
      +
    1. Type in D - dropdown shows Delaware and District of columbia. [Would be nice if it bolded the D's in the dropdown list!]
    2. +
    3. Type in DX - input box shows DX and no dropdown.
    4. +
    5. Open dropdown, click an item, it selects and closes dropdown.
    6. +
    7. Click triangle icon - dropdown shows. Click it again - dropdown goes.
    8. +
    9. Check that you can type in more than required (e.g. alaba for alabama) and it still correctly shows alabama
    10. +
    11. Tab into the combo works, list should not apear.
    12. +
    13. Tab out of the combo works - closes dropdown and goes to next control (focus should not go to the dropdown because tabindex="-1").
    14. +
    15. Do the dropdown and click outside of it - the dropdown disappears.
    16. +
    17. Javascript disabled -> fallback to old style combo?
    18. +
    19. Can you paste in the start of a match? [no]
    20. +
    21. Backspace to start - dropdown shows all all items
    22. +
    23. Backspace deselects last character [Borked: currently you have to backspace twice]
    24. +
    25. Press down key to open dropdown
    26. +
    27. Down and up keys select previous/next in dropdown.
    28. +
    29. Non-alpha keys (F12, ctrl-c, whatever) should not affect dropdown.
    30. +
    31. Press down arrow to highlight an item, pressing enter selects it and closes dropdown.
    32. +
    33. Press down arrow to highlight an item, pressing space selects it and closes dropdown.
    34. +
    35. Check that pressing escape undoes the previous action and closes the dropdown
    36. +
    37. Check that pressing escape again clears the input box.
    38. +
    39. 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)
    40. +
    41. In IE, dropdown list does not go behind the second combo (special code to manage this).
    42. +
    43. Check dropdown is aligned correctly with bottom of the text input
    44. +
    45. 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)
    46. +
    47. Try repeatably droppingdown and closing the dropdown. Shouldnt get hung [sometimes flicks closed just after opening due to timers, but not a biggie]
    48. +
    49. 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)
    50. +
    51. Check that dropdown is smooth [looks uggy on second keypress in FF - hides then shows]
    52. +
    53. 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)
    54. +
    55. Clear the field and enter an invalid entry and tab out e.g. Qualude. Does that make sense given the combobox setup options?
    56. +
    57. (Add any other tests here)
    58. +
    +
    + +
    + + 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 @@ + + + + Dojo ComboBox Widget Destruction Issue + + + + + + + + + +

    Dojo ComboBox Widget Destruction Issue

    +

    + ComboBox does not destroy itself properly, leading to a + JavaScript error. Could it have something to do with not disconnecting + events? +

    +

    + Steps: +
      +
    1. Pick a state from the combo box below.
    2. +
    3. Click the "killit" button, which calls destroy on the widget.
    4. +
    5. Observe the JavaScript error.
    6. +
    +

    +
    + + +
    + + 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 @@ + + + + Test DateTextBox Widget + + + + + + + + + + +

    Test DateTextBox Widget

    + +
    +
    + + DateTextBox class, no attributes +
    +
    + + onChange: +
    +
    + + DateTextBox class, + Attributes: required="true", trim="true", constraints={min:'2004-01-01',max:'2006-12-31',formatLength:'long'}. Works for leap years +
    +
    + + onChange: + + +
    +
    + + DateTextBox class, + Attributes: lang="en-us", required="true", constraints={min:'2004-01-01',max:'2006-12-31'}. Works for leap years +
    +
    + +
    +
    + + DateTextBox class, + Attributes: lang="de-de", constraints={min:2004-01-01, max:2006-12-31}. Works for leap years +
    +
    + +
    + +
    + + Date, overriding pattern with dd-MM-yyyy +
    +
    + +
    + + + + + +
    + +
    +
    + From: + To: +
    + +
    + + + +
    +
    + + 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 @@ + + + + Dojo FilteringSelect Widget Test + + + + + + + + + + +

    Dojo FilteringSelect Widget Test

    +
    +
    +

    The FilteringSelect widget is an enhanced version of HTML's <select> tag.

    +

    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)
    • +
    +

    + +
    + +
    +

    FilteringSelect #1: inlined data, autoComplete=false:

    + + + onChange: + + +
    + +
    + +

    FilteringSelect #2: url, autoComplete=true:

    + + + Value: + +

    FilteringSelect #3: url, autoComplete=false:

    + + + Value: +
    +

    FilteringSelect #5: custom labelFunc (value in textbox should be lower case when onChange is called), autoComplete=true:

    + + +
    +
    + +

    FilteringSelect #7: Input method editor Chinese characters

    +

    Using an input method editor (see IME for Windows) try typing 阿 (a) or 把 (ba).

    + + +
    +
    +

    FilteringSelect #8: Japanese

    +

    Try typing æ±ã€è¥¿ã€åŒ—ã€å— (north, south, east west) and a few choices will pop up.

    + + + Value: +
    +

    FilteringSelect #9: No data

    +

    This FilteringSelect has no options to choose from. It should still load.

    + + +
    +
    +

    FilteringSelect #10: hasDownArrow=false:

    + + +
    +
    +
    +

    FilteringSelect #11: deep data, initial query of type=country:

    + + +
    +
    +

    FilteringSelect #12: special characters

    +

    The drop down list should be:

    +
      +
    • sticks & stones +
    • rags --> riches +
    • more\less +
    • 3 * 5 +
    + + +
    +
    + + +

    + 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: +

    + + + + +
    + + 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 @@ + + + + + Form unit test + + + + + + +

    Form Widget Unit Test

    +
    +

    This form shouldn't submit, nor reset

    + + + +
    + +
    +

    This form shouldn't submit, nor reset

    + + + +
    + +
    +

    This form should submit and reset

    + + + +
    + +
    +

    This form should submit and reset

    + + + +
    + + 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 @@ + + + + Testing MultiSelect form widget | The Dojo Toolkit + + + + + + + + + + + +

    dijit.form.MultiSelect:

    + +
    + + + + + + + + + + +

    + + + + + +
    + + + +

    markup:

    + + + +

    + + + + 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 @@ + + + + Testing SimpleTextArea | The Dojo Toolkit + + + + + + + + + + + + +

    SimpleTextarea

    + +

    + This is a simple text area that doesn't automatically size itself according to it's content. + It can be used inside layout containers. +

    + +

    Plain textarea (rows=5, cols=50)

    + + +

    In a BorderContainer

    + +
    + + + + + +
    + + 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 @@ + + + + Dojo Slider Widget Demo + + + + + + + + + + +

    Slider

    + Also try using the arrow keys, buttons, or clicking on the progress bar to move the slider. +
    + +
    +
    initial value=10, min=0, max=100, pageIncrement=100, onChange event triggers input box value change immediately
    + +
    +
      +
      +
      +
        +
      1. lowest
      2. +
      3. normal
      4. +
      5. highest
      6. +
      +
      + + Slider1 Value: +
      + + +
      +
      initial value=10, min=0, max=100, onChange event triggers input box value change when you mouse up or tab away
      +
      +
        +
      1. 0
      2. +
      3. 100
      4. +
      +
      +
      +
        +
        + Slider2 Value: +

        Fancy HTML labels (no slide animation):

        +
        +
        +
          +

        1. small
        2. +

        3. medium
        4. +

        5. large
        6. +
        +
        + +

        Standalone ruler example:

        + +
        +
        +
        +
        +
        +
          +
        1. +
        2. 1
        3. +
        4. 2
        5. +
        +
        + +

        horizontal, with buttons, disabled (to show styling):

        + +
        +
          +
          +
          +
            +
          1. lowest
          2. +
          3. normal
          4. +
          5. highest
          6. +
          +
          + + +

          Completely Programatic VerticalSlider and VerticalRule

          +

          min:1000, max:3000, 11 discrete values, no animation

          + +
          + Programmatic Value: + + + +
          + + +
          + +
          + + 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 @@ + + + + Dojo Spinner Widget Test + + + + + + + + + + +

          Dijit Spinner Test

          + Try typing values, and use the up/down arrow keys and/or the arrow push + buttons to spin +
          +
          +

          number spinner

          +
          + initial value=900, no delta specified, no min specified, max=1550, onChange captured
          +
          + + onChange: +
          +
          + initial value=1000, delta=10, min=9 max=1550
          + + +
          +
          + initial value not specified, delta not specified, min not specified, max not specified, signed not specified, separator not specified
          + [verify no line break just after this text] + + [verify no line break just before this text] +
          +
          + Move the cursor left and right within the input field to see the effect on the spinner. +
          + initial value=+1.0, delta=0.1, min=-10.9, max=155, places=1, maxLength=20
          +
          + +
          + + +
          + + +
          + +
          + + 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 @@ + + + + Dojo Textarea Widget Demo + + + + + + + + + +

          Test Auto-sizing Textarea Widget

          + + +
          + +
          + +
          this is a very simple resizable text area
          + onChange: +
          + + + + +
          + + +
          + + +
          + +
          + + 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 @@ + + + + Test TimeTextBox Widget + + + + + + + + + + +

          Test TimeTextBox Widget

          + +
          + +
          + + TimeTextBox class, + Attributes: {formatLength:'medium'} +
          +
          + + onChange: +
          + +
          + + TimeTextBox class, + Attributes: {formatLength:'short'} +
          +
          + +
          + +
          + + TimeTextBox class, + Attributes: {timePattern:'h:mm:ss a'} +
          +
          + +
          + +
          + + TimeTextBox class, + Attributes: {timePattern:'HH:mm:ss'} +
          +
          + +
          + +
          + + TimeTextBox class, + Attributes: {timePattern:'HH:mm:ss', clickableIncrement:'T00:15:00', visibleIncrement:'T00:15:00', visibleRange:'T01:00:00'} +
          +
          + +
          + + + +
          + + +
          + +
          + + 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 @@ + + + + Test TextBox Validation Widgets + + + + + + + + + + +

          Dijit Validation Widgets

          + +
          + +
          + + TextBox class, tabIndex=2, Attributes: {trim: true, propercase: true, style: 'width:700px'}, First letter of each word is upper case. +
          +
          + +
          onChange: +
          + +
          + + TextBox class, Attributes: {trim: true, uppercase: true, class: 'verylong'}, all letters converted to upper case. +
          +
          + +
          + +
          + + NumberTextBox class, tabIndex=1, Attributes: {trim: true}, no initial value specified, tooltipPosition=[above, below] +
          +
          + +
          + +
          + + ValidationTextBox class, + Attributes: {lowercase: true, required: true, class: verylong, style: font-size: 15pt;}. Displays a prompt message if field is missing. +
          +
          + +
          + +
          + + IntegerTextBox class, + Attributes: {required: true, min:-20000, max:+20000 }, Enter feet above sea level with a sign. +
          +
          + + onChange: +
          + + + +
          + + CurrencyTextBox class, + Attributes: {fractional: true}. Enter whole and cents. Currency symbol is optional. +
          + +
          + USD +  onChange: +
          + +
          + euro currency (local format) fractional part is optional: + EUR + + + +
          + + +
          + euro currency (fixed lang: de-de) programmatically created, fractional part is optional: EUR +
          + + + + +
          + + RegexpTextBox class, + Attributes: {required: true} +
          +
          + +
          + +
          + + (just a test that type attribute is obeyed) +
          +
          + +
          + +
          + + value: null should show up as empty +
          +
          + +
          + + + +
          + + a test that readOnly is understood +
          +
          + + + +
          + + + +
          + + +
          + +
          +

          Tooltip positioning

          +

          + 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. +

          + + + + 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 @@ + + + + + Test CurrencyTextBox + + + + + + + + + + + + +

          Dijit TextBox Globalization Test for Currency

          + + +

          + Before start this test, make sure the dojo/cldr/nls 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. +

          + + + +

          Issues & Comments

          +

          Issue #1Fixed

          +

          + Some browsers like FireFox have a bug on the non-breaking space character (U+00A0, &nbsp; or &#160; or + &#xA0; in HTML). + They always convert the NBSP character to a normal space (U+0020, &#x20; in HTML) automatically in the following circumstances: +

          +
            +
          • Copy text from the page
          • +
          • Use innerHTML to get the content of a certain element
          • +
          • Use value to get an INPUT element's value
          • +
          + +

          + You cannot read a real NBSP character from an INPUT element on these browsers. It causes issues when some formatting data in CLDR + contains an NBSP character. For example, +

          +
            +
          • Many locales like French use an NBSP character as a group separator in numbers
          • +
          • French and Finnish use NBSP characters in their percentage and currency format patterns respectively
          • +
          + +

          + So Dojo may generate formatted data with NBSP characters in it but cannot read NBSP charaters from user's input in some browser. +

          + +

          Issue #2Fixed: the CLDR data generator should be fixed by adding code to convert U+200F to "\u200F" in nls JS files.

          +

          + 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 alert('â€'.indexOf('\u+200F')) (there is a U+200F in the empty-looking string): +

          +
            +
          • In Firefox, shows "-1" -- no U+200F found
          • +
          • In IE & Opera, shows "0" -- the U+200F is found
          • +
          +

          + But if the U+200F is in some escaping form, Firefox will work as well as other browsers. + Click alert('\u200F'.indexOf('\u+200F')) to see the same result both in Firefox and IE: +

          + + +

          Issue #3Fixed: added a "localeDigit" to the options

          +

          + 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). +

          + + + 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 @@ + + + + + Test DateTextBox + + + + + + + + + + + + + +

          Dijit TextBox Globalization Test for Date

          + + +

          + Before start this test, make sure the dojo/cldr/nls 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. +

          + + + + 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 @@ + + + + + Test Hindi/Arabic numerals + + + + + + + + + + + + + +

          Dijit TextBox Globalization Test for Number

          + + +

          + Before start this test, make sure the dojo/cldr/nls contains the data for "ar-eg" and "hi-in". If not, convert these CLDR data and put them there. +

          + + + + + + + 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 @@ + + + + + Test NumberTextBox + + + + + + + + + + + + +

          Dijit TextBox Globalization Test for Number

          + + +

          + Before start this test, make sure the dojo/cldr/nls contains the data for "zh-cn", "fr-fr". If not, convert these CLDR data and put them there. +

          + + + + + + 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 += " Compare (Escaped)"; + 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 ? "" : "
          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(""); + dojo.doc.write("" + desc + ""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write("" + comment + ""); + dojo.doc.write(""); + formatWidgetCount++; +} +/* +[ + {attrs: {currency: "CNY", lang: "zh-cn"}, desc: "", value:"-123456789.46", expValue: "", comment: ""}, + ... +] +*/ +function genFormatTestCases(title, dojoType, testCases){ + dojo.doc.write("

          " + title + "

          "); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + + 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("
          Test DescriptionTestExpectedResultComment
          "); +} + +function genValidateTestCase(desc, dojoType, dojoAttrs, input, value, comment, isWrong){ + dojo.doc.write(""); + dojo.doc.write("" + desc + ""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write("" + (isWrong ? "Wrong" : "Correct") + ""); + dojo.doc.write(""); + dojo.doc.write("" + comment + ""); + dojo.doc.write(""); + 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("

          " + title + "

          "); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + dojo.doc.write(""); + + 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("
          Test DescriptionTestInputParsed ValueExpectedResultComment
          "); +} 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 @@ + + + + + Test TextBox + + + + + + + + + + + + +

          Dijit TextBox Globalization Test

          + + + + + +

          Issues & Comments

          +

          Issue #1 Not fixed. Avoid using this function of TextBox.

          +

          + 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. +

          + +

          Issue #2 Not fixed. Avoid using this function of TextBox.

          +

          + 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. +

          + + + + + 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 @@ + + + + + Test TextBox for Time + + + + + + + + + + + + + +

          Dijit TextBox Globalization Test for Time

          + +

          Press the following button to start all test after this page is loaded.

          + +

          + Before start this test, make sure the dojo/cldr/nls 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. +

          + + + +

          Issues & Comments

          +

          Issue #1 Fixed

          +

          + Currently Dojo do not support parsing for most "long" and "full" time format which have a timezone mark in it. +

          + +

          Issue #2 Fixed: added a "localeDigit" to the options

          +

          + 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). +

          + +

          Issue #3 Fixed

          +

          + 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. +

          +

          + 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. +

          + + + diff --git a/includes/js/dijit/tests/images/arrowSmall.gif b/includes/js/dijit/tests/images/arrowSmall.gif new file mode 100644 index 0000000000000000000000000000000000000000..8459ffaf8511531852c36cf946ad6b33f94cf2e4 GIT binary patch literal 54 zcmZ?wbhEHb1RC2zIxuA%}dkYYcf~^0M`2o AkN^Mx literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/copy.gif b/includes/js/dijit/tests/images/copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..4df29cc629de9fd35333ff8f3cf3f885fdc00482 GIT binary patch literal 210 zcmZ?wbhEHb6k-r!I3mpO_wV07fBt;<@Zt6A*9Q+C{QC9lojZ5VpFh8O^X9j2-+ur8 z{no8p>(;G1a^%SU`}dbGUw-l8#sB~RJLc_UAPy-0WMO1r5N6N;DF@lf!0P`%r7tCO z-V2SjZ)W)gshqzgeZFY!vD^iVw|lHkeYCb$26Z h;U`NRq#jRFIhC};bCNdWM~6Lo5C6{o&&9}K4FDl9Ta*9* literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/cut.gif b/includes/js/dijit/tests/images/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..9bdbf4a72c0ed84b53130a4c551d4dec90b716db GIT binary patch literal 112 zcmZ?wbhEHb6k-r!Sj5Wk>cD~K)}~h-9WAZRCm0z1|NqYb28usf7#SE?8FWBAkXi<2 z(}-Pn{u!(?T(Wvv?}Snj7Y&~q&N_;rW(%3Pvd%O-jJzSw$WXF;js^FNXV$#d2Npbe Lnr+3+$zTltD@P`Y literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/flatScreen.gif b/includes/js/dijit/tests/images/flatScreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..05edd7251d92fa3979e8f83ae82f32f9b3d8ca35 GIT binary patch literal 824 zcmb`^X-|>?0KoA_v_mYjW0jdDQ+B+*&#FOxS9zyI0M;P?u>gvNR7M zL{#L~6!9QIeFRkS5wQRPDXs@lL}M-&&F|3v1N`3nFQq1*I-MH=gaAe?Kocz*U^icG z>zjgk({Q)c`eS~6KyF)cI$0BzC5J<$RxN0C?0z9AmEj5Wu5t6otb-1kN0mz-$UTMS z@5vn;jYjjC%v`eDW)+IYc3uOuuf2=g)WKWS>qK*owocAZgMlr!m`z4Hv)k=<3n05r zr{&9RR*QLKW22>wZG+*aRu+lMrqQ`3<1gc{pC2iGRMx<#NCbXge&52->-D{pa2=5` zGc(gW1%Fp6tDEQ?iS_FwOrdd1Mq_RL7Yc(<=b+xF95&-(VO1p6JVRC2wPHGhAXeYMPaJmR@c0% z#YAB-@%f+X8$LHS#$!Gp!@bC@lr}0Q97(_+(b+6Ehuh6T(}=-2{DHxt;lbcOI_mD& zI5;5&Q9|VYO!*8ntAO@T#bv3~ngy*UP8b-SVKkX7R&#V=RZR2>9nlo{*wHi_wpny*Z40V?j!{G z9$F#xKGLQ=_dBq!wb*GG@7STVhrKB^$w;Ah3PF+o)_Lv&Y#Qzi3Uwu*^5~7iSG)Eu VJV}Wc3=RHqpBRuFII{rdak_rI&xZ+-ds z_sO%Dm#*FX`s?q3gGYDoKa!Hy_TtTle-App|N3|F>P=Ihtm`*!eg5(1*WdrYzP*_? zYxV!@$=9!(`}_9zwHvn{JbC%|QQxOWPyW9@^Z(bo-uk%5&tBfV`{4hTgn##%Z{B%u z>+XYp_gelvXuom$-v7&y^XJX~eSh+$t2ckXK7RXf`~SCx{``1%Tf0PiyXDzLCJ1^9vaMXnw1!Dn(YZy$Oh9w3xH#7?UK>Zd7DF`wEgl|* zB-SSP>8Y~AgoZw4j~Ob4DUAw~+xa`6I2bxDT&N;o{Exx$@xwz-62?Xc3z^xD i^tU*ry>V1J?CH!m>BO9$Ny~iL+lyY^*=a1mU=08_b`bLb literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/paste.gif b/includes/js/dijit/tests/images/paste.gif new file mode 100644 index 0000000000000000000000000000000000000000..f236cbe693684d0bd471b93496b4295db57b3177 GIT binary patch literal 241 zcmZ?wbhEHb6k-r!I3mvQ=g*&0hnt^0d-mzmr#pAH&Fb^!pOiN&Y%NQ z0SfczZ+z W!uyj=MOmg!>rx93*PElrU=093q+t;N literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/plus.gif b/includes/js/dijit/tests/images/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..97e726531839930e084c213a50338e137ab901ae GIT binary patch literal 151 zcmZ?wbhEHb6krfw*v!xH<;$1fzkmPu@#EjWe;+@7{PpYCr%#{0fB*jN+qci3KY#uD z_2!G@VaPF=2UASFHB+67 zGYjUd-Sj8XN5G`{@+(G0had(Cp{BOQiY5{qE#CbL0}^F;T0&id5?ik+U5V;qV6X-N DD~L}E literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/testsBodyBg.gif b/includes/js/dijit/tests/images/testsBodyBg.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e0b4a7d6b16368281dd1278078b9e9904cc21b9 GIT binary patch literal 753 zcmc(c+e=dc0EagjX=-?Zf`|k!G);YJhB=j7=~S9y*o6oQQUbw;e2IFL87cFYW-=4Z zZ5ow|A!v&N(}m?VP3k6a5~(m+$3+Uv0hoQrSI`Kr1*9 z2-aM|-}|t|8H{m!go)B@Y;zC7DVF2;6$kLghXk?6h6h@AgCG{!J_zkYxFdjiz;KA5 z0hHVW!&W!Q^Km8`3rCm(gowsCHpZSJ1WxaU4(5(H(!t9Sl1Is29TFFy%)GA3_9Ba@_-Nct96`VI;HbM=2)iI&358 zcswrn-^*r1{}PIhc=U-NG2U@p-T6c`=rQbGx zg17VAl?J=E&Cuakcnmk&&5s^vmI~UFOh(x@(7?z50g69afJ{aP9S|2J!@!i))4%fcTmHp!w%qF8d~eTh{YoZ`;}h6FO`p`x}>j=Ir%aer45HE8m3ech-G> veYNTMlTDVheWv%k`lj)suest=)$z3R*$Kb){pXj^u<(e;sOX4bV6X-N$$vw7 literal 0 HcmV?d00001 diff --git a/includes/js/dijit/tests/images/tubeTall.gif b/includes/js/dijit/tests/images/tubeTall.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4fdb8b2d0fa9ac2041197a94d5b07ca2bd0210d GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VHp6H0Du7i00000001HR1OWg50RSuj0000P0G0p%0@sX>smtvT zqf`LQRqI7L@6dHu7)m4wo#&&XqxKzMY|OMB)#o;D5a!!HKYc-kucAMKQx+7hW=jZyny@BV~2l&SjNH}O%h_Oh~ zm~g0=$T;a(3Hiv8DYIGA>BJYB^%+Si3Uw-#O0{a$iiJ9QsX5D8>v;<*`#Q#3whJ69 ztQt%_%vy|m?3&EH3~L;%EbUAUJ&j$ReXZTi{oUIP{`(wWPHt_Uj=rtl&hG6V58uR4 G0029u>2@&y literal 0 HcmV?d00001 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 @@ + + + + Test ContentPane + + + + + + +

          dijit.layout.ContentPane test

          +

          Test designed to run on localhost (minimize impact from network latency)

          + +

          This should NOT be parsed automatically

          +
          +
          If this has a different background and a red border, the page parsed when it shouldn't
          +
          +

          Testing ContentPane

          +
          + Even tough the entire page isn't scanned for widgets, + any sub widgets of a ContentPane will be created when a ContentPane is created
          + This should have a backgroundcolor and a border +
          +
          +
          +
          +

          +
          + + 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 @@ +
          +State: + + + + 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 @@ +

          Document 0

          +This document has a link.
          +(to check we're copying children around properly).
          +Also it's got a widget, a combo box:
          + +And a button too: + +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 @@ + + +

          Document 1

          + +

          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.

          + +

          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.

          + +

          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.

          + +

          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.

          + +

          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.

          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 @@ + + +

          Document 2

          + +

          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.

          + +

          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.

          + +

          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.

          + +

          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.

          + +

          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.

          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 @@ +WARNING This should NEVER be seen, delayed by 2 sec!"; + $delay = 2; + break; + case 1: + echo "
          Testing setHref
          "; + break; + case 2: + echo "
          Delayed setHref test
          +
          Delayed by " . ($delay/1000000) . " sec.
          "; + 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 "
          {$_SERVER["QUERY_STRING"]}
          "; + } + + 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 @@ + +

          Tab 1

          + +

          I am tab 1. I was loaded externally. WebA11y(something to get focus)

          + +
          blah
          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 @@ +

          Tab 2

          + +

          I am tab 2. I was loaded externally as well.

          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 @@ +
          +
          +

          This is a nested tab container BUT loaded via an href.

          +
          +
          +

          + 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. +

          +

          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. +

          +

          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. +

          +
          +
          \ 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 @@ +
          +
          +

          Top of split container loaded via an href.

          +
          +
          +

          Bottom of split container loaded via an href.

          +

          + 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. +

          +

          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. +

          +

          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. +

          +
          +
          \ 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 @@ + + + + Accordion Widget Demo + + + + + + + + + + + + +

          AccordionContainer Tests

          + +

          Accordion from markup:

          +

          HTML before

          +

          HTML before

          +

          HTML before

          + +
          +
          + Hello World +
          +
          +

          + 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. +

          +

          + Sed arcu magna, molestie at, 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. +

          +
          +
          +

          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.

          +
          +
          + +

          HTML after

          +

          HTML after

          +

          HTML after

          +

          +

          Accordion with widgets

          +
          +
          + +

          + 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. +

          +

          + 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. +

          +
          + + +
          + +
          +
          +
          + 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. +
          +
          + 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. +
          +
          +
          +
          + +

          Programatically created:

          + + +
          + +
          + + + 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 @@ + + + + dijit.layout.BorderContainer Test + + + + + + + + + + +

          dijit.layout.BorderContainer tests

          +

          Headline layout (default), left is constrained - min:50, max:150

          + +
          +
          + top bar +
          +
          + left +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + right +
          +
          + bottom bar +
          +
          + + +
          + +

          Sidebar layout, BiDi sensitive, liveSplitters: false

          + +
          +
          + leading +
          +
          + top bar +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + bottom bar +
          +
          + trailing +
          +
          + +
          +

          Vertical panels only with splitters

          + +
          +
          + top bar +
          + +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + bottom bar +
          +
          + +
          +

          More fun with layouts

          + +
          +
          +
          +
          top a
          +
          top b
          +
          +
          +
          +
          +
          bottom c
          +
          bottom d
          +
          +
          +
          +
          +
          leading e
          +
          leading f
          +
          +
          +
          trailing g
          +
          + +
          + + + 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 @@ + + + + dijit.layout.BorderContainer Test - complex layout + + + + + + + + + + +

          dijit.layout.BorderContainer tests

          + +

          Complex layout:

          + +
          +
          +
          + left bar +
          +
          +

          + 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. +

          +

          + 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. +

          +
          +
          +

          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.

          +
          +
          + +
          +
          + right bar +
          +
          +

          + 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. +

          +

          + 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. +

          +
          +
          +

          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.

          +
          +
          +
          + +
          + +
          + +
          + +
          +

          I am tab 3

          +

          And I was already part of the page! That's cool, no?

          +

          tooltip on this paragraph

          +
          I'm a tooltip!
          + +
          + +

          + 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. +

          +

          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. +

          +
          + + + + Sub TabContainer from href + + SplitContainer from href + +
          +
          +
          +
          +

          bottom bar (edit me)

          +
          +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + + + 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 @@ + + + + + BorderContainer Experiments | The Dojo Toolkit + + + + + + + + + + + +

          This is a test

          +

          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 +

          + +
          +

          Layouts:

          +
          +
          + +
          +
          + pane0 +
          +
          + +
          +
          + Sinlge pane - l1 +
          +
          + +
          +

          two panes, vertical split:

          + + +
          +
          + Sinlge pane - left +
          +
          + Sinlge pane - center + +
          +
          + +
          +
          + Sinlge pane - center (splitter) (this is unsupported, and does not work) +
          +
          + Sinlge pane - right (no splitter) +
          +
          + +
          +
          + Sinlge pane - center (no splitter) +
          +
          + Sinlge pane - right (splitter) +
          +
          +
          + +
          +
          + Sinlge pane - top (splitter) + +
          +
          + Sinlge pane - center +
          +
          + +
          +
          + Sinlge pane - center +
          +
          + Single Pane Bottom (splitter) +
          +
          + Single Pane Top (splitter) +
          +
          + + + + + 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 @@ + + + + dijit.layout.BorderContainer Test - Full Screen + + + + + + + + + +
          +
          + leading +
          +
          + top bar +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + bottom bar +
          +
          + trailing +
          +
          + + 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 @@ + + + + dijit.layout.BorderContainer Test + + + + + + + + + + +

          dijit.layout.BorderContainer tests

          +

          Basic layout

          + +
          +
          + left +
          +
          + right +
          +
          + top bar +
          +
          + bottom bar +
          +
          + +
          +
          + left +
          +
          + right +
          +
          + top bar +
          +
          + bottom bar +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          +
          +
          + + 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 @@ + + + + ContentPane Test + + + + + + + + + +

          Dijit layout.ContentPane tests

          +

          pre-container paragraph

          + +
          + some text (top-level container) + +
          + + text in the inner container (1) + +
          + hi +
          + + text in the inner container (2) + +
          + inner-inner 2 +
          + + text in the inner container (3) + +
          + inner-inner 3 +
          + + text in the inner container (4) + +
          + + some more text (top-level container) +
          + +

          mid-container paragraph

          + +
          + 2nd top-level container +
          + +

          post-container paragraph

          + +
          + some content pane blah blah blah +
          +
          +

          This text should automatically be replaced by downloaded content from combotab.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 @@ + + + + Programmatic Layout Demo + + + + + + + + + +

          Test of layout code programmatic creation

          + + + + + +
          +

          Creator

          +

          Pressing a button will programatically add a hierarchy of widgets

          + + + + + +
          +

          Current widgets

          + This pane will let you try certain operations on each of the widgets. +
          +
          +
          +
          + When you press a button, this will be filled in with the generated widgets +
          + + 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 @@ + + + + dijit.layout.LayoutContainer Test + + + + + + + + + +

          Dijit layout.LayoutContainer tests

          +

          Basic layout. Tabindex="0" added to each pane to test for tab order matching source code order. Tab order +should be: left, right, top, middle/main, bottom

          + +
          +
          + left +
          +
          + right +
          +
          + top bar +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          + +
          + bottom bar +
          + +
          + +

          Advanced layout. Tabindex="0" 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.

          +
          +
          + left +
          +
          + top bar +
          +
          + + bottom bar +
          +
          + inner left +
          + +
          + main panel with a link.
          + + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + inner right +
          +
          + +

          Advanced layout with nested containers. Tabindex="0" 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.

          +
          +
          + left +
          +
          +
          + +
          + top bar +
          +
          +
          +
          + inner left +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + inner right +
          +
          +
          +
          + bottom bar +
          +
          +
          +
          + +

          Goofy spiral layout. Match of source code order to tab order can not be achieved with this type of layout.

          +
          +
          + outer left +
          +
          + outer top +
          +
          + outer right +
          +
          + outer bottom +
          +
          + inner left +
          +
          + inner top +
          +
          + inner right +
          +
          + inner bottom +
          +
          + main panel with a link.
          + (to check we're copying children around properly).
          + + Here's some text that comes AFTER the combo box. +
          +
          + + + 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 @@ + + + + SplitContainer Widget Demo + + + + + + + + + +

          Dijit Split Container Test

          +

          HTML before

          + +
          +
          + this box has three split panes +
          +
          + in vertical mode +
          +
          + without active resizing +
          +
          + +
          +
          + this box has two horizontal panes +
          +
          + with active resizing, a smaller sizer, different starting sizes and minimum sizes +
          +
          + +

          HTML after

          + +the following splitter contains two iframes, see whether the resizer works ok in this situation +
          +
          + +
          +
          + +
          +
          + +

          Programatic Example:

          +
          + + + 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 @@ + + + + StackContainer Demo + + + + + + + + + + +

          A Tale Of Two Cities

          + + + + + +
          +

          IT WAS the best of times, it 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

          +

          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.

          +

          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:

          +
          + + + + + + + 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 @@ + + + + StackContainer Demo + + + + + + + + + + +

          A Tale Of Two Cities

          + +
          Links:
          + +
          +

          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

          +

          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.

          +

          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:

          +
          + + + + 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 @@ + + + + TabContainer Demo + + + + + + + + + + +

          Dijit layout.TabContainer tests

          + +

          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. +

          + +
          + +
          + +
          + +
          +

          I am tab 3

          +

          And I was already part of the page! That's cool, no?

          +

          tooltip on this paragraph

          +
          I'm a tooltip!
          + +
          + +

          + 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. +

          +

          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. +

          +
          + + + + Sub TabContainer from href + + SplitContainer from href + +
          + +

          + The next example is with closable tabs. + Tab 1 and Tab 3 can be closed; Tab 3 has a confirm box. +

          + +
          +
          +
          +
          +

          I am tab 3

          +

          And I was already part of the page! That's cool, no?

          +

          If you try to close me there should be a confirm dialog.

          +
          +
          + +

          Tabs with titles on the bottom:

          + +
          +
          +
          +
          + +

          Tabs with titles on the left:

          + +
          +
          +
          +
          + +

          Tabs with titles on the right:

          + +
          +
          +
          +
          + +

          +
          +
          + 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. +
          +
          + 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. +
          +
          + 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. +
          + +

          Typical rendering time

          + + + +
          IEFirefox (mac)
          1719922
          +

          Rendering time

          + + + 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 @@ + + + + TabContainer Nested TitlePane Test + + + + + + + + + + +

          Dijit layout.TabContainer nested TitlePane tests

          + +
          + +
          +

          I am tab 1

          +
          +

          This is a title pane, containing another tab container ...

          +

          + 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... +

          +
          +
          +
          +
          +
          +
          +
          + +
          + + +

          Typical rendering time

          + + + +
          IEFirefox (mac)
          1719922
          +

          Rendering time

          + + + 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 @@ + + + + TabContainer doLayout=false Demo + + + + + + + + + + +

          Dijit layout.TabContainer doLayout=false tests

          + +

          + This tests tabs in doLayout=false mode, in which case the tab container's height == + the height of the currently selected tab. +

          +

          With doLayout=false mode tabs to the left or right are not supported and tabs at the bottom are a bit buggy in FireFox. +

          + + + + +
          + +
          + +
          + +
          +

          I am tab 3

          +

          And I was already part of the page! That's cool, no?

          + tooltip on this span +
          I'm a tooltip!
          + +
          + +

          + 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. +

          +

          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. +

          +
          + + + + Sub TabContainer from href +
          + +

          + Some text here. This should appear directly below the TabContainer, + and the position will change based on the current height of the TabContainer. +

          + + 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 @@ + + + + TabContainer Demo + + + + + + + + + + +

          Dijit layout.TabContainer (delayed) remote tests

          + +

          These tabs are made up of external content. Loading is delayed to make it easier to see if refreshOnShow and preload = 'false' is working.
          + The tabs also tests to insert html in the Tab title +

          + +
          Create a Tab
          + + +

          Rendering time

          + + + 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 @@ + + + + Dijit Manual Test Runner + + + Redirecting to D.O.H runner + + + 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 @@ + + + + + Test Dijit Internal Event: "ondijitclick" + + + + + +
          + + 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 @@ + + + + Dijit Unit Test Runner + + + Redirecting to D.O.H runner. + + 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 @@ + + + + widget infrastructure test + + + + + + + + + + + + + + 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 @@ + + + + Calendar Widget Test + + + + + + + + +

          Dijit Calendar Test

          + + before + + + + + after +

          + disable weekends +

          + +

          Customized template with "today" button

          + + +
          + + + +
          + + + 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 @@ + + + + ColorPalette Test + + + + + + + + + + + +

          dijit.ColorPalette test:

          + +

          Default color palette (7x10):

          +
          + + Test color is: . + +

          Small color palette (3x4):

          +
          + +

          Default color palette (7x10) created via createWidget:

          +
          + + + 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 @@ + + + + Dojo Toolkit - Declaration test + + + + + +

          Simple macro:

          +

          (Check to make sure that links contain employee number) +

          + ${name} + update + delete +
          +
          +
          +
          + +

          Using dojoAttachEvent, dojoAttachPoint

          +
          + XXXXXX + +
          + + + +

          Extending another widget

          +

          HideButton2 extends HideButton (above) and changes the template (but keeps the onclick handler).

          + + YYYYYY + + + + +

          Something more complicated:

          +
          + + +

          thinger blah stuff ${foo}

          + +
          +

          baz thud

          +
          + +
          +
          + + + 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 @@ + + + + Dialog Widget Dojo Tests + + + + + + + + + +

          Dijit layout.Dialog tests

          + | + +
          + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          +
          + + + | + + + + + | + +
          +
          +
          +

          + This is the first tab. +

          +

          + 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. +

          +
          +
          +

          + This is the second tab. +

          +

          + Make it overflow. 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. +

          +

          + 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. +

          +

          + 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. +

          +
          +
          +
          + + | + +
          + + + +
          + + + +
          + +

          Test refocus="false", click programatic dialog, focus input below, wait. close dialog.

          + +

          (scroll down to see more links to click, for testing positioning / scroll handling)

          + +

          +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 +

          + +
          + +
          + +
          + +
          + + +

          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. +

          +

          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. +

          +
          +
          + +
          +
          +

          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. +

          +

          +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. +

          +

          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. +

          +

          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. +

          +
          +
          + +
          +
          +

          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. +

          + +Show Dialog +

          +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. +

          +

          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. +

          +

          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. +

          +

          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. +

          + +

          +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. +

          +

          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. +

          +

          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. +

          +

          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. +

          + + + + 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 @@ + + + + Dialog Widget Dojo Tests + + + + + + + + + +

          Dijit layout.Dialog tests

          + +

          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 #5351 +

          + + + + + + + + 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 @@ + + + + Editor Test + + + + + + + + + +
          Automated Test - all check boxes should be checked
          + Focus: + Value: + + Change: + Blur: + Disabled: +
          +
          + +

          +

          Created from div

          +
          +

          This instance is created from a div directly with default toolbar and plugins

          +
          + + +
          + +

          Created from textarea,auto-expanding

          +
          +

          + +

          ..after

          +
          +
          + +

          Optional toolbar buttons

          +
          +

          + +

          ..after

          + +
          +
          + +

          Plugins specified

          +
          +

          + +

          ..after

          +
          +
          + +

          Programmatic creation

          +
          This div will become an editor.
          + +
          This div will become an auto-expanding editor.
          + + + 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 @@ + + + + Inline Edit Box Test + + + + + + + + + +

          Dijit InlineEditBox Test

          + + + + + + +

          Form Letter with blanks

          +
          +

          +

          + Dear , +

          +

          + Thank you for your recent order. + Please remit +  for + your purchase of +  deluxe +  on +  in + . +

          +

          +

          + Sincerely, +

          + +
          +
          + +

          Form Letter with predefined values, and no auto-save

          +
          +

          + Bob Vance Refrigeration +

          +

          + Dear John, +

          +

          + Thank you for your recent order. + Please remit + $2,000 + for your purchase of + 3 + deluxe + refrigerators + on + 01/01/2007 + in + + Pennsylvania + . +

          +

          + We sincerely appreciate your business and hope we can do business again. +

          +

          + Sincerely, +

          + Bob Vance +
          +
          + + +

          Inline-block Text (of 400px width)

          +
          + 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. +
          + (before plain inline)
          hello world
          (after plain inline) +
          + (before editable inline) +
          + hello world +
          + (after editable inline) +
          + +

          Pararagraph

          + (before plain paragraph) +

          + 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. +

          + (before editable paragraph. the editable paragraph has Save/Cancel buttons when open.) +

          + 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. +

          + These buttons will + / + + the InlineEditBox above. +
          + +

          Editor

          +

          + 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. +

          + +

          FilteringSelect (no down arrow, and save/cancel buttons):

          + before + + Indiana + + after +
          + +

          Programmatically created:

          + before block
          Click here to edit a block programmatically created inline edit region
          after + +
          + + 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 @@ + + + + + Menu System Test + + + + + + + + + + + + + + + + + +
          +

          Dijit Menu System Test

          + +

          Form

          + +
          + +

          left click to open the menu for this input:
          Note: because of the window contextMenu, make sure you get
          the right menu by verifying the left
          click one starts with "Left Click Menu"
          at the very top.

          +
          + + +
          + +
          + Click button below to create special menu on this div. +
          + + + +
          +

          (this space intentionally left blank to aid testing with controls + at the bottom of the browser window)

          +
          + +

          + +

          See also: form/test_Button + (PopupMenu is used with DropDownButton and ComboButton)

          + +

          Mouse opening tests

          + +
            +
          • Right click on the client area of the page (ctrl-click for Macintosh). Menu should open.
          • +
          • Right click on each of the form controls above. Menu should open.
          • +
          • Right click near the righthand window border. Menu should open to the left of the pointer.
          • +
          • Right click near the bottom window border. Menu should open above the pointer.
          • +
          + + +

          Mouse hover tests

          + +
            +
          • Hover over the first item with the pointer. Item should highlight and get focus.
          • +
          • Hover over the second (disabled) item. Item should highlight and get focus.
          • +
          • Seperator items should not highlight on hover - no items should highlight in this case.
          • +
          + + +

          Mouse click tests

          + +
            +
          • Click on the first menu item. Alert should open with the message "Hello world". The menu should dissapear.
          • +
          • Click on the second menu item (disabled). Should not do anything - focus should remain on the disabled item.
          • +
          • Click anywhere outside the menu. Menu should close. Focus will be set by the browser based on where the user clicks.
          • +
          + + +

          Mouse submenu tests

          + +
            +
          • Hover over the "Enabled Submenu" item. Item should highlight and then pop open a submenu after a short (500ms) delay.
          • +
          • 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.
          • +
          • Hover over the "Disabled Submenu" item. Item should highlight, but no submenu should appear.
          • +
          • Clicking on the "Enabled Submenu" item before the submenu has opened (you'll have to be quick!) should immediatley open the submenu.
          • +
          • Clicking on the "Enabled Submenu" item after the submenu has opened should have no effect - the item is still selected and the submenu still open.
          • +
          • Hover over submenu item 1. Should select it - the parent menu item should stay selected also.
          • +
          • Hover over submenu item 2. Should select it - the parent menu item should stay selected also.
          • +
          + + +

          Keyboard opening tests

          + +
            +
          • On Windows: press shift-f10 with focus on any of the form controls. Should open the menu.
          • +
          • 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.
          • +
          • On Firefox on the Mac: press ctrl-space with focus on any of the form controls. Should open the menu.
          • +
          + + +

          Keyboard closing tests

          + +
            +
          • Open the menu.
          • +
          • Press tab. Should close the menu and return focus to where it was before the menu was opened.
          • +
          • Open the menu.
          • +
          • Press escape. Should close the menu and return focus to where it was before the menu was opened.
          • +
          + + +

          Keyboard navigation tests

          + +
            +
          • Open the menu.
          • +
          • Pressing up or down arrow should cycle focus through the items in that menu.
          • +
          • Pressing enter or space should invoke the menu item.
          • +
          • Disabled items receive focus but no action is taken upon pressing enter or space.
          • +
          + + +

          Keyboard submenu tests

          + +
            +
          • Open the menu.
          • +
          • The first item should become selected.
          • +
          • Press the right arrow key. Nothing should happen.
          • +
          • Press the left arrow key. Nothing should happen.
          • +
          • Press the down arrow until "Enabled Submenu" is selected. The submenu should not appear.
          • +
          • Press enter. The submenu should appear with the first item selected.
          • +
          • Press escape. The submenu should vanish - "Enabled Submenu" should remain selected.
          • +
          • Press the right arrow key. The submenu should appear with the first item selected.
          • +
          • Press the right arrow key. Nothing should happen.
          • +
          • Press the left arrow key. The submenu should close - "Enabled Submenu" should remain selected.
          • +
          • Press the left arrow key. The menu should not close and "Enabled Submenu" should remain selected.
          • +
          • Press escape. The menu should close and focus should be returned to where it was before the menu was opened.
          • +
          + +
          + + + 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 @@ + + + + Dojo Toolkit - ProgressBar test + + + + + + + + + + + + +

          Dijit ProgressBar Tests

          + +

          Test 1

          + Progress Value +
          + Max Progress Value +
          + +
          +
          + +

          Test 2

          + Write here: +
          +
          +
          +
          + Small, without text and background image: +
          +
          +
          + Show decimal place: +
          + +

          Test 3

          + No explicit maximum (both 50%) +
          +
          +
          + +

          Test 4

          + +
          + +

          Test 5 - indeterminate progess

          + + +
          + + +
          + + + 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 @@ + + + + TitlePane Test + + + + + + + + + +

          Dijit TitlePane Test

          + +

          Test #1: plain title pane, 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. +
          + +

          Test #2: title pane with form, width=300px

          + +
          +
          + Age:
          + Discount card
          +
          +
          +
          +
          + +

          Test #3: initially closed pane

          +
          +
          + Age:
          + Discount card
          +
          +
          +
          + + +

          Test #4: title pane with href (initially closed)

          +

          The pane should open to "Loading..." message and then 2 seconds later it should slide open more to show loaded data.

          +
          + Loading... +
          + +

          Test #5: title pane with href (initially closed)

          +

          The pane should start to open to "Loading..." but halfway through href data will be loaded, and it should expand correctly.

          +
          + Loading... +
          + +

          Test #6: nested title pane

          +
          +

          This is a title pane, containing another title pane ... +

          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... + +

          +

          And this is the inner title pane... +

          Sed sollicitudin suscipit risus. Nam ullamcorper. Sed nisl lectus, pellentesque nec, malesuada eget, ornare a, libero. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +

          + +

          And this is the closing line for the outer title pane. +

          + +

          Test #7: subclassed title pane (only arrow is selectable and focusable)

          +
          + 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. +
          + + + + + +
          + 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) +
          + + + 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 @@ + + + + Dojo Toolbar Widget Test + + + + + + + + + +

          Toolbar test

          + +

          Toolbar from markup

          + +
          Cut
          Copy
          Paste
          Bold
          Italic
          Underline
          Strikethrough
           
          Ordered list
          Unordered list
          Indent
          Outdent
          + Login +
          + + + + + + + + + + + + +
          +
          +
          + Background + +
          + Foreground + +
          + Save + +
          + +

          Toolbar that looks like MenuBar

          + + +

          Toolbar from script with icons only

          +
          + +

          Toolbar from script with text and icons

          +
          + +

          Toolbar from script with text only

          +
          + + +

          + + 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 @@ + + + + Dojo Tooltip Widget Test + + + + + + + + + +

          Tooltip test

          +

          Mouse-over or focus the items below to test tooltips.

          +

          + Change tooltip positioning search list: + + +

          +
          focusable text + + + rich formatting + ! + + +
          + plain text (not focusable) + + keyboard users can not access this tooltip + + anchor + tooltip on a link +

          + + this text has a programmatically created tooltip +
          + + + tooltip on a button + tooltip from "button w/tooltip". + + + Test tooltip on right aligned element. Tooltip should flow to the left --> + + + + tooltip on a select
          + two line tooltip. +
          +
          + +

          + +
          +
          +
          +
          +
          +
          +
          +
          +
          + +
          + s1 text


          + s2 text


          + s3 text


          + s4 text


          + s5 text


          +
          + + + + tooltip for #1
          + long long long long long long long long long long long text
          + make sure that this works properly with a really narrow window +
          + + tooltip for #2 + tooltip for #3 + tooltip for #4 + tooltip for #5 + tooltip for #6 + + s1 tooltip + s2 tooltip + s3 tooltip + s4 tooltip + s5 tooltip + +

          One Tooltip for multiple connect nodes

          + multi tooltip + multi1
          multi2 + + + + 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 @@ + + + + TooltipDialog Widget Tests + + + + + + + + + +

          Dijit layout.TooltipDialog tests

          + +
          + Show Tooltip Dialog +
          + + + + + + + + + + + + + + + + + + + + + + + + +
          + +
          + +
          +
          Note: This tooltip dialog has a bunch of nested drop downs for testing keyboard and click handling
          +
          +
          | + +
          + Show Tooltip Dialog with TabContainer +
          +
          +
          +

          + This is the first tab. +

          +

          + 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. +

          +
          +
          +

          + This is the second tab. +

          +

          + 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. +

          +
          +
          +
          +
          | + +
          + Test slowloading HREF Tooltip Dialog +
          +
          | + +

          (scroll down to see more links to click, for testing positioning / scroll handling)

          + +

          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. +

          +

          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. +

          +
          +
          + +
          +
          +

          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. +

          +
          + dropdown at right +
          +
          Aliquam vitae enim. Duis scelerisque metus auctor est venenatis
          +
          +
          +

          +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. +

          +

          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. +

          + +
          + Show Tooltip Dialog pointing upwards, with links +
          +

          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. +

          +
          +
          +(will go up if there isn't enough space on the bottom of the screen) + +

          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. +

          +
          +
          + +
          +
          +

          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. +

          +

          +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. +

          +

          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. +

          +

          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. +

          +

          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. +

          + +

          +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. +

          +

          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. +

          +

          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. +

          +

          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. +

          + + + + 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 @@ + + + + Dijit Tree Test + + + + + + + + + + + +

          Dijit Tree Test

          + +
          +
          + +

          Tree with hardcoded root node (not corresponding to any item in the store)

          +

          Clicking a folder node will open/close it (openOnclick==true), and clicking a leaf node will popup an alert.

          +
          + +
          + + + +

          A rootless tree (no "continents" node) with context menus, and custom icons

          + + + +
          + + + + +
          + + + 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 @@ + + + + Dijit Tree Test + + + + + + + + + + + +

          Dijit Tree Test - dojo.data.Notification API support

          + +
          +
          +
          + +
          +

          Selected Item:

          +
          +
          +

          +
          + +
          +
          +
          + +
          +
          +
          (drag and drop items to adjust list of children, and order of those children)
          +
          +
          Update Item
          +
          Delete Item
          + +

          New Item

          +

          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.

          +
          +
          +
          +

          +

          +
          + Children (in order): +
          +
          +
          + +
          +
          +
          (drag and drop items to adjust list of children, and order of those children)
          +
          + +
          Add Item to Store
          +
          + +

          Data in flat form

          + +
          + Id: ${itemId}, Name: ${name} + + Children: + + + +
          +
          + + + + + + 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 @@ + + + dojo.NodeList.instantiate() tests + + + + + + + + + + +

          dojo.NodeList.instantiate() tests: before

          + +

          Some simple widgets:

          +
            +
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • +
          +
            +
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • inner
          • +
          + +

          A TabContainer:

          +
          +
          pane1
          +
          pane2
          +
          pane3
          +
          + +

          Some Buttons

          +
          + + + + + +
          + + + 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 @@ + + + + Dijit Tree Test + + + + + + + + + + + + + +

          Dijit Tree Test - Drag And Drop Support

          + +
          + + + + + + + + + + + +
          +

          Custom

          +

          Should add this category to the store. The second parameter is the value for numberOfItems.

          +
          +
          Add Category
          +
          +
          +

          Items:

          +

          List of Items to be categorized

          +

          +
          Apple
          +
          Orange
          +
          Banana
          +
          Tomato
          +
          Pepper
          +
          Wheat
          +
          Corn
          +
          Spinach
          +
          Cucumber
          +
          Carrot
          +
          Potato
          +
          Grape
          +
          Lemon
          +
          Lettuce
          +
          Peanut
          +
          +
          +

          Collection Count Summary

          +

          You can't drop items onto this tree.

          +
          +
          +
          +

          Collection

          +

          + 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. +

          +
          +
          +
          + + + 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 @@ + + + + Dijit Tree Programmatic Test + + + + + + + + + +

          Dijit Forest Store Programmatic Test

          + + 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 @@ + + + + Dijit Tree Test + + + + + + + + + + +

          Dijit Tree Test

          + +
          + +

          Tree with hardcoded root node (not corresponding to any item in the store)

          +

          Clicking a folder node will open/close it (openOnclick==true), and clicking a leaf node will popup an alert.

          +
          + +
          + + + +

          A rootless tree (no "continents" node) with context menus, and custom icons

          + + + +
          + + + +
          + + + 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 @@ + + + testing widgetsInTemplate support + + + + + +

          testing widgetsInTemplate support

          + + + +
          + + + + +
          + + + 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 0000000000000000000000000000000000000000..66f535cd891a4500e799446bc321e7dbc226152e GIT binary patch literal 2907 zcmZ?wbhEHb6k!ly_|C$xfB*ja`g#TihW}syWQ>B*5EwZjp!lEL&ow02*)hP?NY8+o z5$JQppDe6g3@i*fpils169x_&hX1@09vc=MY+~ZqGMQ1Z@NgTSs8i3036BnSim@l1 z*>N$+y-QxXt!Bo@2Pe8!wU?<>1U>Sarf+&oMnC}7Kqjz(0u0Q5ggpv?26FIg`9v5f zpekYpD-vg5Wci^!;lTlrB9jvaiHBSHl=*l#P}Q=4)ygrjGjM$HS8!}*WmmIVApmrt zfTUN9$H#{*-T#@G5L!S!BvA_!=~|dc*TO=&7FN==u#v8Xopdc6q-)_MT?-fKTDVEq z!b7?iUedMjk*8Q3{wJT@d8Y(Qi=kSxrI z|ExHS0NDe}_WxNK6!2wxWN!e~8aQCh_RPrH9yzdx)Pfu(L~22fcp|kRCodwkASYrX zwEzPb7(u|YkAsDQlZ6ElH^_O2NVAZ0Dv?@{%L5{{AeTBsYC$gBh}42yf)c3(xtu0a m3vz8hq!#2lhe$2RH5-vyK*<7D84{@lWD6`aGxDHjW@`XF3)u_+ literal 0 HcmV?d00001 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 +*******/ + +.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 and . 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

          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

          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 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 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 0000000000000000000000000000000000000000..58f3cf9654e626e8745a658c6b090550bd3ac5df GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bF0V21g*<1xuk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X%sgEjLn>}1{o-fy;Ynav8quJ{AtxxZicN!G|Lgnv_5w#w soZwhAV}?Ui8U}fi7AzZCsS>JiZnf4978H@CH?yTUS62v|NsB;J(7}=GbJP>4w&#X|9BxW h{fEXf4rUe!hF>l`$1GOg{R-5?;OXk;vd$@?2>`pnDxm-X literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1af7e835a6f29076453478e7a2321f782f331ae2 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!2~2v_?8U}fi7AzZCsS>JiZnc3978H@CH?yU-(HxRnOV5QEv-4j&CSh#ZR5nF7Y+43 f2KpGWaTqWh4ieg{^7`@xpdJQKS3j3^P6Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0-i}kK~y-)jg#w3 zlVKRf?@f2`0B&x&<{{_iautdrx20@zks(6b)HO9+1eHRwM9DO*Tyx?f&Dp_(LS-fj zIcL#_AhYsIAN&v%Bm4*6f8*-eoD&tQ3+_+v`@8Pba}ynuluV?efYN@1)4NMha-$fT zbr~F~DG>ek7YV3{LJi|}c)C4_o*$jK^wo*_^;$H1szvj<1En54sDwh%e-FW>6rTS6 z1n#Xi*g|HM2aV8qwa^UYqj0VOs+l~fULJ*c{xtX|et5qL%N&85KG&o2tqs;-IjR;a zu`A<@0XfgJkm=7r>Z25B{c4atS_zYcO!Z@S++>;0G5Ac#0>iQ%-J4x;gSHRXA$u%^ zbV7opVKI0^1W9WeNEVrih5}RD6FB>>0=6|P%H9}Iv~U79H{5Xp*ZUTvj3q-nA_CvX z2YCo0p9nl18*Fx?g1hsx6PC3y6b&DTWwZ>Ze0tno*{h&^(G7KPKD2!rh}s39hXnF5 zlk*82m39@gX%E@;CFP(3Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0&7V`K~y-)jgwzU zlTjGPpU-WIVri)r(jSXydQZo#KV>;o*J1bI$Yo-tXfakVHU+L`Yd8?C8p^ zGkPvG9;eiix(cAbwNHrF~G2+Qki@GbC~tN?y_RW!E-a^teAGN?)y!;e|NBI_B5T}s@d?R zp7E8s*#HF5PGCz3`b)-&ST=r=#bbqZ&0VJqRg4qjxn!b9Q=oQzy2|KM^lAV@LP%z{ zyNm@NY|ML?%PW&k20{Xkj%I6XQpZMfw4DFZMthS*)$caidVzjb(M2sn3&{Hk`uU)muF< z-#*Bkw^nX8BqX6{FZcH)F!pjdVR9W{%CL#kOB0(0#B^?6NQMG41|=~VvhZ&~YgaS1`qdbeGtn;q z{)j}FnD`pe5U$ZBNNEx6HVZvgXdklsOl^L1Hs<8rS-DIr5YdU=snd*T_ZtFw0_}ew zUA$T6Gq1mmzR!t+6-nquKD;OuhEqa?qE3PvF``eKZ)?E!A8;2xtQKO7{{R3007*qo IM6N<$g0T}z8~^|S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9bf9c33962359c6a769f403a584cf854a098b294 GIT binary patch literal 699 zcmV;s0!00ZP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0#HdrK~y-)jZ@!C zQ(+i>&)JVQH`h!G+uVv7WYM}&v!Eb@F1(6`7b4M}SAhl559m)QiXv|+h@>APG@7)r!=Wvc=!(A`JU%{-{*Zlkqyxy(%vI7a8uWfCtfce z6Sw$%hI{It{3TrHM3R%CFxC=XFj@|w64{MXLkORVQezb9ni}-+j5_-V`JzbC=<3Gm z{sUMF1d;dGBI9-=?Q~+s<;FDE55#P30GD}oort~3cMm7@%yCm zITphNNm*iyNLyzAajE-XGwgXqaRM%3)P!HD=h}-v!cU{d&@#L=VUEp6JE*EF){( z@Pf$iX)=-8K)x?pv3BEoutbt+&1p_r^>Eq}R2U{6@Qi1Z$7BbmtNn)P1B2o)21SFy hGtmvT*SpDc{sGkB$E)6PSyuo6002ovPDHLkV1iVZMK1sV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb8bd8bdd521510635377ca88c413267601ae9ec GIT binary patch literal 677 zcmV;W0$TlvP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0y;@VK~y-)jg#L? z6j2n%zccIpaBJ7CHT+R&h?LYr5p5|1Jr!2c!$J@RK@rtM4?$5`k4XeQWI-W8L6h`D z64Sq+w$_LW%37+0-F_&u3PMQ+D+}}O+-b(9%?A&BxM$9}=X=jw&IL)h8~_xpUBI0o zf7DFXHd8Sas4^vXTXGw{`xSp3z<(Xuz{t8SEE@M%Jad-Q$=&?9E6HE`_H+6~C*QOr ztZUHvWv|au2Q)}=5A@8Bu1lQSwu6ObjVv@a(Uf(vbu*_99p-q$3Qn$S;l$1)d*FNL ziok$|%fP^BO&!PTmvVGTEhp9|Xq#opcMZo>PH_EiYd5f4I z&DCo-Ya)<~#_XITSM|sLDx@NdtvzxlI4wG&ILyy=_58;~;A5zg*#!}sPnC|p zFv8rTI6LKHVd(zCcvCa8qB^IEh!?9=VkQ_8;Sg_WJ`;n1FmsV8=WQbLwxWU~f&rcA z_XlmYnY(@S7I>v=e68!eDN}$OnqJ5R{OpsDxkQS+_c`N1&B(CqeIZ;0OdJJz-v@(C zNuXTBlG7eYtej^;S~w;Xiw>aekh+nd-Rh4?D4QKt{ct*~jFHs7?%L({rc5 zi~9eQa&om(T>cvE-;uW34$8$|01Dlbz9L){Ut-2q8T<22*KXZ!PKrDg!)Y^Q00000 LNkvXXu0mjfZgDUm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1c96329ced18783ce447573417ccd970090db8be GIT binary patch literal 3570 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..53b33e54abdb947bdc92cd8b30359a4153017738 GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VGRHf0K^^u_4W1h^Yixh_QJx#$jHdq+1c&w?fLonudlD>=H{-h zuB4=-!^6YJ$H&yv)W*if^z`)V>gwFw+|10(_xJb9%ggxq`276*`uh6&`}_U<{h^_u z{{H^||NsC0{{R30A^8LW0015UEC2ui01W^T000Glphs+ESrVSNb)A;I8oP07msvt? zW!-kE91I{p1YkIu3=mUkHjhc*#R7l;EElA5romV!7K}y<)LbwJ%w-&1am<-Dr?>6A zHTW@Igvi{-83+tN9uor`h=>CX2Q(=U1&IX%78)rj1`7rqnF)lK9t8>#3J!jtmk|sJ IN0%W0JLM~Y#sB~S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..045bf35ed69d830b3a8f25a3459e180ea1b4c808 GIT binary patch literal 413 zcmV;O0b>4%P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzKS@MERCwBiQ#)>iKnxu|>9`8wM%39P zO1DkUkd{p%ZIMu<<_cRN5>Z5HXb^A&1mdG8eBw9SLBs5>V#)H@%3py{(Y9^QhRT|z@z%slXF*632?7Kk_995IsUTHMnMDQ) zkgOM(L;RX5^G2SLCeKuv~^IPQu4jY1;_VKwTyevG1M#Uu(KURBj|+qU=Efn`bp zZi}MWr)j!kf}iL4I{_ZZ?H49Vc5xiDvMf0ZEPUFKJ>7L+k!KQYU)2Bg;c#GCmN8h` z$8F#DpLG3;FLCzu2>3$gI}F2HVtDPk?t}av`~V{7Pk;dc;kd1Onp(@G00000NkvXX Hu0mjfC?~Xr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8c6f92eb45865a0b1c3a08f978ad2e2b61d45057 GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VGRHf0K^{v_4W1n`T4G{uJ-o!^YioN<>ko8$cc%GrlzKQdwZy; zsEdn>^z`)I-QC{a-mtK+w6wIs!osYqtl{C|_xJazs;bM&%lP>C{QUg-`uh9(`~Cg> zc6N6D{{H{}|NsC0A^8LW0018VEC2ui01W^T000Gl;3sfoSqk6BdETbI8_RX7r(HvS zXEoeY3L1Y|lK4KQPAHjhal<^o^UI zH~2AKvReekmUk28jj=7aNWr1qlTnnGS@P1_u@g5gIg?DH93} IM~)!?I|pcgNB{r; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c235849594ee3cd63ab53519c8985bcac9e5342c GIT binary patch literal 434 zcmV;j0ZsmiP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzR7pfZRCwBilf7z$KoG~*k7zn=6~!kI zAH=-Kg^(g}2zi48TQ4cDNs~^9SmhOjfLK`BSSbjWiHTp?S#HIT92ppPXLo+{pT&{! zJP+l0enbfE(Es*i7{)Ds4t9sbfoz6hAWn^CS>j-h<3Qm%eqN^QI@I_52I4pl@%)r} zHSNZ6B)*2=3_w`V#_{W>(=^>Y#ImeKynvvhX_`b0Dl-g2TBC3J6M`g~Kp}`>y$DgY zHMBNy~D>1l_z3Mww;VjVOvJ2m;hJ&0bNIH+=mAUt$A+$+G-WmgPGhr)xaG52~sH@C`oz c&G{8z0R7*RI)c_e82|tP07*qoM6N<$g1$Yu-T(jq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..543d0485c2382dfe9475fe74ddd0db5121e03ecf GIT binary patch literal 7064 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 aB5hv6@>&PMvIJqfgCQYtm0)JFEc`$DbMNH< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c2d3695059a1feb19af3167da1c35a973a3ef1b3 GIT binary patch literal 314 zcmV-A0mc4_P))n|d;GtX7`)G8X-%AgaMJf+JSVdZ(Nvf=nRvc0Z>Z}MSVUC6hMf;SHZho-}6geg1BikvW ziGr>bgCcJ*1~XsYv!)7nm?_F8$W;3zl5gIAN!44BD?}>71TQT?j+UuNzU_X3$rTiN zQQ?fot(3aH`{!a+16ud$h4)^&qwUn8kC4#mpJ579n8FmU3oii%07a~wLALyFk^lez M07*qoM6N<$f{zb@#Q*>R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a8f38657a3b7192e821722a3a6400571fce3a9f9 GIT binary patch literal 746 zcmV3Ye)&WU z1jvz5!|%>qow@l*;jOq1wOn<&L*wSs3gP1ekON+^FI9+E$Qh1lrBW=G1HY}K;p!1- z!fJK3+G1&p%b84HJt4P8E(}A9AE$5gtg(uum|HzDViDb#nqce50YI%_#~ni_)M;^@ z&Y~Y!3N5P}Nh$!H#*gMtwS0OMJ)~NQy+UgUEp}a*&WdEGlDcCM_bZHOr(ANTB?+Uu zbihb2&x4BBSf*+=)aKZP;+VT5$Mw>W#YkAneQ3NKRnxD-QKvgV^E7>gynN*5X1Rlx zAGPdOEM%%*o$PXdC{n9Tc|@gjQFil``*hw;?}PF8XHv7yZr^EQ8T9AJ*6nj2qTQEg z`e`4GU$*HT{kO#bTl>HH3d8(lhzF7*=PYJd%)K3646K!`AXOu{=iXNq1_iYhh)smI zZxqx?uzS5L3RJJfmgMm|w!?1&>~)xDk%}y@J_`UDu#1h`l2KtqkzmU3O7_izre8p{@fKKW(YNrn<=RBr633L;LPP7|bd};c7Y3 z+}Y=FNlHe1QTwk;DlpwX^+Bi+OXtYOO|9kDVO@V6a^TJTyMI&kkBY6KIa{@ c-1{%U0K%hKu_;sD`2YX_07*qoM6N<$f+|O2Pyhe` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..99fbd727babe6fa54b1c0070a39c287d1d3ad525 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JibOnJ978H@CH?vT-=0~*K8U}fi7AzZCsS>JibOnJ978H@CH?vT-=0}0LFE8DhXDicM2_G33Kh$M@(iA? KelF{r5}E)aCLe16 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9adb25441596ab5075f1b0dac72c3dbd3e144aab GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jic~yZ978H@CH?tc$ImRW!N6#vLnKdr_`wJrr+{nuYMLC} b3I`Z=-ePU5h`g`|sGh;o)z4*}Q$iB}Pq8KK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3d75caeb6f7bcc162842e5f3d6d911bd2ce59836 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jiqt$^978H@CH?tc$ImRW!NAB#f~V(yK8r(y50AltPqQ5b d4l!{UFdTo!`g-|6w}(I-44$rjF6*2UngFDnCrkhU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..27e9752e8cc0f25456e89a2f4ba6242231f21cde GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEFu978H@CH?tc$FD5RefV}LkB-y+nM-C!1Tb33D;!{W X(#%@LWfUU-RLkJ$>gTe~DWM4f(4-@Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cca618417bb566796bb279e179d20acfeaf1880a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEFu978H@CH?tc$FHo+e7IYahlgjsB+E>R07ff$g#!$? XSy?T`4lHH^s%7wW^>bP0l+XkKkmez< literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b6abbd2fd4e2c26cf2aee75a5bbbe1e5ee70235c GIT binary patch literal 413 zcmV;O0b>4%P) hY+PcJ`UVvS=G+XTlIq$Mco@Z1Jfo)fswgs80|2y(Z%zOJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73ee70565e51f8aca9968f0ec66493b8c0de254e GIT binary patch literal 421 zcmV;W0b2fvP)CWz{X}_yCekv<&9**te8z8AN+9U z`QA65gOcZY@E;LmjdXutJ!U`=I|zb))3$97mn2C&gb)bB(BAEKuUK9U6ZC4DW|X?F zdtBFr`Fwtbt+!};dSK9X-M3?&=lzKco`7jGnSf{2w!9?6;bY=GWm!U+rXb7mJ>@UNd-!RPX}jG* zk|eBurK;)^9X1+kIH literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e7bc204d8ecf5f4191374e9ba9beec2fb7a99ce0 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T-!2~4#Jy{GS85oO$+?^QKos)S98U}fi7AzZCsS>JiljYV978H@CH?yRod5Fw|Nm$H`}>>ycz|I812cn)yU6|M T*NKyW${0Ld{an^LB{Ts5qK78@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..410a0a7a4267a36ed5d41c271e2b508f2623810d GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#6!2~34%~2=@QjEnx?oJHr&dIz4awJP!BT9nv z(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6^VJeIEF}EPX6)r_4Q4ur~m!`f8Ky4 alA-YC)Qp}JabJNd7(8A5T-G@yGywp6!704} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..064bc1897b83c2a796656af3a9e62961719bcca1 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)O!2~4dW-8AFQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jio`r!978H@CH?vQ{QQ3)ILOe#Es((Qlu_i;9_RLTKotz0 Lu6{1-oD!M<#*`$8 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc81207e70710738804fd4f0803a7f7f6a80fe50 GIT binary patch literal 446 zcmZ?wbhEHb)M4OexT?Z%?e?SN$B$2*Jo(0>k2jzFxOVG)b#--5PfuT8UsF?4YisMZ z>$es!UVQ!Diz`>I)YjHszxVv~>C@Y`ZM%5!;UcGwt#>02{`T76<|7V~!Q2fcl$iSe&paU`(_5Z>-2C(O<`$4y#HHr$VaJ5^DH!P`lsQC#N6$xW(U?Obh3?g$=Wa8_*% X0x$iEP)etvB` zw;bsFId31D&1SCAXy9MjeMER^g3wM(zu&)FE|)*~@60yL69J5f$NapGr1J+}cf7uG z#MdV0Nv@7otJSF6?ULK=CUJiok#}5ykM(+;VzF3~zfD(X- z!$p3KJRT1|<&0#@h+(A{~L+D>Noh)oL8WDm-Wn>u{8qSA8 zp^HEuuyGqva%sq7v7DHiARi8g$!@prBm0!Kcv&iy^v7j`gjo0LKFz}rBxEGxbiz#L z5hNm!h+Z-n$e<)vs}(x>COd*OxGHDqbXpI}kdM&3VadT@fRY+#YlFTvZ$iu$RdbEqtP#ne`6X^r=pQ%Vs|3AygUXO zf6FpBf;3TWB#^bf(V&WX4vR;!!rAp-jJ6C)k8H|~`Hy4rbG2H1jedee1&58sR1W>& zF!Txu975I@uPl@A7y^Rq;~yXp{+|}c?7s8g0t^62NYX=N(GUUv0000*_@o5%*@M6OH1tR>~V2$g@uLX<>hpAbZcvC^z`)B*4BM~eUFch zb#-;!-P}V%LywP-(b3ULN=oA5;$vfC=;-Kte0zC$c<}J>+uPgo^Yhr)*wN9@*x1*{ z$H&*#*VWb3-QC^H%*@o()bH=_{QUg={r&#_{`vX&`uh6#`1t$#`}gXyAFj zV4h*v4Tr}W zc$IQEH8wtl!_1(@$l1%yrZ+Sejp2QSh-e*SK(qmckajTsywJSZ5B#=IIB{ZZ6ML&AU>H(bOJ@z0sOj2JE6$R)1f z!-x|V0F*pTGDu(!Am8)ln~&#uE}VFFg+ncXmD8799>*c3UuAh7)97zQzU@QL#Xdr>K0BB%AHIP0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Wl2OqRCwC#SWS;1Q4~EzA!M|#5T>Um zY_z4Fj#)}<{QwKGnEnsb$@Jf_oZbyf3%@`tXo;PO4I>f40wKDMuc=!J=`LTTnO7S( zd6HM}op%WAbM8|3wR5eNjhRsU3cylXZ*zNXrwfUGDzU}!wywz%j(fCOyJ1;O83_|cfi=wdd&zk>+ z0A{lp_xIls{1!ws8pZYXmyM0&kh;6lP7a=GJ^7@v<8(Tq)9IM{XU(7Aw$RPZS3LZ9 zILi_4SR*_I-Q)2n=AR}1wE&dn+x|evb#TFd49~CbCX&hIQFj^A{wa9c;OMk*%w5ho p@k;XNF1Mk|n(7h)W$m8;0|1(ch|L_xa>@Vz002ovPDHLkV1hJdSa|>d literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..00ad23a310eede2ed0c8e88c2d37532e71b71ad1 GIT binary patch literal 875 zcmV-x1C;znNk%w1VK4v?0Oo%H%F4>=>FNL9fdAZf-QC^L(9rn!`2XaU|Kg7S-FlUP zN6yX4xuIdm$jH9FzPGox|K*wg;*9(I`~Tj4|J`{1+jHOF-~ZWbxu9Lc!^8jPo&Vv9 z|KEcD-h8gEuK(P0|JrZ==%tl|RR7?Gxt&s{j!U_tX}O+Mvz11(ltZJSn8A`7xv`!9 z=b``EY1Y=(>+9>>yIc15_Tu8=|KNkz*x2Re<+-0&=rl!RW@)zyoEY5(Mt+uPgx{QQ1sGP$H{%EY$q z$zijzv(wYl|K*pSi&lDPIeTe7_xJaKd~w9Y#HW;CxuRx}bup@{s;8%?qN1XjdMp3t zn~Z%{b#P?MnHXMJO1Y$L|L33TtrNMOQLcz5|JY`?w5$LB|NsC0A^8LW004ggEC2ui z05AX$000O7fPaF5NPC8RLW7Efg@=iYe|?gZl#+vodqjDgc}19ln3|lPhk|{6sHv)` zeSdqLu(6wlbt|^FxVL+eemgrdz`q8mt!5&}B2%zc3e5^jR_Rs z$Z62T?J3Oc0H^rD4@ zTQI7~7Pw{Mr46qnMw0kIW8jAbA4Vj!Vh{mA*&`31%9KY_$bl9IXq1`DVh&?I3V1ni z@We?00B~L`Py=Hyk0U%rynKpQElmbc$UqUWB!=x6VJ_?81po&D05!7A7}JH-9}EJL zPw2ops_r2IMhF<-`tn3x85U${;J`wSD_o2ZNkE>$fDb*=TGw*|Ly+9H`)e2AX13e~?5d;e-x8*b0RhW*A8&910Q$06QI= B)+PV| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..413098acbfe38bac6cc5f89fcb50f76f10289d9e GIT binary patch literal 1062 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..251389a285e06380d4e8eda1ff98e6679c817fbd GIT binary patch literal 1863 zcmV-N2e|l0Nk%w1VM_ol0Ooc8{r&y^{{Hs%_VDoV=;-MA`T3KRll=Vr=H}+8sHpq< z`@+J)z`($%sj2t(_uSmvzrVkfl$7b|>Dt=b?d|QVs;Z}_r_RpK>gwv5nVIzT^t!sb z^Yinwv$N~#>&VE+va+(JrKRlb?7qIfrlzLF#l__0kA(yQ{0KjEsz|tgNuGu%x78&A7O@wzjtJ?(U$Vppuf3;^N}?`1p&9i;j+tot>T0(b0&Ah>?+zhlht| zW@gvd*U!(-XlQ7Ee}900fZ5sE)6>(^($ZdDUYnbnWo2cMkdTj$kD{WY%gf8y*x0YH zuZoI_@$vEh|NsC0{{R30000000000000000000000000000000A^8LW004FXEC2ui z080QZ000O7fOdj|goTEOh>41ejDiR)APf_VkCBs!m6DW@nwXrIh6ObhHZ(Fh4FaK~ zrKhQ@q^78;vxN#IF?GViD+alCzrn+G#mC9Z%*KSz%gxik(AI+x3&V6D z!UPtC+|c3U+ud~^bi?B0>Hz`n=z`@A3c?(9?}HIM0S>(IaYI;uBPRUuFjwbbLP7t8 z-SF|^fINf>g*5>pz#vA53lktw0D}w%hk^)@P!NDXhb=RN9T;&T<;rzGw1Cl3XJ$=1 zD)ZHuv84lnfHZ9ieeh+$JfBMIC_rK+43VBm?I1{iFGYkIKk5J|00D&~t_KE$m~jQh z*s^E;9a#J^BLbEKWX)RDcq0M&AO{8r44}h)fQSku2%%R$V7+_z z^3$(x|33bC{p`_kpMQePx1WIh6(Rr&O!Tlq6jJE0fFTPu_+W$+D#)ON5K2hlh8KFM zp@ki0SPKIQWS~M210YfWiYl_`B8)4xc*u(>);MF1GB)Dlk3a?~KKk%us2velBoINvB=HcW2QXBJrT%1E z$3zv)!zo0bZq$)5qheZzNFVkIO)Vw9k!-qL83$%HBYZV{VEJo zP6ZJanwp7Pi_>D-2zB$&;-k;&$s7xacN2SYhm{ z76AYO6d=P5Kga_>2dNz}uRO@oyKle$2JpiTG87QNz?S{{K~6g@%x}Z=3K2&C7f2w% z1H*zqQ33!U3!wwZ9PB`d#~^F)KocaJJP67F=pY2h0F-?4$Mou3v&$WSd;$>x@L&N4 zHvgvq%^(+mgAe%~eZT=pFWofKV@Yi^)k-scHPTsYctQ~zU?7AQCw%yI*khONHP~X4 zZ8qC!zm2xrp)kz4wWI>pf%Of9qm5-hwBo_~MK=?)c-77xIV`Qa0HF zDMpD5cjPJMORB&bk62 zj1VAu56}s`@WU7HOz^|gq5L$=CvSZ80X{#-2tx!&zy<69QI8$iH{bpL_u0DAsvFigbN_x zg(s9B9VS2u`@j$=D0IOPlu!X6;Ls5kpgP>Z0!fCxO$1rRL31r+cA4*F#PIac8e4fsG6 z^0>!1il7QXh(Ql1KuA8y5e`cTfeM_^NJI9Z0X-Ok5j>zr-gLmE2pHgG8kFDx45R=% zg7{=8iy(#-l=76x0i_3?Fo8Lm5|zD?r3iNUN?fY43uh1k24YYISpFvk5=dq;5zqhv z*#SMsBme=H+06VPQ<)NArZb_5&1_clnBCN-hBg3$6ina)H!#s47DP^SqEnrMU}rhc zna&Tjlb-OjgFM|?&rm=hM^h-==>DmqfVzmFDlq7c5UNmr0#u-pi>O2=s)#@U06PHh BjY9wc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e81ba07f8d99a772a5e09cc5c8f732670204b294 GIT binary patch literal 2195 zcmV;E2yFL>P)001or1^@s6=Hr&F0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU)HAzH4RCwC#n#)fVSro=kHw{W_(~SxW z3OWitqVWNuB0}65qH$wl+~~OWnP{B?=WOlQiWL#;~6$>S!#vl=c3ZtS?Q4Bsn zq*VlA&Uf@yZr`q|zC~h>lk`n0)l}85&b{ZHd#lbzg-)G1MgL_xbm$QMUs}ZDcta=@ zYMwfEYSY)RU%S72`O?D2{<6I1q}kJ_Pp7f$%%6r08JQJh;LmB(rZrSoS0_qJN@!?k zh@L)uI`rz*tG>^lKR59;{T?Y`)Ej)}ueR%Jq6QBhHn7r8k8c=P5BwY9a;!-o$EURP~=e4J*_o?Xc2Yx&Ps zHx`+3_3Bj$hr?nV5!$*)09(x>H*X#yN4#*-`t|FrS!5CH!7l9cQ^}fr|NgxMDw#}DM@I*BcXwN} zu(@T+7JB^nF_o2-(UK)gTv_F;c8+EYFt%B_IdTNk zj!vFDDO1^G^O~ERu^;1wtdS%63wJbx^hHN`5tJ#x3!!uxQRC@3$^-gUGn~RABH%Fn z7A;!z?ScSoPfrik*49dNRiG4m@Zdp*<%}KU402dx#D)zUXx+MXvgfCqHT&q%BWi4H z6q}gBy}i9uSy?HWt+UPo&r@$#XJ_Zc$B!RLW!S=n3-Lsd-vC=$S_XLlznhD<$s(=G z%gbdSl!ZOmRecD;s!UQ@YRlHt)JR~#Awb)=ZH)-PNl(UBid0Mvd zO@8BZJsB#8z^tkb@iy(n@-;mf%9X6JpBb6SE51V8m#d3>(?nVi_UsUG&Zc4MB~OnW+^T%PGQ|78XMM2qA}SNiAEVk zO=U_nD$Vo09Y~Wq)E_9iO^L>qmCD|bXlz-vWatu&EeoZ>lxW;oN1_=R7>KF)j`Txh zkQMq`fQ_>*P3}-EHb@+B5FE97^=d~wuwj*b*oA%cL)p*7V){TW;L=4L2FKaj#neA@ z<_sM@dQ|$4EK^0b&ZbE;oE0HVA#{`%H<=QvR;>~XsL-!nyEZyLKJF^BfW-lDP#qR8 zUMx`y!a^>AvmvpdA3A&BzyVj81?=3pbBWg=(ZS$ov(J9)g9i_2^XAR8V#NxX`f$2Z zA#~PR;5qeoaiu+>FOE<>_w3o@Xi^t1UUZc^Ocu^suwa4ggR-y(yN)*lux5tZvT!h# z52e&XCW0nsvaS*hM0bhwGD62~}e(b(|`+Q}VY_P5p z4SO|BvfxNqNi;!OU83<~ZDf{gusMk)r#j@E^>a%!{8$&sf*+xQC7Q{wN-ELWpfbyk zWYZ)X2L6mjqYeD%Pt2GxLu#ZKFJ27s6QXZqWW-mZnGCBWnoO*p%#tlOMWW%SLMOjS zR<2#UHZ9}uIK6!NvZu_F4c1L&$tLTpSzIQZt*WZ3&_TR&;Gdpo5XQD{-Rk;9iW{r9 zAS{YuRTBnfO^L>q#mg)H!K*0}u54I)Q{G)uQzH@$KsXAo{n%8SIddjzzBHLdv3~1< zEepj18yuzvu2@rMFEJ`eXo0oAz?YMH~ia5+gs#X@E=S=6z&Z{HU6z{oIP z7Bwsyq@`Q8Zi&Q$g4|?NBpP@Y8`2Wdg?H5rl_?Bj>Vq;{mOCe$imuN3eF;-sTr2^` zCr;QSP_`^=VvMi}WfobDq8eGMvngNEbai!!WTDa%npS;%y)!j={qg)FMQ7nGbRJO- z%0iw&Mysp{!kQUs%OW@kuG0MBYy{b4T_qY`@IoA!2&MzP`|jO4x^w5wFsEk5uV{j@ zxdSu2SqD62~}UaXDGk_|Q|(d1NzAJhI7U;xL` V5GgrqL(KpH002ovPDHLkV1hgq7(f63 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e546e281b131d5a45571c6fd3a5bb7a30e856f1e GIT binary patch literal 233 zcmV)L?(XdD?EU@yi;Ii%^Yi!j_xt<%@bK{U_4V@d z^3KlA`T6<9#l`>s|NsC0A^8LW000jFEC2ui05$*;000D*@X1N5y*TU5yZ>M)jwIHc zXxdzATT%@(I5a&ls};|+bLX$euIIzCWW--kGIS7ZMjf)JTsEIYAZ%Kz1{;P0VLUz< z8Vi6Lzzmbi=k)rruGg6f1A{@>8xmR*4S9Qoe}NEE9<9Z`X(e>q;IB1fvgU@*&{>z@CW19*Rxu-w?Wy=ehA>3xa@u z>Z9_IC5HIE&x8=nakc|Fjw2g}ffYq@D5dh)sdzTABuVV%aof#9&wq?GO*f+!MUm=5 z%CZF4br&Mf^Y}N9=8R`eRaNGv2|RgVWLXAH(?Hv{&~=@PIF6?_KF5B1Pk*x)d!Bii zdalM|#QMHhI~nKiqDd*I0_aK~vFDi=($qsf6*XZPs-HZ|+H;FFM!~O>+9X!jHHnnU ja|Ld%EjF=x@DgAEAcH7jJ)L?(XdD?EU@yi;Ii%^Yi!j_xt<%@bK{U_4V@d z^3KlA`T6<9#l`>s|NsC0A^8LW000jFEC2ui05$*;000D*@X1N5y*TU5yZ>M)j^x&y zXxdzATT%@(I5a&ls};|+bLX$euIIzCWW--kGIS7ZMjf)JTsEIYAZ%KziU451qG31? z&gX+67Z#JvXo8yEt^+uYgn_{z@C^xC6M1`le}PLv2nq!S1dR#^f=r8zmXVVq4FQ~; jotc}So|z&I0;i~`psB2+AuTE_uqcVOwzs&sArSyOolA4X literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b06afdb82c45dcc546b48a37dfd6ae61349d4245 GIT binary patch literal 335 zcmV-V0kHmwP)4WrEz+R#!uIxA233XzI6r8V9kI65SCTjYVUBY^-S-XSZ3FVN))Y z&KamFk)|o4lp;dNA-60G5<;N1Z9gs$O2-$1Zi=(9vMldu>}t@i>s~haJkP5CA*!l6 z{I#Me*4!Q+oedWq8%dIw2M$a{J?gra!!XEk93|&`4aS(dhWn6*=ia?<)7gis&Y3Vy zMW{GTGK`-^nWjkE;M)escqYp5`}gl}-@g6$@#E*upI^Uz{qW(#r%#`rK7IP;&704kKY#rA z@xg-!U%q_#_wV1md-pD1zWnFUpa1{=fB*jd*RNlH|Ndnd1(bz=;!hSv1_n_E9gs1g zIALHEI`O3Miyf<#% Px_#$X`~3&}jSSWR%Flo9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6803db442e3bd37d69d7b09c5848751bb0c30505 GIT binary patch literal 291 zcmV+;0o?vaNk%w1VKM+R0J97L{{H^;_4WAp_~qs0`T6$!t2G3xzQOty-_r<8{kTW~tq<^(!tv z$>y{YtyZ(!<~Lj{pLgr_Ej~Y<^67qmcY%U>goS-th>2i}ReO$WhmlQ?lu?tHl8Ty3 zmXx27p^l@ArHH46se-G2t$eR}v36ucwzszkez?57J-SD}!nwP{#zDYT$ICv+QOwNF p(9y-y#s~_**2_l#olOZ60ORE4=I7|?>Hy&k5*zUG@dFGI06P!$mhk`p literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9ef9ab08496213ec596cdabcea577af6dd8ea51d GIT binary patch literal 511 zcmZ?wbhEHblw>escqYp5`}gl}-@g6$@#E*upI^Uz{qW(#r%#`rK7IP;&704kKY#rA z@xg-!U%q_#_wV1md-pD1zWnFUpa1{=fB*jd*RNlH|Ndnd1(bz=;!hSv1_n_E9gs1g zIALIqY2a&WZfR|65$^2j?&DL;MFR;`mewXY!i$d^~wepEc)bLW4D z>;^TNV_nC@jWTB&W}aTIsihjYdXcu+lDoh5tXdboM>Y9u=$4SbDaLm_cLdrkVSa00 zescqYp5`}gl}-@g6$@#E*upI^Uz{qW(#r%#`rK7IP;&704kKY#rA z@xg-!U%q_#_wV1md-pD1zWnFUpa1{=fB*jd*RNlH|Ndnd1(bz=;!hSv1_n_E9gs1g zIALI~Zs2cfZfR|6VeRbd?&3l}e45V(5n`i+~n qZr{0k@BV{_j~+jH`s}XA%U7@8ynW64;p3;zUp}>e|H0qLU=0ArM3VFX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..010b08ae9da1cce97a260c2dd6fece6967033a19 GIT binary patch literal 388 zcmZ?wbhEHbG-5DfI3mdK^XJch|Ni~``}f0#51&4L`tjq(uV25OK7IQ6^XHErKYsoC z^~;wpzkmP!_U+r{%a{NB`Sbnz_y7O@GY}0Ff3h$#FbFc}fOLTDWMKXO;9*Zn=Ddtm zlawZ@IP07*$-Q6J)N{5;;J|_c4;`saj+P{rOpEy!R+MsUUES%ueMyBW6Z0objhj9r zX4dSi$vN{T6)j4eJ8${yl`~dPT|04o-^T9E9a~$sH|?z7U9-1g!O~@u8IB%1e&Xb* z(`OhWm3b~+x_ss8wd*%{*cg=g@7;g!@X_NZPx)`%efH}0>lb`)K74%e?$g&dU%vf( z^5fUv`+xrZa`hI!Am1#=#KaMCV#C72?E=bPH4hwI8oDKnv+kVOxcE4OsB%Yyg??7-{0Tk{Qv*||Ns900000000000000000000000000 z000000000000000A^8LW000yKEC2ui02u(n0RRR6AayuoX`U!KPHgMGFzdv0J=eH< zPf+jwz~C-OEZ&Mp;4#TuGLf@qlP85zdy%Ym%iTu1;Bdr&jY!Vuv|3GunAdPP+03Zd z1^B$)ZlB-v0D*#ogk%y7f&+?+1B8x-0*e8Yl$Dm0WQYTl3!R>ypq&bb0F#~%sHv)} z4-TZJovgB{u86P;v$M6O0jIgFySKly%$h5`2&8^SJ(aO-x*3{V3%+=h{ zsM+1yw#(qs<=4pK=j`C_-s#%w-|zMDyz0a7-g_mm521 z$+CxKnQ6K}_zW6OgwYOes)5qNu8V0{ZF2%&=#4r3pE7DkBSFBc-XVJ;mm zB^>|~41j=M7Kwmj3M&w{n2S2FaMBl?i9utHV9;3F8d12hBO6rUnBx^C^=OijMFuG( z7dI}cMH@~sSw@su%t7UoZd_SqmOrw=WtV8o0cILvj(NrmZ#slND(tYt7HjOW z$R?}ovdlK??6b$pI_k80^;IhWV5VAD*=AazrYdS?#!4EPr+Is&XPJeh?PTeKWLdZ7 zp8GDm+@8DJs`q~DO1Q4E8SB2`?q+Ad{*F6l1O}6vaF+-JeDK1-LcC+c14~>Q#RWU8 zu*M8q3>wDadMp#j4|5!`$rFnl6UiG_jPk`Q!^CpOFMk~KOEXW58nq^<$ny#_@}Ox< zeynD+AF?H_$C^g3h9(_N+tlOGFHL000Es@W@H4r7r8uc|(J;bR_wO zW2t7R*t~Eo%LD?rb3WJiqW>^Lpa%r8eG#s;K@ZFAdas}!VoWZZ z&06t!eNKx8@VI2e}ja8frp5P1&fT01&0Zdl9QB`i-8Q8nwy-R z36Be%qNAUI1_lqQs;jK31`MUGva+wSv$v_WkGQzH3%s|!z_Y@`t;NQx$jP~|yUec6 zztGLL)XU7+$=b%;!`{H)yyCsm)YZ?|=I7+W>+06f?Zncj_V@Vtu%#FM{s$2N06Qaw BwI=`o literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d32f44e3c7852b9455d5b158c570dfc55ce15f3e GIT binary patch literal 300 zcmV+{0n`3RNk%w1VHp520J8u9`uh6({QLO$_xt<%{r&y-_xJSl^xody{QUg(_V)St z`S|$w_4W1s{{H{}|MT000Ep@W@H4rArOeoc~}LW?Lto zBFUlbmjMXT%yezrZ+!3j8_2xiEC&?wh{hl?xf3X0MP}`_Ay}hHYV6AGdI>MU20<>H z&*tzL%|0)vgSdQ7r@u3bynfFI`2Tl&f`fZ^1&4@<1$T^%3x^4jl9QB`Zv_bqnwy-R zo|l=PqN0zP1`nvIs;j962Bi$Ath21Jvb4Alwz;{xytKZ*wV1KOv%$ux$jQ3Ix6I9^ y(8|u!sLRRN#@fQ%zuvsyz17y@xaPp*)9A}1{o-fS*}1{o-fy;Ynav8quJ{AtxxZicN!G|Lgnv_5w#w soZwhAV}?Ui?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%5gl!Dbne(0s6*x8QJ9xOT({0bPrK-lu4cO*1 z2EIJY#x9eT@J3NYH__O@bgG@c8%~F)`z4d7fKYmPrjbN1S_sH^qg7YYt!g191nA{9GV2 z`EcLb(031D$9pwRg9_eTOb|Lxz!)abkCP{70GE*!{#lmZ@SrG4rm8AMQG{xajD2N9 ou`-C9g{LqKb?i$9h@Suh0BSqSi~!Qew*UYD07*qoM6N<$f@OJ#%>V!Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc947e0a1997c1cd7c0bf170312a93596c2b735c GIT binary patch literal 205 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k#l1@*oZw@IBF<}6yo%3y79WZOiRB8hLhX(F!Y zk7;s9%~;60xR7DWHb=Hw$zJm=EJ~OZ(q|;tQC?!HP;un)nMrn`adu&kHYW8lDKc0C E04+IkLI3~& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3de66a74bcea7892e3bd1b69f33e1b748674f4d GIT binary patch literal 361 zcmV-v0ha!WP)tl3wR&>$n>QHo12M4w11nkfzS3fu)-XD5CQSf~q zX6E%_2C@jMs=AxPYe5h`Ow$CzFo1`Tk|gb2*9ApUt~YMsC!DROX=}%EKorH_gTHu> zhezACLD%(vPZ_a>^Crvk&htFL*WcWWu!|)UDnLc>`fdrrTg$SpZKp!pUl?PMWf=^^ zFo{z{3&iI*j-hQ^E~b3rywr7l2*VJ{vgG11r>^UkNs@e~X$pPcb1~%$XH^u%DF^~+ znud$V9B}_l6h)Bd`6Q;iWBEt?S{Eum=NDx-&s9~i9{~mc8n0Yv0MM>800000NkvXX Hu0mjfFw&Ti literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b0e8097f4b1fe9b8aead6c2b22d23a5702042fbf GIT binary patch literal 204 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%bgk!xaJ2^ZfnHra^c)U&U48!T!g$gd6r@6W` zzTHlcYGPWh!E9k7p{8d%fk`DmEp1ZFKZS`4&D$+vYNWm2UR!m*qTBtIY{g_J25SJ# CJ8_o) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed6efc46cf92608c9fa957fdcaa6e6f70f4c7c6a GIT binary patch literal 205 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%5gaf@PJ8e88^BTieKHe62hT-(=Mw#nf`4c?a zzD!P3Yhqfi!R%oop{8d%fk`GnZP~<_e?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k#l1@%4|vxF2cv8ZLDtF%03D<4TQW0by-VsTEj z>86CC2-7DIvh|cCD9e=l>9P`b5_d>L4$JU?FSCsWz{iKWUvMR DbR2Fi literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7f7a5d8fd543089c5cc59cd80ef2051519dcbbbe GIT binary patch literal 319 zcmV-F0l@x=P)BGU0T}`UQc_Y3+}zwb zAaP<1v1evx?ow1#WB_^tEC8aFl$02ln3%eNTuWjM$&{CuXJBV%M-c?^LE_MW#%oBI zu&{8rkP!AT1j;c0V z?AfbVukPKu_sp3y+qP}nx^?TnfB*9H^FM$7ymRNy`}gnH)zuw8e*E_B+m9bVe);m{ z!Gj0atXZ>X&z=(}PF%ZoZR5s`Z{EB)efsqI^XDHtc<}V;(_g=S9X)z<$BrHK_4R#y zeV;ykN=Zq1_UzfZb?bir{(blE-7QeZ1WM>cQXykfb6=I&i!7Jj&;J0`oqqa$#DKGmX|8?vAj77y-rHmNX zGwCpHV3kv7_LE$^Q+3Y<34vyHt{q2@uV;5^=3??&@6Tj$!JnC*rjW$n6@`DwYsh*v>#4cy@p4>{a8Okw#v{Y%#i4EmW`Ts_rOK|2tnz#U zhZZm~P2^S*P>^6yKGY^A6ULxmvY@Gp*FNAwhl5f>o05dY90QSshdRW#M05-uIxq>b q87V}5`0$90n_0$jupfJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..44ad021a36dea29ecf72868965aed52ce393a41d GIT binary patch literal 66 zcmZ?wbhEHb6k-r!XkcWxeEIVK|Nj+#vM@3*Ff!;c00Bsbfl0Ebzv1*U-oxEFmrAnZ T%D(@}edICiS?974Mh0sDw@Vjn literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d32a2f731795134a05617873080e36711806100 GIT binary patch literal 72 zcmZ?wbhEHb6k-r!XkcWxeEIVK|Nj+#vM@3*Ff!;c00Bsbfl0onzv1*U-oxEFmrAnZ Z%D(@JRWx-|EiqfUO;-E*E?-6lYXCOA7%2b% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c28475c8d4e2f1e6a59369f4ee46c17b700dffce GIT binary patch literal 93 zcmZ?wbhEHbWMmLx*v!E2@87@QzkmPu@#D{*KRDSr z1<%~X^wgl##FWaylc_d9MGBrSjv*Ddl79XBYc0&o%q*;|tgLtD$N&HJ8>DO`6b>+0 X-er>(iZbp8s%7wW^>bP0l+XkKkhddj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c52f83dc3b5ffb880302f50574758a5618bdc1fc GIT binary patch literal 1275 zcmd^8`%jx?6n?vg%Ya^>g??Xe4scMpWSG=3(L`O!C=mh6(5h*i4iP7r*2&~D9MidE z+2$B%#$*K8u*(8NB;7<4I)rtCEhuGB#s=-Wu9TKu_^7>qUw!!#{MnP7^W>c5&3T^Z zA?X%!GiMT^<0o0{|3s0KodB?OpXg0LY-cWPf2-9ED1u(x@~#jh>R6g0K)Shs#FUd>)^` ziKY8X0GtFMip4@QGX;Slp0ZEzjP&PgBa2Z5=T@Bo%evRT8Ci4rUpPEe*f@HyeY&cl z?cSq}6|2YP2_n)i;Rl_0vh(GqChGgW)kZvQ$K0M*);&Ms!Z zT6=uhY<758UB0X1#@ZeY<_mcPp{5&CtDC{z*)^LtEWR+HvV|sX|14nvdmwCfxw|K) z4z;$nkB?tct8baj3axfXryE&V7<=$QV>0QjRtgmgqZ=F!29t@PsNLh?aJeX(jrskU z&ld=Xae`RT>&oDION7Qz-PNNJ}Ly#of9UFWB}c;lP;jVu!Oap}W!FvkbD&pU;J!_4UE{4|~TxzQwW z9f`dyK>RM}WM#>tcrcs*`m$1|KYY()G^nG2BARsW>C|6d%%45hpl`phKCS(hk$4qF zjXw=iDHJ-5mXw&tWH1mGi_77#QIyZ)5jY-+L^?a5_O)Mw~dmKnF#P`bxL ztz?mNEM~lw^t>poyCvoO9$A4@p14azJ|t&6yXyqWrkLxiULsxU9PF25?T%gHA*3^R d=g*#e^Z43R!(GB0qh;%I#f7D!!Mz8*`WG*c$M66E literal 0 HcmV?d00001 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

          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

          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 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 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 0000000000000000000000000000000000000000..249a1533f473e72dc10dcd3cf6db3ac67c57e683 GIT binary patch literal 174 zcmZ?wbhEHbWMVL2IKsd%Z~wb{FMmzl`To@1KT8k4pSS=0@!Nl9?0z?Q-@EHif8Toc zYu283S04XfaNzCqUGFYF{5^B`yE`v_oxA^g&c1gqKm3`p^F0Gzp!kyoEUyD1L3T2* zYAd+1I*Mp|O)@z1+2fLdgxh5Xh9;lOn;a$_KKM|8L+iwnqLVpR^Dl5M6kuYo1_0y- BOius+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..92c74315c4d8ca43e468b14fabee824390059e80 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bF0V21g*<1xuk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xd_7$pLn>}1)%<+O&&8U}fi7AzZCsS>JiUK@c978H@y*Xjc)!@L>@=(#N?B4$}rA}?w+9)@^( W6W7*Rcawo;GkCiCxvX8U}fi7AzZCsS>Jikv)M978H@y_sOhcR)elu;0)B=@VBqv3OP;IC1RG!A;Y3 z94lMZoH=b}AG|sG&QboIh(*hCvxuf5X+it#PwKbXGqN!h?YEJ+`t73v&@={5S3j3^ HP6Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0-i}kK~y-)jg#w3 zlVKRf?@f2`0B&x&<{{_iautdrx20@zks(6b)HO9+1eHRwM9DO*Tyx?f&Dp_(LS-fj zIcL#_AhYsIAN&v%Bm4*6f8*-eoD&tQ3+_+v`@8Pba}ynuluV?efYN@1)4NMha-$fT zbr~F~DG>ek7YV3{LJi|}c)C4_o*$jK^wo*_^;$H1szvj<1En54sDwh%e-FW>6rTS6 z1n#Xi*g|HM2aV8qwa^UYqj0VOs+l~fULJ*c{xtX|et5qL%N&85KG&o2tqs;-IjR;a zu`A<@0XfgJkm=7r>Z25B{c4atS_zYcO!Z@S++>;0G5Ac#0>iQ%-J4x;gSHRXA$u%^ zbV7opVKI0^1W9WeNEVrih5}RD6FB>>0=6|P%H9}Iv~U79H{5Xp*ZUTvj3q-nA_CvX z2YCo0p9nl18*Fx?g1hsx6PC3y6b&DTWwZ>Ze0tno*{h&^(G7KPKD2!rh}s39hXnF5 zlk*82m39@gX%E@;CFP(3Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0&7V`K~y-)jgwzU zlTjGPpU-WIVri)r(jSXydQZo#KV>;o*J1bI$Yo-tXfakVHU+L`Yd8?C8p^ zGkPvG9;eiix(cAbwNHrF~G2+Qki@GbC~tN?y_RW!E-a^teAGN?)y!;e|NBI_B5T}s@d?R zp7E8s*#HF5PGCz3`b)-&ST=r=#bbqZ&0VJqRg4qjxn!b9Q=oQzy2|KM^lAV@LP%z{ zyNm@NY|ML?%PW&k20{Xkj%I6XQpZMfw4DFZMthS*)$caidVzjb(M2sn3&{Hk`uU)muF< z-#*Bkw^nX8BqX6{FZcH)F!pjdVR9W{%CL#kOB0(0#B^?6NQMG41|=~VvhZ&~YgaS1`qdbeGtn;q z{)j}FnD`pe5U$ZBNNEx6HVZvgXdklsOl^L1Hs<8rS-DIr5YdU=snd*T_ZtFw0_}ew zUA$T6Gq1mmzR!t+6-nquKD;OuhEqa?qE3PvF``eKZ)?E!A8;2xtQKO7{{R3007*qo IM6N<$g0T}z8~^|S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9bf9c33962359c6a769f403a584cf854a098b294 GIT binary patch literal 699 zcmV;s0!00ZP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0#HdrK~y-)jZ@!C zQ(+i>&)JVQH`h!G+uVv7WYM}&v!Eb@F1(6`7b4M}SAhl559m)QiXv|+h@>APG@7)r!=Wvc=!(A`JU%{-{*Zlkqyxy(%vI7a8uWfCtfce z6Sw$%hI{It{3TrHM3R%CFxC=XFj@|w64{MXLkORVQezb9ni}-+j5_-V`JzbC=<3Gm z{sUMF1d;dGBI9-=?Q~+s<;FDE55#P30GD}oort~3cMm7@%yCm zITphNNm*iyNLyzAajE-XGwgXqaRM%3)P!HD=h}-v!cU{d&@#L=VUEp6JE*EF){( z@Pf$iX)=-8K)x?pv3BEoutbt+&1p_r^>Eq}R2U{6@Qi1Z$7BbmtNn)P1B2o)21SFy hGtmvT*SpDc{sGkB$E)6PSyuo6002ovPDHLkV1iVZMK1sV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb8bd8bdd521510635377ca88c413267601ae9ec GIT binary patch literal 677 zcmV;W0$TlvP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0y;@VK~y-)jg#L? z6j2n%zccIpaBJ7CHT+R&h?LYr5p5|1Jr!2c!$J@RK@rtM4?$5`k4XeQWI-W8L6h`D z64Sq+w$_LW%37+0-F_&u3PMQ+D+}}O+-b(9%?A&BxM$9}=X=jw&IL)h8~_xpUBI0o zf7DFXHd8Sas4^vXTXGw{`xSp3z<(Xuz{t8SEE@M%Jad-Q$=&?9E6HE`_H+6~C*QOr ztZUHvWv|au2Q)}=5A@8Bu1lQSwu6ObjVv@a(Uf(vbu*_99p-q$3Qn$S;l$1)d*FNL ziok$|%fP^BO&!PTmvVGTEhp9|Xq#opcMZo>PH_EiYd5f4I z&DCo-Ya)<~#_XITSM|sLDx@NdtvzxlI4wG&ILyy=_58;~;A5zg*#!}sPnC|p zFv8rTI6LKHVd(zCcvCa8qB^IEh!?9=VkQ_8;Sg_WJ`;n1FmsV8=WQbLwxWU~f&rcA z_XlmYnY(@S7I>v=e68!eDN}$OnqJ5R{OpsDxkQS+_c`N1&B(CqeIZ;0OdJJz-v@(C zNuXTBlG7eYtej^;S~w;Xiw>aekh+nd-Rh4?D4QKt{ct*~jFHs7?%L({rc5 zi~9eQa&om(T>cvE-;uW34$8$|01Dlbz9L){Ut-2q8T<22*KXZ!PKrDg!)Y^Q00000 LNkvXXu0mjfZgDUm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1c96329ced18783ce447573417ccd970090db8be GIT binary patch literal 3570 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 IN0%W0JLM~Y#sB~S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..045bf35ed69d830b3a8f25a3459e180ea1b4c808 GIT binary patch literal 413 zcmV;O0b>4%P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzKS@MERCwBiQ#)>iKnxu|>9`8wM%39P zO1DkUkd{p%ZIMu<<_cRN5>Z5HXb^A&1mdG8eBw9SLBs5>V#)H@%3py{(Y9^QhRT|z@z%slXF*632?7Kk_995IsUTHMnMDQ) zkgOM(L;RX5^G2SLCeKuv~^IPQu4jY1;_VKwTyevG1M#Uu(KURBj|+qU=Efn`bp zZi}MWr)j!kf}iL4I{_ZZ?H49Vc5xiDvMf0ZEPUFKJ>7L+k!KQYU)2Bg;c#GCmN8h` z$8F#DpLG3;FLCzu2>3$gI}F2HVtDPk?t}av`~V{7Pk;dc;kd1Onp(@G00000NkvXX Hu0mjfC?~Xr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8c6f92eb45865a0b1c3a08f978ad2e2b61d45057 GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VGRHf0K^{v_4W1n`T4G{uJ-o!^YioN<>ko8$cc%GrlzKQdwZy; zsEdn>^z`)I-QC{a-mtK+w6wIs!osYqtl{C|_xJazs;bM&%lP>C{QUg-`uh9(`~Cg> zc6N6D{{H{}|NsC0A^8LW0018VEC2ui01W^T000Gl;3sfoSqk6BdETbI8_RX7r(HvS zXEoeY3L1Y|lK4KQPAHjhal<^o^UI zH~2AKvReekmUk28jj=7aNWr1qlTnnGS@P1_u@g5gIg?DH93} IM~)!?I|pcgNB{r; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c235849594ee3cd63ab53519c8985bcac9e5342c GIT binary patch literal 434 zcmV;j0ZsmiP)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzR7pfZRCwBilf7z$KoG~*k7zn=6~!kI zAH=-Kg^(g}2zi48TQ4cDNs~^9SmhOjfLK`BSSbjWiHTp?S#HIT92ppPXLo+{pT&{! zJP+l0enbfE(Es*i7{)Ds4t9sbfoz6hAWn^CS>j-h<3Qm%eqN^QI@I_52I4pl@%)r} zHSNZ6B)*2=3_w`V#_{W>(=^>Y#ImeKynvvhX_`b0Dl-g2TBC3J6M`g~Kp}`>y$DgY zHMBNy~D>1l_z3Mww;VjVOvJ2m;hJ&0bNIH+=mAUt$A+$+G-WmgPGhr)xaG52~sH@C`oz c&G{8z0R7*RI)c_e82|tP07*qoM6N<$g1$Yu-T(jq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73e25e1724be8b09242ac637091e89f011b9cd25 GIT binary patch literal 9304 zcmb7}dtB1@9{)i>@eYcnj^rY#85*)ynWlo^r8LFvuCvtCv|LkH%h}pj0R@p1FXbgK zAYM?rsI_iu3l*=GdD~X53tmz)SD>!rh4lBu>io{{@i_bA_n-f%`TRV4zF+wI`)qX$ zH-JP!#sSFi>!q>3mO7sM`A z7q52D42&#Q$(4^^&JRs2iDYk|zfxc6Rt=6V{XR0^^J1w&rW~4BD8HwaKUsV}x$yke zVr9$QCodN&THao~`}V=Jg|~C>FLfxVXVh&&i`DWsRjtapcBQCUC2dz#x2Ytps&bjC zMy{-AQPs99tL4htc2!NAO5CEVY*qCRtE*d;l`YEON9XT9TkL+iSl6K%9GU-ZWWKUh z+5K#(zC-!vB=}P)YdcgApD##S-d^rf^^K_i7+(_0-qyD(rESWp7UjUm!u@AU51uXl zHo7QoR@HZ?9=!m6Wo2E*+kxTv!O{6Dxk}QaYJ0L+(foFBbg^%EvFqv5{ill+Ey|j9 z@J9u|*P^6V`NzwpDV4h9?pwvwVs)ExWn~4wVz7&`XSX*sm_czSYeOLr2z~(uhd=-b z3H%zO`7=RuS5i=@tt=FjyzwlV1U;8UK?VleLbA@0ZF7*63+IHnNOCDTClHA&g_c+E zE5#I5BVnba+*}gu_U*G()sQ>48*a*Al)w-sGY|uL2*KoZ22y$+8X@Dl0ujIU26n~e zKg3{+qL>j8%za~Hc4iY(QGbmQqh7r-!XVU$e_KG>=0<&4=L%DjbqIwxJ2u83;*wwf zV;syYg=n`!FdCdyLLt)92aiy*wBQ!jJVUFF7Jpa#zT6mvs#0saQR29vxH)=9snJ~F z^^A&4rUbo7bg+(^Jy2uq=*KXdsNJn^-V}K|Sp0x<^>AP0!w{44n<4R=O0A1P8riUPG#ihCvc?yeIx}{kA%RLA1Cb20{A8Y!717dA@%&l;9 z3yWYc9>Fwxgm3&5+K#fGX{g9>;Kx*GZ!LrRXwis5h{;wRtBP#Blms84u@^Lb1sR}E zg`tCK{&G|xE4A(X0UM_L0xcz6UU1m?w!F|SMXwsk5V)pcJ+8lsM!8KRThS+e)vK}C zjb_%Ed?(ZMHFUw?Cq*<8w4;2d;Wnw5+pcVt2rUvEFrm|sR}w~yORWXt&?38<+e2o2 zR+(GeVR-REsAF9oMSRROK-So-!`+o5zkJhX+iUSHEhwk@E7;E3t8yDh5=OqLf2rXV z#6^D1yO2pUaLQM}ulFV=Fbwu5h3l9qSoKanJxe#ZVl{e0!7!P=afX2$Z29xb&&nGz z+1zc16?Klgg$PbSJ{$j#+pxMI+P_kxDhRge+*Ijpvbw|NUe(18e{a*~mT%<*>mA!-iyX$hO%4C6ALOM3RdE za&`zZO;A{X+$X}=1_oBaM5HP<2_`sO03ac^I2VM#O#udcG648w1QKQ-zz!H<Ns{&Lb~Z<(aT3^`cZb|{$Oz|+%-fm?Uu00=Yj#=fn2v^JctW7wRD=4@pcYT zcdRrC6K1#qeP@BrNs+;tx1yhRm8qKtsQ%Ao>=F_=Am%}yE4EBood-l~VD;B>n_X&zw`95!Sv+a=UbG56Y2>I6*=fORy z_+vZGX=A3(WfUT(NS=j(1f1I^^)LFJTg=(c2e~=BMYdodijh&{=yU)I0}+ z6d%5)zf4_1(df`O&%g&Tr}7e|sEwKwxT7gKDM&qaGh16Qy?+=RR+2i53r@jvQm|S{ zavp}3(2Zgk5@41-WWtE4b9*Nb$>??9U_DAgCe{fCnJ)H4kLf7V#8Fin`tibg2Yje(xD6K{1C@&aQs}sZ=hz*yHs3hHN6$&kWUcWo8EG?jIy9VS zB{roTtEnb5^Q`K9j{n3PAjh#BoOAS8| zUz6~al=~^rN5;9N8-kN{UmH9%?$@&1rf$?WaWrKyaQ~ZbfCWI$o@Jk5vp}{pp?tFK zIRGi-3$g%m0gHStgjJd;Lhh4bY_pI6OhU>BNHG4{MkM4qyRP^eAA|hBbzxvjAf#u^5C-@bVXHJec8 z6x*(Hb(rWeFz*fst`yTQc$$xq)}plnFIXRR=7?mQ42nG0TKM@rp`r>J*>|@sc>BQD zFtk^;T{5p6yDWkymTREaJ7k}{vh|?ibZ?>kw;t|R*Swgza<7Wu2Ni zJE6lX-}0++e)gq&mfCesJrSL-+SyA0%2xi zf8$2P3XTAG7?G_F!{D(d(B*=1oSuH7j-?(VNA{iZQ(ZAGtb{4nfGr0;dv{vS1yZ1G zLB41_4;dCF=5cpkijfD=(5O+ahkB3Pn1#-f5FBT2akBZ38%J@zy|-ZZvRz0ym4uz? zDqlm-$y;oYr{I@3Uwx42FW+^JVm}Y)YY%dh4Zken^F-CSfCg6t<}qXhV8_|54!8?3f*~HGU2e=~7-Xa|*W~ zM%6H_++BaQST%sXqMz7i?#Tq1c8VW*eH9=h=~n@Dx0gXj(~wr9p=HXYCMUo8&TA~v z@yodUU7g-2dq=H*W*T~y%pz|^u{2N%pqT*KHVc$-E^sazu+7ONXN3TPqRf(zzN?kK z1mt=$lNdF|GJ4CJ(Qus$a=jp*9KIRDDl|+a@fvB$AU1O0&A}Wr_~$Yp+UfU$ZNoZ4 zbO@cF_uZxKZ#1UHTaAoWAg$4&gRc@L9iB00(Ig>*_CO!lG}%`f9t{VL?L4D5M@yra z5o4vomqBn>=HZIl!M69)km$;2{A>+aG`TcGp&b4f!8~%MM2(lQGKuTfj_HR)oMt|^ z2b3p+39%_=GN6QnyZg!5xZ2iHhPJ~-(AX)UvEiVxlm4pc!NT;&PP`pc8n|EK{AIe2 z8*BZN6PG}^Yu7!~zzuzrdE#Ee@Sp5zr@hP4g>SVv)t?Z>EAbJBO|#XDd;7|9#*lek6g(zT*V1>a!<&_f3|C;0 zAL;f=HufV7rvqTOa9LotAW^vv2$ZkLl7KG8FgZ9{N@^O>-kB;v6(g9OEQc8ff0P>{ zM2;$caA2(8lrfLXSWCCgs3g)zjbo;}og<m=gNlDG}@+10QVh}m6#T7n>7%dB}wYuh<$Us);Brr^hr-$mTWII~w zarcf9z<*h3a$3`a&7X0a0P>$SgMq0b+I2%qFQ;pU*A! z-w`y1FmK6Nm~1&1CV7-Vu<0oe1$M~RD#UN+dVx6Gr&p05x+Kpi>LoL3>i4K|mXV4z ztKmEku5=3+H=0C}WJQLclZ8@@(azl%n-@C!y)cCaw;dA~i^Av4(}I)v9< z3%e=w9aK%2w1zw)ZpW^On7EqzM19JJL3&lH2J<+Img8Iyh`Akzd0TCXR6rBm7Owk% zd96x=c^=IW3=@M;AIFt#TQw3d@ZZt&0Cc#s1o|ONx+>wRaMy!jg?%3#9u}h832gZM zKbZ5TlVp{vnE&GXcd93LydjFHXg&UTPxQ+75gN>~(txJY(ZDS27ON*ej<)>!YoAqz z*XSeme02D!$-US2uYj1JU&Y*Iy#{mp(xYQx29By&-s5u4a!|43lHQ0HKu4$Oqr)&z zpJbi>n>bq|iq>kGmucrAT{Qkq72^>4%?K1$pC(5UmZ3Um=|{rbh+$xK2z*2YI%*5Q zaFocH#`&Rq=OJTQnlqErnIm|N8WZ|X-lFFMbl0x@@aYD*i4-UCTfn zF}~ee01~d_=oZi{$A;c@%|PrXw{S`Y@`Y8xu(d7So#xaZtmWq0MXdTO z(R17UudtN-?iv$yf}>-%UH!Cq$8yf4D|v-eaRxecH>VpN+wMbd3UEuhI>cRxa-%Kk ze}o%K1~zieYz6oL=x{#e|4KYlBk_y;Rf&_ug33T-E$Hx&KvFHKpb(aKwh~yckvJG8 zBpDx*^@;A|;H8=g(p`=CT^JYv;{6Qhic^5qooB>kYO4E>C5)#XwQ@$9A3vyu|BbHzSdWoUSVz@kX+2j!PI7ga0mZQL+J0mHaI^J zp33pZ>zu?%c=w+${u}Owy_I8c2tNfaD_)5r`&lljV4wugzx`0%NTupY} zp}1sZ?0gVI_oAV5Ml;-Yf$7ahCvZ$?%ha)UQwHufZ>_h*_hYLL$NIt|L5Gw2MhM>N z&GZ6Kgg>zWKr`(M-FUZK(O<*n?96}|)C7?bpwcZ3czV0DBwp>pFwL9xn!u)-hE9q# z)lJ+@9)?!{?)tAPdB2C(62AWkH{I(K+*5@AhWpMZxM7@+aPyVcy&AZWdHp|dPdDY^ z>Zh?fm@{7+JaewN%-(gu;TbmdA2ygXXE$ynpWXWZi#B8xZ4xXGM7vs+36dRxxm^;- zJT7?12f02Th!_wAMjQtZ%Fejeb287U7v%a?rd^brZ=?i^dlhUTK|XCJ>3Bgfji7Wk z;@bIC2L9c8$0Jc8m^3~~D3z|Zw_R=ncu-J*zNO)bd<1L{_OLPt7D9{-RexG5gRmAQ#olGs?#%-IFRZTDFW>)c#KD{ zfZis6W%9|}YFp6TS*zX_{g<~paxyjEX6%YMk_%u|k4)V-jjg7%1GoKz;pE1bCSLlr zFR={aLezzb<-T^$Rd4TJ^|rd1Q}Ug&=|ss%JC`owZ`&aqSeCIqxV%7IGD#C_Y}o8z8y|Z@8d=S(LFz0)7!n3#U=^k3p>FS(f6P1=c>RIv3}OIFyKP(Tul*g5NUd{ zGl;Z8;;iquK}hdo6zE(qkD0n%OPvrIdYhR)q)2I2{{oQ?o62E5B7LC~l><5DrAyh> z89!X?$I!KB?}_iLA{tn2W3S|23LN`QvmNG7hLXp-aP|gs{XZ=YcNN0t7yB6{(pEDl zdz`$B{?fa`Mf>C_WY|J>%7Z&3?EGx_F5Q2X_~un7Cimu~`78DzYYt!+aeGFzWwqK_i8m9oPGW28zq1u!h+0bxW%nf9HMoEKn;K*N8S zeNUCAvFGh!X~7C_I*N^e>R8Mp8tEB6l?UW}><#Hol$#-#*&Yw(eb4Pg=Nut?*BfJ- zbw>)GioS|#^1H@hgm94lcC;gw0pNode6e}K7qx#!SLAu%WKpN_ZnCNaO;FgjpaHT= zoAK8Q@9Lu6U}ihJ62PLI^uYc9#1MWJe_hV4+P_!M!QpG^Qd6kJCX5;$gc9XUTW z;$r~B@L?V&4ne1?C3X}#Ql!c3`9sZ9SZX1(-uYU3@^OL)B)WQDJ@xwPe#OA+tJkL@ zrW%TL#P=IT)?uV;RKNSLu@6GsI<2-mMcSbMN!GB9z}Yh>fCoU4fjkN{gSSewFoTj0 z*cS50t4x;x#TuxqL8$9U)uf9T%Fc>4Q0H6?VM-vs@Gyerkh?h_pvL6bA!WyzwvhXQ z5s#Qd8SQb;BKGxX81+~HQ4>77s42kc4FFR8Is%acQk}TW>ucSJ(sO}0QAUFq*mt+{w?yI0ra=|HZKj*1RST4;`^eHc5!|2g&BGY>Nl4 zC=hL+#G&Y7=cPP*V4Fk6^)N$)D=6zXOQ(DCTnrYimQ!N9#^`Iyf|oy^NF+FFnVz#k z*0z>B)bjH!o}B>Kzi+qED`r+Z#O${Zvd%fSD(m=Xy3avb<4%5(wf84k(^qA!%+lPF zygH#TZ0-AUCwoF^(4KWaR!+w*DJ21X7-QGe ziVje_q#?eh6F%~N%4a6JUozq!$NENJm#^%;i4K9{J6`n)~8VX5_2Kijc5S9y~|L6=Nq z$?z;EV*PX@K+HT&+`lQ)&tN|crPtK394>3@xq+15%!oJGaGQro@IE>Ce%SjTCO`<8 z3=+--ugO3z1vA_btcdE~sD0$$##vjIw3AQIdF1z=@MNX5YUk`LAv)`x)B{+Wx( zyBBgt_z`dj&kp%3NO&KwJK`Y|A(Y2GjX+|AMh`$kkM~EtI&SnA7X*AN;)M|8TR$Rs zuFvcUH5Kl%54OBMkJ=-q?CZ&3#&>FE@OZTOGk#jRW#_=co-9fWpcKCh2Jc8p#qHirk%LtSk72q^S+sUd zhTyMxX%WrWmSCo2a7~4*OsW$qDx3%nyUHHy)rxJl{N>v+lH$ykZxk*Dxc3W7!@VhT z-ZuAG^-<$U`W{%Y&F7F1u4_L0WI9ZTOEQparXa(ra=9>-Vf2!1D?j27~y$#63u08jf&$RoF50|FYgON7#{>e3{e zChdzL-O*(!iFz>N@nZ=HGcKWS5`St_GAQmCDAxkqM+&RBN#W_$!dsx$_a~)tB2K7X z>S}5T6pj>tf#T*HL46Gxi>Vt3eub$UYJa}7*r5$vk8cw=A-|k%6e@O*u28)a8BJWv z&zuN77E4?xpZR4R@@a%y+)u*EI_cV3A~T$w*C; zaC0<#mjOi@e^-^{)sm`6#p&nE&K8S7e`kxB6_C5>nBsdOKWBfUn+rzC1CVa+D&0>2 z4c_OoSLr5Z+ktpL%GS_rg~-QadrTbT_vH8n{~ zLNq?ZZ^yjcq>ORku=setWoRwrAr_u&?M_+HHS#LLe&HZhnlcJ}tq<*MsGUH;jogi* z9Fh^S7T(~}-OC$q8SqT3-uy76HTVJ&y~%jet6i@MZfa9IsgMWjI>)XUt?#0x_h9WE zZ@F88A8Y<=UABcl83E92_SIjN5}|JsZ-G>ZR0+M3r1j0bzr8IW-oZJSetv%@kh zRE*8pJQu!;>$_*iwd$EgA!Ohi;~zvblU=K6qIf^q3Z_Y-fx}lXvx`0Vx=;VCO6w@! zXzb-a6jHVLx7mn&mY2G(0JEdoh*qE`t^LBZ?i0&e_mv zEYjz1KSJm4)0f+RPZq;5`NoZpYPf~?DccjWaNZifX;9#G$>BcrT*DkNOAht5dU(si zb*@BDCnHSnSyybh8t<<3HP}BHliqZH^HS&4?i(quJ)FGm$04&1eEAnvC#?Q!nx1AG$OI`rmrh0oW?x7bevmjhP(!%{ z5CT$?1XGljFDWVqDbFg)4TSuh)|7MQP8KBx>~0Js9b}vdD!eDXGXf0oKY*sVp@{q} zqXAIiM9ib8iNWb~5b{YYqpS~*TOcqw$RpHdtie7lYsWnCi*m}o?hKbCA)W4x$9NEj z{enCme|Fw%FtMel24VuWCLchyjjiVeMu%pZnG zX+?ULeTTxVP3!teU+72aQK6$L#*rmL@N>@`zVR;oQ;Luq!cP)sWlFAUBpz|Im*tW? z;r>cAcH*mMz+y~WE$+2!OaCZw?^TI||M|LNjn$~$C#XqJU2y7F@ODhnu+oOjM6bDv zgL^RB8%syMPWWOIZ_R)EB}9n<2GzAA_;U6}_vIfFAcVu_ll?(^w(MD#EOz|U;Okc> zV(#ntj@>Ii4O^vqhH-ku<5!Sw-Yxr(wjc2h^b{rt_f`$u2oP?#wU#IaKu&gAEvABS zyKhy1a34VUSX*ziRA6Z-P=<%?1%!^p!qWs;2F)_(5mpaD9l=tzX{Db7G%LvhhAGGH zL_;fWeU+1=T{-EPM(rHn?xdgAhkMfRAi{DlCE=yXf_rRKc9?Yty&&j9?5703KFmYx zRyWJhZk?|X7f+1T9>u%eveGu&XV+LG`pWv4-^EaLqCGMzpie3hT7&mwsH`uhG%NBL z&%%3bR0ore!%tx=m&4O*(+ypY;rGu8A0gulRldmR&d|Ec4O2tMF0cAKI*G|^SSW04 w(QbZTOuE+m6^diKLERi@09Xox40>-MIXBY7{&c#PRswA^dhuQyjf1%TA3>THssI20 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..04d81df089a3bc80c5c3d9373cbf66d9725106bf GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^+(4Yd!2~4l=fwU4Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jin=^q978H@T?uvMYB1ngy{p;$|Nk?M3X3G_H;DD9zO`KA zIjb!AzPxmpb$*ZF=E|!Nl+HB&h_$fkSrF#z{ebs+sh2oku!ccsVb8(C=XdqVPq^_{ zM$W3P=Dwv@)2~9+JC{8seYEelnm+$y_^K6WZ{40!v*gZ`Eo+<)ZnWAwH8DypnNj!l ft{%bl49pClq@B++b*Fy;x{ATm)z4*}Q$iB}EZ$tK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bed17b39033e3880f6b21c05ac8ec34aacfb51ff GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^+(4Yd!2~4l=fwU4Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JispK{IEGZ*dNbXSyTyQ~H9l+ZoOl2Ko0Xf3x(H;=pSC;n zRepkBoxmIqQ9roTu}_jgc?l@${%W zlRnwB_uUqnyV)gcxtzJhll6C`Ugnz0{543o6nPdg(RTTk_*WkmZ9TeX!mX7rqx;#_ z>=p9keRlmVdFk?rFWTYupLI*t+qrgFut+d4w8nRyKGD7h=uievS3j3^P68U}fi7AzZCsS>JibOnJ978H@CH?vT-=0~*K8U}fi7AzZCsS>JibOnJ978H@CH?vT-=0}0LFE8DhXDicM2_G33Kh$M@(iA? KelF{r5}E)aCLe16 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..171eb54d9e11a583516750bccb75f7644e2fb0e1 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jic~#a978H@CH?yGRGwvH&5wW68F?b?{8U}fi7AzZCsS>JicCCR978H@CDnX=D1NxUZU2ACho+HlTh6Pgg&ebxsLQ0RHVUB>(^b literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..35845daf1d5f455c82cc838629dc2c585bba5b43 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEIv978H@CH?vF^nUyMdi(!>et*6$&&I~4#un0Wj-A7R Z;n7C!rDA*Dy8{(7c)I$ztaD0e0sx*WD9!)? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9b158bb049c981da7a5a70cc22dbd90993d18b4b GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiVQtn978H@CDr_UcYS(%&-;A_b-(`o|GN9T&zT+`fe+8+ p58wa)f2M?lWZnPN2Id9^W`^YR!kz&-Ms7gO44$rjF6*2UngAK=G6ett literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b6abbd2fd4e2c26cf2aee75a5bbbe1e5ee70235c GIT binary patch literal 413 zcmV;O0b>4%P) hY+PcJ`UVvS=G+XTlIq$Mco@Z1Jfo)fswgs80|2y(Z%zOJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..73ee70565e51f8aca9968f0ec66493b8c0de254e GIT binary patch literal 421 zcmV;W0b2fvP)CWz{X}_yCekv<&9**te8z8AN+9U z`QA65gOcZY@E;LmjdXutJ!U`=I|zb))3$97mn2C&gb)bB(BAEKuUK9U6ZC4DW|X?F zdtBFr`Fwtbt+!};dSK9X-M3?&=lzKco`7jGnSf{2w!9?6;bY=GWm!U+rXb7mJ>@UNd-!RPX}jG* zk|eBurK;)^9X1+kIH literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0e8f397227dc4c944bb5a7cc60a583fe4644e487 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T-!2~4#Jy{GS86-|6H_V+Po~-c70G+LIEGZ*O8WETsXTLJL+Z6zf1kWe`SbC$eWev66Awe( W1@;HC6L-3T4D@vMb6Mw<&;$T&6e!>T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7cdf79a92d8d1dfb32f0b0ec51b8f658338dce45 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrJ!2~4T^fnv@Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiWEIv978H@CH?yGRQ_`N`}&!7|Nor+^7*>F8XFs%1RI9| Z!;AOa>jYj!9|bCA@O1TaS?83{1OSCHD8~Q* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7f12fed5cfbb59929847c42ab6c9f12479048131 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#6!2~34%~2=@Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiljYV978H@CH?sEH2!_E)O!2~4dW-8AFQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JisU?9978H@CGGk7q`igVcKiE!`~QD_f4(lyX28Hk2jzFxOVG)b#--5PfuT8UsF?4YisMZ z>$es!UVQ!Diz`>I)YjHszxVv~>C@Y`ZM%5!;UcGwt#>02{`T76<|7V~!Q2fcl$iSe&paU`(_5Z>-2C(O<`$4y#HHr$VaJ5^DH!P`lsQC#N6$xW(U?Obh3?g$=Wa8_*% X0x$iEP)etvB` zw;bsFId31D&1SCAXy9MjeMER^g3wM(zu&)FE|)*~@60yL69J5f$NapGr1J+}cf7uG z#MdV0Nv@7otJSF6?ULK=CUJiok#}5ykM(+;VzF3~zfD(X- z!$p3KJRT1|<&0#@h+(A{~L+D>Noh)oL8WDm-Wn>u{8qSA8 zp^HEuuyGqva%sq7v7DHiARi8g$!@prBm0!Kcv&iy^v7j`gjo0LKFz}rBxEGxbiz#L z5hNm!h+Z-n$e<)vs}(x>COd*OxGHDqbXpI}kdM&3VadT@fRY+#YlFTvZ$iu$RdbEqtP#ne`6X^r=pQ%Vs|3AygUXO zf6FpBf;3TWB#^bf(V&WX4vR;!!rAp-jJ6C)k8H|~`Hy4rbG2H1jedee1&58sR1W>& zF!Txu975I@uPl@A7y^Rq;~yXp{+|}c?7s8g0t^62NYX=N(GUUv0000*_@o5%*@M6OH1tR>~V2$g@uLX<>hpAbZcvC^z`)B*4BM~eUFch zb#-;!-P}V%LywP-(b3ULN=oA5;$vfC=;-Kte0zC$c<}J>+uPgo^Yhr)*wN9@*x1*{ z$H&*#*VWb3-QC^H%*@o()bH=_{QUg={r&#_{`vX&`uh6#`1t$#`}gXyAFj zV4h*v4Tr}W zc$IQEH8wtl!_1(@$l1%yrZ+Sejp2QSh-e*SK(qmckajTsywJSZ5B#=IIB{ZZ6ML&AU>H(bOJ@z0sOj2JE6$R)1f z!-x|V0F*pTGDu(!Am8)ln~&#uE}VFFg+ncXmD8799>*c3UuAh7)97zQzU@QL#Xdr>K0BB%AHIP0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Wl2OqRCwC#SWS;1Q4~EzA!M|#5T>Um zY_z4Fj#)}<{QwKGnEnsb$@Jf_oZbyf3%@`tXo;PO4I>f40wKDMuc=!J=`LTTnO7S( zd6HM}op%WAbM8|3wR5eNjhRsU3cylXZ*zNXrwfUGDzU}!wywz%j(fCOyJ1;O83_|cfi=wdd&zk>+ z0A{lp_xIls{1!ws8pZYXmyM0&kh;6lP7a=GJ^7@v<8(Tq)9IM{XU(7Aw$RPZS3LZ9 zILi_4SR*_I-Q)2n=AR}1wE&dn+x|evb#TFd49~CbCX&hIQFj^A{wa9c;OMk*%w5ho p@k;XNF1Mk|n(7h)W$m8;0|1(ch|L_xa>@Vz002ovPDHLkV1hJdSa|>d literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f5c58e47a0dcfce5380cba10ec120a4c26cedbf3 GIT binary patch literal 884 zcmV-)1B?7eNk%w1VK4v?0Oo%H+~@addW%C?ZH1Vt*4Eb6;q}VO%IWFp-QC^1&h609 z(9GKM`1ts~(C$lNd&k!Bf|jb(;Pt}N?^JAs%*@Ql$jIU9_`bfrx3{+9>o)bHEo_sG}r*x1ln$G;mv^Wx&-ZiuWuRCMg@ z>`-QT?(Xj7?fJE}wYtsiyUp$M^!3Ww^1;&Y@bK`))$sN8_2%a0YJ;W8*zvv3?!m#q zf0L>5^78ZZ^SaFKaD$P3lBsKdmHhntskzVB)2+uM4Kn?hM~_xJbE-Sb&;jl{&nxy$U&&(Er=s><2%&D!juqN1m# zr(AG<)z#HMS81%g(5}JV&D-*NkEnl{!(Dchx3sIc%k2OE|NsC0A^8LW004ggEC2ui z05AX$000O7fJJ|Ue^h&idq0GOf`o>Mii?AMl$Dm0got}gdYyVanuD60o}h@6eyOUf zseFHXp0To>hde5`xVgA{e|&y8I4{D%463em8_8W0v1%>PEdqOEDb?23)zZCw3JM4` z1PTN&#(!o(Bmf^GCMG8*R(cf*COyOqrNxLJEwldTjLLros~g z2nZ0UfxyPeKO(Xeh~Pqpkt9c)u%PMSCeBnkx9!+*07yPp13g-w!2_nr*$xS&(iCGMhy?&t*b(XrO&ai6FuN13&-)6jh91ASzcKCCP;tW{9CL6}qC~hafI; K$%q~X0suRA-s~{| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d76325f39a15f69d3e44d60d30477964d16cf1c5 GIT binary patch literal 1114 zcmV-g1f~0lP)CT(JywoBRs zW7lA}&Z>-2w#teX41%yRe3%m_Il&t}x_b80 z+wkC-!$&V~?te7tUCU-tx4--R!!Xw1se`ZFlf8>?FPxQV0(TC!gV|n*^J8S zYV8NLdTTCIcSdI@R%h>$Ae2fao?BX4s(XYG{Ot4j(AL&gcc%a5%r6M~%6zL(7psJz zST^z4_NTRtzfN6O=~~v-=5kp))Hj4b(?21(`|+kCc<$2oh!1Sj)>5eyND*CKU078C zq366Y>n#N7N1CL`1b&0V1Y_CNQMW_J93~Y0@E`&nXK85(-QC?V3YlKp%fZe+uX_`Qx zSXKn|HPbYCkc8UX+f{8vSV9CMLD}#|-yxtPtfa$oQO;A8X}Ba@LK2M`l#2!YR~Q`~ z<(ZspZEaOeBfO!FpQ26~aHCBQn?yoM$IghXW}^{SR!jJK`UXBbbH2J3kM&}2@=0yq zmFquZ`nTV!&%Rc{t<{U3o*u3N(mu(DB2LnwnQFqVhhQ+cRzkvVS=Fdh7GRU$Y~1-j zCLRmp?bna1OAWQ(ZUiSzokBMEm$vWnwI4A4;xRs(@a7w1IQ_-P+MdbDNp_I*Un~~U z*Vo4qnwpwo-BS$^iJ_q(PX>gY0dC*2CLPN&*6|-ZckEyrL)1Ff_zQ=TzWE0SfaFO{ z;`#mC>ueuRY}KBr!^Gopb~>NWbEHX1$z&3Xi;EZ@9_H-S)c{2ePN52?b&9)i-pv|0 z=*o=dVBi64+cKzkF{i7o2a0Ykm*Ys2y1FII1NGConT#%G{{j`^YopvQYaME>q#fyQCGz89y?^b^U;^mc>~z+ z5-;96euz(e|C6sJoh_YiRs92W$avdwBYPLISghea)I#qFyU*X>ap{|{WV3K=?6=YX g1ODyn^gjX&0GBi++i+6EL;wH)07*qoM6N<$g3YlSqW}N^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8dd6e578e89939ac92dddcb77a684ebb95955933 GIT binary patch literal 1137 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..795ea848da796ed02a62592dc5ab36e2de78522b GIT binary patch literal 1937 zcmV;C2X6RBNk%w1VM_ol0Oo%HtFFA`>-U_Xu>Jl1?e6e=ftTFo_O7zNcYKoY@bZI+ zo#E;A({0mB`Q7dVGIfU0r~Mn%LRkw70_e`1;n^-iVH%-QMKi;N`@}(ew26^7j0= z%j)|4{*;)Vu(rpnv&5gHvv+-nl9#Ey%;kcMnC0c=mZP_nmz<@lu!f0@nVq7~-SnKG zrRneb!^+w7^Yf0Hw4krX-{0T0yv+3Y{Q3I(=I;6Y{QUp_|NsC0A^8LW004ggEC2ui z080QZ000O7fPaF6goTEOh>41ejDiFZ9avh5kCBs!Ul|7w43v+ORXXajy53CbiL?#To8@%sIURwtW0K~@M1*c0T!m?Fs} zbQzS;&j3A0z(DjPaS)mw7HeDx(!idA2NVfdB!D5v#*PS8`mjJDLym$l30Uz1Mu(d> z8u%dbQvrsfoqAxLP;z3-(4vA+co@)tkA^pHbWrfqfy7ZidiYFPf<-7%qknXQ4WNWd z4lhst(LPX6HNp}NC-?}x@Ilbrsx07WSVCfN-#=fZ6w!NPa0H>7{LWDpHnELpvLR8wTZxDA8_deO*|3R)@CF{xMo;mwCc4hTw= zfR-)jKpEI1fb*f@A4f&)4jpk5IYk^v4K=s=kW1srA}h8nWK zp@)NLfx`=rv5-drSQv6)h8uS1B8V}PSl|U)>`;I%i2Q(~jyxVRfENgbg=w#H(5Ztg*rpC-h+tRB7!rzy=mrpaiXFiS|z)CoHkT8hvo(Rks%P z;erq*2wN_^12C~f3OU%Yty~HWfC3&uoM1s8+Gh60T(J`1!wEvzknmxN#oCAe1rXyQ zY-9@u+=s&uOFV$W3?pnq6)7+=v1mW^@k0hR9E|V_!b#P#y!4_lvv9W(fUpHMWN>o{ zyLr$uxZ>8ZGs}HIo52#!_CfP?Fd&SA4NCX%Ky_3jT!#yFAiVW=seXWP4L0c92LtDI zjquxAbKP9kCP>VL4|R+^2!1`l-A4-&5O^OBeWRc@;DY~QAO?Qdu|

          6Ye+S4)zT< z@?oi+YD98s3hH!)wWPu4O!hi*EAPq-Q0|yL%1Y22w z0Rf1E3U)Zd8uIE7XwX6q)o_F~^zbAs%%KC4;D8?55Qk&Xz!RL10~+}7C;{L=2+(kb z82~{A2KWG4bdtp*%%F>E0HYXL!+|H95e*>#;|tzJ#x^=Z18n$W7{_RZEE=JUIf#K8 z0XBpuBtZi+n86KzzyUHGW-f)~!4_tqffz8-k%CA}A#adK4J3i?ksW{>B%dHjN?Nj! zk5s@W?@)yqK;e>ykqQTH0EIiKL6J95!3b*Rfmz<*j%>I=E_X>02LOSSYPbUwaw&nL z&C-l$940Sk8G{_$;S6Vhf-ZS>02v7L1~E{BFqn_yMkB0PhCb9!Tc_0HRwCHmjq XNVo&u_-dEap)&8NNKNV@0s#O!aa+aI literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..10c0d139f2567f41017197bcd89b23f66f6ed638 GIT binary patch literal 3187 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 toQW7p0Ea@fbR6~QXX!ilsmR06Wk#v2OqX literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2c9f51a7112d9c0d6cfd03d285df29ab51d8375c GIT binary patch literal 3010 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b06afdb82c45dcc546b48a37dfd6ae61349d4245 GIT binary patch literal 335 zcmV-V0kHmwP)4WrEz+R#!uIxA233XzI6r8V9kI65SCTjYVUBY^-S-XSZ3FVN))Y z&KamFk)|o4lp;dNA-60G5<;N1Z9gs$O2-$1Zi=(9vMldu>}t@i>s~haJkP5CA*!l6 z{I#Me*4!Q+oedWq8%dIw2M$a{J?gra!!XEk93|&`4aS(dhWn6*=ia?<)7gis&Y3Vy zMW{GTGK`-^nWjkE;M)esxXQq=@W9*i4}M>I^n2>g_h;|_x%uq(y#4P^-TgCt*Skdr-_Aeq z_U?;c(|5nS{ruOoUGJ_u{ylr|yX#MX&)oBF=I(d*UjCZ9@7ra1{9)91wVDFS2 z?-?itia%MvX6S%Oke?XX{yR)5@X(R!TnW|NQ;;N05n2#$&^S156ykS}`XA5}Vrvl)dIi6gD31mN3pb;<0e?@qPv8x+4V- k4|DK}8)RH)IOxL8Bd=HTqM-3J@9*^dq{Hu@!0(~J@4Ls?puq3o>-^s8{p#`k>+<~R z@cg*M)#L5`?ehHf`2FVY`|tJrBI`-`Bxl(_Hz|Nj60 z00000A^8LW002DzEC2ui05SkF000L6K-X?aEE^~rbxaqMCWN_MN*9k;oJxVKk&rDI^!6&>_$e!|VJ1fPsR8ggh5}g^7xbhdX?Wkdc0kkCK*& zl$V->nVX(}ou8kfqMM|pm#3(bs;iK#u8Od+g|oDSwzq+~x}b=?jK9E`!o!@!#)7=V z%fQXOlm*h$)YaD4*x3ahLmC6$;Njxq(BTJsV;KdLc1Tt&h%(=7Y&!7odR?MKZ>C>oFt6t5T0gfR#49K2MySDAy zxN{p=F+|3M-@tNk%w1VHp520K@*YLg8@aXUT;_Un6?fll|_|)Y1%iZ(m?)=^9 z`n}cgz}WG^+40-x`SJAr>F@p0-)dg@x$5j(Bk*GyWPCi@Bjb+ z000000000000000A^8LV00000EC2ui02u%>000HfU?z@aX_82)u57z%a4gSsZQppV z?|kq7z@TtQEEW70jJ|4dL z>Ga*thi-m+^7hZoXFu=0{B`BYk4JBQ@4x=>(&O*fp8mM-===RwzxG}K@bdlNk6-?s zyZ`0gr@tRQ|2uQ<^Ox`cUVixV=HuTdZ-2l3_~+TX-!I<(dHvzdMuZ=Px|jx%=*(s~`UV|Ia`oQ2fcl$iSe_paaqe@)HBwe}}Ma4;`ug6H6wo z$XY6PVMU48+Nky2R|Foss@nfxLxoQnx_=kM8FO>yFQ{0wxMu0Hq&bUMFIYRbgk#g@ zEnBy3-?5XUgmv$}{Ra*nI(&pRS62Mwsnci9o;!a*T-I4u=-TxgH*ej(b64oHt`y7T zCr_U}fAR7ai-7oSJaT}koDfS=H}*% z%XSWiE-kIw3m%`E>%DzlEVoiygT#UD>+kPxVCI&yVK_2DSWrki?#zyjkB?7Ko+Gho zVdK-&GmNwEo!MF3%sYj-L(X^CmY0`T1hX^TZE9|~z9ISaJm1~hav5dX3M>xn-v0jn zfo5*`I)!p>epLgF_;Y)9etv#o;q(s|l8%1lxv@F>{<*!o%imw|-IK9t$)3v3kD3`6 FtN{%cbM^oL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..47b9da29a27309a950286aeec37e899b3897d9b9 GIT binary patch literal 280 zcmZ?wbhEHblw>esIKsg2{L`QNZ+{)R_4)MuuLo{?dimw=o!39FJ^%6O{qMb3KVEwB z{lwibPd@(s`0d~MN8fI~{JC@Y-OXoTGY}0Ff3kqp>VQa)oeZo~6;%3CGA9MDT9@;B zUxCi~lHB_h>)zMA|9@aXfrpM%|A{3h9_7W}7f^(&Q{fE#1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..59f3edd60a951e235fd228c5f0b496f53bc124b5 GIT binary patch literal 569 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3e7475aa5562750d94bb5fc1230cc1f50629a388 GIT binary patch literal 795 zcmb`ESx?gd0D!9yk6{$lAZ&Q@f(ahMBN9bPyg-amKm&>wT8%tu;)6bzr~_0mnCRBA zgRyRSjYG+f?qKc4L^j4iK!piKqPU}UZ8yvYtceDHgWtpV_`Q5b^N;MwzMKkV0bT$Q z===gbAwYtozPbL1n9xY~;4EwnN-dNOrG|gSJl>cbqZ+M2r7b8jQ||BV;E&knpD}R< z1(_(3i5d^g;r_V>loFe%;518yS^77t>ZD(NpoKa=Y^7lvtwf2b5DV%3LWGcGv{3IS zLaYiSn(TDFkx*EOMk@^&$$AqhvydXhCpHrA91LtBx;)WtPgG(ev@YhAjetxfWFQn) z+V*v3D$FWvv;qshw9{f!Kw=6=J4lh<=NgNO5dV8;$UYox?_u0{WMp!t0VSQIQAr1B z=wpP2pvJ`@ZlHF(=XS;E|zZw*QlFYTHDT^d=sb9>hwrK(Izm#f?`(Nk#lCw$8LwS=foBB%KlFS zgG0Oblz~Z}Z=+-QuEL#Q{Ljf>USIyPOfWG>(M%{OZ)#B_Ix{(|%DYG=O5nFcuTQE_YZ&h3HDQrgQd{w3mOZTc1!T zOUVK|p=~jD%iYjq-@R;pGA`C$8xox=I&hsTZCaamOzN_WlKkbG4EH literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ec4b659363deacbd7cea5dca3d7f931f907c3b83 GIT binary patch literal 793 zcmb`E+e=e%0Dw;!rlw?BsZ%3cfmf)kP%0Ur<}5@iK~l2JQzShkQutCV&6ETq+(n(b z%{x@yraRl&-I=L#N?tRam$Y4eo}F{1=FA;4>~H9M_#VHP?;0~9I_ADVbPh5>5WCyL zmH;+ln=x;VEI2tbV$ev5G&a5xuU6qxKb_MiXRR6+Xl!*_8&8fK=Bd#i&haH@r2^-o zI1k0=tXoFQR*ed;l;gHF3R|U!b*jFHXzC?6-4>CC5NU}z6?*1S+gng~^7=?jh1j zQtU2MsZhz563~Al`1ihlrHEbcK7sb{upSl^zAk$68jeZ55kLzJ2ndX&2Zqq-blQ7b zHjN91W@R30Xl!b35vJVn{nXml-T|Myb=?J#%22sDJ>h^x+oS6hKS=f%7}O6L;Ed>t zhsVYzCa2)@H!mDA&do0@!VyW#eP)XltSlv7@h0u7YwPgssJpIPPHOuPeD)(Nm(ecN z7P{$=_#Za0bj9BEq=>xu#Bx`^sGQmU4o`RgGkzt3%+3bpyYP~GX#<^&dR~a&R0UJq zWZ=We+13JK^N4^^XqvTW6@0BvEDwuZ+oLb_OsP+*N#Z=Uh-)MdGy>RE|h_^8s+&*9??3aZC=g#wfFdqv@?sk7hd$(kNNh6zOtRG zWz~KRmXhs~-d8secPM;UMGSX hU2dbI`29XXjQoYg;JBwgVK4Jja$C@6QLiBA(qI2tvy=b; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..51a2d40aa68e09b70213e4d4f92156930d210ea3 GIT binary patch literal 54 zcmZ?wbhEHbWMq(Mn8?I1Wy`bf1$+Ph|Ifg{p!k!8k%57UK?lfY0Le2ju}|q=Da8=T Hz+epktqu)W literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..41b1ac0f61c0c52eccf99fee6b22b4a4a75606f1 GIT binary patch literal 54 zcmZ?wbhEHbWMq(Mn8?I1Wy`bf1$+Ph|Ifg{p!k!8k%57UK?lfY0Le2jvGWKlI{h|| Hfx#L8tr!jT literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2214fa41bd9becdae79e105d93174abdd1a62c5 GIT binary patch literal 54 zcmZ?wbhEHblxJXMn8?I1Wy`bf1$+Ph|Ifg{p!k!8k%57UK?lfY0Le2ju}|q=Da8=T Hz+epkt%eO( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..bff311553fa9ee53b1cf6baed1800f3e7c227fb2 GIT binary patch literal 54 zcmZ?wbhEHblxJXMn8?I1Wy`bf1$+Ph|Ifg{p!k!8k%57UK?lfY0Le2jvGWKlI{h|| Hfx#L8t&k1$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cbf98da708a7a169103a9badb7c67c25d1e76b54 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bF0V21g*<1xuk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X0zF+ELn>}v=?&y+FyL{1e5bws-v1d*O-9#lm>nu(UHG9w zapCDgsfH?Zwi7Ncj9kY~{t6e|l^9X@Sz46WWdFQn{E|X*bOS%V_7D7?Te^pdhoStC VvCN%*SyiCn44$rjF6*2UngD-HJa+&9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..92c74315c4d8ca43e468b14fabee824390059e80 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bF0V21g*<1xuk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xd_7$pLn>}1)%<+O&&?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%5gl!Dbne(0s6*x8QJ9xOT({0bPrK-lu4cO*1 z2EIJY#x9eT@J3NYH__O@bgG@c8%~F)`z4d7fKYmPrjbN1S_sH^qg7YYt!g191nA{9GV2 z`EcLb(031D$9pwRg9_eTOb|Lxz!)abkCP{70GE*!{#lmZ@SrG4rm8AMQG{xajD2N9 ou`-C9g{LqKb?i$9h@Suh0BSqSi~!Qew*UYD07*qoM6N<$f@OJ#%>V!Z literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fc947e0a1997c1cd7c0bf170312a93596c2b735c GIT binary patch literal 205 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k#l1@*oZw@IBF<}6yo%3y79WZOiRB8hLhX(F!Y zk7;s9%~;60xR7DWHb=Hw$zJm=EJ~OZ(q|;tQC?!HP;un)nMrn`adu&kHYW8lDKc0C E04+IkLI3~& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f3de66a74bcea7892e3bd1b69f33e1b748674f4d GIT binary patch literal 361 zcmV-v0ha!WP)tl3wR&>$n>QHo12M4w11nkfzS3fu)-XD5CQSf~q zX6E%_2C@jMs=AxPYe5h`Ow$CzFo1`Tk|gb2*9ApUt~YMsC!DROX=}%EKorH_gTHu> zhezACLD%(vPZ_a>^Crvk&htFL*WcWWu!|)UDnLc>`fdrrTg$SpZKp!pUl?PMWf=^^ zFo{z{3&iI*j-hQ^E~b3rywr7l2*VJ{vgG11r>^UkNs@e~X$pPcb1~%$XH^u%DF^~+ znud$V9B}_l6h)Bd`6Q;iWBEt?S{Eum=NDx-&s9~i9{~mc8n0Yv0MM>800000NkvXX Hu0mjfFw&Ti literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b0e8097f4b1fe9b8aead6c2b22d23a5702042fbf GIT binary patch literal 204 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%bgk!xaJ2^ZfnHra^c)U&U48!T!g$gd6r@6W` zzTHlcYGPWh!E9k7p{8d%fk`DmEp1ZFKZS`4&D$+vYNWm2UR!m*qTBtIY{g_J25SJ# CJ8_o) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed6efc46cf92608c9fa957fdcaa6e6f70f4c7c6a GIT binary patch literal 205 zcmZ?wbhEHb?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k%5gaf@PJ8e88^BTieKHe62hT-(=Mw#nf`4c?a zzD!P3Yhqfi!R%oop{8d%fk`GnZP~<_e?&z?Pe`0(-L$Dcoc{{8#+-@kwF-o1P8-o2kcf4+J1 z=EjX1mo8npcJ11eCr=(cc<}b^+jHm6J$?H0`t|E)&z^n#`t_GDUp{^M^y9~m=g*&? zIdkSe7%;$q;!hSv1_l`h9gqOXP6k#l1@%4|vxF2cv8ZLDtF%03D<4TQW0by-VsTEj z>86CC2-7DIvh|cCD9e=l>9P`b5_d>L4$JU?FSCsWz{iKWUvMR DbR2Fi literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7f7a5d8fd543089c5cc59cd80ef2051519dcbbbe GIT binary patch literal 319 zcmV-F0l@x=P)BGU0T}`UQc_Y3+}zwb zAaP<1v1evx?ow1#WB_^tEC8aFl$02ln3%eNTuWjM$&{CuXJBV%M-c?^LE_MW#%oBI zu&{8rkP!AT1j;c0V z?AfbVukPKu_sp3y+qP}nx^?TnfB*9H^FM$7ymRNy`}gnH)zuw8e*E_B+m9bVe);m{ z!Gj0atXZ>X&z=(}PF%ZoZR5s`Z{EB)efsqI^XDHtc<}V;(_g=S9X)z<$BrHK_4R#y zeV;ykN=Zq1_UzfZb?bir{(blE-7QeZ1WM>cQXykfb6=I&i!7Jj&;J0`oqqa$#DKGmX|8?vAj77y-rHmNX zGwCpHV3kv7_LE$^Q+3Y<34vyHt{q2@uV;5^=3??&@6Tj$!JnC*rjW$n6@`DwYsh*v>#4cy@p4>{a8Okw#v{Y%#i4EmW`Ts_rOK|2tnz#U zhZZm~P2^S*P>^6yKGY^A6ULxmvY@Gp*FNAwhl5f>o05dY90QSshdRW#M05-uIxq>b q87V}5`0$90n_0$jupfJ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..44ad021a36dea29ecf72868965aed52ce393a41d GIT binary patch literal 66 zcmZ?wbhEHb6k-r!XkcWxeEIVK|Nj+#vM@3*Ff!;c00Bsbfl0Ebzv1*U-oxEFmrAnZ T%D(@}edICiS?974Mh0sDw@Vjn literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0d32a2f731795134a05617873080e36711806100 GIT binary patch literal 72 zcmZ?wbhEHb6k-r!XkcWxeEIVK|Nj+#vM@3*Ff!;c00Bsbfl0onzv1*U-oxEFmrAnZ Z%D(@JRWx-|EiqfUO;-E*E?-6lYXCOA7%2b% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c28475c8d4e2f1e6a59369f4ee46c17b700dffce GIT binary patch literal 93 zcmZ?wbhEHbWMmLx*v!E2@87@QzkmPu@#D{*KRDSr z1<%~X^wgl##FWaylc_d9MGBrSjv*Ddl79XBYc0&o%q*;|tgLtD$N&HJ8>DO`6b>+0 X-er>(iZbp8s%7wW^>bP0l+XkKkhddj literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c52f83dc3b5ffb880302f50574758a5618bdc1fc GIT binary patch literal 1275 zcmd^8`%jx?6n?vg%Ya^>g??Xe4scMpWSG=3(L`O!C=mh6(5h*i4iP7r*2&~D9MidE z+2$B%#$*K8u*(8NB;7<4I)rtCEhuGB#s=-Wu9TKu_^7>qUw!!#{MnP7^W>c5&3T^Z zA?X%!GiMT^<0o0{|3s0KodB?OpXg0LY-cWPf2-9ED1u(x@~#jh>R6g0K)Shs#FUd>)^` ziKY8X0GtFMip4@QGX;Slp0ZEzjP&PgBa2Z5=T@Bo%evRT8Ci4rUpPEe*f@HyeY&cl z?cSq}6|2YP2_n)i;Rl_0vh(GqChGgW)kZvQ$K0M*);&Ms!Z zT6=uhY<758UB0X1#@ZeY<_mcPp{5&CtDC{z*)^LtEWR+HvV|sX|14nvdmwCfxw|K) z4z;$nkB?tct8baj3axfXryE&V7<=$QV>0QjRtgmgqZ=F!29t@PsNLh?aJeX(jrskU z&ld=Xae`RT>&oDION7Qz-PNNJ}Ly#of9UFWB}c;lP;jVu!Oap}W!FvkbD&pU;J!_4UE{4|~TxzQwW z9f`dyK>RM}WM#>tcrcs*`m$1|KYY()G^nG2BARsW>C|6d%%45hpl`phKCS(hk$4qF zjXw=iDHJ-5mXw&tWH1mGi_77#QIyZ)5jY-+L^?a5_O)Mw~dmKnF#P`bxL ztz?mNEM~lw^t>poyCvoO9$A4@p14azJ|t&6yXyqWrkLxiULsxU9PF25?T%gHA*3^R d=g*#e^Z43R!(GB0qh;%I#f7D!!Mz8*`WG*c$M66E literal 0 HcmV?d00001 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 @@ + + + + Test Widget Templates in Multiple Themes + + + + + + + + + +

          Tundra

          +
          + + + +

          + + + +

          + + + +

          + + + + +

          + + + + + +
          +
          + +

          Noir

          +
          +
          +
          + +

          Soria

          +
          +
          +
          + +

          a11y mode

          +
          +
          +
          + + + + + + + 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 @@ + + + + Dijit Theme Tester + + + + + + + + + + + + + + + +
          Loading themeTester ...
          + + +
          +
          + + + + + +
          + +

          Dijit Theme Test Page

          + + +
          + +
          + +
          +

          Tooltips:

          +
            +
          • + rich text tooltip + + Embedded bold RICH text weirdness! + +
          • + +
          • anchor tooltip + tooltip on anchor +
          • + +
          + +
          + +

          Dialogs:

          + + +
          + Show Tooltip Dialog +
          + + + + + + + + + + + +
          + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + + +
          + +
          + +

          Dijit Color Palette(7x10)

          +
          +
          + Test color is: + +

          +
          +
          + + + +
          + + +
          + + + + + + + + + + +
          + +

          dijit.Editor:

          + +
          + +
          +
          + + +

          dijit.InlineEditBox + dijit.form.TextBox on <h3>

          + + (HTML before) +

          + Edit me - I trigger the onChange callback +

          + (HTML after) + +
          + +

          dijit.InlineEditBox + dijit.form.Textarea

          + + (HTML before) +

          + 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 ... +

          + (HTML after) + +

          + These links will + disable / + enable + the text area above. +

          + +
          + +

          dijit.form.DateTextBox:

          + + (HTML inline before) + 12/30/2005 + (HTML after) + +
          + +

          dijit.form.TimeTextBox:

          + + (HTML inline before) + 9:00 AM + (HTML after) + +
          + + +

          dijit.form.FilteringSelect + Inline + remote data store:

          + (HTML inline before) + + Indiana + + (HTML after) + +
          + + + + + + +
          + + +
          + + +
          +

          You can explore this single page after applying a Theme + for use in creation of your own theme.

          + +

          I am whole slew of Widgets on a page. Jump to dijit tests to + test individual components.

          + +

          There is a right-click [context] pop-up menu here, as well.

          +
          + +
          + +
          + +
          +

          I am the last Tab

          + +
          + +
          + +
          +
          + + + + + + diff --git a/includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif b/includes/js/dijit/themes/themeTesterImages/blackButtonEnabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..9174efda3730e94ae92dafb5672db26db0e5d758 GIT binary patch literal 151 zcmZ?wbhEHbWMq(FIKsfd&CSih!J(+35lEUciQpsTBE zWo6~=?k+AauA-u1XJ_Z_?d{>=AuTQK>gwv}=f{8-DE?#t%j8v9x8!s UM`VsD*_?W!!YaTM#=&3>0EL+r0RR91 literal 0 HcmV?d00001 diff --git a/includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif b/includes/js/dijit/themes/themeTesterImages/blackButtonHover.gif new file mode 100644 index 0000000000000000000000000000000000000000..16f087cdaf0a7846d95e7c2f412970f877a009d5 GIT binary patch literal 99 zcmZ?wbhEHbWMmL$*v!D-;NYO8rKPT}9vB#CVq#)#ZLO-RYGh=TnVG4tukY#UsiUJ~ wV`F1!X{n;3Vry%w_>+YJ1av?I$P5M+fejnn<+D{-AMc8AXVzdAVq~xe0PqMCod5s; literal 0 HcmV?d00001 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 @@ + + + Dijit Theme Tester + + + + + + + + + + + + + + + +
          Loading themeTester ...
          + + +
          +
          + + + + + +
          + +

          Dijit Theme Test Page

          + + +
          + +
          + +
          +

          Tooltips:

          +
            +
          • + rich text tooltip + + Embedded bold RICH text weirdness! + +
          • + +
          • anchor tooltip + tooltip on anchor +
          • + +
          + +
          + +

          Dialogs:

          + + +
          + Show Tooltip Dialog +
          + + + + + + + + + + + +
          + +
          +
          +
          +
          +
          + +
          + +
          +
          +
          + +
          + + +
          + +
          + +

          Dijit Color Palette(7x10)

          +
          +
          + Test color is: + +

          +
          +
          + + + +
          + + +
          + + + + + + + + + + +
          + +

          dijit.Editor:

          + +
          + +
          +
          + + +

          dijit.InlineEditBox + dijit.form.TextBox on <h3>

          + + (HTML before) +

          + Edit me - I trigger the onChange callback +

          + (HTML after) + +
          + +

          dijit.InlineEditBox + dijit.form.Textarea

          + + (HTML before) +

          + 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 ... +

          + (HTML after) + +

          + These links will + disable / + enable + the text area above. +

          + +
          + +

          dijit.form.DateTextBox:

          + + (HTML inline before) + 12/30/2005 + (HTML after) + +
          + +

          dijit.form.TimeTextBox:

          + + (HTML inline before) + 9:00 AM + (HTML after) + +
          + + +

          dijit.form.FilteringSelect + Inline + remote data store:

          + (HTML inline before) + + Indiana + + (HTML after) + +
          + + + + + + +
          + + +
          + + +
          +

          You can explore this single page after applying a Theme + for use in creation of your own theme.

          + +

          I am whole slew of Widgets on a page. Jump to dijit tests to + test individual components.

          + +

          There is a right-click [context] pop-up menu here, as well.

          +
          + +
          + +
          + +
          +

          I am the last Tab

          + +
          + +
          + +
          +
          + + + + + + 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

          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

          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 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 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 0000000000000000000000000000000000000000..f7e04a3b78a082cea39e880e80a325a603e5d6b2 GIT binary patch literal 168 zcmZ?wbhEHbWMYtHIKsg2{rmSXU%tG0_3GotkMG{Sd;R+Lix)4xe*OCC)2H|E-~asi z^TUS^Z{NQC@#DvvH*a3PeEIF$x6hwHKY#w5fjFS}lLf3$2SkGGWMEZYu*f8ZnIV8n j)?L7*phe;E1|3f)0iMTy`kWjUDkS9Dno~4685yhrY*j?+ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7a73f82726b6038a7575097f382fdf8fe92cd522 GIT binary patch literal 49 xcmZ?wbhEHbWM^PuXkcUjg8%>jEB<5wG8q|kKzxu40~1FJf1_j;Z=?o;H30Vo2=f2{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..148b810e33a94e0456a23ed642ef38686eed9754 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3-ozC9e7dDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MQi~+A+A9B|Ns9>Z_d99WHFTl`33)Hc)H!d3&<1qba4!+ qxRsR9z~rWJk|W8WDZ_w`!+?Qd0t4@8U}fi7AzZCsS>JiWEFu977~7C;#~W-=3L=nNf;ejp4b20T+8W*P1j1ZYGA1 X)5d36cG~;_s%7wW^>bP0l+XkKk8U}fi7AzZCsS>Jij+NF977~7CnqE%{NQKdG2mhPKauqzlYyfMqsFm?OhjEB<5wG8q|kKzxu40~32sBIoMUeB2Dy0P*e#QUCw| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c4c06ceeb3c8b5bcaffff987bd88e87fdb7769f0 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3-ozC9e7dDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MQi~+A+A9B|Ns9>Z_d99WHFTl`33)Hc)H!d3&@l5ba4!+ txRsQUl9JMpz{V!PxJY7wiU0$P1OuZ1(C+6ECxNOMJYD@<);T3K0RVehDUbjF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..09417b1a6c658f762ccf98e0c1ba919d00e4025c GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#4!2~3EjvmefQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jij+NF977~7C)fP`rppWl+{((zd1AuMJP*R%<7IDrVPYtC WVRjUq$-4-soWax8&t;ucLK6U{xFH4r literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..70766f4f1b9ab66ec1bde3724a8a08dd32555100 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#4!2~3EjvmefQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiZnf4978H@CDnX>#>*^WV0eI`>FB5b|LZRu>6of|H)YMc h8U}fi7AzZCsS>JinKjl977~7hxQn9F&OZ)^!@%neeqnO7YdJ(uBg3~T2Yn5 jET5IW>_DZw=OR021B-J~FG{ZiwJ~_Q`njxgN@xNA*sd!L literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b074e4ede889177dedcd80c787fd7fd3fe464f52 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{S!2~3YtcsL@lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JVT2B|p5Q)pNCpYpQFc4^P==m;h*)Q$h6|_Km!KO*sG5dY} pEcQM!wm}rwbzdjzgZvxcK;OXk;vd$@?2>_w`Es6jD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c1a1553eb2b4f84d01046b749d81346516ab374a GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#2!2~3yhcs3IDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9Mb4fsjv*3~tOpwf4;u)uC{Ee=&-&c@hoJ{1CB#1PZN0wk z^5DSr z1<%~X^wgl##FWaylc_d9MJ}E$jv*3~tOpqd84NfW6z^@Wzf@Xqp_+e&*DBvBx0fwg zdmz{M-4@}X+dN6>MH@_;a*Iy-Ek10vGbMQEn=2E;eCNF5`(d9Y=$glWVFl1U22WQ% Jmvv4FO#q1bHp&11 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dd344f54c7c6336b64403f1bc54cac3247f5ca5c GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#7!2~4D&M%S!Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jiu^oX978ljSr0by9&ivitWb68pYne0cvhJPZAax!(L<`L z!3U#RqgdB4g)w?JeFc)M8$u7f`k2_dfh*#tNU;BoJptMx+CL-|`3^AtVAP)xz$4$j R(Fp0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy)Ja4^R4C7t&n*gsKor37Np?Xn3Le1d zF~n0C%od~7q;=IM;KqzWr3! zH5;(LAItOHG)*>R{Wy?inIuU;5U?xO&pl1ksH)0wT#_X01?$%y!!RI?k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X>^xl@Lp09sJ-3sWL4o10!?*kWoIj2jvxvwY2q*}$66gHr zW)Xd^y~^s!;f3$`N{d&lc8-;K^(H|5`O1C2-{$f>3!78^*Le%jBnD4cKbLh*2~7Zi C*)`k% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2205f075182651cc43aa18e06d23f529069707fe GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^{2k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XoIG6|Lp09MJ++ayL4m>5@mu`E_wK1v6pkEonQeZcdG-1f zSILTD*C+VXu5ck%y*;_Pu#P(-=Hm{an^L HB{Ts5{p~rV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1dfeea8a770b0b32627d1cb23c3bdafed56d5dbf GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^{2k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X+&o}1>Aa6P;9$eB>Yu+1!>W`d1=bA=AMfw4_YC;^ z`+L4n$p7Ep`&q6!$nywYZ9aZ?$<8O&*T<`@n71QCeBvrbCLV^qD}Fus9#i6gCNg-s L`njxgN@xNAr_MQS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..77237aa5761c1e28e9bc0d23c5ff239f3c4a59c6 GIT binary patch literal 2436 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 Cso>B6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a473c9c09af4328180d93b9a1ea8f911879bb65d GIT binary patch literal 2555 zcmVJNRA}DqT5U{J=@lk1Au;J6jT=pj zXw=oFNiEqXWSiKU){iBXB_^e=Nn`B(p_Qa1%hGNQ?y9>iQA${pVg#jvLP22Nu$Bt) zseFzIGx80?@HKo3ih?MLo}TCJ%;e>I@12<|v`yAYp3Ka9-)HW7&z$GH=bU?eQc_aL zDEQ@b{``3|3h-N7TgfOEga66NG%||C;J?BD7Cvy~;o)JgAq&9BOBTSy#Dv$71@Jn2 zha-CZk_GTOd?nZ}D;c4TWJa#zJ%q8`lRuQ_ZDL$zv@z_C_c;8nC;XCuUT~;ze8Oe-X$9o84N%%qllarGkVQ6T`_4&IffRV9#ODX`i$!{6cm6es$ z-ri0d9Pta0Bvn; zOCkVI)@$tC>n5-aWUtdGjU>4i37$%L4F(uY@cBcWdqJ?xP>=*iRX`1+Fn!07kA~7698~dwzbt zuq&MR;lqd2)YL>ZH8ljMnwgmqlErs)kfe+s7?5vpk;>8Og9Ec4ffFQ6V zV241Oq;THtI2W83yF7y3_3PIuD=Ui%3JSz|G2YqP2`8RJnxn_pf)<}`vHk4j0vZ{g zBx~<5HMiTSs>Vb&ip!|9qLNxV`-EdRb42I4lSp&)_#L*vSD?ig0+^bb(!}`qI0Xa* zkgu;VAwoIFWdS^X{Mc*A0>C-+P*+z+#l^)7#$*Aw#lfdh2r%o!0yaU8bb@o0qrM&Pv0hz|iM0Rezt zTU!f$mBNAZVGo?Up`n2?GczeCCr6w=Iy#!-*C@CpP@Zdx|->fK_g{U9^J<&k~0|Nu#KbD+#Ib$BXD}FmY zJzY3IfE@q=05UQ%#14#9is#=^<9h-nAH^wS-aa%&mey{%l9TJYe$(wc!cHF_JxQ@~ z@f^W>ITf{IOqGAP&87=Az7W8pM~_^vvZegbXg(iJbs*u=_G+RuVuU_)h27J0}Ey8i6@4BnRGl>((ui zqF@(_iHV`Kv@{_Ah|Vd1Q>RXeIanie#?|hqlHFfved53MJAN0#J&>6UYLP+pA?|Wg<%8GYpF@Q>_gv3&2PlR~CSCP2Uz)(AxpQ6r1>;v3GuP zfDVR5sjgoZfRXE$1mK6117iq0hYlSQPA>xj2n-AqbMU{Q4v+-!F8FY6>=1gpIZ`1s z02Bi7Lw$vyV6)j=4zEO9T%4GLU4l6yYJ5+i*$>86D6*L&PsHFBj*97_=gZEC5fVj~X8acCP6+zds@({`Y^fkG_aYp^ZP@OWl2T z)%D8)FmnBp0G2T(QI}vmDk_Tn{rwjRVAG~ebnMtMaoo|(sgwlZi^3M-K#s4~$N(4J zAhafV{sYN@m!U94P(W&U@!~~Q0iejnabyTQze0=e4oW`TVHpZjblDo3Iw|7gKhcL_ zpDYkSP{<()|0t5oEmmr3>&BQSUk_@0Apki~jE#*IA^;K+5;XHkSpe?3NNSJ;Am@na zI6wr>)JH3qlm*~v{;9@?f#r22p3f2@0M4c5YOY@vfRXE06u}qJMZq|P9~2ZsTefVW z4I4Jlx^?R)BqT&cPaH>G!1KcuMQ|qyM|6CgyMz)D2T)pC3jSq95qrVeO@sXt6B8FW zKk5RUAIBX*qy+Hc;p7&|@-e1!@0o&=9d*7!jlZ9*? zjI#18U^`8Iy`^0fYJ4F8Ws5E{GLp7!+a@BtRvS+ifG776l#m6W>=dBmP+eWE+f9%K z;7RvEiw{RsuI;mvXX&RwAL_1O7J!lKR|sG&(wgSxX5p-erYMGygBKPSx}4Z#GQn;g zi24cvyo+4`&WrXZqCI{C*NL44|07Z)2mdMKdkP2kV@x3hLW(pxIx4zBNI_d#T3q)| z95>Zk8NPaaEokwP#xSPp8d|8fzKO~!Z_}Bi6#Dd7G$p5A;@ZGMO|4y2$WG4lS{b^0 z%vVB-F9e`=qXrJ5cOyp@fRP(fdIIpqffqvnYU}H;_Uf)*7J!lKSGf_k8^tZ0R4sLY zGosyzqFLic*iqQjVzG!wkN*hw0niqOARPSXjGY=cvH}^iXs4>RjUi4x-p|;)6nwTv zAY-=V)*Z4mcTml33*D?~pn7u)S#7aW6e_X*(UxBQ%uqoO3%9?@b~OOI+5@X*ejE<=zO0yPlNvdJq^mX+3a{A4mjw} z@m2Uc9S_6-=iE8IiX(4!JkSOlbmzE>%}11WJkSOlbm#c5!+-Ng>>GTi@o&QB{q~Vh RsFeT!002ovPDHLkV1i+8%sv1B literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..11dc80027e917ae21b62c878cff935e4a06e301a GIT binary patch literal 2028 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d582290a556336a15cbfaf32b7679f8845a50132 GIT binary patch literal 204 zcmZ?wbhEHbmD}aNN_N!6n1NQ$^jtU{ZkF%LffwszC=2axArMJD+_? YL8&NP;HW}s#2p!Srd2*u`kff80YuD2^Z)<= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f059e61ec585985959ae5e373a62f3fee8c501e GIT binary patch literal 2975 zcmV;Q3t;q#P)j1^HV3BT(l>q>XB#n!>>_iEhOPC}K5A%@lA^>otgs*tjS1jUYi=>b8NE74;c?pRk zx*^+$ZeefFr2BHSQn(@!BZS3HW(hfTkF-<)i=P9)=Qn?ng0#1ENt10Y>}_osmZlb8 zHR``^{!K}}{Y)=HKY0exdcMT|Dle@L0OqWuH`~9&R#gGewg~{GyI*3u`vH)Z_}1F@ z)q7~tc}WzB1P*3qSy@@8JTBW*+R#7rKNJ3jzWSf3^teCTL-*vyv&1PPy0mZXw3IZl zke(r6vAJ}{pNIG#7yk7<7KU--xk4^qQV}VcG9EucVmF_|6YOli&2FF1gI1Mg<%iub=0S3W6FapNGQ!oQwfq4jmun-xdK+2FN zqz9QmmJkzihPd(Lnu30Z z-ogk>f~l}NtPh*POxO($fWzVCZ~~kT=fVZ>Hn2$8i&5mJHFA8Q1+ z5>z$n2&xs;g}R9vMa`f-pvh=8v%^*@J1poX7NI#xS#3ELIt7f_1_MV_8@cwh&u|J&HYt9l(xbU*m{4 zO`Ijp8yAD)){>n!FUcn2VaV>$9LfS@Z1;6w-~ zBoQ_cDhbVmON9G`7epdan`loACGv>tiIv1-#4E&6;v13z$(ZCpiY19j+en8==Sg=+ zFUVxFKG~HVLl%*@ksHVt$q&h|WhgSHGJY}~nRPNXGOaQLGS6i3vU;*^vMXeBWh-P) z$o9!j%i-npNmG<}*M zErnJ}J5C#-yws3T*1WcXc7%4m zc8m4{9fA&1Ctjyqr&DJ}S5r4gH&3@o_pTmZkExfaw_C4UZ%*GpKT3bIew+TJfs%or zL9RiQ!F@xrp^IU581U9iX;hF3)>0gLmXupuZ zux{ZngT!!SWHOo|K+}BFHq&Qjx@IwEJIuPxKA78>rbbRvHP?Et^=%u9O_0rIn@*eewsy8c+h*G-J6*dtyIQ+p zCY2e&EMZ=;N87vGud_dG|Hi@ALF91U;WtNyW3pqToJO4K z&T-EBokv`>Tv#r3E{|MwTsf|XTqoR&+>+dmx;=9@cNe;!bf5EZ@L1z<-V^ck@htM} z^-}PP@T&HD=&kLY;N9ds<74Bq+ULA4+Bd*=hwreTx*yxG!EeUj&VP-6R{$wsNkDbL zqd?<8VPHoP9ONIgGwA+ey~X^+ZNVVeFL-D0gAjv|^pGDzF`*%$HKC8gEW+}_x|dLv ztX$H#QnRINmR^rmiRMMO$6#Y3V-Cg4 zF7sNpYuR|LO>AN8&~k(2*~_o4P+5_(;>=3fm8_K~;?QwXagA~BSi!71*6b?3Rkf>T z*dFZN?57-8PB~|a>%=YNPQ*LKm&H#eI3?^%m`Zd>tVo>ZdGM-v&y#$U_9e|F2PYp+ z{+JS#(vpfxjY~bnSKue}yV5k$veWtnCW1o2NV-G%uJjpUfbdWTl(9UcT|^ZLL_K0d z@h0(TrgLUZ=IgA;tP|Pt+5GID9OIm=ITN|wx!)h4TKHJ8-B_+&o9e=xiM;EM}d05`hu}dKAV~fWeSCb!Z|#=qSwl=kGx^N>3$pac49v39rj)2d!zRq9|Aty z|Csvm06Lfe z02gnPU&TfM000SaNLh0L01FcU01FcV0GgZ_0002uNklZa7g&3OZP3EH5%56r(7+^VXAf4kB`(mSu?`16gSEvc49nPt7s3 zLNd>@bY15(41=)dd$9vZ!*pqyM%uQOG)*N*63Mbm%CeL^&!2$r9*PKM z=vQp?!q)J^)x>uSD}QkHZmr?PaY|j+x_=jgai?jzqJR3_^xm(5i5rYJ=nNgz_XaA( Vh)^sufq(!2002ovPDHLkV1gMt!eamc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e00a87b36ab1b596dfe61d49af171b3a452f027f GIT binary patch literal 49 ucmZ?wbhEHbWM^PuXkcW30L7myKqe!D4u}hqVPN8D;ct}8;*Hc`um%8^Wd-&C literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..167a3e0d5d6052990938d0dedf9aff5d37a7cd26 GIT binary patch literal 1676 zcmcJNM^h7F0ERcs&_YO1ilP`rupm-Y0*Hth0*DleqM(9*LauQ2SLrA-2+~3VA#JnC zW?L#Djgx+L#sfLJmpyFxo_U|gK0a#g`&`Z#7=dBjY&@DMa!SF+#l%ETOco;XVo*r` zItU5LGd`9Lh*>FF2ugV=RowMN_dNWzn>!9CgM8xqmY0=t$C0$lF9rDIk8R(^e$dA$ zK^eSXV8s(YQRL&rNW2hMz<*AKMBW=oaZ299CH>L#_95?K-;?7ZI_b}|^Pn_OpNX`YNoGYLN#2hPTB64PZH^>U9 z^}V2!DtNiX5gX&gv=GnwqM0Ku8Im&lUWt$ALkf7R90tU&l#V6}PM`d9$L|+1UOvq$ zr(&}B+Z|?QK%0-oa}nkA+oqTKpO@uN<&@1aH!?h9>+a~(sK8m4Gp)7)+}q)~P!pqH zS#9dPI&+~}bwRB*d^9{%m6u<4v_5@y$+A#gt?T_zSvfeZ8?9=&ar5PT&!;Nz{qVcG zfmanv6OSL=ZkxPyP2chUx!%k$=COwHxfk}KsW--YO>M2F+jysJ@yXpQv#)E~Z6o*k z?pwQR${Lq1zI|ZoH(g#kpM|0{Q4}>raZnT;MX91FT8gqnQS=mLjG`DRN*P75QIy6K zEM%3YPO^&HKvr?Il2vrQWR!h(P)EC`swf`BP32$;fxfT`(V$jfG^iCAO$ip5E$SC$ zi~5DxqJCkvs9%^Z>KA5<`i0q|eqpw#UzjcG7iNq4h1sHhVYaAWm@VqJ1PeuJrYI_k zVxcI56lI>G)KQc+iejcHc8a2*D6NPbvV2)3t2C>~DqqPcmIX4(;4~R!zK4ub zH$X;dnW7?CZm9L@F><5U#et;<5U#et;<5TiV+Q^Lm^jZ2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0a7bf23a4bf663e3d893c270890452dcc628949f GIT binary patch literal 40142 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 IM6N<$g0T}z8~^|S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9bf9c33962359c6a769f403a584cf854a098b294 GIT binary patch literal 699 zcmV;s0!00ZP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0#HdrK~y-)jZ@!C zQ(+i>&)JVQH`h!G+uVv7WYM}&v!Eb@F1(6`7b4M}SAhl559m)QiXv|+h@>APG@7)r!=Wvc=!(A`JU%{-{*Zlkqyxy(%vI7a8uWfCtfce z6Sw$%hI{It{3TrHM3R%CFxC=XFj@|w64{MXLkORVQezb9ni}-+j5_-V`JzbC=<3Gm z{sUMF1d;dGBI9-=?Q~+s<;FDE55#P30GD}oort~3cMm7@%yCm zITphNNm*iyNLyzAajE-XGwgXqaRM%3)P!HD=h}-v!cU{d&@#L=VUEp6JE*EF){( z@Pf$iX)=-8K)x?pv3BEoutbt+&1p_r^>Eq}R2U{6@Qi1Z$7BbmtNn)P1B2o)21SFy hGtmvT*SpDc{sGkB$E)6PSyuo6002ovPDHLkV1iVZMK1sV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cb8bd8bdd521510635377ca88c413267601ae9ec GIT binary patch literal 677 zcmV;W0$TlvP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0y;@VK~y-)jg#L? z6j2n%zccIpaBJ7CHT+R&h?LYr5p5|1Jr!2c!$J@RK@rtM4?$5`k4XeQWI-W8L6h`D z64Sq+w$_LW%37+0-F_&u3PMQ+D+}}O+-b(9%?A&BxM$9}=X=jw&IL)h8~_xpUBI0o zf7DFXHd8Sas4^vXTXGw{`xSp3z<(Xuz{t8SEE@M%Jad-Q$=&?9E6HE`_H+6~C*QOr ztZUHvWv|au2Q)}=5A@8Bu1lQSwu6ObjVv@a(Uf(vbu*_99p-q$3Qn$S;l$1)d*FNL ziok$|%fP^BO&!PTmvVGTEhp9|Xq#opcMZo>PH_EiYd5f4I z&DCo-Ya)<~#_XITSM|sLDx@NdtvzxlI4wG&ILyy=_58;~;A5zg*#!}sPnC|p zFv8rTI6LKHVd(zCcvCa8qB^IEh!?9=VkQ_8;Sg_WJ`;n1FmsV8=WQbLwxWU~f&rcA z_XlmYnY(@S7I>v=e68!eDN}$OnqJ5R{OpsDxkQS+_c`N1&B(CqeIZ;0OdJJz-v@(C zNuXTBlG7eYtej^;S~w;Xiw>aekh+nd-Rh4?D4QKt{ct*~jFHs7?%L({rc5 zi~9eQa&om(T>cvE-;uW34$8$|01Dlbz9L){Ut-2q8T<22*KXZ!PKrDg!)Y^Q00000 LNkvXXu0mjfZgDUm literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0da12393b3b94174a900fc06715629bdf5ec502d GIT binary patch literal 65 zcmZ?wbhEHbWMtrCSj50^^ytyen>R08wrtLvIn$<1n>=~)#EBFC|NpP}lZBCift^8z T0SG{98JO8JT$LHs)flV+O0N}e literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ac118dd76d972f112bb410b4285c9264ee61ae72 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrA!3HEtFPV4&DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MVg*2jv*44lYjjF{$83*;iJ6E9R@*b$$x);oAbMvGpAuw@%El?AKr>mdKI;Vst07ot-_W%F@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..92678d2f96ab740c6e808f9f37deecad884ec22c GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|BuiW)N`mv# zO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%>3X_2hG?8m{_+36J+r`{1|%O$WD@{VjKx9jP7LeL$-D$|BuiW)N`mv# zO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%8GE`ohG?8m{`3F8J+o0lN(zwizuqmy zP_2aZgh`uH31^C(uo!Evgc|>z*%BPPIHegFglEbwSTk*#HBdW)r>mdKI;Vst0OBJq A(EtDd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1c96329ced18783ce447573417ccd970090db8be GIT binary patch literal 3570 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45359fb675339488404a0da4a9839e0af0d0a3da GIT binary patch literal 339 zcmZ?wbhEHb6krfwxT?*tYxnN6=guuyv~=O3MIS$YT(fpvXJ==3clW}Di`K8-P+D4= zlA6}j)6>w@JbB8Lg$ox>m^kVDg$oN7Em^&K&4NXX>+0$X3k#1PJvw8?jO3J*ox65j zxpHO6k|iCToztdGn=@z5(xuDV+uNT#e{tpN^?e5pZQiz{zOi}5>UAeipS}O!;i^@u z{{R2aKmkzv$->CMpv|BIG6Uo%2DX9&QwuzFq`IdCtk|SjWEZgF;lfo$e24u@Pp@s; zbhki*k%7nIg~_eQtR440?9gZkY}H%2r*3}vjc``wrsfu9j(RDLuI`>L*?1NamB~}4 qstCku3#-nVJ5N=J%Sn()ecAFA>XOd9YU|c-P~&#rvUQ6igEauXy@-$i literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ebd95a7aa9075cb7b9902aa4b5a6981f6bafaa8a GIT binary patch literal 48 zcmZ?wbhEHb6k=dzXkcX6zkfdi1B2pE7DfgJMg|=qn*k)lz{K9uzmns1KNo{F0O(8! AaR2}S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2947c4fa17501eaa1b477e6010d122d1e358c3ee GIT binary patch literal 63 zcmZ?wbhEHb6k-r!XkcX6zkfdi1B2pE7DfgJMg|=q8z?Tsz`!KdBj0fP?do}RG%mf? Rx##|wzwMF7v=BxHYXH~&5$ON` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f60ec444d7d5b84976d54505f3e3de038aeb300 GIT binary patch literal 61 zcmZ?wbhEHb6k-r!XkcX6zkfdi1B2pE7DfgJMg|=q8z?Tsz`!KZ)8BCV?do}RI-?}l PuiO2bzwMESD1$Wsxa$#T literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7dafaadefc7ac7281911c6c36cacebc5bb718923 GIT binary patch literal 48 zcmZ?wbhEHb6k=dzXkcX6zkfdi1B2pE7DfgJMg|=qn*k)lz{K9uzmog4JQssC0OpI)424fddE5oH_I2#fuLgKK%Lf z=f{s9`}Xa7_3G8RbLSpBc(7&5mfgE|fB*jd)TvX)jvagY^y#*3+fJM~@$A{ND_5@E zzJ2@Kw{Ks*e0lu%@ynMlA3b{X=FOY?_wRrF`0@Jn>nBg1yl~;d=g*&S+_>@k_wOA$ zcI@B3|HzRefB*jd`t|G1ojVU7KK$#~uYdpk?b@~L=g*)2!GHlTQ2fcl$iQIApaW6` z@)HBw28aH}4_Z>aOiqi{e(R)N$Ou_9@oEfrRL<$Amwfcpw8ADVjaet6a%fTR8l#Aw zBOE8V_<0uHZ8|N>!o;Ruty7a&XvogSqh%x_%h~QzB&@~AsHLyWJGpZjqaXvnjL^Iy zb|x(z7FE$nCb}K<`b)zkdDm=g$uxKD>JM z>cxu}|NsC0`0?ZC&!6ADd-vtbmv7&`y?pud&!0cvzkmPq>C>AxZ{ELu|KrDxXV0Di zRWhIg#sA!Xt|7tBjsdPldIrplKv~6~ESwAsQVcpEl^|y@ux2b!>r2U;m$7PH&g*G` zO6noEWZZ+*BIk#$bj;uI`ES$VMf@GRo=&lS<}Ez?>arVa#8?f!F)V6G@Zp=WD{ceZ z!?P0Sa!qgl)?3*7scde^_opulGL?$ms+DWwo2wctlvr6NOk|CoGF3+ro8=8~%QM;b z5L;sJp-EGGoC^~%2vFBw<$d>3onfm#rH(UGB%ZA&9cP5;PEcbcmCy-&X z(4g&$2ut9Bi7Ubd)Xn+$Z0?9fs#clTNU_zKHB{yowslB$sWqFmw%0eROqOhAWa1U& z-)V-cfU4)$RAQ8WQtoT=^iv%-+nKr!36E z!Q!OO#BIskrX<=gCalpnVUiRlgCy7V-hPXTD!lX97pe&+aWja|77^tY=uu-6WZEUM ztzzH)0|zU>4rN7)x_NMizBwu4C?lTkz{w=yn{+{A(gUSJB_1*EhNeRoSmb7AdcRwFPuA~MFA17zI(u`ReB3yw2CQ^%YH3Yc>`Btro)sSFz5ZpX-t-67* V@T%2&w)Sla>OXnvw5lS5H2|lfH!J`E literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f5b93d1159c7ecb490c7e708f674ee3f25b71bfd GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^%s?!{!2~3a&lETfq!^2X+?^QKos)S9>R hm|0|1hu~^vhN*3GGN1lVnGRIU;OXk;vd$@?2>^%)Cw~9{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..48d5172470f250383e7696c7b61c727b9df06eb0 GIT binary patch literal 148 zcmZ?wbhEHbM-k@FKWqMb!FG&cxGi^RyGZSQxAUy8cA) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9021a14e210b1107b48bcd16a637aed335ddb3d2 GIT binary patch literal 179 zcmZ?wbhEHb6krfw*v!drCnDz6+y!q}uf42i^6l!iYc`HIz5M@t{CGh@?f?J(3>ZN1 zCkrD311EzHNCspE151LzNnxH{YBDECf literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4a16dc7957f4d6e7f0d6f222995a28149c549a45 GIT binary patch literal 80 zcmZ?wbhEHblq!;ZasrmY<(rP*6}_UjF9IoA2Mh7Zw(lmX`kh{rkm> z7e9ageD>_w-@kufy?XWJ$&;r~pZ@> zU0K?lelp^%GTmPDE?4OpIV^AxVCmv(ZxLb$P@ACC%;?C=vVvpfi-S*vIAYgjII7j3 eP6{dw03d+O%v|MXO3um%7=piZy= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..15f4f1b8cbe5e43760e98033b66e57d56cc6fbb6 GIT binary patch literal 151 zcmZ?wbhEHbWMq(FIKsg2{rmSXU%veM_3PuukMG{S`~Ca(r%#{WzkmPc&6}S;e}4P+ z?Zbx;fB*h{`}Xa>fB$~``0@4Y*FS&${Qv)-fjFS}lLf3$2SkGGWMCCppkm1jid-v|$vuDrFojYgEngvwPKnhU&$->CMAi$sl(gd=Tfi>`fa$kxjQ^u-Q&tEM{ z63{8hJ-ukbdmDYe0}BE)lqC8+maI6CV>MT)xx{PfB#HJlW~U___wlnO`Mj$;pWv1> a*I@C*{x+wJ6?@+Ew;!%M{`tNlgEauxxmZ2` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f2fc338700f2a2c9f9762e003789168999cdf3d7 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2Ig%x=5hcO- zX(i=}MX3yqDfvmM3ZA)%>8U}fi7AzZCsS>Jih4a=978Nluf62WbwokHHSqg>mg^5) z0ty@#Jz`gHy2};1<)_Drk_Rm8`>ZDwp8GAG^Jm5V|4eJQo|O2^ap$(?(|zI^`t`O~LQ zA3l6||Ni~EckkZ3dDGn73{(%+M--v>lZBCiL6AWQq#9%=18d*{g}xL`wv1J)p1)eO zD3PZm_w=KM?``yz4lD@J@RI2FSmJRo$7=4P))KF!lQ??Tn0ZUM?qhOF_IX!#KA|c3 at-<1pO@|%_3ha5$#BrqV_~-kI4AuY{kyXV2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fb063237840e7826e981cb28a06f81d652abb84e GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2ISR=hLB0$O zRjLdO4b2P;KmP-1pm?bP1H-EX1_rAc3=HD=lj4uM0o8IActjR6FmMZlFeAgPITAp@ zNuDl_Ar`0CUh?KTtRT{wXg)`_M2$1j!Q1@NCYPh^ek{?g#Vd1_o^ET@xA^c!`RJyY zSNbl$3-|wL_0qh%@BaR#-y$b0HwP#zJ>t|Tq0G(d#Gxbd;ojx|hHY=d<`xIPJ@;Y4 zlpq$t?6-kt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^|0o>vRf*n&;I_rGxzTK<0YC3u1EIW{Jie_p6AC)rcPq;J62wP kGj;pC%XdR3O}_E}+^hM$Wsxe|fgWJ+boFyt=akR{0FwuEod5s; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d27981d645104333ea84fdaf00cce10d9359fa0f GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_6OjCpbU6@6F%}28J29*~C-V}>kt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^J6f`}lcK2%KzrB-wR?OMR734a3@9oduca;~L_Zx4!#gzH}*`E8~ l$b}7{};R#l)mm?)B^MYgQu&X%Q~loCIDBFcHaO1 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3b92a7dbeb744a7e545441eeed8a418c7e303838 GIT binary patch literal 288 zcmV+*0pI?KP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0JTX(K~yLe1;Nol z0zeQ$!I$h|{}uXe1tM^pIHT{Mr_ERrf|R6N+Mc!v7M3K95Rh&;Qd>5ae1wDt3E)U= zNmwE@mV|}H84;Sa1uQhSV9c>F-6o+aRi|SKj=;v@ZZ5QH+woYZt-(TKHwkUqc6@eM zLR4*&-RxD?eav~kKQjhI)Fhj9SG#kbulLvEj8%{-n(W=~?)m-u+|A>Rt+qhgySX># m^?KjyuQM~Yl(tEBcl!@~%A#s)(2TbL0000Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0JKR&K~yLe1;N2V z13(M|K}o(q{~hwCfCR!>%Z$IiUlZH1RMfHvuzXr##kM_`C6z_M0k+sVmaU9zN!oHG zTCHk%Vq39d)f|ZykQB?4SegiQB9^wI2s2DTa(D2AE82=|qZUYqzZcfJy8F zwJ^}`cCWkPF=uk_T}f6=+iltP?tDJxy#MaRNH!Mj-eq^&InST><4j^eQsHjz?cJW| l>-Xc#Okx*kySvN1`UecrrfaE^#1sGk002ovPDHLkV1kkt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^D1 zRK#35iNj#-HaolhDlD3wvA4L+7ToGn$!u--?`Pq+#L_8AjPpR|Y0oUBEy|sO%8RZq zWp&F)XR+SWGS7_Dcjd0T6BCYHFn(ku9<}xDxz+8)PKW%Q{=exlDR8-Jw(;@mieEQ2 zD;Lh{Sm8P6%Cx=j`|r+8-mMU7^072m{r5ME=dYiiTcJDQo7MMcR@W`hKmY!&XUaCu foZa7x-v41LY+Rj_y7)~2(CrMKu6{1-oD!M<=5=;s literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af50c4d58d9e713a6c636cecd12e1e80f09c1d2d GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_6OjCpbU6@6F%}28J29*~C-V}>kt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^cTVdBLHwR^Y>ZPG!Ga$|`9S8Rl%WkhS)^<>cNofy=jQ z9k22h<0jdtPj=S6D|g+Um~bS(eEG@Nu-x6BuODtvPE=o*Z>`MRW05uc#>Y^b+BY{R z3fL-T38`;QeSbW;oZVt+kgIU~^|DRpkKerbb7vm+lD+5l?mSm2mwx{BSKFXlY8&6) fJH7X_&2R3`)b%BO=WeG0-Ok|Y>gTe~DWM4fSs8L( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a4fffa3039be312dfc74363eea9ed25d88e7a8a6 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_6OjCpbU6@6F%}28J29*~C-V}>kt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^wfoOGdqg<-kwoJo@=Z*y?%P~bLM zIoG!Rfd`9QhTxaG?_Z}*ncL^#&=O$I`R&cLTa>mLGF4J@_9(jJt@7d2Ag4{V#44LP5p0<2$Q>OCn_47++ow?un f%B$X;c_D5VzNUjKkt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^lW0$@D_O~zmxw+0+Cd5DAC)p{Y(9|+_@AaP& ztNSbEl}>Ftspgk;d0zkVGaL+pX5JPx#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0Jcd)K~yLe1;No# zLqQM&!IAcC@(+<;5}?exmFU*@&+nGDLN;Sb2vR)O2tnJVZ3U9XI%kjoHf`Bd@(~gT zYGDzzC1HusScf7Q(-NAr1uS&#?pOi~(`^!(Qk~~+$72a>9PZ{qtMm74+m0<6EF^Z5 za6X?W>%QiUB}COW+0A*LXIH!P^_m$2B5IO7$=>bmCi8xsu?kW}Pujb=H+OS4uQRsV n0;frKcY81Q`h8}`meT$M4`Q8`(X(k300000NkvXXu0mjf#7A^g literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d3df139dcec6d74a38d67a78ace35f274e0e7b0e GIT binary patch literal 2624 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 T1Jy9Bd}~xWr}9nHkt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^Rc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0ce60f5589c336121add6a9c301f93f5d9ec164c GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^%s_mCg9%73N0@?kEP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0lP^=K~y-)os&IF zLU9zvgCJ-Pf)frCq*KyV0~1VIP{2hqVn6hv_l6*NQ? z^x{R~;>#5W37^h6DELwi4L>fN|M?xx|GD>`066(C2ZeArd_lYr@5JZ&=_1aL%GB^o z==ppe&1MswPDh@ZOa@d}i2GkR9U_xAO%ZWy#fyH8he!q`$xr}PH%8hWl-3SJQvJsyb zi$$)#iOfOpI=ZfdiO1t2GJFk#!2rA6j!-Bh8}M-IuWaO-SS%)Duh)am=R+hC5!vhY zifl5OWCQM*OeQQZHnJ%ijbb*NK~WTVJRT9YVcFquNROsza_^0NN@%0eNT&Mze%Nfb z9ob^BAP@-1`8xIdc3>ZzET`RSwcvC*VYOOeHk)BI8sT!epsK2za}Lz+-Ifi!O1)l} zwFZNM1jiwz(`l(OrBaE-FXC+fBYEH;xPf2GKDk_uMU?~o>+`%N3LIc6l@gN4q@+*v o7;$y<$5;=!UjH1-)4sIf2j4D<03F@E{{R3007*qoM6N<$f+#NVZvX%Q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b49724e5fe6f6d9a972dad2e8a6e2eba2140f873 GIT binary patch literal 517 zcmV+g0{Z=lP)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0h&ofK~y-)os+w2 z0#Oi#g+L%}s#K|jw0VF)+CbX0X@xvPS`h@X5sP3z1sB0oTZoNdv=A1f7P{Uqtgd$h zfj}S-n9M)yinmy#_*j^k@0_#$o^=qB7jZNi$!@7sisJD& zC6h_&_xne1A)vDA$yv~=?8UncvxZOP^rCIztkS-QPs00000NkvXX Hu0mjfY4PY& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f21d4e5ec48d4b6624bc4f18a50fd56839da5bce GIT binary patch literal 646 zcmV;10(t$3P)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0vkz0K~y+ToswNh zQ(+v&g&^p*tFF8fx{WTn5~2&Iw7fIBis(jAh)7E>Dk`%f7ABFRkzwD>4`gArEk9Py z>Dk$K&d%B9wzIR%oz2a$fmjGZ@brHV4$f9rUHo|AIsf1DesJml)cr4i1$~24M~Mz% zf|xm2+lV8zv$bL;@ng>J0Vl*DMbrBFW_|^fXNlAQlaqRUc6p&acZ@a;+j1OY5aForGq~>}p2Y z<`rYuR5IWLGI*XxFc`$gFN?VUa16tbN8l48*rtMoC5{yg=rVf<;t@gzs}BR4m<;EbsiP3H4Bd8!d-&8={ABGj~o z_cj-kJB)HYvAf|9VV#$-vg*Z?(Py}QX8;qEujnmANZ~l_v;ob9iNm!&Nei*R_}vFl zj>6*=@y+80FNC0|DcBrqOxz+Gs(unf!3l!1j9T$>)~WO2gB|xq-ZAklam+YhB^yc_ g*u4(8SSwZd12uhvl*%thvH$=807*qoM6N<$f=7HJ-v9sr literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8da7e78f77b7b497e83ad379b218755a74bb25b8 GIT binary patch literal 403 zcmV;E0c`$>P)Px#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0VqjCK~y-)os+vt z#84217X-o9%4(|xTOUBM6>M#77kma=UqZ08va%1vq*w?mn<9kV1G$rnAP9mWjQ@lL zVzS9D79R&D=Nl$Jb7n*|`!9onAPC1`2_C?6b6$g^Nf{Sz!RKbPA=5O;ah&>Guh)cn z3@*0H_;9DHDg{A6d7cljZJQf>gR4I>3g@fUsuq(Z8O5?JZt%{()|Fp$U8g9DcEZ!) z{(UWT5a1_{W7-GTby7L; z&+=hUmnk<^f!QAwvmR}Yx+b^|2=7sPx#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0eneBK~y-)os+R@ z!cY{3g+ifgr%p~n*FHd@YoTk`u0o%oYhR++NeBp?GKh;piGl<>xD*9NsTK>tXfzs4 zj5$63!APpcp~J_8n|%Mh=iGY}M3ne1dlQ*V=A210FU;F!yl2ji%KXD4W0%WiYBU2zc)7K_C5-^|THnLj*LDis=yM&x-OEtgALEEeRtF0EE8YPZ`6aGAS5GEZEqs!Ef| zgdE2adA(j!5Cr7=z62l)JK=v#loplMX0y3n3GyzG5nQcS5%4TB8o~JU`CMd-aUh`A z>p}hq<;z?yw-s&Mjs-G$!j2KjNkviQ!)!K_y5qq1hr=P{pHMzQ6Q_NoNsan&ut|2BlI7aylv}8LQjv$`N6e!C*lBexD4(kaAF#uIms# znbX}%a?3dNdRPx#8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0ftFLK~y-)ozu-r z!f+hNaUlr0cIwng=-M9;bPc+8?JD#abm$aRM5hiF1rbHh4kJt(jcLOi`LMfu z2t-rh#eCy>owz7MbgOO2Qv1o>99GF}t1 zDM8FZ$|@`lx8kw2Z96hK1zcR}OVbS&8?AVBdE)|UxqufT-It=3Sgg0=0d@#dwtxtq zG8K(U;1d}Zd)g0d*X;?>1`#1H*^``CaO(81*w!A8lG<}527ic$H^6n_<7v3)2WVfM z40gUGQ>1?P6b2`V@C7+M`XUHLW02$=oNg}*--xx>>p4yWE1TyyxVmlFJ9A-i{e*?b nWW@BtXb!P9KMrQLGivz(*#@bqv*>A!00000NkvXXu0mjfwNuZV literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..070c12f5b69c92c2861eeb6f78a4a7d02cb2bc99 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQjEnx?oJHr&dIz4awJP!BT9nv z(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6$yH}IEF}EPX58q%=06%Jb{5B>XG)$ T{P4}+fRYTJu6{1-oD!M<5ac3H literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..45aceb7b5849aead90264670acf83b81de996860 GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQjEnx?oJHr&dIz4a)dlx977~7 lC;#YYd3R^$VTT5O201?MnbSAk*#(qk@O1TaS?83{1OQN}7s~(u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4b3fcbb0c46a31836d903147ac90ad40ce2fcca5 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQjEnx?oJHr&dIz4awJP!BT9nv z(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c70GzIIEF}EPX58q%yU1X;h`muK}<7a e8*_V~lK_K4n});`?hgV$bqt=aelF{r5}E*o1|%&2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ee193560dfd02462064dfb81ac4efb3bffe064ec GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y_!2~4vg%5rOQjEnx?oJHr&dIz4aukw1f_xbm zs#F;m8k!jxe*Op2K=D!o28LG&3=CE?7#PI!C&eFi1FGdL@Q5sCVBi)8VMc~ob0mO* zGM+AuArhC9D;Su0%o7?On(!FBX=H4hy84=v0K)<)zhl%G};(B=CTl;nE@viHC>h2Llx{c)I$ztaD0e0s!zKA3p#9 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3ab37e6cc041b558c478063cddef8c1b4288388b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!2~3)gaoYzQjEnx?oJHr&dIz4aukw1f_xbm zs#F;m8k!jxe*Op2K=D!o28LG&3=CE?7#PI!C&eFi1FGdL@Q5sCVBi)8VMc~ob0mO* zvYsxEArhC9D?U6p*eh-BH{Wh=`uTZNS6?#{c)-jMy;j*`XR1UhP$7e-tDnm{r-UW| D-?A$W literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fe335835c929642a1785a929609a4ffbf8f9929b GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2Ig%x=5hcO- zX(i=}MX3yqDfvmM3ZA)%>8U}fi7AzZCsS>JirPF~978Nl&%JERbwoj;<>4Kj+;cB7 zbGCnCDLa_!a#TKtER mZa496;o+>FAg~dGeyUbJzU&^XL2b?_a-u{qp6@ z=g*%%efsp_!-x0p-@kkJ?#-Jw&z?O4>H_N~Kq&rXVPs$sX3znt1KG*I8u~y*ASH9s zArl$L*ZbZY3KYDZ#1ZtSX8z>P1qBu=ntdlyCT+>En(r@^?6o$`vv*C|ZdJ>D4+>^{ l(U^TcT`1*j-geK4J8JCId3Yx6she-k6QbT&CalO{4FFy-Sj_+c literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fe9763a43e9ee1e819dbf2abdaefcc9a4b6ef55e GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2ISR=hLB0$O zRjLdO4b2P;KmP-1pm?bP1H-EX1_rAc3=HD=lj4uM0o8IActjR6FmMZlFeAgPITAp@ znVv3=Ar`0SPB!FXRuo~~8+j`xWp?XYW<~ZJb=?gcd|$|6H_V+Po~-c6-j%#IEF}EPEJTj_|f0^|3CXh4n_lc emjfyZISh-pOFiS=7gY;X#^CAd=d#Wzp$P!t)+cNL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a4dd67068a9692ca4249a8204b2db00cd77a9aa3 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1n!3HFw&5r&6QjEnx?oJHr&dIz4awJP!BT9nv z(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6-j%#IEF}EPX6)#zdbVt^TB!xX*Gt! e0d`IdZH%AFq@LxdXPy8mWAJqKb6Mw<&;$U)114wy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e7bc204d8ecf5f4191374e9ba9beec2fb7a99ce0 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T-!2~4#Jy{GS85oO$+?^QKos)S9kt}hIC<)F_ zD=AMbN@Z|N$xljE@XSq2PYp^gMk3k#z+5{wI9_^ kE-z|6H_V+Po~-c6^VJeIEF}EPX6)r_4Q4ur~m!`f8Ky4 alA-YC)Qp}JabJNd7(8A5T-G@yGywp6!704} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6781f0ea91e0bf2f25d4406d58cadedb65ad9434 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)O!2~4dW-8AFaf*Z7ofy`glX(f`NS3%plmzFe zm6RtIr7}3C;r~m)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..251389a285e06380d4e8eda1ff98e6679c817fbd GIT binary patch literal 1863 zcmV-N2e|l0Nk%w1VM_ol0Ooc8{r&y^{{Hs%_VDoV=;-MA`T3KRll=Vr=H}+8sHpq< z`@+J)z`($%sj2t(_uSmvzrVkfl$7b|>Dt=b?d|QVs;Z}_r_RpK>gwv5nVIzT^t!sb z^Yinwv$N~#>&VE+va+(JrKRlb?7qIfrlzLF#l__0kA(yQ{0KjEsz|tgNuGu%x78&A7O@wzjtJ?(U$Vppuf3;^N}?`1p&9i;j+tot>T0(b0&Ah>?+zhlht| zW@gvd*U!(-XlQ7Ee}900fZ5sE)6>(^($ZdDUYnbnWo2cMkdTj$kD{WY%gf8y*x0YH zuZoI_@$vEh|NsC0{{R30000000000000000000000000000000A^8LW004FXEC2ui z080QZ000O7fOdj|goTEOh>41ejDiR)APf_VkCBs!m6DW@nwXrIh6ObhHZ(Fh4FaK~ zrKhQ@q^78;vxN#IF?GViD+alCzrn+G#mC9Z%*KSz%gxik(AI+x3&V6D z!UPtC+|c3U+ud~^bi?B0>Hz`n=z`@A3c?(9?}HIM0S>(IaYI;uBPRUuFjwbbLP7t8 z-SF|^fINf>g*5>pz#vA53lktw0D}w%hk^)@P!NDXhb=RN9T;&T<;rzGw1Cl3XJ$=1 zD)ZHuv84lnfHZ9ieeh+$JfBMIC_rK+43VBm?I1{iFGYkIKk5J|00D&~t_KE$m~jQh z*s^E;9a#J^BLbEKWX)RDcq0M&AO{8r44}h)fQSku2%%R$V7+_z z^3$(x|33bC{p`_kpMQePx1WIh6(Rr&O!Tlq6jJE0fFTPu_+W$+D#)ON5K2hlh8KFM zp@ki0SPKIQWS~M210YfWiYl_`B8)4xc*u(>);MF1GB)Dlk3a?~KKk%us2velBoINvB=HcW2QXBJrT%1E z$3zv)!zo0bZq$)5qheZzNFVkIO)Vw9k!-qL83$%HBYZV{VEJo zP6ZJanwp7Pi_>D-2zB$&;-k;&$s7xacN2SYhm{ z76AYO6d=P5Kga_>2dNz}uRO@oyKle$2JpiTG87QNz?S{{K~6g@%x}Z=3K2&C7f2w% z1H*zqQ33!U3!wwZ9PB`d#~^F)KocaJJP67F=pY2h0F-?4$Mou3v&$WSd;$>x@L&N4 zHvgvq%^(+mgAe%~eZT=pFWofKV@Yi^)k-scHPTsYctQ~zU?7AQCw%yI*khONHP~X4 zZ8qC!zm2xrp)kz4wWI>pf%Of9qm5-hwBo_~MK=?)c-77xIV`Qa0HF zDMpD5cjPJMORB&bk62 zj1VAu56}s`@WU7HOz^|gq5L$=CvSZ80X{#-2tx!&zy<69QI8$iH{bpL_u0DAsvFigbN_x zg(s9B9VS2u`@j$=D0IOPlu!X6;Ls5kpgP>Z0!fCxO$1rRL31r+cA4*F#PIac8e4fsG6 z^0>!1il7QXh(Ql1KuA8y5e`cTfeM_^NJI9Z0X-Ok5j>zr-gLmE2pHgG8kFDx45R=% zg7{=8iy(#-l=76x0i_3?Fo8Lm5|zD?r3iNUN?fY43uh1k24YYISpFvk5=dq;5zqhv z*#SMsBme=H+06VPQ<)NArZb_5&1_clnBCN-hBg3$6ina)H!#s47DP^SqEnrMU}rhc zna&Tjlb-OjgFM|?&rm=hM^h-==>DmqfVzmFDlq7c5UNmr0#u-pi>O2=s)#@U06PHh BjY9wc literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e81ba07f8d99a772a5e09cc5c8f732670204b294 GIT binary patch literal 2195 zcmV;E2yFL>P)001or1^@s6=Hr&F0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU)HAzH4RCwC#n#)fVSro=kHw{W_(~SxW z3OWitqVWNuB0}65qH$wl+~~OWnP{B?=WOlQiWL#;~6$>S!#vl=c3ZtS?Q4Bsn zq*VlA&Uf@yZr`q|zC~h>lk`n0)l}85&b{ZHd#lbzg-)G1MgL_xbm$QMUs}ZDcta=@ zYMwfEYSY)RU%S72`O?D2{<6I1q}kJ_Pp7f$%%6r08JQJh;LmB(rZrSoS0_qJN@!?k zh@L)uI`rz*tG>^lKR59;{T?Y`)Ej)}ueR%Jq6QBhHn7r8k8c=P5BwY9a;!-o$EURP~=e4J*_o?Xc2Yx&Ps zHx`+3_3Bj$hr?nV5!$*)09(x>H*X#yN4#*-`t|FrS!5CH!7l9cQ^}fr|NgxMDw#}DM@I*BcXwN} zu(@T+7JB^nF_o2-(UK)gTv_F;c8+EYFt%B_IdTNk zj!vFDDO1^G^O~ERu^;1wtdS%63wJbx^hHN`5tJ#x3!!uxQRC@3$^-gUGn~RABH%Fn z7A;!z?ScSoPfrik*49dNRiG4m@Zdp*<%}KU402dx#D)zUXx+MXvgfCqHT&q%BWi4H z6q}gBy}i9uSy?HWt+UPo&r@$#XJ_Zc$B!RLW!S=n3-Lsd-vC=$S_XLlznhD<$s(=G z%gbdSl!ZOmRecD;s!UQ@YRlHt)JR~#Awb)=ZH)-PNl(UBid0Mvd zO@8BZJsB#8z^tkb@iy(n@-;mf%9X6JpBb6SE51V8m#d3>(?nVi_UsUG&Zc4MB~OnW+^T%PGQ|78XMM2qA}SNiAEVk zO=U_nD$Vo09Y~Wq)E_9iO^L>qmCD|bXlz-vWatu&EeoZ>lxW;oN1_=R7>KF)j`Txh zkQMq`fQ_>*P3}-EHb@+B5FE97^=d~wuwj*b*oA%cL)p*7V){TW;L=4L2FKaj#neA@ z<_sM@dQ|$4EK^0b&ZbE;oE0HVA#{`%H<=QvR;>~XsL-!nyEZyLKJF^BfW-lDP#qR8 zUMx`y!a^>AvmvpdA3A&BzyVj81?=3pbBWg=(ZS$ov(J9)g9i_2^XAR8V#NxX`f$2Z zA#~PR;5qeoaiu+>FOE<>_w3o@Xi^t1UUZc^Ocu^suwa4ggR-y(yN)*lux5tZvT!h# z52e&XCW0nsvaS*hM0bhwGD62~}e(b(|`+Q}VY_P5p z4SO|BvfxNqNi;!OU83<~ZDf{gusMk)r#j@E^>a%!{8$&sf*+xQC7Q{wN-ELWpfbyk zWYZ)X2L6mjqYeD%Pt2GxLu#ZKFJ27s6QXZqWW-mZnGCBWnoO*p%#tlOMWW%SLMOjS zR<2#UHZ9}uIK6!NvZu_F4c1L&$tLTpSzIQZt*WZ3&_TR&;Gdpo5XQD{-Rk;9iW{r9 zAS{YuRTBnfO^L>q#mg)H!K*0}u54I)Q{G)uQzH@$KsXAo{n%8SIddjzzBHLdv3~1< zEepj18yuzvu2@rMFEJ`eXo0oAz?YMH~ia5+gs#X@E=S=6z&Z{HU6z{oIP z7Bwsyq@`Q8Zi&Q$g4|?NBpP@Y8`2Wdg?H5rl_?Bj>Vq;{mOCe$imuN3eF;-sTr2^` zCr;QSP_`^=VvMi}WfobDq8eGMvngNEbai!!WTDa%npS;%y)!j={qg)FMQ7nGbRJO- z%0iw&Mysp{!kQUs%OW@kuG0MBYy{b4T_qY`@IoA!2&MzP`|jO4x^w5wFsEk5uV{j@ zxdSu2SqD62~}UaXDGk_|Q|(d1NzAJhI7U;xL` V5GgrqL(KpH002ovPDHLkV1hgq7(f63 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..eaf1ed489d8f5ef92f82d8ecd0298262f7dd36cf GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^%s?#7!2~4D&M%S!QjEnx?oJHr&dIz4awJP!BT9nv z(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6&ZNCIEHAP-+ESCj6s3t$br58TYriL zRK^CLUa>=CLE9#)HEbq{TNAb}{F5d-rS#)^xrx)>mt?=0brPtT!PC{xWt~$(69DQo BG)Mpd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2cb0ee1fa95af8fa6b9514effea35c4acd040137 GIT binary patch literal 193 zcmZ?wbhEHbzg-kZr;3k<;s=AhYue-cyRst z^($7a0I4PgDE?$&WMB|r&;e-z*~!3ar@*4<_1L1fsUzT!O~DzJ$I|zCIGMTkFl?CA r|NXVC&qjIuGB2iS23HCKTb7m`ix)`TeXwZlx*j#9nE_gX91PX~F)Ki0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..136cd220d97f7dbd2fee4c2c49b583d0ce2e0813 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}k|nMYCBgY= zCFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X3O!vMLp07O|M>sko|$8P#6~Bv4(^5u zYk~bukKP6tM$WLBk>ss#kKxGw!h{KPR3n(Lq||gxG(BnLu$G0p>A+O&@CRKEIRXxs zLJlyLs&_F7^qz6Mv|%peD@&f>jT&qZ!&5R9ZhERz&)SlpYWc{+SBk-H_39%VqjOFJ PEobm_^>bP0l+XkKWrs}L literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f59471e6e5c172e25bc2787fa2bf857713eed9a9 GIT binary patch literal 193 zcmZ?wbhEHbzl( re}Ap%vr%5Z%!_H7!IcYvElbOe#S0|vK3KGNU5}d5%mA%G4hCxgKeIm@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..290e77f55a765b7f92357da9e9e4514f6af12b0d GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k#^NA%Cx&(BWL^R}k|nMYCBgY= zCFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X3O!vMLp07O|M>sko|$8Mxy}UEM@$O$ z_>Qb!P+=Y7Beslh*$tr%bB2%gG7>83oYxpkCFdul_-^6}&_39tu;KR!)*VU$(kv59 zL=7D7b}nLYQQkb!BqzP0itliUPM6~k(MTzeGNF_6)N~^}`z(ScvoXXTX*u&QU$_Ej OIfJLGpUXO@geCw8u1C)R literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ea0f61722a2e19436ae9635f6496ec9a66936ba7 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^%s{Nc!2~3?C|;KZQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JigZ0)978H@CDr`;qRA{_V0eJxrOvef|NjT;xyc59=uRxP kRaRDhn&==a=Fq^%p!!($ch;S}mq3jSp00i_>zopr032N_L;wH) literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d40cf4525b3df2afa80c92a7c9519be7972805f8 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!2~2XTwzxLQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiVQqm978H@CH?yU-(Hx<*ucO*@${!eb5n-5&+or~{(S%T z?ccwDk6wTM{N?MfUqAo-{rmg(uOC0Y-+%e#>6@>w-haLS;`75-U+%s5^8f$;=WjkS vU;xFREMPGm5DBuAfmKprn++$ErOOhQvkVd;hKAEhVy`Nu)V%+#$Y2cscP3YR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..16487f1dc99ef7d15881f9825be27669e0317787 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfx!2~2XTwzxLQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiflYx978H@O*!Mpb-;j!+0pgq|H-d=y<$0bJ~fEjaFFd! zka%f%EBDd(pDPzT-skj``#JTY<%ciZcW+^lVCcMOAvU8ddj-%O22WQ%mvv4FO#o^I BH244j literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..617d9d425b5213ca52c57e3bebbd200dc19d0793 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^OhBy60U`}md>#NP$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWu?Bo-U3d6}OUp@w4gdult*nkdTnXz$~_aL-E!9{q-(fNmCCW nKdgS@#EFgq^_?OP4U7z%CB6A}h_NRDH8Xg+`njxgN@xNAm{BWw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1cd57cf5a31eab4b72317876fdb2ffa1962600fc GIT binary patch literal 97 zcmZ?wbhEHbWMq(H*v!E2_3PJf-@bkS{{73BFF$_#`1$ka=g*)2|NsB%*DnTaK=CIF eSXc){g3MrG;S)Hi*{vGUA;2KftSBeQU=09u3n9+{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..015447ee2c002a47042afb9665c1cdca3f2cac35 GIT binary patch literal 324 zcmZ?wbhEHb6ky+|z@WmQ12P!o zCkD2}0|!!Ebfh{bA4o08>0=WYYI&d|q@Z%i`O(Tem3|$~kQHJsNkYpGW*AA$FwtC; znWgk;&Ecdi7M~)yn7CcInYbDv+1Xs!*gGRd8Dte0L?=YbOG?Vjh~(tp;G7pJBGTZ< GU=0BFNP->! literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c502c8368f3190fab5e40c4fa38a38bfcda36f52 GIT binary patch literal 365 zcmV-z0h0cSP)8t zuhT8))Tsvuf}m>;(4~jyP^TdJk02{U)C%%qbSTPpWEDxx8u(y#zL{BJjdgottB}u; zY(^me;A}p~Qa%!@8)k9A$iF}aS<3j}XqX-8Wd0n67a3$J*Q&#{a*Zd`kzpZ~Ch#JI zvs0k5Y0P$dWWi)>dzw7s7TDr+tE<<$6&l749$e;V-U9oxR)=$F0pC@**H-{^B<(U# zjGHeE4Lf+eIt{p}+@H%&Q50PP92$0?=AeQJoAzj z1sTH%5U4NY6PfSrzqG+M9}-`lyu}Ji&J%~3z7^crR6INoZvh4X;R}A%2e%1S00000 LNkvXXu0mjf1MHS3 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..846b3b8eb22e26ab93b7db66d11c1cf2aa656970 GIT binary patch literal 325 zcmZ?wbhEHb6kyki+4{`T+RzkmMzJACoZj#D>IT)n^V?9B(yUVs1j zd(D9hHy^!Rwg3FJ`_C8dJUwgkv3c80{QCXp{H;fyzx{mm;mg4bx3?X?I(_5OS8qR@ zx$)@i&BrINJ$(J{A;i%51&9DUiXa}9~1bR4;G#1h_GAwX3M4>Dw`fG zViK6qaW3QHgawTvZp(Jq=!w_}%$;0!e*Jx8jmDb8US@Pn`i(4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a5c2720684e38c534c0af44fd977ebd70ee843d6 GIT binary patch literal 356 zcmV-q0h|7bP)OfLWO+ki+4{`T+RzkmMzJACoZj#D>IT)n^V?9B(yUVs1j zd(D9hHy^!Rwg3FJ`_C8dJUwgkv3c80{QCXp{H;fyzx{mm;mg4bx3?X?I(_5OS8qR@ zx$)@i&BrINJ$(J{bWSpt=nH*Dx5n z@H}>97Bzyj&jKjT{cm`E^TBq$9>}c{Xpjqt;~4YmG^Z|f4W7`kMRrI1SsnnQD8ggS zq6eTqa^T5!WN=;fh(KZo5JF&)uKxyWFs2@ud|{J&OJ#LRDwU#R+t)UOFbt0pXw2CX z?#Y^}gp(Oqv(MZnO63ClpWx&ewE#gY@iNgbl1`~d^k>=#FaU+j V>1~^2g24a)002ovPDHLkV1kQVo~-}? literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b8ff4c01e15be91b81dacfa2fe13d636a39dd359 GIT binary patch literal 323 zcmZ?wbhEHb6kyov0WF3qQbM9a z{0t(3d<-BqNQ_tm41hSzSXBxx0A;5^

          %u*;ZG9nUj+fE&yVK#6WU{42V*Z61Fi= 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5977782378ff197130fda60586c23fb92fe6d322 GIT binary patch literal 211 zcmZ?wbhEHb6k-r!I3mdK;>C;m_wO?>FdRL4G%_;s*s)`$PMy-z)4Ouz%C~RdZr;54 z_wU~e7cTtz^=tO**`1x8|Ns97DkdH%{$ycfU=U=`0cio*$-o+rpwgF;IWJ??x)+c4 zeJHl`$-RB9=Z($$+5D{q7JsJ7H6BXHE-lRePf@E_T$Let6>X aq_b&@C+^-@ctadsatB=hCH1adB}+j~+ENG)zoPJb3WnqeqX< zojZ5`{{3ISe%-uz^Y7okSFT*Cs;Zhjdo}|D!~g&Pfh2yQ_>+Z^fkBi(2c!&SCj)C} zf@)t%=Ddtm>sCD3x1q!qEE5(+apU83` r)`x|ONkMy(!MUDBM&ETFG6fY%_og|#tEjO)^#1p4oyMj{MFwjC8C+MM literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..11f9916748ec622755203971e2ee90e502d08c62 GIT binary patch literal 215 zcmZ?wbhEHb6k-r!I3mjM;>C+^-@ctadsatB=hCH1adB}+j~+ENG)zoPJb3WnqeqX< zojZ5`{{3ISe%-uz^Y7okSFT*Cs;Zhjdo}|D!~g&Pfh2yQ_>+Z^fkBi(2c!&SCj)Cp zf@)t%=Ddtm>sCM6x1q!>B=`0v&->+ZZv79K6>ENYOl%7>4Akmh?4b}aBZ5D8g$9!X q2g_vEgf(kjBr*;&^y<0Gd|;`0*LLH5d3nnD_nZGUG%6`FSOWlI##Ooi literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..5a9916a66e3ca1e403742442f25f2712ccc8dca3 GIT binary patch literal 109 zcmZ?wbhEHbWML3v*v!E2|NsAg|Ni~``}fbEKR*RNkcefsp_!v~-g0|rq1 w$->CMz{#Kkk^z~)z#=8!S@O#8#+29&b!Q8XB?5C87p%*9y{|xrS&+dR05?1;!^8D#DhCdoIPpWw zwV|`~rR1(I_7__3Ch2_;h-~g??Xe4scMpWSG=3(L`O!C=mh6(5h*i4iP7r*2&~D9MidE z+2$B%#$*K8u*(8NB;7<4I)rtCEhuGB#s=-Wu9TKu_^7>qUw!!#{MnP7^W>c5&3T^Z zA?X%!GiMT^<0o0{|3s0KodB?OpXg0LY-cWPf2-9ED1u(x@~#jh>R6g0K)Shs#FUd>)^` ziKY8X0GtFMip4@QGX;Slp0ZEzjP&PgBa2Z5=T@Bo%evRT8Ci4rUpPEe*f@HyeY&cl z?cSq}6|2YP2_n)i;Rl_0vh(GqChGgW)kZvQ$K0M*);&Ms!Z zT6=uhY<758UB0X1#@ZeY<_mcPp{5&CtDC{z*)^LtEWR+HvV|sX|14nvdmwCfxw|K) z4z;$nkB?tct8baj3axfXryE&V7<=$QV>0QjRtgmgqZ=F!29t@PsNLh?aJeX(jrskU z&ld=Xae`RT>&oDION7Qz-PNNJ}Ly#of9UFWB}c;lP;jVu!Oap}W!FvkbD&pU;J!_4UE{4|~TxzQwW z9f`dyK>RM}WM#>tcrcs*`m$1|KYY()G^nG2BARsW>C|6d%%45hpl`phKCS(hk$4qF zjXw=iDHJ-5mXw&tWH1mGi_77#QIyZ)5jY-+L^?a5_O)Mw~dmKnF#P`bxL ztz?mNEM~lw^t>poyCvoO9$A4@p14azJ|t&6yXyqWrkLxiULsxU9PF25?T%gHA*3^R d=g*#e^Z43R!(GB0qh;%I#f7D!!Mz8*`WG*c$M66E literal 0 HcmV?d00001 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"); diff --git a/includes/js/dojo/AdapterRegistry.js b/includes/js/dojo/AdapterRegistry.js new file mode 100644 index 0000000..34bc8be --- /dev/null +++ b/includes/js/dojo/AdapterRegistry.js @@ -0,0 +1,99 @@ +if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo.AdapterRegistry"] = true; +dojo.provide("dojo.AdapterRegistry"); + +dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){ + // summary: + // A registry to make contextual calling/searching easier. + // description: + // Objects of this class keep list of arrays in the form [name, check, + // wrap, directReturn] that are used to determine what the contextual + // result of a set of checked arguments is. All check/wrap functions + // in this registry should be of the same arity. + // example: + // | // create a new registry + // | var reg = new dojo.AdapterRegistry(); + // | reg.register("handleString", + // | dojo.isString, + // | function(str){ + // | // do something with the string here + // | } + // | ); + // | reg.register("handleArr", + // | dojo.isArray, + // | function(arr){ + // | // do something with the array here + // | } + // | ); + // | + // | // now we can pass reg.match() *either* an array or a string and + // | // the value we pass will get handled by the right function + // | reg.match("someValue"); // will call the first function + // | reg.match(["someValue"]); // will call the second + + this.pairs = []; + this.returnWrappers = returnWrappers || false; // Boolean +} + +dojo.extend(dojo.AdapterRegistry, { + register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){ + // summary: + // register a check function to determine if the wrap function or + // object gets selected + // name: + // a way to identify this matcher. + // check: + // a function that arguments are passed to from the adapter's + // match() function. The check function should return true if the + // given arguments are appropriate for the wrap function. + // directReturn: + // If directReturn is true, the value passed in for wrap will be + // returned instead of being called. Alternately, the + // AdapterRegistry can be set globally to "return not call" using + // the returnWrappers property. Either way, this behavior allows + // the registry to act as a "search" function instead of a + // function interception library. + // override: + // If override is given and true, the check function will be given + // highest priority. Otherwise, it will be the lowest priority + // adapter. + this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]); + }, + + match: function(/* ... */){ + // summary: + // Find an adapter for the given arguments. If no suitable adapter + // is found, throws an exception. match() accepts any number of + // arguments, all of which are passed to all matching functions + // from the registered pairs. + for(var i = 0; i < this.pairs.length; i++){ + var pair = this.pairs[i]; + if(pair[1].apply(this, arguments)){ + if((pair[3])||(this.returnWrappers)){ + return pair[2]; + }else{ + return pair[2].apply(this, arguments); + } + } + } + throw new Error("No match found"); + }, + + unregister: function(name){ + // summary: Remove a named adapter from the registry + + // FIXME: this is kind of a dumb way to handle this. On a large + // registry this will be slow-ish and we can use the name as a lookup + // should we choose to trade memory for speed. + for(var i = 0; i < this.pairs.length; i++){ + var pair = this.pairs[i]; + if(pair[0] == name){ + this.pairs.splice(i, 1); + return true; + } + } + return false; + } +}); + +} diff --git a/includes/js/dojo/DeferredList.js b/includes/js/dojo/DeferredList.js new file mode 100644 index 0000000..0a77d11 --- /dev/null +++ b/includes/js/dojo/DeferredList.js @@ -0,0 +1,88 @@ +if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo.DeferredList"] = true; +dojo.provide("dojo.DeferredList"); +dojo.declare("dojo.DeferredList", dojo.Deferred, { + constructor: function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){ + // summary: + // Provides event handling for a group of Deferred objects. + // description: + // DeferredList takes an array of existing deferreds and returns a new deferred of its own + // this new deferred will typically have its callback fired when all of the deferreds in + // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and + // fireOnOneErrback, will fire before all the deferreds as appropriate + // + // list: + // The list of deferreds to be synchronizied with this DeferredList + // fireOnOneCallback: + // Will cause the DeferredLists callback to be fired as soon as any + // of the deferreds in its list have been fired instead of waiting until + // the entire list has finished + // fireonOneErrback: + // Will cause the errback to fire upon any of the deferreds errback + // canceller: + // A deferred canceller function, see dojo.Deferred + this.list = list; + this.resultList = new Array(this.list.length); + + // Deferred init + this.chain = []; + this.id = this._nextId(); + this.fired = -1; + this.paused = 0; + this.results = [null, null]; + this.canceller = canceller; + this.silentlyCancelled = false; + + if(this.list.length === 0 && !fireOnOneCallback){ + this.callback(this.resultList); + } + + this.finishedCount = 0; + this.fireOnOneCallback = fireOnOneCallback; + this.fireOnOneErrback = fireOnOneErrback; + this.consumeErrors = consumeErrors; + + dojo.forEach(this.list, function(d, index){ + d.addCallback(this, function(r){ this._cbDeferred(index, true, r); return r; }); + d.addErrback(this, function(r){ this._cbDeferred(index, false, r); return r; }); + }, this); + }, + + _cbDeferred: function(index, succeeded, result){ + // summary: + // The DeferredLists' callback handler + + this.resultList[index] = [succeeded, result]; this.finishedCount += 1; + if(this.fired !== 0){ + if(succeeded && this.fireOnOneCallback){ + this.callback([index, result]); + }else if(!succeeded && this.fireOnOneErrback){ + this.errback(result); + }else if(this.finishedCount == this.list.length){ + this.callback(this.resultList); + } + } + if(!succeeded && this.consumeErrors){ + result = null; + } + return result; + }, + + gatherResults: function(deferredList){ + // summary: + // Gathers the results of the deferreds for packaging + // as the parameters to the Deferred Lists' callback + + var d = new dojo.DeferredList(deferredList, false, true, false); + d.addCallback(function(results){ + var ret = []; + dojo.forEach(results, function(result){ + ret.push(result[1]); + }); + return ret; + }); + return d; + } +}); + +} diff --git a/includes/js/dojo/LICENSE b/includes/js/dojo/LICENSE new file mode 100644 index 0000000..3fa2720 --- /dev/null +++ b/includes/js/dojo/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/dojo/NodeList-fx.js b/includes/js/dojo/NodeList-fx.js new file mode 100644 index 0000000..ede0a89 --- /dev/null +++ b/includes/js/dojo/NodeList-fx.js @@ -0,0 +1,137 @@ +if(!dojo._hasResource["dojo.NodeList-fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo.NodeList-fx"] = true; +dojo.provide("dojo.NodeList-fx"); +dojo.require("dojo.fx"); + +/*===== +dojo["NodeList-fx"] = { + // summary: Adds dojo.fx animation support to dojo.query() +}; +=====*/ + +dojo.extend(dojo.NodeList, { + _anim: function(obj, method, args){ + args = args||{}; + return dojo.fx.combine( + this.map(function(item){ + var tmpArgs = { node: item }; + dojo.mixin(tmpArgs, args); + return obj[method](tmpArgs); + }) + ); // dojo._Animation + }, + + wipeIn: function(args){ + // summary: + // wipe in all elements of this NodeList. Returns an instance of dojo._Animation + // example: + // Fade in all tables with class "blah": + // | dojo.query("table.blah").wipeIn().play(); + return this._anim(dojo.fx, "wipeIn", args); // dojo._Animation + }, + + wipeOut: function(args){ + // summary: + // wipe out all elements of this NodeList. Returns an instance of dojo._Animation + // example: + // Wipe out all tables with class "blah": + // | dojo.query("table.blah").wipeOut().play(); + return this._anim(dojo.fx, "wipeOut", args); // dojo._Animation + }, + + slideTo: function(args){ + // summary: + // slide all elements of the node list to the specified place. + // Returns an instance of dojo._Animation + // example: + // | Move all tables with class "blah" to 300/300: + // | dojo.query("table.blah").slideTo({ + // | left: 40, + // | top: 50 + // | }).play(); + return this._anim(dojo.fx, "slideTo", args); // dojo._Animation + }, + + + fadeIn: function(args){ + // summary: + // fade in all elements of this NodeList. Returns an instance of dojo._Animation + // example: + // Fade in all tables with class "blah": + // | dojo.query("table.blah").fadeIn().play(); + return this._anim(dojo, "fadeIn", args); // dojo._Animation + }, + + fadeOut: function(args){ + // summary: + // fade out all elements of this NodeList. Returns an instance of dojo._Animation + // example: + // Fade out all elements with class "zork": + // | dojo.query(".zork").fadeOut().play(); + // example: + // Fade them on a delay and do something at the end: + // | var fo = dojo.query(".zork").fadeOut(); + // | dojo.connect(fo, "onEnd", function(){ /*...*/ }); + // | fo.play(); + return this._anim(dojo, "fadeOut", args); // dojo._Animation + }, + + animateProperty: function(args){ + // summary: + // see dojo.animateProperty(). Animate all elements of this + // NodeList across the properties specified. + // example: + // | dojo.query(".zork").animateProperty({ + // | duration: 500, + // | properties: { + // | color: { start: "black", end: "white" }, + // | left: { end: 300 } + // | } + // | }).play(); + return this._anim(dojo, "animateProperty", args); // dojo._Animation + }, + + anim: function( /*Object*/ properties, + /*Integer?*/ duration, + /*Function?*/ easing, + /*Function?*/ onEnd, + /*Integer?*/ delay){ + // summary: + // Animate one or more CSS properties for all nodes in this list. + // The returned animation object will already be playing when it + // is returned. See the docs for `dojo.anim` for full details. + // properties: Object + // the properties to animate + // duration: Integer? + // Optional. The time to run the animations for + // easing: Function? + // Optional. The easing function to use. + // onEnd: Function? + // A function to be called when the animation ends + // delay: + // how long to delay playing the returned animation + // example: + // Another way to fade out: + // | dojo.query(".thinger").anim({ opacity: 0 }); + // example: + // animate all elements with the "thigner" class to a width of 500 + // pixels over half a second + // | dojo.query(".thinger").anim({ width: 500 }, 700); + var canim = dojo.fx.combine( + this.map(function(item){ + return dojo.animateProperty({ + node: item, + properties: properties, + duration: duration||350, + easing: easing + }); + }) + ); + if(onEnd){ + dojo.connect(canim, "onEnd", onEnd); + } + return canim.play(delay||0); // dojo._Animation + } +}); + +} diff --git a/includes/js/dojo/OpenAjax.js b/includes/js/dojo/OpenAjax.js new file mode 100644 index 0000000..32cf358 --- /dev/null +++ b/includes/js/dojo/OpenAjax.js @@ -0,0 +1,194 @@ +/******************************************************************************* + * OpenAjax.js + * + * Reference implementation of the OpenAjax Hub, as specified by OpenAjax Alliance. + * Specification is under development at: + * + * http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification + * + * Copyright 2006-2007 OpenAjax Alliance + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 . Unless + * required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + ******************************************************************************/ + +// prevent re-definition of the OpenAjax object +if(!window["OpenAjax"]){ + OpenAjax = new function(){ + // summary: the OpenAjax hub + // description: see http://www.openajax.org/member/wiki/OpenAjax_Hub_Specification + + var t = true; + var f = false; + var g = window; + var libs; + var ooh = "org.openajax.hub."; + + var h = {}; + this.hub = h; + h.implementer = "http://openajax.org"; + h.implVersion = "0.6"; + h.specVersion = "0.6"; + h.implExtraData = {}; + var libs = {}; + h.libraries = libs; + + h.registerLibrary = function(prefix, nsURL, version, extra){ + libs[prefix] = { + prefix: prefix, + namespaceURI: nsURL, + version: version, + extraData: extra + }; + this.publish(ooh+"registerLibrary", libs[prefix]); + } + h.unregisterLibrary = function(prefix){ + this.publish(ooh+"unregisterLibrary", libs[prefix]); + delete libs[prefix]; + } + + h._subscriptions = { c:{}, s:[] }; + h._cleanup = []; + h._subIndex = 0; + h._pubDepth = 0; + + h.subscribe = function(name, callback, scope, subscriberData, filter){ + if(!scope){ + scope = window; + } + var handle = name + "." + this._subIndex; + var sub = { scope: scope, cb: callback, fcb: filter, data: subscriberData, sid: this._subIndex++, hdl: handle }; + var path = name.split("."); + this._subscribe(this._subscriptions, path, 0, sub); + return handle; + } + + h.publish = function(name, message){ + var path = name.split("."); + this._pubDepth++; + this._publish(this._subscriptions, path, 0, name, message); + this._pubDepth--; + if((this._cleanup.length > 0) && (this._pubDepth == 0)){ + for(var i = 0; i < this._cleanup.length; i++){ + this.unsubscribe(this._cleanup[i].hdl); + } + delete(this._cleanup); + this._cleanup = []; + } + } + + h.unsubscribe = function(sub){ + var path = sub.split("."); + var sid = path.pop(); + this._unsubscribe(this._subscriptions, path, 0, sid); + } + + h._subscribe = function(tree, path, index, sub){ + var token = path[index]; + if(index == path.length){ + tree.s.push(sub); + }else{ + if(typeof tree.c == "undefined"){ + tree.c = {}; + } + if(typeof tree.c[token] == "undefined"){ + tree.c[token] = { c: {}, s: [] }; + this._subscribe(tree.c[token], path, index + 1, sub); + }else{ + this._subscribe( tree.c[token], path, index + 1, sub); + } + } + } + + h._publish = function(tree, path, index, name, msg){ + if(typeof tree != "undefined"){ + var node; + if(index == path.length) { + node = tree; + }else{ + this._publish(tree.c[path[index]], path, index + 1, name, msg); + this._publish(tree.c["*"], path, index + 1, name, msg); + node = tree.c["**"]; + } + if(typeof node != "undefined"){ + var callbacks = node.s; + var max = callbacks.length; + for(var i = 0; i < max; i++){ + if(callbacks[i].cb){ + var sc = callbacks[i].scope; + var cb = callbacks[i].cb; + var fcb = callbacks[i].fcb; + var d = callbacks[i].data; + if(typeof cb == "string"){ + // get a function object + cb = sc[cb]; + } + if(typeof fcb == "string"){ + // get a function object + fcb = sc[fcb]; + } + if((!fcb) || + (fcb.call(sc, name, msg, d))) { + cb.call(sc, name, msg, d); + } + } + } + } + } + } + + h._unsubscribe = function(tree, path, index, sid) { + if(typeof tree != "undefined") { + if(index < path.length) { + var childNode = tree.c[path[index]]; + this._unsubscribe(childNode, path, index + 1, sid); + if(childNode.s.length == 0) { + for(var x in childNode.c) + return; + delete tree.c[path[index]]; + } + return; + } + else { + var callbacks = tree.s; + var max = callbacks.length; + for(var i = 0; i < max; i++) + if(sid == callbacks[i].sid) { + if(this._pubDepth > 0) { + callbacks[i].cb = null; + this._cleanup.push(callbacks[i]); + } + else + callbacks.splice(i, 1); + return; + } + } + } + } + // The following function is provided for automatic testing purposes. + // It is not expected to be deployed in run-time OpenAjax Hub implementations. + h.reinit = function() + { + for (var lib in OpenAjax.hub.libraries) { + delete OpenAjax.hub.libraries[lib]; + } + OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "0.6", {}); + + delete OpenAjax._subscriptions; + OpenAjax._subscriptions = {c:{},s:[]}; + delete OpenAjax._cleanup; + OpenAjax._cleanup = []; + OpenAjax._subIndex = 0; + OpenAjax._pubDepth = 0; + } + }; + // Register the OpenAjax Hub itself as a library. + OpenAjax.hub.registerLibrary("OpenAjax", "http://openajax.org/hub", "0.6", {}); + +} diff --git a/includes/js/dojo/_base.js b/includes/js/dojo/_base.js new file mode 100644 index 0000000..e1a7edd --- /dev/null +++ b/includes/js/dojo/_base.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base"] = true; +dojo.provide("dojo._base"); +dojo.require("dojo._base.lang"); +dojo.require("dojo._base.declare"); +dojo.require("dojo._base.connect"); +dojo.require("dojo._base.Deferred"); +dojo.require("dojo._base.json"); +dojo.require("dojo._base.array"); +dojo.require("dojo._base.Color"); +dojo.requireIf(dojo.isBrowser, "dojo._base.browser"); + +} diff --git a/includes/js/dojo/_base/Color.js b/includes/js/dojo/_base/Color.js new file mode 100644 index 0000000..38d0584 --- /dev/null +++ b/includes/js/dojo/_base/Color.js @@ -0,0 +1,156 @@ +if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.Color"] = true; +dojo.provide("dojo._base.Color"); +dojo.require("dojo._base.array"); +dojo.require("dojo._base.lang"); + +dojo.Color = function(/*Array|String|Object*/ color){ + // summary: + // takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another dojo.Color object + if(color){ this.setColor(color); } +}; + +// FIXME: there's got to be a more space-efficient way to encode or discover these!! Use hex? +dojo.Color.named = { + black: [0,0,0], + silver: [192,192,192], + gray: [128,128,128], + white: [255,255,255], + maroon: [128,0,0], + red: [255,0,0], + purple: [128,0,128], + fuchsia: [255,0,255], + green: [0,128,0], + lime: [0,255,0], + olive: [128,128,0], + yellow: [255,255,0], + navy: [0,0,128], + blue: [0,0,255], + teal: [0,128,128], + aqua: [0,255,255] +}; + + +dojo.extend(dojo.Color, { + r: 255, g: 255, b: 255, a: 1, + _set: function(r, g, b, a){ + var t = this; t.r = r; t.g = g; t.b = b; t.a = a; + }, + setColor: function(/*Array|String|Object*/ color){ + // summary: + // takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another dojo.Color object + var d = dojo; + if(d.isString(color)){ + d.colorFromString(color, this); + }else if(d.isArray(color)){ + d.colorFromArray(color, this); + }else{ + this._set(color.r, color.g, color.b, color.a); + if(!(color instanceof d.Color)){ this.sanitize(); } + } + return this; // dojo.Color + }, + sanitize: function(){ + // summary: + // makes sure that the object has correct attributes + // description: + // the default implementation does nothing, include dojo.colors to + // augment it to real checks + return this; // dojo.Color + }, + toRgb: function(){ + // summary: returns 3 component array of rgb values + var t = this; + return [t.r, t.g, t.b]; // Array + }, + toRgba: function(){ + // summary: returns a 4 component array of rgba values + var t = this; + return [t.r, t.g, t.b, t.a]; // Array + }, + toHex: function(){ + // summary: returns a css color string in hexadecimal representation + var arr = dojo.map(["r", "g", "b"], function(x){ + var s = this[x].toString(16); + return s.length < 2 ? "0" + s : s; + }, this); + return "#" + arr.join(""); // String + }, + toCss: function(/*Boolean?*/ includeAlpha){ + // summary: returns a css color string in rgb(a) representation + var t = this, rgb = t.r + ", " + t.g + ", " + t.b; + return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String + }, + toString: function(){ + // summary: returns a visual representation of the color + return this.toCss(true); // String + } +}); + +dojo.blendColors = function( + /*dojo.Color*/ start, + /*dojo.Color*/ end, + /*Number*/ weight, + /*dojo.Color?*/ obj +){ + // summary: + // blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend, + // can reuse a previously allocated dojo.Color object for the result + var d = dojo, t = obj || new dojo.Color(); + d.forEach(["r", "g", "b", "a"], function(x){ + t[x] = start[x] + (end[x] - start[x]) * weight; + if(x != "a"){ t[x] = Math.round(t[x]); } + }); + return t.sanitize(); // dojo.Color +}; + +dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: get rgb(a) array from css-style color declarations + var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/); + return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color +}; + +dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: converts a hex string with a '#' prefix to a color object. + // Supports 12-bit #rgb shorthand. + var d = dojo, t = obj || new d.Color(), + bits = (color.length == 4) ? 4 : 8, + mask = (1 << bits) - 1; + color = Number("0x" + color.substr(1)); + if(isNaN(color)){ + return null; // dojo.Color + } + d.forEach(["b", "g", "r"], function(x){ + var c = color & mask; + color >>= bits; + t[x] = bits == 4 ? 17 * c : c; + }); + t.a = 1; + return t; // dojo.Color +}; + +dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){ + // summary: builds a color from 1, 2, 3, or 4 element array + var t = obj || new dojo.Color(); + t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3])); + if(isNaN(t.a)){ t.a = 1; } + return t.sanitize(); // dojo.Color +}; + +dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){ + // summary: + // parses str for a color value. + // description: + // Acceptable input values for str may include arrays of any form + // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or + // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10, + // 10, 50)" + // returns: + // a dojo.Color object. If obj is passed, it will be the return value. + var a = dojo.Color.named[str]; + return a && dojo.colorFromArray(a, obj) || dojo.colorFromRgb(str, obj) || dojo.colorFromHex(str, obj); +}; + +} diff --git a/includes/js/dojo/_base/Deferred.js b/includes/js/dojo/_base/Deferred.js new file mode 100644 index 0000000..9fe8918 --- /dev/null +++ b/includes/js/dojo/_base/Deferred.js @@ -0,0 +1,408 @@ +if(!dojo._hasResource["dojo._base.Deferred"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.Deferred"] = true; +dojo.provide("dojo._base.Deferred"); +dojo.require("dojo._base.lang"); + +dojo.Deferred = function(/*Function?*/ canceller){ + // summary: + // Encapsulates a sequence of callbacks in response to a value that + // may not yet be available. This is modeled after the Deferred class + // from Twisted . + // description: + // JavaScript has no threads, and even if it did, threads are hard. + // Deferreds are a way of abstracting non-blocking events, such as the + // final response to an XMLHttpRequest. Deferreds create a promise to + // return a response a some point in the future and an easy way to + // register your interest in receiving that response. + // + // The most important methods for Deffered users are: + // + // * addCallback(handler) + // * addErrback(handler) + // * callback(result) + // * errback(result) + // + // In general, when a function returns a Deferred, users then "fill + // in" the second half of the contract by registering callbacks and + // error handlers. You may register as many callback and errback + // handlers as you like and they will be executed in the order + // registered when a result is provided. Usually this result is + // provided as the result of an asynchronous operation. The code + // "managing" the Deferred (the code that made the promise to provide + // an answer later) will use the callback() and errback() methods to + // communicate with registered listeners about the result of the + // operation. At this time, all registered result handlers are called + // *with the most recent result value*. + // + // Deferred callback handlers are treated as a chain, and each item in + // the chain is required to return a value that will be fed into + // successive handlers. The most minimal callback may be registered + // like this: + // + // | var d = new dojo.Deferred(); + // | d.addCallback(function(result){ return result; }); + // + // Perhaps the most common mistake when first using Deferreds is to + // forget to return a value (in most cases, the value you were + // passed). + // + // The sequence of callbacks is internally represented as a list of + // 2-tuples containing the callback/errback pair. For example, the + // following call sequence: + // + // | var d = new dojo.Deferred(); + // | d.addCallback(myCallback); + // | d.addErrback(myErrback); + // | d.addBoth(myBoth); + // | d.addCallbacks(myCallback, myErrback); + // + // is translated into a Deferred with the following internal + // representation: + // + // | [ + // | [myCallback, null], + // | [null, myErrback], + // | [myBoth, myBoth], + // | [myCallback, myErrback] + // | ] + // + // The Deferred also keeps track of its current status (fired). Its + // status may be one of three things: + // + // * -1: no value yet (initial condition) + // * 0: success + // * 1: error + // + // A Deferred will be in the error state if one of the following three + // conditions are met: + // + // 1. The result given to callback or errback is "instanceof" Error + // 2. The previous callback or errback raised an exception while + // executing + // 3. The previous callback or errback returned a value + // "instanceof" Error + // + // Otherwise, the Deferred will be in the success state. The state of + // the Deferred determines the next element in the callback sequence + // to run. + // + // When a callback or errback occurs with the example deferred chain, + // something equivalent to the following will happen (imagine + // that exceptions are caught and returned): + // + // | // d.callback(result) or d.errback(result) + // | if(!(result instanceof Error)){ + // | result = myCallback(result); + // | } + // | if(result instanceof Error){ + // | result = myErrback(result); + // | } + // | result = myBoth(result); + // | if(result instanceof Error){ + // | result = myErrback(result); + // | }else{ + // | result = myCallback(result); + // | } + // + // The result is then stored away in case another step is added to the + // callback sequence. Since the Deferred already has a value + // available, any new callbacks added will be called immediately. + // + // There are two other "advanced" details about this implementation + // that are useful: + // + // Callbacks are allowed to return Deferred instances themselves, so + // you can build complicated sequences of events with ease. + // + // The creator of the Deferred may specify a canceller. The canceller + // is a function that will be called if Deferred.cancel is called + // before the Deferred fires. You can use this to implement clean + // aborting of an XMLHttpRequest, etc. Note that cancel will fire the + // deferred with a CancelledError (unless your canceller returns + // another kind of error), so the errbacks should be prepared to + // handle that error for cancellable Deferreds. + // example: + // | var deferred = new dojo.Deferred(); + // | setTimeout(function(){ deferred.callback({success: true}); }, 1000); + // | return deferred; + // example: + // Deferred objects are often used when making code asynchronous. It + // may be easiest to write functions in a synchronous manner and then + // split code using a deferred to trigger a response to a long-lived + // operation. For example, instead of register a callback function to + // denote when a rendering operation completes, the function can + // simply return a deferred: + // + // | // callback style: + // | function renderLotsOfData(data, callback){ + // | var success = false + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | success = true; + // | }catch(e){ } + // | if(callback){ + // | callback(success); + // | } + // | } + // + // | // using callback style + // | renderLotsOfData(someDataObj, function(success){ + // | // handles success or failure + // | if(!success){ + // | promptUserToRecover(); + // | } + // | }); + // | // NOTE: no way to add another callback here!! + // example: + // Using a Deferred doesn't simplify the sending code any, but it + // provides a standard interface for callers and senders alike, + // providing both with a simple way to service multiple callbacks for + // an operation and freeing both sides from worrying about details + // such as "did this get called already?". With Deferreds, new + // callbacks can be added at any time. + // + // | // Deferred style: + // | function renderLotsOfData(data){ + // | var d = new dojo.Deferred(); + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | d.callback(true); + // | }catch(e){ + // | d.errback(new Error("rendering failed")); + // | } + // | return d; + // | } + // + // | // using Deferred style + // | renderLotsOfData(someDataObj).addErrback(function(){ + // | promptUserToRecover(); + // | }); + // | // NOTE: addErrback and addCallback both return the Deferred + // | // again, so we could chain adding callbacks or save the + // | // deferred for later should we need to be notified again. + // example: + // In this example, renderLotsOfData is syncrhonous and so both + // versions are pretty artificial. Putting the data display on a + // timeout helps show why Deferreds rock: + // + // | // Deferred style and async func + // | function renderLotsOfData(data){ + // | var d = new dojo.Deferred(); + // | setTimeout(function(){ + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | d.callback(true); + // | }catch(e){ + // | d.errback(new Error("rendering failed")); + // | } + // | }, 100); + // | return d; + // | } + // + // | // using Deferred style + // | renderLotsOfData(someDataObj).addErrback(function(){ + // | promptUserToRecover(); + // | }); + // + // Note that the caller doesn't have to change his code at all to + // handle the asynchronous case. + + this.chain = []; + this.id = this._nextId(); + this.fired = -1; + this.paused = 0; + this.results = [null, null]; + this.canceller = canceller; + this.silentlyCancelled = false; +}; + +dojo.extend(dojo.Deferred, { + /* + makeCalled: function(){ + // summary: + // returns a new, empty deferred, which is already in the called + // state. Calling callback() or errback() on this deferred will + // yeild an error and adding new handlers to it will result in + // them being called immediately. + var deferred = new dojo.Deferred(); + deferred.callback(); + return deferred; + }, + + toString: function(){ + var state; + if(this.fired == -1){ + state = 'unfired'; + }else{ + state = this.fired ? 'success' : 'error'; + } + return 'Deferred(' + this.id + ', ' + state + ')'; + }, + */ + + _nextId: (function(){ + var n = 1; + return function(){ return n++; }; + })(), + + cancel: function(){ + // summary: + // Cancels a Deferred that has not yet received a value, or is + // waiting on another Deferred as its value. + // description: + // If a canceller is defined, the canceller is called. If the + // canceller did not return an error, or there was no canceller, + // then the errback chain is started. + var err; + if(this.fired == -1){ + if(this.canceller){ + err = this.canceller(this); + }else{ + this.silentlyCancelled = true; + } + if(this.fired == -1){ + if(!(err instanceof Error)){ + var res = err; + err = new Error("Deferred Cancelled"); + err.dojoType = "cancel"; + err.cancelResult = res; + } + this.errback(err); + } + }else if( (this.fired == 0) && + (this.results[0] instanceof dojo.Deferred) + ){ + this.results[0].cancel(); + } + }, + + + _resback: function(res){ + // summary: + // The private primitive that means either callback or errback + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + this._fire(); + }, + + _check: function(){ + if(this.fired != -1){ + if(!this.silentlyCancelled){ + throw new Error("already called!"); + } + this.silentlyCancelled = false; + return; + } + }, + + callback: function(res){ + // summary: + // Begin the callback sequence with a non-error value. + + /* + callback or errback should only be called once on a given + Deferred. + */ + this._check(); + this._resback(res); + }, + + errback: function(/*Error*/res){ + // summary: + // Begin the callback sequence with an error result. + this._check(); + if(!(res instanceof Error)){ + res = new Error(res); + } + this._resback(res); + }, + + addBoth: function(/*Function|Object*/cb, /*String?*/cbfn){ + // summary: + // Add the same function as both a callback and an errback as the + // next element on the callback sequence.This is useful for code + // that you want to guarantee to run, e.g. a finalizer. + var enclosed = dojo.hitch.apply(dojo, arguments); + return this.addCallbacks(enclosed, enclosed); + }, + + addCallback: function(/*Function|Object*/cb, /*String?*/cbfn /*...*/){ + // summary: + // Add a single callback to the end of the callback sequence. + return this.addCallbacks(dojo.hitch.apply(dojo, arguments)); + }, + + addErrback: function(cb, cbfn){ + // summary: + // Add a single callback to the end of the callback sequence. + return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments)); + }, + + addCallbacks: function(cb, eb){ + // summary: + // Add separate callback and errback to the end of the callback + // sequence. + this.chain.push([cb, eb]) + if(this.fired >= 0){ + this._fire(); + } + return this; + }, + + _fire: function(){ + // summary: + // Used internally to exhaust the callback sequence when a result + // is available. + var chain = this.chain; + var fired = this.fired; + var res = this.results[fired]; + var self = this; + var cb = null; + while( + (chain.length > 0) && + (this.paused == 0) + ){ + // Array + var f = chain.shift()[fired]; + if(!f){ continue; } + try{ + res = f(res); + fired = ((res instanceof Error) ? 1 : 0); + if(res instanceof dojo.Deferred){ + cb = function(res){ + self._resback(res); + // inlined from _pause() + self.paused--; + if( + (self.paused == 0) && + (self.fired >= 0) + ){ + self._fire(); + } + } + // inlined from _unpause + this.paused++; + } + }catch(err){ + console.debug(err); + fired = 1; + res = err; + } + } + this.fired = fired; + this.results[fired] = res; + if((cb)&&(this.paused)){ + // this is for "tail recursion" in case the dependent + // deferred is already fired + res.addBoth(cb); + } + } +}); + +} diff --git a/includes/js/dojo/_base/NodeList.js b/includes/js/dojo/_base/NodeList.js new file mode 100644 index 0000000..c10e18d --- /dev/null +++ b/includes/js/dojo/_base/NodeList.js @@ -0,0 +1,532 @@ +if(!dojo._hasResource["dojo._base.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.NodeList"] = true; +dojo.provide("dojo._base.NodeList"); +dojo.require("dojo._base.lang"); +dojo.require("dojo._base.array"); + +(function(){ + + var d = dojo; + + var tnl = function(arr){ + // decorate an array to make it look like a NodeList + arr.constructor = dojo.NodeList; + dojo._mixin(arr, dojo.NodeList.prototype); + return arr; + } + + var _mapIntoDojo = function(func, alwaysThis){ + // returns a function which, when executed in the scope of its caller, + // applies the passed arguments to a particular dojo.* function (named + // in func) and aggregates the returns. if alwaysThis is true, it + // always returns the scope object and not the collected returns from + // the Dojo method + return function(){ + var _a = arguments; + var aa = d._toArray(_a, 0, [null]); + var s = this.map(function(i){ + aa[0] = i; + return d[func].apply(d, aa); + }); + return (alwaysThis || ( (_a.length > 1) || !d.isString(_a[0]) )) ? this : s; // String||dojo.NodeList + } + }; + + dojo.NodeList = function(){ + // summary: + // dojo.NodeList is as subclass of Array which adds syntactic + // sugar for chaining, common iteration operations, animation, + // and node manipulation. NodeLists are most often returned as + // the result of dojo.query() calls. + // example: + // create a node list from a node + // | new dojo.NodeList(dojo.byId("foo")); + + return tnl(Array.apply(null, arguments)); + } + + dojo.NodeList._wrap = tnl; + + dojo.extend(dojo.NodeList, { + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods + + // FIXME: handle return values for #3244 + // http://trac.dojotoolkit.org/ticket/3244 + + // FIXME: + // need to wrap or implement: + // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?) + // reduce + // reduceRight + + slice: function(/*===== begin, end =====*/){ + // summary: + // Returns a new NodeList, maintaining this one in place + // description: + // This method behaves exactly like the Array.slice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice + // begin: Integer + // Can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // end: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + var a = dojo._toArray(arguments); + return tnl(a.slice.apply(this, a)); + }, + + splice: function(/*===== index, howmany, item =====*/){ + // summary: + // Returns a new NodeList, manipulating this NodeList based on + // the arguments passed, potentially splicing in new elements + // at an offset, optionally deleting elements + // description: + // This method behaves exactly like the Array.splice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // + // index: Integer + // begin can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // howmany: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + // item: Object...? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + var a = dojo._toArray(arguments); + return tnl(a.splice.apply(this, a)); + }, + + concat: function(/*===== item =====*/){ + // summary: + // Returns a new NodeList comprised of items in this NodeList + // as well as items passed in as parameters + // description: + // This method behaves exactly like the Array.concat method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // + // item: Object...? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + var a = dojo._toArray(arguments, 0, [this]); + return tnl(a.concat.apply([], a)); + }, + + indexOf: function(/*Object*/ value, /*Integer?*/ fromIndex){ + // summary: + // see dojo.indexOf(). The primary difference is that the acted-on + // array is implicitly this NodeList + // value: + // The value to search for. + // fromIndex: + // The loction to start searching from. Optional. Defaults to 0. + // description: + // For more details on the behavior of indexOf, see: + // + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.indexOf(this, value, fromIndex); // Integer + }, + + lastIndexOf: function(/*===== value, fromIndex =====*/){ + // summary: + // see dojo.lastIndexOf(). The primary difference is that the + // acted-on array is implicitly this NodeList + // description: + // For more details on the behavior of lastIndexOf, see: + // + // value: Object + // The value to search for. + // fromIndex: Integer? + // The loction to start searching from. Optional. Defaults to 0. + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.lastIndexOf.apply(d, d._toArray(arguments, 0, [this])); // Integer + }, + + every: function(/*Function*/callback, /*Object?*/thisObject){ + // summary: + // see `dojo.every()` and: + // + // Takes the same structure of arguments and returns as + // dojo.every() with the caveat that the passed array is + // implicitly this NodeList + return d.every(this, callback, thisObject); // Boolean + }, + + some: function(/*Function*/callback, /*Object?*/thisObject){ + // summary: + // see dojo.some() and: + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some + // Takes the same structure of arguments and returns as + // dojo.some() with the caveat that the passed array is + // implicitly this NodeList + return d.some(this, callback, thisObject); // Boolean + }, + + map: function(/*Function*/ func, /*Function?*/ obj){ + // summary: + // see dojo.map(). The primary difference is that the acted-on + // array is implicitly this NodeList and the return is a + // dojo.NodeList (a subclass of Array) + + return d.map(this, func, obj, d.NodeList); // dojo.NodeList + }, + + forEach: function(callback, thisObj){ + // summary: + // see dojo.forEach(). The primary difference is that the acted-on + // array is implicitly this NodeList + + d.forEach(this, callback, thisObj); + // non-standard return to allow easier chaining + return this; // dojo.NodeList + }, + + // custom methods + + coords: function(){ + // summary: + // Returns the box objects all elements in a node list as + // an Array (*not* a NodeList) + + return d.map(this, d.coords); // Array + }, + + /*===== + attr: function(property, value){ + // summary: + // gets or sets the DOM attribute for every element in the + // NodeList + // property: String + // the attribute to get/set + // value: String? + // optional. The value to set the property to + // return: + // if no value is passed, the result is an array of attribute values + // If a value is passed, the return is this NodeList + }, + + style: function(property, value){ + // summary: + // gets or sets the CSS property for every element in the NodeList + // property: String + // the CSS property to get/set, in JavaScript notation + // ("lineHieght" instead of "line-height") + // value: String? + // optional. The value to set the property to + // return: + // if no value is passed, the result is an array of strings. + // If a value is passed, the return is this NodeList + }, + + addClass: function(className){ + // summary: + // adds the specified class to every node in the list + // className: String + // the CSS class to add + // return: + // dojo.NodeList, this list + }, + + removeClass: function(className){ + // summary: + // removes the specified class from every node in the list + // className: String + // the CSS class to add + // return: + // dojo.NodeList, this list + }, + + toggleClass: function(className, condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // condition: Boolean? + // If passed, true means to add the class, false means to remove. + // className: String + // the CSS class to add + // return: dojo.NodeList + // this list + }, + + connect: function(methodName, objOrFunc, funcName){ + // summary: + // attach event handlers to every item of the NodeList. Uses dojo.connect() + // so event properties are normalized + // methodName: String + // the name of the method to attach to. For DOM events, this should be + // the lower-case name of the event + // objOrFunc: Object|Function|String + // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should + // reference a function or be the name of the function in the global + // namespace to attach. If 3 arguments are provided + // (methodName, objOrFunc, funcName), objOrFunc must be the scope to + // locate the bound function in + // funcName: String? + // optional. A string naming the function in objOrFunc to bind to the + // event. May also be a function reference. + // example: + // add an onclick handler to every button on the page + // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){ + // | console.debug("clicked!"); + // | }); + // example: + // attach foo.bar() to every odd div's onmouseover + // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar"); + }, + =====*/ + attr: _mapIntoDojo("attr"), + style: _mapIntoDojo("style"), + addClass: _mapIntoDojo("addClass", true), + removeClass: _mapIntoDojo("removeClass", true), + toggleClass: _mapIntoDojo("toggleClass", true), + connect: _mapIntoDojo("connect", true), + + // FIXME: connectPublisher()? connectRunOnce()? + + place: function(/*String||Node*/ queryOrNode, /*String*/ position){ + // summary: + // places elements of this node list relative to the first element matched + // by queryOrNode. Returns the original NodeList. + // queryOrNode: + // may be a string representing any valid CSS3 selector or a DOM node. + // In the selector case, only the first matching element will be used + // for relative positioning. + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + var item = d.query(queryOrNode)[0]; + return this.forEach(function(i){ d.place(i, item, (position||"last")); }); // dojo.NodeList + }, + + orphan: function(/*String?*/ simpleFilter){ + // summary: + // removes elements in this list that match the simple + // filter from their parents and returns them as a new + // NodeList. + // simpleFilter: + // single-expression CSS filter + // return: + // `dojo.NodeList` the orpahned elements + var orphans = simpleFilter ? d._filterQueryResult(this, simpleFilter) : this; + orphans.forEach(function(item){ + if(item.parentNode){ + item.parentNode.removeChild(item); + } + }); + return orphans; // dojo.NodeList + }, + + adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){ + // summary: + // places any/all elements in queryOrListOrNode at a + // position relative to the first element in this list. + // Returns a dojo.NodeList of the adopted elements. + // queryOrListOrNode: + // a DOM node or a query string or a query result. + // Represents the nodes to be adopted relative to the + // first element of this NodeList. + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + var item = this[0]; + return d.query(queryOrListOrNode).forEach(function(ai){ d.place(ai, item, position || "last"); }); // dojo.NodeList + }, + + // FIXME: do we need this? + query: function(/*String*/ queryStr){ + // summary: + // Returns a new, flattened NodeList. Elements of the new list + // satisfy the passed query but use elements of the + // current NodeList as query roots. + + if(!queryStr){ return this; } + + // FIXME: probably slow + // FIXME: use map? + var ret = d.NodeList(); + this.forEach(function(item){ + d.query(queryStr, item).forEach(function(subItem){ + if(subItem !== undefined){ + ret.push(subItem); + } + }); + }); + return ret; // dojo.NodeList + }, + + filter: function(/*String*/ simpleQuery){ + // summary: + // "masks" the built-in javascript filter() method to support + // passing a simple string filter in addition to supporting + // filtering function objects. + // example: + // "regular" JS filter syntax as exposed in dojo.filter: + // | dojo.query("*").filter(function(item){ + // | // highlight every paragraph + // | return (item.nodeName == "p"); + // | }).styles("backgroundColor", "yellow"); + // example: + // the same filtering using a CSS selector + // | dojo.query("*").filter("p").styles("backgroundColor", "yellow"); + + var items = this; + var _a = arguments; + var r = d.NodeList(); + var rp = function(t){ + if(t !== undefined){ + r.push(t); + } + } + if(d.isString(simpleQuery)){ + items = d._filterQueryResult(this, _a[0]); + if(_a.length == 1){ + // if we only got a string query, pass back the filtered results + return items; // dojo.NodeList + } + // if we got a callback, run it over the filtered items + _a.shift(); + } + // handle the (callback, [thisObject]) case + d.forEach(d.filter(items, _a[0], _a[1]), rp); + return r; // dojo.NodeList + }, + + /* + // FIXME: should this be "copyTo" and include parenting info? + clone: function(){ + // summary: + // creates node clones of each element of this list + // and returns a new list containing the clones + }, + */ + + addContent: function(/*String*/ content, /*String||Integer?*/ position){ + // summary: + // add a node or some HTML as a string to every item in the list. + // Returns the original list. + // description: + // a copy of the HTML content is added to each item in the + // list, with an optional position argument. If no position + // argument is provided, the content is appended to the end of + // each item. + // content: + // the HTML in string format to add at position to every item + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + // example: + // appends content to the end if the position is ommitted + // | dojo.query("h3 > p").addContent("hey there!"); + // example: + // add something to the front of each element that has a "thinger" property: + // | dojo.query("[thinger]").addContent("...", "first"); + // example: + // adds a header before each element of the list + // | dojo.query(".note").addContent("

          NOTE:

          ", "before"); + var ta = d.doc.createElement("span"); + if(d.isString(content)){ + ta.innerHTML = content; + }else{ + ta.appendChild(content); + } + if(position === undefined){ + position = "last"; + } + var ct = (position == "first" || position == "after") ? "lastChild" : "firstChild"; + this.forEach(function(item){ + var tn = ta.cloneNode(true); + while(tn[ct]){ + d.place(tn[ct], item, position); + } + }); + return this; // dojo.NodeList + }, + + empty: function(){ + // summary: + // clears all content from each node in the list + return this.forEach("item.innerHTML='';"); // dojo.NodeList + + // FIXME: should we be checking for and/or disposing of widgets below these nodes? + }, + + instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){ + // summary: + // Create a new instance of a specified class, using the + // specified properties and each node in the nodeList as a + // srcNodeRef + // + var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass); + return this.forEach(function(i){ + new c(properties||{},i); + }) // dojo.NodeList + } + + }); + + // syntactic sugar for DOM events + d.forEach([ + "blur", "focus", "click", "keydown", "keypress", "keyup", "mousedown", + "mouseenter", "mouseleave", "mousemove", "mouseout", "mouseover", + "mouseup" + ], function(evt){ + var _oe = "on"+evt; + dojo.NodeList.prototype[_oe] = function(a, b){ + return this.connect(_oe, a, b); + } + // FIXME: should these events trigger publishes? + /* + return (a ? this.connect(_oe, a, b) : + this.forEach(function(n){ + // FIXME: + // listeners get buried by + // addEventListener and can't be dug back + // out to be triggered externally. + // see: + // http://developer.mozilla.org/en/docs/DOM:element + + console.debug(n, evt, _oe); + + // FIXME: need synthetic event support! + var _e = { target: n, faux: true, type: evt }; + // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt }); + try{ n[evt](_e); }catch(e){ console.debug(e); } + try{ n[_oe](_e); }catch(e){ console.debug(e); } + }) + ); + } + */ + } + ); + +})(); + +} diff --git a/includes/js/dojo/_base/_loader/bootstrap.js b/includes/js/dojo/_base/_loader/bootstrap.js new file mode 100644 index 0000000..c62ab6a --- /dev/null +++ b/includes/js/dojo/_base/_loader/bootstrap.js @@ -0,0 +1,436 @@ +/*===== +// note: +// 'djConfig' does not exist under 'dojo.*' so that it can be set before the +// 'dojo' variable exists. +// note: +// Setting any of these variables *after* the library has loaded does +// nothing at all. + +djConfig = { + // summary: + // Application code can set the global 'djConfig' prior to loading + // the library to override certain global settings for how dojo works. + // + // isDebug: Boolean + // Defaults to `false`. If set to `true`, ensures that Dojo provides + // extende debugging feedback via Firebug. If Firebug is not available + // on your platform, setting `isDebug` to `true` will force Dojo to + // pull in (and display) the version of Firebug Lite which is + // integrated into the Dojo distribution, thereby always providing a + // debugging/logging console when `isDebug` is enabled. Note that + // Firebug's `console.*` methods are ALWAYS defined by Dojo. If + // `isDebug` is false and you are on a platform without Firebug, these + // methods will be defined as no-ops. + isDebug: false, + // debugAtAllCosts: Boolean + // Defaults to `false`. If set to `true`, this triggers an alternate + // mode of the package system in which dependencies are detected and + // only then are resources evaluated in dependency order via + // ` + // | + d._modulePrefixes[module] = { name: module, value: prefix }; + } + + dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ + // summary: + // Declares translated resources and loads them if necessary, in the + // same style as dojo.require. Contents of the resource bundle are + // typically strings, but may be any name/value pair, represented in + // JSON format. See also dojo.i18n.getLocalization. + // moduleName: + // name of the package containing the "nls" directory in which the + // bundle is found + // bundleName: + // bundle name, i.e. the filename without the '.js' suffix + // locale: + // the locale to load (optional) By default, the browser's user + // locale as defined by dojo.locale + // availableFlatLocales: + // A comma-separated list of the available, flattened locales for this + // bundle. This argument should only be set by the build process. + // description: + // Load translated resource bundles provided underneath the "nls" + // directory within a package. Translated resources may be located in + // different packages throughout the source tree. For example, a + // particular widget may define one or more resource bundles, + // structured in a program as follows, where moduleName is + // mycode.mywidget and bundleNames available include bundleone and + // bundletwo: + // + // | ... + // | mycode/ + // | mywidget/ + // | nls/ + // | bundleone.js (the fallback translation, English in this example) + // | bundletwo.js (also a fallback translation) + // | de/ + // | bundleone.js + // | bundletwo.js + // | de-at/ + // | bundleone.js + // | en/ + // | (empty; use the fallback translation) + // | en-us/ + // | bundleone.js + // | en-gb/ + // | bundleone.js + // | es/ + // | bundleone.js + // | bundletwo.js + // | ...etc + // | ... + // + // Each directory is named for a locale as specified by RFC 3066, + // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase. + // Note that the two bundles in the example do not define all the + // same variants. For a given locale, bundles will be loaded for + // that locale and all more general locales above it, including a + // fallback at the root directory. For example, a declaration for + // the "de-at" locale will first load `nls/de-at/bundleone.js`, + // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The + // data will be flattened into a single Object so that lookups + // will follow this cascading pattern. An optional build step can + // preload the bundles to avoid data redundancy and the multiple + // network hits normally required to load these resources. + + d.require("dojo.i18n"); + d.i18n._requireLocalization.apply(d.hostenv, arguments); + }; + + + var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"); + var ire = new RegExp("^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$"); + + dojo._Url = function(/*dojo._Url||String...*/){ + // summary: + // Constructor to create an object representing a URL. + // It is marked as private, since we might consider removing + // or simplifying it. + // description: + // Each argument is evaluated in order relative to the next until + // a canonical uri is produced. To get an absolute Uri relative to + // the current document use: + // new dojo._Url(document.baseURI, url) + + var n = null; + + // TODO: support for IPv6, see RFC 2732 + var _a = arguments; + var uri = [_a[0]]; + // resolve uri components relative to each other + for(var i = 1; i<_a.length; i++){ + if(!_a[i]){ continue; } + + // Safari doesn't support this.constructor so we have to be explicit + // FIXME: Tracked (and fixed) in Webkit bug 3537. + // http://bugs.webkit.org/show_bug.cgi?id=3537 + var relobj = new d._Url(_a[i]+""); + var uriobj = new d._Url(uri[0]+""); + + if( + relobj.path == "" && + !relobj.scheme && + !relobj.authority && + !relobj.query + ){ + if(relobj.fragment != n){ + uriobj.fragment = relobj.fragment; + } + relobj = uriobj; + }else if(!relobj.scheme){ + relobj.scheme = uriobj.scheme; + + if(!relobj.authority){ + relobj.authority = uriobj.authority; + + if(relobj.path.charAt(0) != "/"){ + var path = uriobj.path.substring(0, + uriobj.path.lastIndexOf("/") + 1) + relobj.path; + + var segs = path.split("/"); + for(var j = 0; j < segs.length; j++){ + if(segs[j] == "."){ + // flatten "./" references + if(j == segs.length - 1){ + segs[j] = ""; + }else{ + segs.splice(j, 1); + j--; + } + }else if(j > 0 && !(j == 1 && segs[0] == "") && + segs[j] == ".." && segs[j-1] != ".."){ + // flatten "../" references + if(j == (segs.length - 1)){ + segs.splice(j, 1); + segs[j - 1] = ""; + }else{ + segs.splice(j - 1, 2); + j -= 2; + } + } + } + relobj.path = segs.join("/"); + } + } + } + + uri = []; + if(relobj.scheme){ + uri.push(relobj.scheme, ":"); + } + if(relobj.authority){ + uri.push("//", relobj.authority); + } + uri.push(relobj.path); + if(relobj.query){ + uri.push("?", relobj.query); + } + if(relobj.fragment){ + uri.push("#", relobj.fragment); + } + } + + this.uri = uri.join(""); + + // break the uri into its main components + var r = this.uri.match(ore); + + this.scheme = r[2] || (r[1] ? "" : n); + this.authority = r[4] || (r[3] ? "" : n); + this.path = r[5]; // can never be undefined + this.query = r[7] || (r[6] ? "" : n); + this.fragment = r[9] || (r[8] ? "" : n); + + if(this.authority != n){ + // server based naming authority + r = this.authority.match(ire); + + this.user = r[3] || n; + this.password = r[4] || n; + this.host = r[5]; + this.port = r[7] || n; + } + } + + dojo._Url.prototype.toString = function(){ return this.uri; }; + + dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){ + // summary: + // Returns a `dojo._Url` object relative to a module. + // example: + // | var pngPath = dojo.moduleUrl("acme","images/small.png"); + // | console.dir(pngPath); // list the object properties + // | // create an image and set it's source to pngPath's value: + // | var img = document.createElement("img"); + // | // NOTE: we assign the string representation of the url object + // | img.src = pngPath.toString(); + // | // add our image to the document + // | dojo.body().appendChild(img); + // example: + // you may de-reference as far as you like down the package + // hierarchy. This is sometimes handy to avoid lenghty relative + // urls or for building portable sub-packages. In this example, + // the `acme.widget` and `acme.util` directories may be located + // under different roots (see `dojo.registerModulePath`) but the + // the modules which reference them can be unaware of their + // relative locations on the filesystem: + // | // somewhere in a configuration block + // | dojo.registerModulePath("acme.widget", "../../acme/widget"); + // | dojo.registerModulePath("acme.util", "../../util"); + // | + // | // ... + // | + // | // code in a module using acme resources + // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html"); + // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json"); + + var loc = d._getModuleSymbols(module).join('/'); + if(!loc){ return null; } + if(loc.lastIndexOf("/") != loc.length-1){ + loc += "/"; + } + + //If the path is an absolute path (starts with a / or is on another + //domain/xdomain) then don't add the baseUrl. + var colonIndex = loc.indexOf(":"); + if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){ + loc = d.baseUrl + loc; + } + + return new d._Url(loc, url); // String + } +})(); + +} diff --git a/includes/js/dojo/_base/_loader/loader_debug.js b/includes/js/dojo/_base/_loader/loader_debug.js new file mode 100644 index 0000000..7e52373 --- /dev/null +++ b/includes/js/dojo/_base/_loader/loader_debug.js @@ -0,0 +1,61 @@ +if(!dojo._hasResource["dojo._base._loader.loader_debug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base._loader.loader_debug"] = true; +dojo.provide("dojo._base._loader.loader_debug"); + +//Override dojo.provide, so we can trigger the next +//script tag for the next local module. We can only add one +//at a time because there are browsers that execute script tags +//in the order that the code is received, and not in the DOM order. +dojo.nonDebugProvide = dojo.provide; + +dojo.provide = function(resourceName){ + var dbgQueue = dojo["_xdDebugQueue"]; + if(dbgQueue && dbgQueue.length > 0 && resourceName == dbgQueue["currentResourceName"]){ + //Set a timeout so the module can be executed into existence. Normally the + //dojo.provide call in a module is the first line. Don't want to risk attaching + //another script tag until the current one finishes executing. + if(dojo.isAIR){ + window.setTimeout(function(){dojo._xdDebugFileLoaded(resourceName);}, 1); + }else{ + window.setTimeout(dojo._scopeName + "._xdDebugFileLoaded('" + resourceName + "')", 1); + } + } + + return dojo.nonDebugProvide.apply(dojo, arguments); +} + +dojo._xdDebugFileLoaded = function(resourceName){ + + if(!this._xdDebugScopeChecked){ + //If using a scoped dojo, we need to expose dojo as a real global + //for the debugAtAllCosts stuff to work. + if(dojo._scopeName != "dojo"){ + window.dojo = window[dojo.config.scopeMap[0][1]]; + window.dijit = window[dojo.config.scopeMap[1][1]]; + window.dojox = window[dojo.config.scopeMap[2][1]]; + } + + this._xdDebugScopeChecked = true; + } + + var dbgQueue = this._xdDebugQueue; + + if(resourceName && resourceName == dbgQueue.currentResourceName){ + dbgQueue.shift(); + } + + if(dbgQueue.length == 0){ + dbgQueue.currentResourceName = null; + this._xdNotifyLoaded(); + }else{ + if(resourceName == dbgQueue.currentResourceName){ + dbgQueue.currentResourceName = dbgQueue[0].resourceName; + var element = document.createElement("script"); + element.type = "text/javascript"; + element.src = dbgQueue[0].resourcePath; + document.getElementsByTagName("head")[0].appendChild(element); + } + } +} + +} diff --git a/includes/js/dojo/_base/_loader/loader_xd.js b/includes/js/dojo/_base/_loader/loader_xd.js new file mode 100644 index 0000000..d851df8 --- /dev/null +++ b/includes/js/dojo/_base/_loader/loader_xd.js @@ -0,0 +1,631 @@ +if(!dojo._hasResource["dojo._base._loader.loader_xd"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base._loader.loader_xd"] = true; +//Cross-domain resource loader. +dojo.provide("dojo._base._loader.loader_xd"); + +dojo._xdReset = function(){ + //summary: Internal xd loader function. Resets the xd state. + + //This flag indicates where or not we have crossed into xdomain territory. Once any resource says + //it is cross domain, then the rest of the resources have to be treated as xdomain because we need + //to evaluate resources in order. If there is a xdomain resource followed by a xhr resource, we can't load + //the xhr resource until the one before it finishes loading. The text of the xhr resource will be converted + //to match the format for a xd resource and put in the xd load queue. + this._isXDomain = dojo.config.useXDomain || false; + + this._xdTimer = 0; + this._xdInFlight = {}; + this._xdOrderedReqs = []; + this._xdDepMap = {}; + this._xdContents = []; + this._xdDefList = []; +} + +//Call reset immediately to set the state. +dojo._xdReset(); + +dojo._xdCreateResource = function(/*String*/contents, /*String*/resourceName, /*String*/resourcePath){ + //summary: Internal xd loader function. Creates an xd module source given an + //non-xd module contents. + + //Remove comments. Not perfect, but good enough for dependency resolution. + var depContents = contents.replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg , ""); + + //Find dependencies. + var deps = []; + var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\(([\w\W]*?)\)/mg; + var match; + while((match = depRegExp.exec(depContents)) != null){ + if(match[1] == "requireLocalization"){ + //Need to load the local bundles asap, since they are not + //part of the list of modules watched for loading. + eval(match[0]); + }else{ + deps.push('"' + match[1] + '", ' + match[2]); + } + } + + //Create resource object and the call to _xdResourceLoaded. + var output = []; + output.push(dojo._scopeName + "._xdResourceLoaded({\n"); + + //Add dependencies + if(deps.length > 0){ + output.push("depends: ["); + for(var i = 0; i < deps.length; i++){ + if(i > 0){ + output.push(",\n"); + } + output.push("[" + deps[i] + "]"); + } + output.push("],"); + } + + //Add the contents of the file inside a function. + //Pass in scope arguments so we can support multiple versions of the + //same module on a page. + output.push("\ndefineResource: function(" + dojo._scopePrefixArgs + "){"); + + //Don't put in the contents in the debugAtAllCosts case + //since the contents may have syntax errors. Let those + //get pushed up when the script tags are added to the page + //in the debugAtAllCosts case. + if(!dojo.config["debugAtAllCosts"] || resourceName == "dojo._base._loader.loader_debug"){ + output.push(contents); + } + //Add isLocal property so we know if we have to do something different + //in debugAtAllCosts situations. + output.push("\n}, resourceName: '" + resourceName + "', resourcePath: '" + resourcePath + "'});"); + + return output.join(""); //String +} + +dojo._xdIsXDomainPath = function(/*string*/relpath) { + //summary: Figure out whether the path is local or x-domain + //If there is a colon before the first / then, we have a URL with a protocol. + + var colonIndex = relpath.indexOf(":"); + var slashIndex = relpath.indexOf("/"); + + if(colonIndex > 0 && colonIndex < slashIndex){ + return true; + }else{ + //Is the base script URI-based URL a cross domain URL? + //If so, then the relpath will be evaluated relative to + //baseUrl, and therefore qualify as xdomain. + //Only treat it as xdomain if the page does not have a + //host (file:// url) or if the baseUrl does not match the + //current window's domain. + var url = this.baseUrl; + colonIndex = url.indexOf(":"); + slashIndex = url.indexOf("/"); + if(colonIndex > 0 && colonIndex < slashIndex && (!location.host || url.indexOf("http://" + location.host) != 0)){ + return true; + } + } + return false; +} + +dojo._loadPath = function(/*String*/relpath, /*String?*/module, /*Function?*/cb){ + //summary: Internal xd loader function. Overrides loadPath() from loader.js. + //xd loading requires slightly different behavior from loadPath(). + + var currentIsXDomain = this._xdIsXDomainPath(relpath); + this._isXDomain |= currentIsXDomain; + + var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : this.baseUrl) + relpath; + + try{ + return ((!module || this._isXDomain) ? this._loadUri(uri, cb, currentIsXDomain, module) : this._loadUriAndCheck(uri, module, cb)); //Boolean + }catch(e){ + console.debug(e); + return false; //Boolean + } +} + +dojo._loadUri = function(/*String*/uri, /*Function?*/cb, /*boolean*/currentIsXDomain, /*String?*/module){ + //summary: Internal xd loader function. Overrides loadUri() from loader.js. + // xd loading requires slightly different behavior from loadPath(). + //description: Wanted to override getText(), but it is used by + // the widget code in too many, synchronous ways right now. + if(this._loadedUrls[uri]){ + return 1; //Boolean + } + + //Add the module (resource) to the list of modules. + //Only do this work if we have a modlue name. Otherwise, + //it is a non-xd i18n bundle, which can load immediately and does not + //need to be tracked. Also, don't track dojo.i18n, since it is a prerequisite + //and will be loaded correctly if we load it right away: it has no dependencies. + if(this._isXDomain && module && module != "dojo.i18n"){ + this._xdOrderedReqs.push(module); + + //Add to waiting resources if it is an xdomain resource. + //Don't add non-xdomain i18n bundles, those get evaled immediately. + if(currentIsXDomain || uri.indexOf("/nls/") == -1){ + this._xdInFlight[module] = true; + + //Increment inFlightCount + //This will stop the modulesLoaded from firing all the way. + this._inFlightCount++; + } + + //Start timer + if(!this._xdTimer){ + if(dojo.isAIR){ + this._xdTimer = setInterval(function(){dojo._xdWatchInFlight();}, 100); + }else{ + this._xdTimer = setInterval(dojo._scopeName + "._xdWatchInFlight();", 100); + } + } + this._xdStartTime = (new Date()).getTime(); + } + + if (currentIsXDomain){ + //Fix name to be a .xd.fileextension name. + var lastIndex = uri.lastIndexOf('.'); + if(lastIndex <= 0){ + lastIndex = uri.length - 1; + } + + var xdUri = uri.substring(0, lastIndex) + ".xd"; + if(lastIndex != uri.length - 1){ + xdUri += uri.substring(lastIndex, uri.length); + } + + if (dojo.isAIR){ + xdUri = xdUri.replace("app:/", "/"); + } + + //Add to script src + var element = document.createElement("script"); + element.type = "text/javascript"; + element.src = xdUri; + if(!this.headElement){ + this._headElement = document.getElementsByTagName("head")[0]; + + //Head element may not exist, particularly in html + //html 4 or tag soup cases where the page does not + //have a head tag in it. Use html element, since that will exist. + //Seems to be an issue mostly with Opera 9 and to lesser extent Safari 2 + if(!this._headElement){ + this._headElement = document.getElementsByTagName("html")[0]; + } + } + this._headElement.appendChild(element); + }else{ + var contents = this._getText(uri, null, true); + if(contents == null){ return 0; /*boolean*/} + + //If this is not xdomain, or if loading a i18n resource bundle, then send it down + //the normal eval/callback path. + if(this._isXDomain + && uri.indexOf("/nls/") == -1 + && module != "dojo.i18n"){ + var res = this._xdCreateResource(contents, module, uri); + dojo.eval(res); + }else{ + if(cb){ + contents = '('+contents+')'; + }else{ + //Only do the scoping if no callback. If a callback is specified, + //it is most likely the i18n bundle stuff. + contents = this._scopePrefix + contents + this._scopeSuffix; + } + var value = dojo["eval"](contents+"\r\n//@ sourceURL="+uri); + if(cb){ + cb(value); + } + } + } + + //These steps are done in the non-xd loader version of this function. + //Maintain these steps to fit in with the existing system. + this._loadedUrls[uri] = true; + this._loadedUrls.push(uri); + return true; //Boolean +} + +dojo._xdResourceLoaded = function(/*Object*/res){ + //summary: Internal xd loader function. Called by an xd module resource when + //it has been loaded via a script tag. + var deps = res.depends; + var requireList = null; + var requireAfterList = null; + var provideList = []; + if(deps && deps.length > 0){ + var dep = null; + var insertHint = 0; + var attachedResource = false; + for(var i = 0; i < deps.length; i++){ + dep = deps[i]; + + //Look for specific dependency indicators. + if (dep[0] == "provide"){ + provideList.push(dep[1]); + }else{ + if(!requireList){ + requireList = []; + } + if(!requireAfterList){ + requireAfterList = []; + } + + var unpackedDeps = this._xdUnpackDependency(dep); + if(unpackedDeps.requires){ + requireList = requireList.concat(unpackedDeps.requires); + } + if(unpackedDeps.requiresAfter){ + requireAfterList = requireAfterList.concat(unpackedDeps.requiresAfter); + } + } + + //Call the dependency indicator to allow for the normal dojo setup. + //Only allow for one dot reference, for the i18n._preloadLocalizations calls + //(and maybe future, one-dot things). + var depType = dep[0]; + var objPath = depType.split("."); + if(objPath.length == 2){ + dojo[objPath[0]][objPath[1]].apply(dojo[objPath[0]], dep.slice(1)); + }else{ + dojo[depType].apply(dojo, dep.slice(1)); + } + } + + + //If loading the debugAtAllCosts module, eval it right away since we need + //its functions to properly load the other modules. + if(provideList.length == 1 && provideList[0] == "dojo._base._loader.loader_debug"){ + res.defineResource(dojo); + }else{ + //Save off the resource contents for definition later. + var contentIndex = this._xdContents.push({ + content: res.defineResource, + resourceName: res["resourceName"], + resourcePath: res["resourcePath"], + isDefined: false + }) - 1; + + //Add provide/requires to dependency map. + for(var i = 0; i < provideList.length; i++){ + this._xdDepMap[provideList[i]] = { requires: requireList, requiresAfter: requireAfterList, contentIndex: contentIndex }; + } + } + + //Now update the inflight status for any provided resources in this loaded resource. + //Do this at the very end (in a *separate* for loop) to avoid shutting down the + //inflight timer check too soon. + for(var i = 0; i < provideList.length; i++){ + this._xdInFlight[provideList[i]] = false; + } + } +} + +dojo._xdLoadFlattenedBundle = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*Object*/bundleData){ + //summary: Internal xd loader function. Used when loading + //a flattened localized bundle via a script tag. + locale = locale || "root"; + var jsLoc = dojo.i18n.normalizeLocale(locale).replace('-', '_'); + var bundleResource = [moduleName, "nls", bundleName].join("."); + var bundle = dojo["provide"](bundleResource); + bundle[jsLoc] = bundleData; + + //Assign the bundle for the original locale(s) we wanted. + var mapName = [moduleName, jsLoc, bundleName].join("."); + var bundleMap = dojo._xdBundleMap[mapName]; + if(bundleMap){ + for(var param in bundleMap){ + bundle[param] = bundleData; + } + } +}; + + +dojo._xdInitExtraLocales = function(){ + // Simulate the extra locale work that dojo.requireLocalization does. + + var extra = dojo.config.extraLocale; + if(extra){ + if(!extra instanceof Array){ + extra = [extra]; + } + + dojo._xdReqLoc = dojo.xdRequireLocalization; + dojo.xdRequireLocalization = function(m, b, locale, fLocales){ + dojo._xdReqLoc(m,b,locale, fLocales); + if(locale){return;} + for(var i=0; i bestLocale.length){ + bestLocale = locales[i]; + } + } + } + + var fixedBestLocale = bestLocale.replace('-', '_'); + //See if the bundle we are going to use is already loaded. + var bundleResource = dojo.getObject([moduleName, "nls", bundleName].join(".")); + if(bundleResource && bundleResource[fixedBestLocale]){ + bundle[jsLoc.replace('-', '_')] = bundleResource[fixedBestLocale]; + }else{ + //Need to remember what locale we wanted and which one we actually use. + //Then when we load the one we are actually using, use that bundle for the one + //we originally wanted. + var mapName = [moduleName, (fixedBestLocale||"root"), bundleName].join("."); + var bundleMap = dojo._xdBundleMap[mapName]; + if(!bundleMap){ + bundleMap = dojo._xdBundleMap[mapName] = {}; + } + bundleMap[jsLoc.replace('-', '_')] = true; + + //Do just a normal dojo.require so the resource tracking stuff works as usual. + dojo.require(moduleName + ".nls" + (bestLocale ? "." + bestLocale : "") + "." + bundleName); + } +} + +// Replace dojo.requireLocalization with a wrapper +dojo._xdRealRequireLocalization = dojo.requireLocalization; +dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String*/availableFlatLocales){ + // summary: loads a bundle intelligently based on whether the module is + // local or xd. Overrides the local-case implementation. + + var modulePath = this.moduleUrl(moduleName).toString(); + if (this._xdIsXDomainPath(modulePath)) { + // call cross-domain loader + return dojo.xdRequireLocalization.apply(dojo, arguments); + } else { + // call local-loader + return dojo._xdRealRequireLocalization.apply(dojo, arguments); + } +} + +//This is a bit brittle: it has to know about the dojo methods that deal with dependencies +//It would be ideal to intercept the actual methods and do something fancy at that point, +//but I have concern about knowing which provide to match to the dependency in that case, +//since scripts can load whenever they want, and trigger new calls to dojo._xdResourceLoaded(). +dojo._xdUnpackDependency = function(/*Array*/dep){ + //summary: Internal xd loader function. Determines what to do with a dependency + //that was listed in an xd version of a module contents. + + //Extract the dependency(ies). + var newDeps = null; + var newAfterDeps = null; + switch(dep[0]){ + case "requireIf": + case "requireAfterIf": + //First arg (dep[1]) is the test. Depedency is dep[2]. + if(dep[1] === true){ + newDeps = [{name: dep[2], content: null}]; + } + break; + case "platformRequire": + var modMap = dep[1]; + var common = modMap["common"]||[]; + var newDeps = (modMap[dojo.hostenv.name_]) ? common.concat(modMap[dojo.hostenv.name_]||[]) : common.concat(modMap["default"]||[]); + //Flatten the array of arrays into a one-level deep array. + //Each result could be an array of 3 elements (the 3 arguments to dojo.require). + //We only need the first one. + if(newDeps){ + for(var i = 0; i < newDeps.length; i++){ + if(newDeps[i] instanceof Array){ + newDeps[i] = {name: newDeps[i][0], content: null}; + }else{ + newDeps[i] = {name: newDeps[i], content: null}; + } + } + } + break; + case "require": + //Just worry about dep[1] + newDeps = [{name: dep[1], content: null}]; + break; + case "i18n._preloadLocalizations": + //We can eval these immediately, since they load i18n bundles. + //Since i18n bundles have no dependencies, whenever they are loaded + //in a script tag, they are evaluated immediately, so we do not have to + //treat them has an explicit dependency for the dependency mapping. + //We can call it immediately since dojo.i18n is part of dojo.xd.js. + dojo.i18n._preloadLocalizations.apply(dojo.i18n._preloadLocalizations, dep.slice(1)); + break; + } + + //The requireIf and requireAfterIf needs to be evaluated after the current resource is evaluated. + if(dep[0] == "requireAfterIf" || dep[0] == "requireIf"){ + newAfterDeps = newDeps; + newDeps = null; + } + return {requires: newDeps, requiresAfter: newAfterDeps}; //Object +} + +dojo._xdWalkReqs = function(){ + //summary: Internal xd loader function. + //Walks the requires and evaluates module resource contents in + //the right order. + var reqChain = null; + var req; + for(var i = 0; i < this._xdOrderedReqs.length; i++){ + req = this._xdOrderedReqs[i]; + if(this._xdDepMap[req]){ + reqChain = [req]; + reqChain[req] = true; //Allow for fast lookup of the req in the array + this._xdEvalReqs(reqChain); + } + } +} + +dojo._xdEvalReqs = function(/*Array*/reqChain){ + //summary: Internal xd loader function. + //Does a depth first, breadth second search and eval of required modules. + while(reqChain.length > 0){ + var req = reqChain[reqChain.length - 1]; + var res = this._xdDepMap[req]; + if(res){ + //Trace down any requires for this resource. + //START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack + var reqs = res.requires; + if(reqs && reqs.length > 0){ + var nextReq; + for(var i = 0; i < reqs.length; i++){ + nextReq = reqs[i].name; + if(nextReq && !reqChain[nextReq]){ + //New req depedency. Follow it down. + reqChain.push(nextReq); + reqChain[nextReq] = true; + this._xdEvalReqs(reqChain); + } + } + } + //END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack + + //Evaluate the resource. + var contents = this._xdContents[res.contentIndex]; + if(!contents.isDefined){ + var content = contents.content; + content["resourceName"] = contents["resourceName"]; + content["resourcePath"] = contents["resourcePath"]; + this._xdDefList.push(content); + contents.isDefined = true; + } + this._xdDepMap[req] = null; + + //Trace down any requireAfters for this resource. + //START dojo._xdTraceReqs() inlining for small Safari 2.0 call stack + var reqs = res.requiresAfter; + if(reqs && reqs.length > 0){ + var nextReq; + for(var i = 0; i < reqs.length; i++){ + nextReq = reqs[i].name; + if(nextReq && !reqChain[nextReq]){ + //New req depedency. Follow it down. + reqChain.push(nextReq); + reqChain[nextReq] = true; + this._xdEvalReqs(reqChain); + } + } + } + //END dojo._xdTraceReqs() inlining for small Safari 2.0 call stack + } + + //Done with that require. Remove it and go to the next one. + reqChain.pop(); + } +} + +dojo._xdClearInterval = function(){ + //summary: Internal xd loader function. + //Clears the interval timer used to check on the + //status of in-flight xd module resource requests. + clearInterval(this._xdTimer); + this._xdTimer = 0; +} + +dojo._xdWatchInFlight = function(){ + //summary: Internal xd loader function. + //Monitors in-flight requests for xd module resources. + + var noLoads = ""; + var waitInterval = (dojo.config.xdWaitSeconds || 15) * 1000; + var expired = (this._xdStartTime + waitInterval) < (new Date()).getTime(); + + //If any xdInFlight are true, then still waiting for something to load. + //Come back later. If we timed out, report the things that did not load. + for(var param in this._xdInFlight){ + if(this._xdInFlight[param] === true){ + if(expired){ + noLoads += param + " "; + }else{ + return; + } + } + } + + //All done. Clean up and notify. + this._xdClearInterval(); + + if(expired){ + throw "Could not load cross-domain resources: " + noLoads; + } + + this._xdWalkReqs(); + + var defLength = this._xdDefList.length; + for(var i= 0; i < defLength; i++){ + var content = dojo._xdDefList[i]; + if(dojo.config["debugAtAllCosts"] && content["resourceName"]){ + if(!this["_xdDebugQueue"]){ + this._xdDebugQueue = []; + } + this._xdDebugQueue.push({resourceName: content.resourceName, resourcePath: content.resourcePath}); + }else{ + //Evaluate the resource to bring it into being. + //Pass in scope args to allow multiple versions of modules in a page. + content.apply(dojo.global, dojo._scopeArgs); + } + } + + //Evaluate any resources that were not evaled before. + //This normally shouldn't happen with proper dojo.provide and dojo.require + //usage, but providing it just in case. Note that these may not be executed + //in the original order that the developer intended. + for(var i = 0; i < this._xdContents.length; i++){ + var current = this._xdContents[i]; + if(current.content && !current.isDefined){ + //Pass in scope args to allow multiple versions of modules in a page. + current.content.apply(dojo.global, dojo._scopeArgs); + } + } + + //Clean up for the next round of xd loading. + this._xdReset(); + + if(this["_xdDebugQueue"] && this._xdDebugQueue.length > 0){ + this._xdDebugFileLoaded(); + }else{ + this._xdNotifyLoaded(); + } +} + +dojo._xdNotifyLoaded = function(){ + //Clear inflight count so we will finally do finish work. + this._inFlightCount = 0; + + //Only trigger call loaded if dj_load_init has run. + if(this._initFired && !this._loadNotifying){ + this._callLoaded(); + } +} + +} diff --git a/includes/js/dojo/_base/array.js b/includes/js/dojo/_base/array.js new file mode 100644 index 0000000..b0c68fa --- /dev/null +++ b/includes/js/dojo/_base/array.js @@ -0,0 +1,182 @@ +if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.array"] = true; +dojo.require("dojo._base.lang"); +dojo.provide("dojo._base.array"); + +(function(){ + var _getParts = function(arr, obj, cb){ + return [ + dojo.isString(arr) ? arr.split("") : arr, + obj || dojo.global, + // FIXME: cache the anonymous functions we create here? + dojo.isString(cb) ? new Function("item", "index", "array", cb) : cb + ]; + }; + + dojo.mixin(dojo, { + indexOf: function( /*Array*/ array, + /*Object*/ value, + /*Integer?*/ fromIndex, + /*Boolean?*/ findLast){ + // summary: + // locates the first index of the provided value in the + // passed array. If the value is not found, -1 is returned. + // description: + // For details on this method, see: + // + + var step = 1, end = array.length || 0, i = 0; + if(findLast){ + i = end - 1; + step = end = -1; + } + if(fromIndex != undefined){ i = fromIndex; } + if((findLast && i > end) || i < end){ + for(; i != end; i += step){ + if(array[i] == value){ return i; } + } + } + return -1; // Number + }, + + lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){ + // summary: + // locates the last index of the provided value in the passed array. + // If the value is not found, -1 is returned. + // description: + // For details on this method, see: + // + return dojo.indexOf(array, value, fromIndex, true); // Number + }, + + forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ + // summary: + // for every item in arr, callback is invoked. Return values are ignored. + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.forEach() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + + // match the behavior of the built-in forEach WRT empty arrs + if(!arr || !arr.length){ return; } + + // FIXME: there are several ways of handilng thisObject. Is + // dojo.global always the default context? + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + for(var i=0,l=_p[0].length; i + // example: + // | dojo.every([1, 2, 3, 4], function(item){ return item>1; }); + // returns false + // example: + // | dojo.every([1, 2, 3, 4], function(item){ return item>0; }); + // returns true + return this._everyOrSome(true, arr, callback, thisObject); // Boolean + }, + + some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ + // summary: + // Determines whether or not any item in arr satisfies the + // condition implemented by callback. + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array and returns true + // if the condition is met. + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.some() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + // example: + // | dojo.some([1, 2, 3, 4], function(item){ return item>1; }); + // returns true + // example: + // | dojo.some([1, 2, 3, 4], function(item){ return item<1; }); + // returns false + return this._everyOrSome(false, arr, callback, thisObject); // Boolean + }, + + map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){ + // summary: + // applies callback to each element of arr and returns + // an Array with the results + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array and returns a value + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.map() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + // example: + // | dojo.map([1, 2, 3, 4], function(item){ return item+1 }); + // returns [2, 3, 4, 5] + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + var outArr = (arguments[3] ? (new arguments[3]()) : []); + for(var i=0;i + // example: + // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; }); + // returns [2, 3, 4] + + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + var outArr = []; + for(var i = 0; i < arr.length; i++){ + if(_p[2].call(_p[1], arr[i], i, arr)){ + outArr.push(arr[i]); + } + } + return outArr; // Array + } + }); +})(); + +} diff --git a/includes/js/dojo/_base/browser.js b/includes/js/dojo/_base/browser.js new file mode 100644 index 0000000..9ee17a7 --- /dev/null +++ b/includes/js/dojo/_base/browser.js @@ -0,0 +1,21 @@ +if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.browser"] = true; +dojo.provide("dojo._base.browser"); + +dojo.require("dojo._base.window"); +dojo.require("dojo._base.event"); +dojo.require("dojo._base.html"); +dojo.require("dojo._base.NodeList"); +dojo.require("dojo._base.query"); +dojo.require("dojo._base.xhr"); +dojo.require("dojo._base.fx"); + +//Need this to be the last code segment in base, so do not place any +//dojo.requireIf calls in this file. Otherwise, due to how the build system +//puts all requireIf dependencies after the current file, the require calls +//could be called before all of base is defined. +if(dojo.config.require){ + dojo.forEach(dojo.config.require, "dojo['require'](item);"); +} + +} diff --git a/includes/js/dojo/_base/connect.js b/includes/js/dojo/_base/connect.js new file mode 100644 index 0000000..5111372 --- /dev/null +++ b/includes/js/dojo/_base/connect.js @@ -0,0 +1,285 @@ +if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.connect"] = true; +dojo.provide("dojo._base.connect"); +dojo.require("dojo._base.lang"); + +// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA + +// low-level delegation machinery +dojo._listener = { + // create a dispatcher function + getDispatcher: function(){ + // following comments pulled out-of-line to prevent cloning them + // in the returned function. + // - indices (i) that are really in the array of listeners (ls) will + // not be in Array.prototype. This is the 'sparse array' trick + // that keeps us safe from libs that take liberties with built-in + // objects + // - listener is invoked with current scope (this) + return function(){ + var ap=Array.prototype, c=arguments.callee, ls=c._listeners, t=c.target; + // return value comes from original target function + var r=t && t.apply(this, arguments); + // invoke listeners after target function + for(var i in ls){ + if(!(i in ap)){ + ls[i].apply(this, arguments); + } + } + // return value comes from original target function + return r; + } + }, + // add a listener to an object + add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ + // Whenever 'method' is invoked, 'listener' will have the same scope. + // Trying to supporting a context object for the listener led to + // complexity. + // Non trivial to provide 'once' functionality here + // because listener could be the result of a dojo.hitch call, + // in which case two references to the same hitch target would not + // be equivalent. + source = source || dojo.global; + // The source method is either null, a dispatcher, or some other function + var f = source[method]; + // Ensure a dispatcher + if(!f||!f._listeners){ + var d = dojo._listener.getDispatcher(); + // original target function is special + d.target = f; + // dispatcher holds a list of listeners + d._listeners = []; + // redirect source to dispatcher + f = source[method] = d; + } + // The contract is that a handle is returned that can + // identify this listener for disconnect. + // + // The type of the handle is private. Here is it implemented as Integer. + // DOM event code has this same contract but handle is Function + // in non-IE browsers. + // + // We could have separate lists of before and after listeners. + return f._listeners.push(listener) ; /*Handle*/ + }, + // remove a listener from an object + remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){ + var f = (source||dojo.global)[method]; + // remember that handle is the index+1 (0 is not a valid handle) + if(f && f._listeners && handle--){ + delete f._listeners[handle]; + } + } +}; + +// Multiple delegation for arbitrary methods. + +// This unit knows nothing about DOM, +// but we include DOM aware +// documentation and dontFix +// argument here to help the autodocs. +// Actual DOM aware code is in event.js. + +dojo.connect = function(/*Object|null*/ obj, + /*String*/ event, + /*Object|null*/ context, + /*String|Function*/ method, + /*Boolean*/ dontFix){ + // summary: + // Create a link that calls one function when another executes. + // + // description: + // Connects method to event, so that after event fires, method + // does too. All connected functions are passed the same arguments as + // the event function was initially called with. You may connect as + // many methods to event as needed. + // + // event must be a string. If obj is null, dojo.global is used. + // + // null arguments may simply be omitted. + // + // obj[event] can resolve to a function or undefined (null). + // If obj[event] is null, it is assigned a function. + // + // The return value is a handle that is needed to + // remove this connection with dojo.disconnect. + // + // obj: + // The source object for the event function. + // Defaults to dojo.global if null. + // If obj is a DOM node, the connection is delegated + // to the DOM event manager (unless dontFix is true). + // + // event: + // String name of the event function in obj. + // I.e. identifies a property obj[event]. + // + // context: + // The object that method will receive as "this". + // + // If context is null and method is a function, then method + // inherits the context of event. + // + // If method is a string then context must be the source + // object object for method (context[method]). If context is null, + // dojo.global is used. + // + // method: + // A function reference, or name of a function in context. + // The function identified by method fires after event does. + // method receives the same arguments as the event. + // See context argument comments for information on method's scope. + // + // dontFix: + // If obj is a DOM node, set dontFix to true to prevent delegation + // of this connection to the DOM event manager. + // + // example: + // When obj.onchange(), do ui.update(): + // | dojo.connect(obj, "onchange", ui, "update"); + // | dojo.connect(obj, "onchange", ui, ui.update); // same + // + // example: + // Using return value for disconnect: + // | var link = dojo.connect(obj, "onchange", ui, "update"); + // | ... + // | dojo.disconnect(link); + // + // example: + // When onglobalevent executes, watcher.handler is invoked: + // | dojo.connect(null, "onglobalevent", watcher, "handler"); + // + // example: + // When ob.onCustomEvent executes, customEventHandler is invoked: + // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler"); + // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same + // + // example: + // When ob.onCustomEvent executes, customEventHandler is invoked + // with the same scope (this): + // | dojo.connect(ob, "onCustomEvent", null, customEventHandler); + // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same + // + // example: + // When globalEvent executes, globalHandler is invoked + // with the same scope (this): + // | dojo.connect(null, "globalEvent", null, globalHandler); + // | dojo.connect("globalEvent", globalHandler); // same + + // normalize arguments + var a=arguments, args=[], i=0; + // if a[0] is a String, obj was ommited + args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]); + // if the arg-after-next is a String or Function, context was NOT omitted + var a1 = a[i+1]; + args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]); + // absorb any additional arguments + for(var l=a.length; i90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222); + // synthesize keypress for most unprintables and CTRL-keys + if(unprintable||evt.ctrlKey){ + var c = unprintable ? 0 : k; + if(evt.ctrlKey){ + if(k==3 || k==13){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ + c -= 48; // map CTRL-[numpad 0-9] to ASCII + }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ + c += 32; // map CTRL-[A-Z] to lowercase + }else{ + c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII + } + } + // simulate a keypress event + var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); + kp.call(evt.currentTarget, faux); + evt.cancelBubble = faux.cancelBubble; + evt.returnValue = faux.returnValue; + _trySetKeyCode(evt, faux.keyCode); + } + }, + // Called in Event scope + _stopPropagation: function(){ + this.cancelBubble = true; + }, + _preventDefault: function(){ + // Setting keyCode to 0 is the only way to prevent certain keypresses (namely + // ctrl-combinations that correspond to menu accelerator keys). + // Otoh, it prevents upstream listeners from getting this information + // Try to split the difference here by clobbering keyCode only for ctrl + // combinations. If you still need to access the key upstream, bubbledKeyCode is + // provided as a workaround. + this.bubbledKeyCode = this.keyCode; + if(this.ctrlKey){_trySetKeyCode(this, 0);} + this.returnValue = false; + } + }); + + // override stopEvent for IE + dojo.stopEvent = function(evt){ + evt = evt || window.event; + del._stopPropagation.call(evt); + del._preventDefault.call(evt); + } + } + + del._synthesizeEvent = function(evt, props){ + var faux = dojo.mixin({}, evt, props); + del._setKeyChar(faux); + // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); + // but it throws an error when preventDefault is invoked on Safari + // does Event.preventDefault not support "apply" on Safari? + faux.preventDefault = function(){ evt.preventDefault(); }; + faux.stopPropagation = function(){ evt.stopPropagation(); }; + return faux; + } + + // Opera event normalization + if(dojo.isOpera){ + dojo.mixin(del, { + _fixEvent: function(evt, sender){ + switch(evt.type){ + case "keypress": + var c = evt.which; + if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // can't trap some keys at all, like INSERT and DELETE + // there is no differentiating info between DELETE and ".", or INSERT and "-" + c = ((c<41)&&(!evt.shiftKey) ? 0 : c); + if((evt.ctrlKey)&&(!evt.shiftKey)&&(c>=65)&&(c<=90)){ + // lowercase CTRL-[A-Z] keys + c += 32; + } + return del._synthesizeEvent(evt, { charCode: c }); + } + return evt; + } + }); + } + + // Safari event normalization + if(dojo.isSafari){ + dojo.mixin(del, { + _fixEvent: function(evt, sender){ + switch(evt.type){ + case "keypress": + var c = evt.charCode, s = evt.shiftKey, k = evt.keyCode; + // FIXME: This is a hack, suggest we rethink keyboard strategy. + // Arrow and page keys have 0 "keyCode" in keypress events.on Safari for Windows + k = k || identifierMap[evt.keyIdentifier] || 0; + if(evt.keyIdentifier=="Enter"){ + c = 0; // differentiate Enter from CTRL-m (both code 13) + }else if((evt.ctrlKey)&&(c>0)&&(c<27)){ + c += 96; // map CTRL-[A-Z] codes to ASCII + } else if (c==dojo.keys.SHIFT_TAB) { + c = dojo.keys.TAB; // morph SHIFT_TAB into TAB + shiftKey: true + s = true; + } else { + c = (c>=32 && c<63232 ? c : 0); // avoid generating keyChar for non-printables + } + return del._synthesizeEvent(evt, {charCode: c, shiftKey: s, keyCode: k}); + } + return evt; + } + }); + + dojo.mixin(dojo.keys, { + SHIFT_TAB: 25, + UP_ARROW: 63232, + DOWN_ARROW: 63233, + LEFT_ARROW: 63234, + RIGHT_ARROW: 63235, + F1: 63236, + F2: 63237, + F3: 63238, + F4: 63239, + F5: 63240, + F6: 63241, + F7: 63242, + F8: 63243, + F9: 63244, + F10: 63245, + F11: 63246, + F12: 63247, + PAUSE: 63250, + DELETE: 63272, + HOME: 63273, + END: 63275, + PAGE_UP: 63276, + PAGE_DOWN: 63277, + INSERT: 63302, + PRINT_SCREEN: 63248, + SCROLL_LOCK: 63249, + NUM_LOCK: 63289 + }); + var dk = dojo.keys, identifierMap = { "Up": dk.UP_ARROW, "Down": dk.DOWN_ARROW, "Left": dk.LEFT_ARROW, "Right": dk.RIGHT_ARROW, "PageUp": dk.PAGE_UP, "PageDown": dk.PAGE_DOWN }; + } +})(); + +if(dojo.isIE){ + // keep this out of the closure + // closing over 'iel' or 'ieh' b0rks leak prevention + // ls[i] is an index into the master handler array + dojo._ieDispatcher = function(args, sender){ + var ap=Array.prototype, h=dojo._ie_listener.handlers, c=args.callee, ls=c._listeners, t=h[c.target]; + // return value comes from original target function + var r = t && t.apply(sender, args); + // invoke listeners after target function + for(var i in ls){ + if(!(i in ap)){ + h[ls[i]].apply(sender, args); + } + } + return r; + } + dojo._getIeDispatcher = function(){ + // ensure the returned function closes over nothing + return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function + } + // keep this out of the closure to reduce RAM allocation + dojo._event_listener._fixCallback = function(fp){ + var f = dojo._event_listener._fixEvent; + return function(e){ return fp.call(this, f(e, this)); }; + } +} + +} diff --git a/includes/js/dojo/_base/fx.js b/includes/js/dojo/_base/fx.js new file mode 100644 index 0000000..33307a9 --- /dev/null +++ b/includes/js/dojo/_base/fx.js @@ -0,0 +1,584 @@ +if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.fx"] = true; +dojo.provide("dojo._base.fx"); +dojo.require("dojo._base.Color"); +dojo.require("dojo._base.connect"); +dojo.require("dojo._base.declare"); +dojo.require("dojo._base.lang"); +dojo.require("dojo._base.html"); + +/* + Animation losely package based on Dan Pupius' work, contributed under CLA: + http://pupius.co.uk/js/Toolkit.Drawing.js +*/ +(function(){ + + var d = dojo; + + dojo._Line = function(/*int*/ start, /*int*/ end){ + // summary: + // dojo._Line is the object used to generate values from a start value + // to an end value + // start: int + // Beginning value for range + // end: int + // Ending value for range + this.start = start; + this.end = end; + this.getValue = function(/*float*/ n){ + // summary: returns the point on the line + // n: a floating point number greater than 0 and less than 1 + return ((this.end - this.start) * n) + this.start; // Decimal + } + } + + d.declare("dojo._Animation", null, { + // summary + // A generic animation class that fires callbacks into its handlers + // object at various states. Nearly all dojo animation functions + // return an instance of this method, usually without calling the + // .play() method beforehand. Therefore, you will likely need to + // call .play() on instances of dojo._Animation when one is + // returned. + constructor: function(/*Object*/ args){ + d.mixin(this, args); + if(d.isArray(this.curve)){ + /* curve: Array + pId: a */ + this.curve = new d._Line(this.curve[0], this.curve[1]); + } + }, + + // duration: Integer + // The time in milliseonds the animation will take to run + duration: 350, + + /*===== + // curve: dojo._Line||Array + // A two element array of start and end values, or a dojo._Line instance to be + // used in the Animation. + curve: null, + + // easing: Function + // A Function to adjust the acceleration (or deceleration) of the progress + // across a dojo._Line + easing: null, + =====*/ + + // repeat: Integer + // The number of times to loop the animation + repeat: 0, + + // rate: Integer + // the time in milliseconds to wait before advancing to next frame + // (used as a fps timer: rate/1000 = fps) + rate: 10 /* 100 fps */, + + /*===== + // delay: Integer + // The time in milliseconds to wait before starting animation after it has been .play()'ed + delay: null, + + // events + // + // beforeBegin: Event + // Synthetic event fired before a dojo._Animation begins playing (synchronous) + beforeBegin: null, + + // onBegin: Event + // Synthetic event fired as a dojo._Animation begins playing (useful?) + onBegin: null, + + // onAnimate: Event + // Synthetic event fired at each interval of a dojo._Animation + onAnimate: null, + + // onEnd: Event + // Synthetic event fired after the final frame of a dojo._Animation + onEnd: null, + + // onPlay: Event + // Synthetic event fired any time a dojo._Animation is play()'ed + onPlay: null, + + // onPause: Event + // Synthetic event fired when a dojo._Animation is paused + onPause: null, + + // onStop: Event + // Synthetic event fires when a dojo._Animation is stopped + onStop: null, + + =====*/ + + _percent: 0, + _startRepeatCount: 0, + + _fire: function(/*Event*/ evt, /*Array?*/ args){ + // summary: + // Convenience function. Fire event "evt" and pass it the + // arguments specified in "args". + // evt: + // The event to fire. + // args: + // The arguments to pass to the event. + try{ + if(this[evt]){ + this[evt].apply(this, args||[]); + } + }catch(e){ + // squelch and log because we shouldn't allow exceptions in + // synthetic event handlers to cause the internal timer to run + // amuck, potentially pegging the CPU. I'm not a fan of this + // squelch, but hopefully logging will make it clear what's + // going on + console.error("exception in animation handler for:", evt); + console.error(e); + } + return this; // dojo._Animation + }, + + play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ + // summary: + // Start the animation. + // delay: + // How many milliseconds to delay before starting. + // gotoStart: + // If true, starts the animation from the beginning; otherwise, + // starts it from its current position. + var _t = this; + if(gotoStart){ + _t._stopTimer(); + _t._active = _t._paused = false; + _t._percent = 0; + }else if(_t._active && !_t._paused){ + return _t; // dojo._Animation + } + + _t._fire("beforeBegin"); + + var de = delay||_t.delay; + var _p = dojo.hitch(_t, "_play", gotoStart); + if(de > 0){ + setTimeout(_p, de); + return _t; // dojo._Animation + } + _p(); + return _t; + }, + + _play: function(gotoStart){ + var _t = this; + _t._startTime = new Date().valueOf(); + if(_t._paused){ + _t._startTime -= _t.duration * _t._percent; + } + _t._endTime = _t._startTime + _t.duration; + + _t._active = true; + _t._paused = false; + + var value = _t.curve.getValue(_t._percent); + if(!_t._percent){ + if(!_t._startRepeatCount){ + _t._startRepeatCount = _t.repeat; + } + _t._fire("onBegin", [value]); + } + + _t._fire("onPlay", [value]); + + _t._cycle(); + return _t; // dojo._Animation + }, + + pause: function(){ + // summary: Pauses a running animation. + this._stopTimer(); + if(!this._active){ return this; /*dojo._Animation*/ } + this._paused = true; + this._fire("onPause", [this.curve.getValue(this._percent)]); + return this; // dojo._Animation + }, + + gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){ + // summary: + // Sets the progress of the animation. + // percent: + // A percentage in decimal notation (between and including 0.0 and 1.0). + // andPlay: + // If true, play the animation after setting the progress. + this._stopTimer(); + this._active = this._paused = true; + this._percent = percent; + if(andPlay){ this.play(); } + return this; // dojo._Animation + }, + + stop: function(/*boolean?*/ gotoEnd){ + // summary: Stops a running animation. + // gotoEnd: If true, the animation will end. + if(!this._timer){ return this; /* dojo._Animation */ } + this._stopTimer(); + if(gotoEnd){ + this._percent = 1; + } + this._fire("onStop", [this.curve.getValue(this._percent)]); + this._active = this._paused = false; + return this; // dojo._Animation + }, + + status: function(){ + // summary: Returns a string token representation of the status of + // the animation, one of: "paused", "playing", "stopped" + if(this._active){ + return this._paused ? "paused" : "playing"; // String + } + return "stopped"; // String + }, + + _cycle: function(){ + var _t = this; + if(_t._active){ + var curr = new Date().valueOf(); + var step = (curr - _t._startTime) / (_t._endTime - _t._startTime); + + if(step >= 1){ + step = 1; + } + _t._percent = step; + + // Perform easing + if(_t.easing){ + step = _t.easing(step); + } + + _t._fire("onAnimate", [_t.curve.getValue(step)]); + + if(_t._percent < 1){ + _t._startTimer(); + }else{ + _t._active = false; + + if(_t.repeat > 0){ + _t.repeat--; + _t.play(null, true); + }else if(_t.repeat == -1){ + _t.play(null, true); + }else{ + if(_t._startRepeatCount){ + _t.repeat = _t._startRepeatCount; + _t._startRepeatCount = 0; + } + } + _t._percent = 0; + _t._fire("onEnd"); + _t._stopTimer(); + } + } + return _t; // dojo._Animation + } + }); + + var ctr = 0; + var _globalTimerList = []; + var runner = { + run: function(){ } + }; + var timer = null; + dojo._Animation.prototype._startTimer = function(){ + // this._timer = setTimeout(dojo.hitch(this, "_cycle"), this.rate); + if(!this._timer){ + this._timer = d.connect(runner, "run", this, "_cycle"); + ctr++; + } + if(!timer){ + timer = setInterval(d.hitch(runner, "run"), this.rate); + } + }; + + dojo._Animation.prototype._stopTimer = function(){ + if(this._timer){ + d.disconnect(this._timer); + this._timer = null; + ctr--; + } + if(ctr <= 0){ + clearInterval(timer); + timer = null; + ctr = 0; + } + }; + + var _makeFadeable = (d.isIE) ? function(node){ + // only set the zoom if the "tickle" value would be the same as the + // default + var ns = node.style; + if(!ns.zoom.length && d.style(node, "zoom") == "normal"){ + // make sure the node "hasLayout" + // NOTE: this has been tested with larger and smaller user-set text + // sizes and works fine + ns.zoom = "1"; + // node.style.zoom = "normal"; + } + // don't set the width to auto if it didn't already cascade that way. + // We don't want to f anyones designs + if(!ns.width.length && d.style(node, "width") == "auto"){ + ns.width = "auto"; + } + } : function(){}; + + dojo._fade = function(/*Object*/ args){ + // summary: + // Returns an animation that will fade the node defined by + // args.node from the start to end values passed (args.start + // args.end) (end is mandatory, start is optional) + + args.node = d.byId(args.node); + var fArgs = d.mixin({ properties: {} }, args); + var props = (fArgs.properties.opacity = {}); + props.start = !("start" in fArgs) ? + function(){ + return Number(d.style(fArgs.node, "opacity")); + } : fArgs.start; + props.end = fArgs.end; + + var anim = d.animateProperty(fArgs); + d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node)); + + return anim; // dojo._Animation + } + + /*===== + dojo.__FadeArgs = function(node, duration, easing){ + // node: DOMNode|String + // The node referenced in the animation + // duration: Integer? + // Duration of the animation in milliseconds. + // easing: Function? + // An easing function. + this.node = node; + this.duration = duration; + this.easing = easing; + } + =====*/ + + dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){ + // summary: + // Returns an animation that will fade node defined in 'args' from + // its current opacity to fully opaque. + return d._fade(d.mixin({ end: 1 }, args)); // dojo._Animation + } + + dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){ + // summary: + // Returns an animation that will fade node defined in 'args' + // from its current opacity to fully transparent. + return d._fade(d.mixin({ end: 0 }, args)); // dojo._Animation + } + + dojo._defaultEasing = function(/*Decimal?*/ n){ + // summary: The default easing function for dojo._Animation(s) + return 0.5 + ((Math.sin((n + 1.5) * Math.PI))/2); + } + + var PropLine = function(properties){ + // PropLine is an internal class which is used to model the values of + // an a group of CSS properties across an animation lifecycle. In + // particular, the "getValue" function handles getting interpolated + // values between start and end for a particular CSS value. + this._properties = properties; + for(var p in properties){ + var prop = properties[p]; + if(prop.start instanceof d.Color){ + // create a reusable temp color object to keep intermediate results + prop.tempColor = new d.Color(); + } + } + this.getValue = function(r){ + var ret = {}; + for(var p in this._properties){ + var prop = this._properties[p]; + var start = prop.start; + if(start instanceof d.Color){ + ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss(); + }else if(!d.isArray(start)){ + ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units||"px" : ""); + } + } + return ret; + } + } + + /*===== + dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], { + // Properties: Object? + // A hash map of style properties to Objects describing the transition, + // such as the properties of dojo._Line with an additional 'unit' property + properties: {} + + //TODOC: add event callbacks + }); + =====*/ + + dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){ + // summary: + // Returns an animation that will transition the properties of + // node defined in 'args' depending how they are defined in + // 'args.properties' + // + // description: + // dojo.animateProperty is the foundation of most dojo.fx + // animations. It takes an object of "properties" corresponding to + // style properties, and animates them in parallel over a set + // duration. + // + // example: + // A simple animation that changes the width of the specified node. + // | dojo.animateProperty({ + // | node: "nodeId", + // | properties: { width: 400 }, + // | }).play(); + // Dojo figures out the start value for the width and converts the + // integer specified for the width to the more expressive but + // verbose form `{ width: { end: '400', units: 'px' } }` which you + // can also specify directly + // example: + // animate width, height, and padding over 2 seconds...the + // pedantic way: + // | dojo.animateProperty({ node: node, duration:2000, + // | properties: { + // | width: { start: '200', end: '400', unit:"px" }, + // | height: { start:'200', end: '400', unit:"px" }, + // | paddingTop: { start:'5', end:'50', unit:"px" } + // | } + // | }).play(); + // + // example: + // plug in a different easing function and register a callback for + // when the animation ends. Easing functions accept values between + // zero and one and return a value on that basis. In this case, an + // exponential-in curve. + // | dojo.animateProperty({ + // | node: "nodeId", + // | // dojo figures out the start value + // | properties: { width: { end: 400 } }, + // | easing: function(n){ + // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1)); + // | }, + // | onEnd: function(){ + // | // called when the animation finishes + // | } + // | }).play(500); // delay playing half a second + + args.node = d.byId(args.node); + if(!args.easing){ args.easing = d._defaultEasing; } + + var anim = new d._Animation(args); + d.connect(anim, "beforeBegin", anim, function(){ + var pm = {}; + for(var p in this.properties){ + // Make shallow copy of properties into pm because we overwrite + // some values below. In particular if start/end are functions + // we don't want to overwrite them or the functions won't be + // called if the animation is reused. + if(p == "width" || p == "height"){ + this.node.display = "block"; + } + var prop = this.properties[p]; + prop = pm[p] = d.mixin({}, (d.isObject(prop) ? prop: { end: prop })); + + if(d.isFunction(prop.start)){ + prop.start = prop.start(); + } + if(d.isFunction(prop.end)){ + prop.end = prop.end(); + } + var isColor = (p.toLowerCase().indexOf("color") >= 0); + function getStyle(node, p){ + // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable: + var v = ({height: node.offsetHeight, width: node.offsetWidth})[p]; + if(v !== undefined){ return v; } + v = d.style(node, p); + return (p=="opacity") ? Number(v) : (isColor ? v : parseFloat(v)); + } + if(!("end" in prop)){ + prop.end = getStyle(this.node, p); + }else if(!("start" in prop)){ + prop.start = getStyle(this.node, p); + } + + if(isColor){ + prop.start = new d.Color(prop.start); + prop.end = new d.Color(prop.end); + }else{ + prop.start = (p == "opacity") ? Number(prop.start) : parseFloat(prop.start); + } + } + this.curve = new PropLine(pm); + }); + d.connect(anim, "onAnimate", anim, function(propValues){ + // try{ + for(var s in propValues){ + d.style(this.node, s, propValues[s]); + // this.node.style[s] = propValues[s]; + } + }); + return anim; // dojo._Animation + } + + dojo.anim = function( /*DOMNode|String*/ node, + /*Object*/ properties, + /*Integer?*/ duration, + /*Function?*/ easing, + /*Function?*/ onEnd, + /*Integer?*/ delay){ + // summary: + // A simpler interface to `dojo.animateProperty()`, also returns + // an instance of `dojo._Animation` but begins the animation + // immediately, unlike nearly every other Dojo animation API. + // description: + // `dojo.anim` is a simpler (but somewhat less powerful) version + // of `dojo.animateProperty`. It uses defaults for many basic properties + // and allows for positional parameters to be used in place of the + // packed "property bag" which is used for other Dojo animation + // methods. + // + // The `dojo._Animation` object returned from `dojo.anim` will be + // already playing when it is returned from this function, so + // calling play() on it again is (usually) a no-op. + // node: + // a DOM node or the id of a node to animate CSS properties on + // duration: + // The number of milliseconds over which the animation + // should run. Defaults to the global animation default duration + // (350ms). + // easing: + // An easing function over which to calculate acceleration + // and deceleration of the animation through its duration. + // A default easing algorithm is provided, but you may + // plug in any you wish. A large selection of easing algorithms + // are available in `dojox.fx.easing`. + // onEnd: + // A function to be called when the animation finishes + // running. + // delay: + // The number of milliseconds to delay beginning the + // animation by. The default is 0. + // example: + // Fade out a node + // | dojo.anim("id", { opacity: 0 }); + // example: + // Fade out a node over a full second + // | dojo.anim("id", { opacity: 0 }, 1000); + return d.animateProperty({ + node: node, + duration: duration||d._Animation.prototype.duration, + properties: properties, + easing: easing, + onEnd: onEnd + }).play(delay||0); + } +})(); + +} diff --git a/includes/js/dojo/_base/html.js b/includes/js/dojo/_base/html.js new file mode 100644 index 0000000..d673eb1 --- /dev/null +++ b/includes/js/dojo/_base/html.js @@ -0,0 +1,1227 @@ +if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.html"] = true; +dojo.require("dojo._base.lang"); +dojo.provide("dojo._base.html"); + +// FIXME: need to add unit tests for all the semi-public methods + +try{ + document.execCommand("BackgroundImageCache", false, true); +}catch(e){ + // sane browsers don't have cache "issues" +} + +// ============================= +// DOM Functions +// ============================= + +/*===== +dojo.byId = function(id, doc){ + // summary: + // Returns DOM node with matching `id` attribute or `null` + // if not found, similar to "$" function in another library. + // If `id` is a DomNode, this function is a no-op. + // + // id: String|DOMNode + // A string to match an HTML id attribute or a reference to a DOM Node + // + // doc: Document? + // Document to work in. Defaults to the current value of + // dojo.doc. Can be used to retrieve + // node references from other documents. +=====*/ +if(dojo.isIE || dojo.isOpera){ + dojo.byId = function(id, doc){ + if(dojo.isString(id)){ + var _d = doc || dojo.doc; + var te = _d.getElementById(id); + // attributes.id.value is better than just id in case the + // user has a name=id inside a form + if(te && te.attributes.id.value == id){ + return te; + }else{ + var eles = _d.all[id]; + if(!eles || !eles.length){ return eles; } + // if more than 1, choose first with the correct id + var i=0; + while((te=eles[i++])){ + if(te.attributes.id.value == id){ return te; } + } + } + }else{ + return id; // DomNode + } + } +}else{ + dojo.byId = function(id, doc){ + return dojo.isString(id) ? (doc || dojo.doc).getElementById(id) : id; // DomNode + } +} +/*===== +} +=====*/ + +(function(){ + /* + dojo.createElement = function(obj, parent, position){ + // TODO: need to finish this! + } + */ + + var d = dojo; + + var _destroyContainer = null; + dojo.addOnUnload(function(){ + _destroyContainer=null; //prevent IE leak + }); + dojo._destroyElement = function(/*String||DomNode*/node){ + // summary: + // removes node from its parent, clobbers it and all of its + // children. + // node: + // the element to be destroyed, either as an ID or a reference + + node = d.byId(node); + try{ + if(!_destroyContainer){ + _destroyContainer = document.createElement("div"); + } + _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node); + // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature + _destroyContainer.innerHTML = ""; + }catch(e){ + /* squelch */ + } + }; + + dojo.isDescendant = function(/*DomNode|String*/node, /*DomNode|String*/ancestor){ + // summary: + // Returns true if node is a descendant of ancestor + // node: id or node reference to test + // ancestor: id or node reference of potential parent to test against + try{ + node = d.byId(node); + ancestor = d.byId(ancestor); + while(node){ + if(node === ancestor){ + return true; // Boolean + } + node = node.parentNode; + } + }catch(e){ /* squelch, return false */ } + return false; // Boolean + }; + + dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){ + // summary: enable or disable selection on a node + // node: + // id or reference to node + // selectable: + node = d.byId(node); + if(d.isMozilla){ + node.style.MozUserSelect = selectable ? "" : "none"; + }else if(d.isKhtml){ + node.style.KhtmlUserSelect = selectable ? "auto" : "none"; + }else if(d.isIE){ + node.unselectable = selectable ? "" : "on"; + d.query("*", node).forEach(function(descendant){ + descendant.unselectable = selectable ? "" : "on"; + }); + } + //FIXME: else? Opera? + }; + + var _insertBefore = function(/*Node*/node, /*Node*/ref){ + ref.parentNode.insertBefore(node, ref); + return true; // boolean + } + + var _insertAfter = function(/*Node*/node, /*Node*/ref){ + // summary: + // Try to insert node after ref + var pn = ref.parentNode; + if(ref == pn.lastChild){ + pn.appendChild(node); + }else{ + return _insertBefore(node, ref.nextSibling); // boolean + } + return true; // boolean + } + + dojo.place = function(/*String|DomNode*/node, /*String|DomNode*/refNode, /*String|Number*/position){ + // summary: + // Attempt to insert node into the DOM, choosing from various positioning options. + // Returns true if successful, false otherwise. + // node: + // id or node reference to place relative to refNode + // refNode: + // id or node reference to use as basis for placement + // position: + // string noting the position of node relative to refNode or a + // number indicating the location in the childNodes collection of + // refNode. Accepted string values are: + // + // * before + // * after + // * first + // * last + // + // "first" and "last" indicate positions as children of refNode. + + // FIXME: need to write tests for this!!!! + if(!node || !refNode || position === undefined){ + return false; // boolean + } + node = d.byId(node); + refNode = d.byId(refNode); + if(typeof position == "number"){ + var cn = refNode.childNodes; + if((position == 0 && cn.length == 0) || + cn.length == position){ + refNode.appendChild(node); return true; + } + if(position == 0){ + return _insertBefore(node, refNode.firstChild); + } + return _insertAfter(node, cn[position-1]); + } + switch(position.toLowerCase()){ + case "before": + return _insertBefore(node, refNode); // boolean + case "after": + return _insertAfter(node, refNode); // boolean + case "first": + if(refNode.firstChild){ + return _insertBefore(node, refNode.firstChild); // boolean + } + // else fallthrough... + default: // aka: last + refNode.appendChild(node); + return true; // boolean + } + } + + // Box functions will assume this model. + // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. + // Can be set to change behavior of box setters. + + // can be either: + // "border-box" + // "content-box" (default) + dojo.boxModel = "content-box"; + + // We punt per-node box mode testing completely. + // If anybody cares, we can provide an additional (optional) unit + // that overrides existing code to include per-node box sensitivity. + + // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. + // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. + // IIRC, earlier versions of Opera did in fact use border-box. + // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. + + if(d.isIE /*|| dojo.isOpera*/){ + var _dcm = document.compatMode; + // client code may have to adjust if compatMode varies across iframes + d.boxModel = _dcm == "BackCompat" || _dcm == "QuirksMode" || d.isIE<6 ? "border-box" : "content-box"; // FIXME: remove IE < 6 support? + } + + // ============================= + // Style Functions + // ============================= + + // getComputedStyle drives most of the style code. + // Wherever possible, reuse the returned object. + // + // API functions below that need to access computed styles accept an + // optional computedStyle parameter. + // If this parameter is omitted, the functions will call getComputedStyle themselves. + // This way, calling code can access computedStyle once, and then pass the reference to + // multiple API functions. + +/*===== + dojo.getComputedStyle = function(node){ + // summary: + // Returns a "computed style" object. + // + // description: + // Gets a "computed style" object which can be used to gather + // information about the current state of the rendered node. + // + // Note that this may behave differently on different browsers. + // Values may have different formats and value encodings across + // browsers. + // + // Note also that this method is expensive. Wherever possible, + // reuse the returned object. + // + // Use the dojo.style() method for more consistent (pixelized) + // return values. + // + // node: DOMNode + // A reference to a DOM node. Does NOT support taking an + // ID string for speed reasons. + // example: + // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth; + return; // CSS2Properties + } +=====*/ + + var gcs, dv = document.defaultView; + if(d.isSafari){ + gcs = function(/*DomNode*/node){ + var s = dv.getComputedStyle(node, null); + if(!s && node.style){ + node.style.display = ""; + s = dv.getComputedStyle(node, null); + } + return s || {}; + }; + }else if(d.isIE){ + gcs = function(node){ + return node.currentStyle; + }; + }else{ + gcs = function(node){ + return dv.getComputedStyle(node, null); + }; + } + dojo.getComputedStyle = gcs; + + if(!d.isIE){ + dojo._toPixelValue = function(element, value){ + // style values can be floats, client code may want + // to round for integer pixels. + return parseFloat(value) || 0; + } + }else{ + dojo._toPixelValue = function(element, avalue){ + if(!avalue){ return 0; } + // on IE7, medium is usually 4 pixels + if(avalue=="medium"){ return 4; } + // style values can be floats, client code may + // want to round this value for integer pixels. + if(avalue.slice && (avalue.slice(-2)=='px')){ return parseFloat(avalue); } + with(element){ + var sLeft = style.left; + var rsLeft = runtimeStyle.left; + runtimeStyle.left = currentStyle.left; + try{ + // 'avalue' may be incompatible with style.left, which can cause IE to throw + // this has been observed for border widths using "thin", "medium", "thick" constants + // those particular constants could be trapped by a lookup + // but perhaps there are more + style.left = avalue; + avalue = style.pixelLeft; + }catch(e){ + avalue = 0; + } + style.left = sLeft; + runtimeStyle.left = rsLeft; + } + return avalue; + } + } + var px = d._toPixelValue; + + // FIXME: there opacity quirks on FF that we haven't ported over. Hrm. + /*===== + dojo._getOpacity = function(node){ + // summary: + // Returns the current opacity of the passed node as a + // floating-point value between 0 and 1. + // node: DomNode + // a reference to a DOM node. Does NOT support taking an + // ID string for speed reasons. + // return: Number between 0 and 1 + } + =====*/ + + dojo._getOpacity = d.isIE ? function(node){ + try{ + return node.filters.alpha.opacity / 100; // Number + }catch(e){ + return 1; // Number + } + } : function(node){ + return gcs(node).opacity; + }; + + /*===== + dojo._setOpacity = function(node, opacity){ + // summary: + // set the opacity of the passed node portably. Returns the + // new opacity of the node. + // node: DOMNode + // a reference to a DOM node. Does NOT support taking an + // ID string for performance reasons. + // opacity: Number + // A Number between 0 and 1. 0 specifies transparent. + // return: Number between 0 and 1 + } + =====*/ + + dojo._setOpacity = d.isIE ? function(/*DomNode*/node, /*Number*/opacity){ + if(opacity == 1){ + // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so remove it altogether (bug #2661) + var filterRE = /FILTER:[^;]*;?/i; + node.style.cssText = node.style.cssText.replace(filterRE, ""); + if(node.nodeName.toLowerCase() == "tr"){ + d.query("> td", node).forEach(function(i){ + i.style.cssText = i.style.cssText.replace(filterRE, ""); + }); + } + }else{ + var o = "Alpha(Opacity="+ opacity * 100 +")"; + node.style.filter = o; + } + if(node.nodeName.toLowerCase() == "tr"){ + d.query("> td", node).forEach(function(i){ + i.style.filter = o; + }); + } + return opacity; + } : function(node, opacity){ + return node.style.opacity = opacity; + }; + + var _pixelNamesCache = { + left: true, top: true + }; + var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border + var _toStyleValue = function(node, type, value){ + type = type.toLowerCase(); + if(d.isIE && value == "auto"){ + if(type == "height"){ return node.offsetHeight; } + if(type == "width"){ return node.offsetWidth; } + } + if(!(type in _pixelNamesCache)){ + // if(dojo.isOpera && type == "cssText"){ + // FIXME: add workaround for #2855 here + // } + _pixelNamesCache[type] = _pixelRegExp.test(type); + } + return _pixelNamesCache[type] ? px(node, value) : value; + } + + var _floatStyle = d.isIE ? "styleFloat" : "cssFloat"; + var _floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle }; + + // public API + + dojo.style = function( /*DomNode|String*/ node, + /*String?|Object?*/ style, + /*String?*/ value){ + // summary: + // Accesses styles on a node. If 2 arguments are + // passed, acts as a getter. If 3 arguments are passed, acts + // as a setter. + // node: + // id or reference to node to get/set style for + // style: + // the style property to set in DOM-accessor format + // ("borderWidth", not "border-width") or an object with key/value + // pairs suitable for setting each property. + // value: + // If passed, sets value on the node for style, handling + // cross-browser concerns. + // example: + // Passing only an ID or node returns the computed style object of + // the node: + // | dojo.style("thinger"); + // example: + // Passing a node and a style property returns the current + // normalized, computed value for that property: + // | dojo.style("thinger", "opacity"); // 1 by default + // + // example: + // Passing a node, a style property, and a value changes the + // current display of the node and returns the new computed value + // | dojo.style("thinger", "opacity", 0.5); // == 0.5 + // + // example: + // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node: + // | dojo.style("thinger", { + // | "opacity": 0.5, + // | "border": "3px solid black", + // | "height": 300 + // | }); + // + // example: + // When the CSS style property is hyphenated, the JavaScript property is camelCased. + // font-size becomes fontSize, and so on. + // | dojo.style("thinger",{ + // | fontSize:"14pt", + // | letterSpacing:"1.2em" + // | }); + // + // example: + // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling + // dojo.style() on every element of the list. See: dojo.query and dojo.NodeList + // | dojo.query(".someClassName").style("visibility","hidden"); + // | // or + // | dojo.query("#baz > div").style({ + // | opacity:0.75, + // | fontSize:"13pt" + // | }); + + var n = d.byId(node), args = arguments.length, op = (style=="opacity"); + style = _floatAliases[style] || style; + if(args == 3){ + return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/ + } + if(args == 2 && op){ + return d._getOpacity(n); + } + var s = gcs(n); + if(args == 2 && !d.isString(style)){ + for(var x in style){ + d.style(node, x, style[x]); + } + return s; + } + return (args == 1) ? s : _toStyleValue(n, style, s[style]); /* CSS2Properties||String||Number */ + } + + // ============================= + // Box Functions + // ============================= + + dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // Returns object with special values specifically useful for node + // fitting. + // + // * l/t = left/top padding (respectively) + // * w = the total of the left and right padding + // * h = the total of the top and bottom padding + // + // If 'node' has position, l/t forms the origin for child nodes. + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + l = px(n, s.paddingLeft), + t = px(n, s.paddingTop); + return { + l: l, + t: t, + w: l+px(n, s.paddingRight), + h: t+px(n, s.paddingBottom) + }; + } + + dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // returns an object with properties useful for noting the border + // dimensions. + // + // * l/t = the sum of left/top border (respectively) + // * w = the sum of the left and right border + // * h = the sum of the top and bottom border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + ne = "none", + s = computedStyle||gcs(n), + bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0), + bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0); + return { + l: bl, + t: bt, + w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0), + h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0) + }; + } + + dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // returns object with properties useful for box fitting with + // regards to padding. + // + // * l/t = the sum of left/top padding and left/top border (respectively) + // * w = the sum of the left and right padding and border + // * h = the sum of the top and bottom padding and border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + p = d._getPadExtents(n, s), + b = d._getBorderExtents(n, s); + return { + l: p.l + b.l, + t: p.t + b.t, + w: p.w + b.w, + h: p.h + b.h + }; + } + + dojo._getMarginExtents = function(n, computedStyle){ + // summary: + // returns object with properties useful for box fitting with + // regards to box margins (i.e., the outer-box). + // + // * l/t = marginLeft, marginTop, respectively + // * w = total width, margin inclusive + // * h = total height, margin inclusive + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + l = px(n, s.marginLeft), + t = px(n, s.marginTop), + r = px(n, s.marginRight), + b = px(n, s.marginBottom); + if(d.isSafari && (s.position != "absolute")){ + // FIXME: Safari's version of the computed right margin + // is the space between our right edge and the right edge + // of our offsetParent. + // What we are looking for is the actual margin value as + // determined by CSS. + // Hack solution is to assume left/right margins are the same. + r = l; + } + return { + l: l, + t: t, + w: l+r, + h: t+b + }; + } + + // Box getters work in any box context because offsetWidth/clientWidth + // are invariant wrt box context + // + // They do *not* work for display: inline objects that have padding styles + // because the user agent ignores padding (it's bogus styling in any case) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + + // Although it would be easier to read, there are not separate versions of + // _getMarginBox for each browser because: + // 1. the branching is not expensive + // 2. factoring the shared code wastes cycles (function call overhead) + // 3. duplicating the shared code wastes bytes + + dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){ + // summary: + // returns an object that encodes the width, height, left and top + // positions of the node's margin box. + var s = computedStyle||gcs(node), me = d._getMarginExtents(node, s); + var l = node.offsetLeft - me.l, t = node.offsetTop - me.t; + if(d.isMoz){ + // Mozilla: + // If offsetParent has a computed overflow != visible, the offsetLeft is decreased + // by the parent's border. + // We don't want to compute the parent's style, so instead we examine node's + // computed left/top which is more stable. + var sl = parseFloat(s.left), st = parseFloat(s.top); + if(!isNaN(sl) && !isNaN(st)){ + l = sl, t = st; + }else{ + // If child's computed left/top are not parseable as a number (e.g. "auto"), we + // have no choice but to examine the parent's computed style. + var p = node.parentNode; + if(p && p.style){ + var pcs = gcs(p); + if(pcs.overflow != "visible"){ + var be = d._getBorderExtents(p, pcs); + l += be.l, t += be.t; + } + } + } + }else if(d.isOpera){ + // On Opera, offsetLeft includes the parent's border + var p = node.parentNode; + if(p){ + var be = d._getBorderExtents(p); + l -= be.l, t -= be.t; + } + } + return { + l: l, + t: t, + w: node.offsetWidth + me.w, + h: node.offsetHeight + me.h + }; + } + + dojo._getContentBox = function(node, computedStyle){ + // summary: + // Returns an object that encodes the width, height, left and top + // positions of the node's content box, irrespective of the + // current box model. + + // clientWidth/Height are important since the automatically account for scrollbars + // fallback to offsetWidth/Height for special cases (see #3378) + var s=computedStyle||gcs(node), pe=d._getPadExtents(node, s), be=d._getBorderExtents(node, s), w=node.clientWidth, h; + if(!w){ + w=node.offsetWidth, h=node.offsetHeight; + }else{ + h=node.clientHeight, be.w = be.h = 0; + } + // On Opera, offsetLeft includes the parent's border + if(d.isOpera){ pe.l += be.l; pe.t += be.t; }; + return { + l: pe.l, + t: pe.t, + w: w - pe.w - be.w, + h: h - pe.h - be.h + }; + } + + dojo._getBorderBox = function(node, computedStyle){ + var s=computedStyle||gcs(node), pe=d._getPadExtents(node, s), cb=d._getContentBox(node, s); + return { + l: cb.l - pe.l, + t: cb.t - pe.t, + w: cb.w + pe.w, + h: cb.h + pe.h + }; + } + + // Box setters depend on box context because interpretation of width/height styles + // vary wrt box context. + // + // The value of dojo.boxModel is used to determine box context. + // dojo.boxModel can be set directly to change behavior. + // + // Beware of display: inline objects that have padding styles + // because the user agent ignores padding (it's a bogus setup anyway) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + // + // Elements other than DIV may have special quirks, like built-in + // margins or padding, or values not detectable via computedStyle. + // In particular, margins on TABLE do not seems to appear + // at all in computedStyle on Mozilla. + + dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ + // summary: + // sets width/height/left/top in the current (native) box-model + // dimentions. Uses the unit passed in u. + // node: DOM Node reference. Id string not supported for performance reasons. + // l: optional. left offset from parent. + // t: optional. top offset from parent. + // w: optional. width in current box model. + // h: optional. width in current box model. + // u: optional. unit measure to use for other measures. Defaults to "px". + u = u || "px"; + var s = node.style; + if(!isNaN(l)){ s.left = l+u; } + if(!isNaN(t)){ s.top = t+u; } + if(w>=0){ s.width = w+u; } + if(h>=0){ s.height = h+u; } + } + + dojo._usesBorderBox = function(/*DomNode*/node){ + // summary: + // True if the node uses border-box layout. + + // We could test the computed style of node to see if a particular box + // has been specified, but there are details and we choose not to bother. + var n = node.tagName; + // For whatever reason, TABLE and BUTTON are always border-box by default. + // If you have assigned a different box to either one via CSS then + // box functions will break. + return d.boxModel=="border-box" || n=="TABLE" || n=="BUTTON"; // boolean + } + + dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){ + // summary: + // Sets the size of the node's contents, irrespective of margins, + // padding, or borders. + if(d._usesBorderBox(node)){ + var pb = d._getPadBorderExtents(node, computedStyle); + if(widthPx >= 0){ widthPx += pb.w; } + if(heightPx >= 0){ heightPx += pb.h; } + } + d._setBox(node, NaN, NaN, widthPx, heightPx); + } + + dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx, + /*Number?*/widthPx, /*Number?*/heightPx, + /*Object*/computedStyle){ + // summary: + // sets the size of the node's margin box and placement + // (left/top), irrespective of box model. Think of it as a + // passthrough to dojo._setBox that handles box-model vagaries for + // you. + + var s = computedStyle||gcs(node); + // Some elements have special padding, margin, and box-model settings. + // To use box functions you may need to set padding, margin explicitly. + // Controlling box-model is harder, in a pinch you might set dojo.boxModel. + var bb=d._usesBorderBox(node), + pb=bb ? _nilExtents : d._getPadBorderExtents(node, s), + mb=d._getMarginExtents(node, s); + if(widthPx>=0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); } + if(heightPx>=0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); } + d._setBox(node, leftPx, topPx, widthPx, heightPx); + } + + var _nilExtents = { l:0, t:0, w:0, h:0 }; + + // public API + + dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){ + // summary: + // Getter/setter for the margin-box of node. + // description: + // Returns an object in the expected format of box (regardless + // if box is passed). The object might look like: + // `{ l: 50, t: 200, w: 300: h: 150 }` + // for a node offset from its parent 50px to the left, 200px from + // the top with a margin width of 300px and a margin-height of + // 150px. + // node: + // id or reference to DOM Node to get/set box for + // box: + // If passed, denotes that dojo.marginBox() should + // update/set the margin box for node. Box is an object in the + // above format. All properties are optional if passed. + var n=d.byId(node), s=gcs(n), b=box; + return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object + } + + dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){ + // summary: + // Getter/setter for the content-box of node. + // description: + // Returns an object in the expected format of box (regardless if box is passed). + // The object might look like: + // `{ l: 50, t: 200, w: 300: h: 150 }` + // for a node offset from its parent 50px to the left, 200px from + // the top with a content width of 300px and a content-height of + // 150px. Note that the content box may have a much larger border + // or margin box, depending on the box model currently in use and + // CSS values set/inherited for node. + // node: + // id or reference to DOM Node to get/set box for + // box: + // If passed, denotes that dojo.contentBox() should + // update/set the content box for node. Box is an object in the + // above format. All properties are optional if passed. + var n=dojo.byId(node), s=gcs(n), b=box; + return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object + } + + // ============================= + // Positioning + // ============================= + + var _sumAncestorProperties = function(node, prop){ + if(!(node = (node||0).parentNode)){return 0}; + var val, retVal = 0, _b = d.body(); + while(node && node.style){ + if(gcs(node).position == "fixed"){ + return 0; + } + val = node[prop]; + if(val){ + retVal += val - 0; + // opera and khtml #body & #html has the same values, we only + // need one value + if(node == _b){ break; } + } + node = node.parentNode; + } + return retVal; // integer + } + + dojo._docScroll = function(){ + var + _b = d.body(), + _w = d.global, + de = d.doc.documentElement; + return { + y: (_w.pageYOffset || de.scrollTop || _b.scrollTop || 0), + x: (_w.pageXOffset || d._fixIeBiDiScrollLeft(de.scrollLeft) || _b.scrollLeft || 0) + }; + }; + + dojo._isBodyLtr = function(){ + //FIXME: could check html and body tags directly instead of computed style? need to ignore case, accept empty values + return !("_bodyLtr" in d) ? + d._bodyLtr = gcs(d.body()).direction == "ltr" : + d._bodyLtr; // Boolean + } + + dojo._getIeDocumentElementOffset = function(){ + // summary + // The following values in IE contain an offset: + // event.clientX + // event.clientY + // node.getBoundingClientRect().left + // node.getBoundingClientRect().top + // But other position related values do not contain this offset, such as + // node.offsetLeft, node.offsetTop, node.style.left and node.style.top. + // The offset is always (2, 2) in LTR direction. When the body is in RTL + // direction, the offset counts the width of left scroll bar's width. + // This function computes the actual offset. + + //NOTE: assumes we're being called in an IE browser + + var de = d.doc.documentElement; + //FIXME: use this instead? var de = d.compatMode == "BackCompat" ? d.body : d.documentElement; + + return (d.isIE >= 7) ? + {x: de.getBoundingClientRect().left, y: de.getBoundingClientRect().top} + : + // IE 6.0 + {x: d._isBodyLtr() || window.parent == window ? + de.clientLeft : de.offsetWidth - de.clientWidth - de.clientLeft, + y: de.clientTop}; // Object + }; + + dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){ + // In RTL direction, scrollLeft should be a negative value, but IE + // returns a positive one. All codes using documentElement.scrollLeft + // must call this function to fix this error, otherwise the position + // will offset to right when there is a horizontal scrollbar. + var dd = d.doc; + if(d.isIE && !dojo._isBodyLtr()){ + var de = dd.compatMode == "BackCompat" ? dd.body : dd.documentElement; + return scrollLeft + de.clientWidth - de.scrollWidth; // Integer + } + return scrollLeft; // Integer + } + + dojo._abs = function(/*DomNode*/node, /*Boolean?*/includeScroll){ + // summary: + // Gets the position of the passed element relative to + // the viewport (if includeScroll==false), or relative to the + // document root (if includeScroll==true). + // + // Returns an object of the form: + // { x: 100, y: 300 } + // if includeScroll is passed, the x and y values will include any + // document offsets that may affect the position relative to the + // viewport. + + // FIXME: need to decide in the brave-new-world if we're going to be + // margin-box or border-box. + var ownerDocument = node.ownerDocument; + var ret = { + x: 0, + y: 0 + }; + + // targetBoxType == "border-box" + var db = d.body(); + if(d.isIE || (d.isFF >= 3)){ + var client = node.getBoundingClientRect(); + var offset = (d.isIE) ? d._getIeDocumentElementOffset() : { x: 0, y: 0}; + ret.x = client.left - offset.x; + ret.y = client.top - offset.y; + }else if(ownerDocument["getBoxObjectFor"]){ + // mozilla + var bo = ownerDocument.getBoxObjectFor(node), + b = d._getBorderExtents(node); + ret.x = bo.x - b.l - _sumAncestorProperties(node, "scrollLeft"); + ret.y = bo.y - b.t - _sumAncestorProperties(node, "scrollTop"); + }else{ + if(node["offsetParent"]){ + var endNode; + // in Safari, if the node is an absolutely positioned child of + // the body and the body has a margin the offset of the child + // and the body contain the body's margins, so we need to end + // at the body + // FIXME: getting contrary results to the above in latest WebKit. + if(d.isSafari && + //(node.style.getPropertyValue("position") == "absolute") && + (gcs(node).position == "absolute") && + (node.parentNode == db)){ + endNode = db; + }else{ + endNode = db.parentNode; + } + if(node.parentNode != db){ + var nd = node; + if(d.isOpera){ nd = db; } + ret.x -= _sumAncestorProperties(nd, "scrollLeft"); + ret.y -= _sumAncestorProperties(nd, "scrollTop"); + } + var curnode = node; + do{ + var n = curnode.offsetLeft; + //FIXME: ugly hack to workaround the submenu in + //popupmenu2 does not shown up correctly in opera. + //Someone have a better workaround? + if(!d.isOpera || n > 0){ + ret.x += isNaN(n) ? 0 : n; + } + var t = curnode.offsetTop; + ret.y += isNaN(t) ? 0 : t; + if(d.isSafari && curnode != node){ + var cs = gcs(curnode); + ret.x += px(curnode, cs.borderLeftWidth); + ret.y += px(curnode, cs.borderTopWidth); + } + curnode = curnode.offsetParent; + }while((curnode != endNode) && curnode); + }else if(node.x && node.y){ + ret.x += isNaN(node.x) ? 0 : node.x; + ret.y += isNaN(node.y) ? 0 : node.y; + } + } + // account for document scrolling + // if offsetParent is used, ret value already includes scroll position + // so we may have to actually remove that value if !includeScroll + if(includeScroll){ + var scroll = d._docScroll(); + ret.y += scroll.y; + ret.x += scroll.x; + } + + return ret; // object + } + + // FIXME: need a setter for coords or a moveTo!! + dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){ + // summary: + // Returns an object that measures margin box width/height and + // absolute positioning data from dojo._abs(). + // + // description: + // Returns an object that measures margin box width/height and + // absolute positioning data from dojo._abs(). + // Return value will be in the form: + // `{ l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }` + // Does not act as a setter. If includeScroll is passed, the x and + // y params are affected as one would expect in dojo._abs(). + var n=d.byId(node), s=gcs(n), mb=d._getMarginBox(n, s); + var abs = d._abs(n, includeScroll); + mb.x = abs.x; + mb.y = abs.y; + return mb; + } + + // ============================= + // Element attribute Functions + // ============================= + + var _fixAttrName = function(/*String*/name){ + switch(name.toLowerCase()){ + case "tabindex": + // Internet Explorer will only set or remove tabindex + // if it is spelled "tabIndex" + // console.debug((dojo.isIE && dojo.isIE < 8)? "tabIndex" : "tabindex"); + return (d.isIE && d.isIE < 8) ? "tabIndex" : "tabindex"; + default: + return name; + } + } + + // non-deprecated HTML4 attributes with default values + // http://www.w3.org/TR/html401/index/attributes.html + // FF and Safari will return the default values if you + // access the attributes via a property but not + // via getAttribute() + var _attrProps = { + colspan: "colSpan", + enctype: "enctype", + frameborder: "frameborder", + method: "method", + rowspan: "rowSpan", + scrolling: "scrolling", + shape: "shape", + span: "span", + type: "type", + valuetype: "valueType" + } + + dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){ + // summary: + // Returns true if the requested attribute is specified on the + // given element, and false otherwise. + // node: + // id or reference to the element to check + // name: + // the name of the attribute + // returns: + // true if the requested attribute is specified on the + // given element, and false otherwise + var attr = d.byId(node).getAttributeNode(_fixAttrName(name)); + return attr ? attr.specified : false; // Boolean + } + + var _evtHdlrMap = { + + } + + var _ctr = 0; + var _attrId = dojo._scopeName + "attrid"; + + dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){ + // summary: + // Gets or sets an attribute on an HTML element. + // description: + // Handles normalized getting and setting of attributes on DOM + // Nodes. If 2 arguments are passed, and a the second argumnt is a + // string, acts as a getter. + // + // If a third argument is passed, or if the second argumnt is a + // map of attributes, acts as a setter. + // + // When passing functions as values, note that they will not be + // directly assigned to slots on the node, but rather the default + // behavior will be removed and the new behavior will be added + // using `dojo.connect()`, meaning that event handler properties + // will be normalized and that some caveats with regards to + // non-standard behaviors for onsubmit apply. Namely that you + // should cancel form submission using `dojo.stopEvent()` on the + // passed event object instead of returning a boolean value from + // the handler itself. + // node: + // id or reference to the element to get or set the attribute on + // name: + // the name of the attribute to get or set. + // value: + // The value to set for the attribute + // returns: + // when used as a getter, the value of the requested attribute + // or null if that attribute does not have a specified or + // default value; + // + // when user as a setter, undefined + // example: + // | // get the current value of the "foo" attribute on a node + // | dojo.attr(dojo.byId("nodeId"), "foo"); + // | + // | // we can just pass the id: + // | dojo.attr("nodeId", "foo"); + // | + // | // use attr() to set the tab index + // | dojo.attr("nodeId", "tabindex", 3); + // | + // | // set multiple values at once, including event handlers: + // | dojo.attr("formId", { + // | "foo": "bar", + // | "tabindex": -1, + // | "method": "POST", + // | "onsubmit": function(e){ + // | // stop submitting the form. Note that the IE behavior + // | // of returning true or false will have no effect here + // | // since our handler is connect()ed to the built-in + // | // onsubmit behavior and so we need to use + // | // dojo.stopEvent() to ensure that the submission + // | // doesn't proceed. + // | dojo.stopEvent(e); + // | + // | // submit the form with Ajax + // | dojo.xhrPost({ form: "formId" }); + // | } + // | }); + + var args = arguments.length; + if(args == 2 && !d.isString(name)){ + for(var x in name){ d.attr(node, x, name[x]); } + return; + } + node = d.byId(node); + name = _fixAttrName(name); + if(args == 3){ + if(d.isFunction(value)){ + // clobber if we can + var attrId = d.attr(node, _attrId); + if(!attrId){ + attrId = _ctr++; + d.attr(node, _attrId, attrId); + } + if(!_evtHdlrMap[attrId]){ + _evtHdlrMap[attrId] = {}; + } + var h = _evtHdlrMap[attrId][name]; + if(h){ + d.disconnect(h); + }else{ + try{ + delete node[name]; + }catch(e){} + } + + // ensure that event objects are normalized, etc. + _evtHdlrMap[attrId][name] = d.connect(node, name, value); + + }else if(typeof value == "boolean"){ // e.g. onsubmit, disabled + // if a function, we should normalize the event object here!!! + node[name] = value; + }else{ + node.setAttribute(name, value); + } + return; + }else{ + // should we access this attribute via a property or + // via getAttribute()? + var prop = _attrProps[name.toLowerCase()]; + if(prop){ + return node[prop]; + }else{ + var value = node[name]; + return (typeof value == 'boolean' || typeof value == 'function') ? value : (d.hasAttr(node, name) ? node.getAttribute(name) : null); + } + } + } + + dojo.removeAttr = function(/*DomNode|String*/node, /*String*/name){ + // summary: + // Removes an attribute from an HTML element. + // node: + // id or reference to the element to remove the attribute from + // name: + // the name of the attribute to remove + d.byId(node).removeAttribute(_fixAttrName(name)); + } +})(); + +// ============================= +// (CSS) Class Functions +// ============================= + +dojo.hasClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: + // Returns whether or not the specified classes are a portion of the + // class list currently applied to the node. + return ((" "+dojo.byId(node).className+" ").indexOf(" "+classStr+" ") >= 0); // Boolean +}; + +dojo.addClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: + // Adds the specified classes to the end of the class list on the + // passed node. + node = dojo.byId(node); + var cls = node.className; + if((" "+cls+" ").indexOf(" "+classStr+" ") < 0){ + node.className = cls + (cls ? ' ' : '') + classStr; + } +}; + +dojo.removeClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: Removes the specified classes from node. + node = dojo.byId(node); + var t = dojo.trim((" " + node.className + " ").replace(" " + classStr + " ", " ")); + if(node.className != t){ node.className = t; } +}; + +dojo.toggleClass = function(/*DomNode|String*/node, /*String*/classStr, /*Boolean?*/condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // condition: + // If passed, true means to add the class, false means to remove. + if(condition === undefined){ + condition = !dojo.hasClass(node, classStr); + } + dojo[condition ? "addClass" : "removeClass"](node, classStr); +}; + +} diff --git a/includes/js/dojo/_base/json.js b/includes/js/dojo/_base/json.js new file mode 100644 index 0000000..55d8035 --- /dev/null +++ b/includes/js/dojo/_base/json.js @@ -0,0 +1,137 @@ +if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.json"] = true; +dojo.provide("dojo._base.json"); + +dojo.fromJson = function(/*String*/ json){ + // summary: + // Parses a [JSON](http://json.org) string to return a JavaScript object. + // json: + // a string literal of a JSON item, for instance: + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` + + return eval("(" + json + ")"); // Object +} + +dojo._escapeString = function(/*String*/str){ + //summary: + // Adds escape sequences for non-visual characters, double quote and + // backslash and surrounds with double quotes to form a valid string + // literal. + return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). + replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). + replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string +} + +dojo.toJsonIndentStr = "\t"; +dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){ + // summary: + // Returns a [JSON](http://json.org) serialization of an object. + // + // description: + // Returns a [JSON](http://json.org) serialization of an object. + // Note that this doesn't check for infinite recursion, so don't do that! + // + // it: + // an object to be serialized. Objects may define their own + // serialization via a special "__json__" or "json" function + // property. If a specialized serializer has been defined, it will + // be used as a fallback. + // + // prettyPrint: + // if true, we indent objects and arrays to make the output prettier. + // The variable dojo.toJsonIndentStr is used as the indent string + // -- to use something other than the default (tab), + // change that variable before calling dojo.toJson(). + // + // _indentStr: + // private variable for recursive calls when pretty printing, do not use. + + if(it === undefined){ + return "undefined"; + } + var objtype = typeof it; + if(objtype == "number" || objtype == "boolean"){ + return it + ""; + } + if(it === null){ + return "null"; + } + if(dojo.isString(it)){ + return dojo._escapeString(it); + } + if(it.nodeType && it.cloneNode){ // isNode + return ""; // FIXME: would something like outerHTML be better here? + } + // recurse + var recurse = arguments.callee; + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + var newObj; + _indentStr = _indentStr || ""; + var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : ""; + if(typeof it.__json__ == "function"){ + newObj = it.__json__(); + if(it !== newObj){ + return recurse(newObj, prettyPrint, nextIndent); + } + } + if(typeof it.json == "function"){ + newObj = it.json(); + if(it !== newObj){ + return recurse(newObj, prettyPrint, nextIndent); + } + } + + var sep = prettyPrint ? " " : ""; + var newLine = prettyPrint ? "\n" : ""; + + // array + if(dojo.isArray(it)){ + var res = dojo.map(it, function(obj){ + var val = recurse(obj, prettyPrint, nextIndent); + if(typeof val != "string"){ + val = "undefined"; + } + return newLine + nextIndent + val; + }); + return "[" + res.join("," + sep) + newLine + _indentStr + "]"; + } + /* + // look in the registry + try { + window.o = it; + newObj = dojo.json.jsonRegistry.match(it); + return recurse(newObj, prettyPrint, nextIndent); + }catch(e){ + // console.debug(e); + } + // it's a function with no adapter, skip it + */ + if(objtype == "function"){ + return null; // null + } + // generic object code path + var output = []; + for(var key in it){ + var keyStr; + if(typeof key == "number"){ + keyStr = '"' + key + '"'; + }else if(typeof key == "string"){ + keyStr = dojo._escapeString(key); + }else{ + // skip non-string or number keys + continue; + } + val = recurse(it[key], prettyPrint, nextIndent); + if(typeof val != "string"){ + // skip non-serializable values + continue; + } + // FIXME: use += on Moz!! + // MOW NOTE: using += is a pain because you have to account for the dangling comma... + output.push(newLine + nextIndent + keyStr + ":" + sep + val); + } + return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String +} + +} diff --git a/includes/js/dojo/_base/lang.js b/includes/js/dojo/_base/lang.js new file mode 100644 index 0000000..feedc21 --- /dev/null +++ b/includes/js/dojo/_base/lang.js @@ -0,0 +1,257 @@ +if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.lang"] = true; +dojo.provide("dojo._base.lang"); + +// Crockford (ish) functions + +dojo.isString = function(/*anything*/ it){ + // summary: + // Return true if it is a String + return !!arguments.length && it != null && (typeof it == "string" || it instanceof String); // Boolean +} + +dojo.isArray = function(/*anything*/ it){ + // summary: + // Return true if it is an Array + return it && (it instanceof Array || typeof it == "array"); // Boolean +} + +/*===== +dojo.isFunction = function(it){ + // summary: Return true if it is a Function + // it: anything + // return: Boolean +} +=====*/ + +dojo.isFunction = (function(){ + var _isFunction = function(/*anything*/ it){ + return it && (typeof it == "function" || it instanceof Function); // Boolean + }; + + return dojo.isSafari ? + // only slow this down w/ gratuitious casting in Safari since it's what's b0rken + function(/*anything*/ it){ + if(typeof it == "function" && it == "[object NodeList]"){ return false; } + return _isFunction(it); // Boolean + } : _isFunction; +})(); + +dojo.isObject = function(/*anything*/ it){ + // summary: + // Returns true if it is a JavaScript object (or an Array, a Function + // or null) + return it !== undefined && + (it === null || typeof it == "object" || dojo.isArray(it) || dojo.isFunction(it)); // Boolean +} + +dojo.isArrayLike = function(/*anything*/ it){ + // summary: + // similar to dojo.isArray() but more permissive + // description: + // Doesn't strongly test for "arrayness". Instead, settles for "isn't + // a string or number and has a length property". Arguments objects + // and DOM collections will return true when passed to + // dojo.isArrayLike(), but will return false when passed to + // dojo.isArray(). + // return: + // If it walks like a duck and quicks like a duck, return `true` + var d = dojo; + return it && it !== undefined && + // keep out built-in constructors (Number, String, ...) which have length + // properties + !d.isString(it) && !d.isFunction(it) && + !(it.tagName && it.tagName.toLowerCase() == 'form') && + (d.isArray(it) || isFinite(it.length)); // Boolean +} + +dojo.isAlien = function(/*anything*/ it){ + // summary: + // Returns true if it is a built-in function or some other kind of + // oddball that *should* report as a function but doesn't + return it && !dojo.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean +} + +dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){ + // summary: + // Adds all properties and methods of props to constructor's + // prototype, making them available to all instances created with + // constructor. + for(var i=1, l=arguments.length; i 2){ + return dojo._hitchArgs.apply(dojo, arguments); // Function + } + if(!method){ + method = scope; + scope = null; + } + if(dojo.isString(method)){ + scope = scope || dojo.global; + if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); } + return function(){ return scope[method].apply(scope, arguments || []); }; // Function + } + return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function +} + +/*===== +dojo.delegate = function(obj, props){ + // summary: + // returns a new object which "looks" to obj for properties which it + // does not have a value for. Optionally takes a bag of properties to + // seed the returned object with initially. + // description: + // This is a small implementaton of the Boodman/Crockford delegation + // pattern in JavaScript. An intermediate object constructor mediates + // the prototype chain for the returned object, using it to delegate + // down to obj for property lookup when object-local lookup fails. + // This can be thought of similarly to ES4's "wrap", save that it does + // not act on types but rather on pure objects. + // obj: + // The object to delegate to for properties not found directly on the + // return object or in props. + // props: + // an object containing properties to assign to the returned object + // returns: + // an Object of anonymous type + // example: + // | var foo = { bar: "baz" }; + // | var thinger = dojo.delegate(foo, { thud: "xyzzy"}); + // | thinger.bar == "baz"; // delegated to foo + // | foo.thud == undefined; // by definition + // | thinger.thud == "xyzzy"; // mixed in from props + // | foo.bar = "thonk"; + // | thinger.bar == "thonk"; // still delegated to foo's bar +} +=====*/ + + +dojo.delegate = dojo._delegate = function(obj, props){ + + // boodman/crockford delegation + function TMP(){}; + TMP.prototype = obj; + var tmp = new TMP(); + if(props){ + dojo.mixin(tmp, props); + } + return tmp; // Object +} + +dojo.partial = function(/*Function|String*/method /*, ...*/){ + // summary: + // similar to hitch() except that the scope object is left to be + // whatever the execution context eventually becomes. + // description: + // Calling dojo.partial is the functional equivalent of calling: + // | dojo.hitch(null, funcName, ...); + var arr = [ null ]; + return dojo.hitch.apply(dojo, arr.concat(dojo._toArray(arguments))); // Function +} + +dojo._toArray = function(/*Object*/obj, /*Number?*/offset, /*Array?*/ startWith){ + // summary: + // Converts an array-like object (i.e. arguments, DOMCollection) to an + // array. Returns a new Array with the elements of obj. + // obj: + // the object to "arrayify". We expect the object to have, at a + // minimum, a length property which corresponds to integer-indexed + // properties. + // offset: + // the location in obj to start iterating from. Defaults to 0. + // Optional. + // startWith: + // An array to pack with the properties of obj. If provided, + // properties in obj are appended at the end of startWith and + // startWith is the returned array. + var arr = startWith||[]; + for(var x = offset || 0; x < obj.length; x++){ + arr.push(obj[x]); + } + return arr; // Array +} + +dojo.clone = function(/*anything*/ o){ + // summary: + // Clones objects (including DOM nodes) and all children. + // Warning: do not clone cyclic structures. + if(!o){ return o; } + if(dojo.isArray(o)){ + var r = []; + for(var i = 0; i < o.length; ++i){ + r.push(dojo.clone(o[i])); + } + return r; // Array + } + if(!dojo.isObject(o)){ + return o; /*anything*/ + } + if(o.nodeType && o.cloneNode){ // isNode + return o.cloneNode(true); // Node + } + if(o instanceof Date){ + return new Date(o.getTime()); // Date + } + // Generic objects + var r = new o.constructor(); // specific to dojo.declare()'d classes! + for(var i in o){ + if(!(i in r) || r[i] != o[i]){ + r[i] = dojo.clone(o[i]); + } + } + return r; // Object +} + +dojo.trim = function(/*String*/ str){ + // summary: + // trims whitespaces from both sides of the string + // description: + // This version of trim() was selected for inclusion into the base due + // to its compact size and relatively good performance (see Steven + // Levithan's blog: + // http://blog.stevenlevithan.com/archives/faster-trim-javascript). + // The fastest but longest version of this function is located at + // dojo.string.trim() + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); // String +} + +} diff --git a/includes/js/dojo/_base/query.js b/includes/js/dojo/_base/query.js new file mode 100644 index 0000000..8743df8 --- /dev/null +++ b/includes/js/dojo/_base/query.js @@ -0,0 +1,1191 @@ +if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.query"] = true; +dojo.provide("dojo._base.query"); +dojo.require("dojo._base.NodeList"); + +/* + dojo.query() architectural overview: + + dojo.query is a relatively full-featured CSS3 query library. It is + designed to take any valid CSS3 selector and return the nodes matching + the selector. To do this quickly, it processes queries in several + steps, applying caching where profitable. + + The steps (roughly in reverse order of the way they appear in the code): + 1.) check to see if we already have a "query dispatcher" + - if so, use that with the given parameterization. Skip to step 4. + 2.) attempt to determine which branch to dispatch the query to: + - JS (optimized DOM iteration) + - xpath (for browsers that support it and where it's fast) + - native (not available in any browser yet) + 3.) tokenize and convert to executable "query dispatcher" + - this is where the lion's share of the complexity in the + system lies. In the DOM version, the query dispatcher is + assembled as a chain of "yes/no" test functions pertaining to + a section of a simple query statement (".blah:nth-child(odd)" + but not "div div", which is 2 simple statements). Individual + statement dispatchers are cached (to prevent re-definition) + as are entire dispatch chains (to make re-execution of the + same query fast) + - in the xpath path, tokenization yeilds a concatenation of + parameterized xpath selectors. As with the DOM version, both + simple selector blocks and overall evaluators are cached to + prevent re-defintion + 4.) the resulting query dispatcher is called in the passed scope (by default the top-level document) + - for DOM queries, this results in a recursive, top-down + evaluation of nodes based on each simple query section + - xpath queries can, thankfully, be executed in one shot + 5.) matched nodes are pruned to ensure they are unique +*/ + +;(function(){ + // define everything in a closure for compressability reasons. "d" is an + // alias to "dojo" since it's so frequently used. This seems a + // transformation that the build system could perform on a per-file basis. + + //////////////////////////////////////////////////////////////////////// + // Utility code + //////////////////////////////////////////////////////////////////////// + + var d = dojo; + var childNodesName = dojo.isIE ? "children" : "childNodes"; + var caseSensitive = false; + + var getQueryParts = function(query){ + // summary: state machine for query tokenization + if(">~+".indexOf(query.charAt(query.length-1)) >= 0){ + query += " *" + } + query += " "; // ensure that we terminate the state machine + + var ts = function(s, e){ + return d.trim(query.slice(s, e)); + } + + // the overall data graph of the full query, as represented by queryPart objects + var qparts = []; + // state keeping vars + var inBrackets = -1; + var inParens = -1; + var inMatchFor = -1; + var inPseudo = -1; + var inClass = -1; + var inId = -1; + var inTag = -1; + var lc = ""; // the last character + var cc = ""; // the current character + var pStart; + // iteration vars + var x = 0; // index in the query + var ql = query.length; + var currentPart = null; // data structure representing the entire clause + var _cp = null; // the current pseudo or attr matcher + + var endTag = function(){ + if(inTag >= 0){ + var tv = (inTag == x) ? null : ts(inTag, x).toLowerCase(); + currentPart[ (">~+".indexOf(tv) < 0) ? "tag" : "oper" ] = tv; + inTag = -1; + } + } + + var endId = function(){ + if(inId >= 0){ + currentPart.id = ts(inId, x).replace(/\\/g, ""); + inId = -1; + } + } + + var endClass = function(){ + if(inClass >= 0){ + currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, "")); + inClass = -1; + } + } + + var endAll = function(){ + endId(); endTag(); endClass(); + } + + for(; lc=cc, cc=query.charAt(x),x= 0){ + // look for a the close first + if(cc == "]"){ + if(!_cp.attr){ + _cp.attr = ts(inBrackets+1, x); + }else{ + _cp.matchFor = ts((inMatchFor||inBrackets+1), x); + } + var cmf = _cp.matchFor; + if(cmf){ + if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ + _cp.matchFor = cmf.substring(1, cmf.length-1); + } + } + currentPart.attrs.push(_cp); + _cp = null; // necessaray? + inBrackets = inMatchFor = -1; + }else if(cc == "="){ + var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; + _cp.type = addToCc+cc; + _cp.attr = ts(inBrackets+1, x-addToCc.length); + inMatchFor = x+1; + } + // now look for other clause parts + }else if(inParens >= 0){ + if(cc == ")"){ + if(inPseudo >= 0){ + _cp.value = ts(inParens+1, x); + } + inPseudo = inParens = -1; + } + }else if(cc == "#"){ + endAll(); + inId = x+1; + }else if(cc == "."){ + endAll(); + inClass = x; + }else if(cc == ":"){ + endAll(); + inPseudo = x; + }else if(cc == "["){ + endAll(); + inBrackets = x; + _cp = { + /*===== + attr: null, type: null, matchFor: null + =====*/ + }; + }else if(cc == "("){ + if(inPseudo >= 0){ + _cp = { + name: ts(inPseudo+1, x), + value: null + } + currentPart.pseudos.push(_cp); + } + inParens = x; + }else if(cc == " " && lc != cc){ + // note that we expect the string to be " " terminated + endAll(); + if(inPseudo >= 0){ + currentPart.pseudos.push({ name: ts(inPseudo+1, x) }); + } + currentPart.hasLoops = ( + currentPart.pseudos.length || + currentPart.attrs.length || + currentPart.classes.length ); + currentPart.query = ts(pStart, x); + currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); + qparts.push(currentPart); + currentPart = null; + } + } + return qparts; + }; + + + //////////////////////////////////////////////////////////////////////// + // XPath query code + //////////////////////////////////////////////////////////////////////// + + // this array is a lookup used to generate an attribute matching function. + // There is a similar lookup/generator list for the DOM branch with similar + // calling semantics. + var xPathAttrs = { + "*=": function(attr, value){ + return "[contains(@"+attr+", '"+ value +"')]"; + }, + "^=": function(attr, value){ + return "[starts-with(@"+attr+", '"+ value +"')]"; + }, + "$=": function(attr, value){ + return "[substring(@"+attr+", string-length(@"+attr+")-"+(value.length-1)+")='"+value+"']"; + }, + "~=": function(attr, value){ + return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + }, + "|=": function(attr, value){ + return "[contains(concat(' ',@"+attr+",' '), ' "+ value +"-')]"; + }, + "=": function(attr, value){ + return "[@"+attr+"='"+ value +"']"; + } + }; + + // takes a list of attribute searches, the overall query, a function to + // generate a default matcher, and a closure-bound method for providing a + // matching function that generates whatever type of yes/no distinguisher + // the query method needs. The method is a bit tortured and hard to read + // because it needs to be used in both the XPath and DOM branches. + var handleAttrs = function( attrList, + query, + getDefault, + handleMatch){ + d.forEach(query.attrs, function(attr){ + var matcher; + // type, attr, matchFor + if(attr.type && attrList[attr.type]){ + matcher = attrList[attr.type](attr.attr, attr.matchFor); + }else if(attr.attr.length){ + matcher = getDefault(attr.attr); + } + if(matcher){ handleMatch(matcher); } + }); + } + + var buildPath = function(query){ + var xpath = "."; + var qparts = getQueryParts(d.trim(query)); + while(qparts.length){ + var tqp = qparts.shift(); + var prefix; + var postfix = ""; + if(tqp.oper == ">"){ + prefix = "/"; + // prefix = "/child::*"; + tqp = qparts.shift(); + }else if(tqp.oper == "~"){ + prefix = "/following-sibling::"; // get element following siblings + tqp = qparts.shift(); + }else if(tqp.oper == "+"){ + // FIXME: + // fails when selecting subsequent siblings by node type + // because the position() checks the position in the list + // of matching elements and not the localized siblings + prefix = "/following-sibling::"; + postfix = "[position()=1]"; + tqp = qparts.shift(); + }else{ + prefix = "//"; + // prefix = "/descendant::*" + } + + // get the tag name (if any) + + xpath += prefix + tqp.tag + postfix; + + // check to see if it's got an id. Needs to come first in xpath. + if(tqp.id){ + xpath += "[@id='"+tqp.id+"'][1]"; + } + + d.forEach(tqp.classes, function(cn){ + var cnl = cn.length; + var padding = " "; + if(cn.charAt(cnl-1) == "*"){ + padding = ""; cn = cn.substr(0, cnl-1); + } + xpath += + "[contains(concat(' ',@class,' '), ' "+ + cn + padding + "')]"; + }); + + handleAttrs(xPathAttrs, tqp, + function(condition){ + return "[@"+condition+"]"; + }, + function(matcher){ + xpath += matcher; + } + ); + + // FIXME: need to implement pseudo-class checks!! + }; + return xpath; + }; + + var _xpathFuncCache = {}; + var getXPathFunc = function(path){ + if(_xpathFuncCache[path]){ + return _xpathFuncCache[path]; + } + + var doc = d.doc; + // don't need to memoize. The closure scope handles it for us. + var xpath = buildPath(path); + + var tf = function(parent){ + // XPath query strings are memoized. + var ret = []; + var xpathResult; + try{ + xpathResult = doc.evaluate(xpath, parent, null, + // XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); + XPathResult.ANY_TYPE, null); + }catch(e){ + console.debug("failure in exprssion:", xpath, "under:", parent); + console.debug(e); + } + var result = xpathResult.iterateNext(); + while(result){ + ret.push(result); + result = xpathResult.iterateNext(); + } + return ret; + } + return _xpathFuncCache[path] = tf; + }; + + /* + d.xPathMatch = function(query){ + // XPath based DOM query system. Handles a small subset of CSS + // selectors, subset is identical to the non-XPath version of this + // function. + + return getXPathFunc(query)(); + } + */ + + //////////////////////////////////////////////////////////////////////// + // DOM query code + //////////////////////////////////////////////////////////////////////// + + var _filtersCache = {}; + var _simpleFiltersCache = {}; + + // the basic building block of the yes/no chaining system. agree(f1, f2) + // generates a new function which returns the boolean results of both of + // the passed functions to a single logical-anded result. + var agree = function(first, second){ + if(!first){ return second; } + if(!second){ return first; } + + return function(){ + return first.apply(window, arguments) && second.apply(window, arguments); + } + } + + var _childElements = function(root){ + var ret = []; + var te, x=0, tret = root[childNodesName]; + while(te=tret[x++]){ + if(te.nodeType == 1){ ret.push(te); } + } + return ret; + } + + var _nextSiblings = function(root, single){ + var ret = []; + var te = root; + while(te = te.nextSibling){ + if(te.nodeType == 1){ + ret.push(te); + if(single){ break; } + } + } + return ret; + } + + var _filterDown = function(element, queryParts, matchArr, idx){ + // NOTE: + // in the fast path! this function is called recursively and for + // every run of a query. + var nidx = idx+1; + var isFinal = (queryParts.length == nidx); + var tqp = queryParts[idx]; + + // see if we can constrain our next level to direct children + if(tqp.oper){ + var ecn = (tqp.oper == ">") ? + _childElements(element) : + _nextSiblings(element, (tqp.oper == "+")); + + if(!ecn || !ecn.length){ + return; + } + nidx++; + isFinal = (queryParts.length == nidx); + // kinda janky, too much array alloc + var tf = getFilterFunc(queryParts[idx+1]); + // for(var x=ecn.length-1, te; x>=0, te=ecn[x]; x--){ + for(var x=0, ecnl=ecn.length, te; x=0, te=elements[x]; x--){ + var x = elements.length - 1, te; + while(te = elements[x--]){ + _filterDown(te, queryParts, ret, 0); + } + return ret; + } + + var getFilterFunc = function(q){ + // note: query can't have spaces! + if(_filtersCache[q.query]){ + return _filtersCache[q.query]; + } + var ff = null; + + // does it have a tagName component? + if(q.tag){ + if(q.tag == "*"){ + ff = agree(ff, + function(elem){ + return (elem.nodeType == 1); + } + ); + }else{ + // tag name match + ff = agree(ff, + function(elem){ + return ( + (elem.nodeType == 1) && + (q.tag == elem.tagName.toLowerCase()) + ); + // return isTn; + } + ); + } + } + + // does the node have an ID? + if(q.id){ + ff = agree(ff, + function(elem){ + return ( + (elem.nodeType == 1) && + (elem.id == q.id) + ); + } + ); + } + + if(q.hasLoops){ + // if we have other query param parts, make sure we add them to the + // filter chain + ff = agree(ff, getSimpleFilterFunc(q)); + } + + return _filtersCache[q.query] = ff; + } + + var getNodeIndex = function(node){ + // NOTE: + // we could have a more accurate caching mechanism by invalidating + // caches after the query has finished, but I think that'd lead to + // significantly more cache churn than the cache would provide + // value for in the common case. Generally, we're more + // conservative (and therefore, more accurate) than jQuery and + // DomQuery WRT node node indexes, but there may be corner cases + // in which we fall down. How much we care about them is TBD. + + var pn = node.parentNode; + var pnc = pn.childNodes; + + // check to see if we can trust the cache. If not, re-key the whole + // thing and return our node match from that. + + var nidx = -1; + var child = pn.firstChild; + if(!child){ + return nidx; + } + + var ci = node["__cachedIndex"]; + var cl = pn["__cachedLength"]; + + // only handle cache building if we've gone out of sync + if(((typeof cl == "number")&&(cl != pnc.length))||(typeof ci != "number")){ + // rip though the whole set, building cache indexes as we go + pn["__cachedLength"] = pnc.length; + var idx = 1; + do{ + // we only assign indexes for nodes with nodeType == 1, as per: + // http://www.w3.org/TR/css3-selectors/#nth-child-pseudo + // only elements are counted in the search order, and they + // begin at 1 for the first child's index + + if(child === node){ + nidx = idx; + } + if(child.nodeType == 1){ + child["__cachedIndex"] = idx; + idx++; + } + child = child.nextSibling; + }while(child); + }else{ + // NOTE: + // could be incorrect in some cases (node swaps involving the + // passed node, etc.), but we ignore those due to the relative + // unlikelihood of that occuring + nidx = ci; + } + return nidx; + } + + var firedCount = 0; + + var blank = ""; + var _getAttr = function(elem, attr){ + if(attr == "class"){ + return elem.className || blank; + } + if(attr == "for"){ + return elem.htmlFor || blank; + } + return elem.getAttribute(attr, 2) || blank; + } + + var attrs = { + "*=": function(attr, value){ + return function(elem){ + // E[foo*="bar"] + // an E element whose "foo" attribute value contains + // the substring "bar" + return (_getAttr(elem, attr).indexOf(value)>=0); + } + }, + "^=": function(attr, value){ + // E[foo^="bar"] + // an E element whose "foo" attribute value begins exactly + // with the string "bar" + return function(elem){ + return (_getAttr(elem, attr).indexOf(value)==0); + } + }, + "$=": function(attr, value){ + // E[foo$="bar"] + // an E element whose "foo" attribute value ends exactly + // with the string "bar" + var tval = " "+value; + return function(elem){ + var ea = " "+_getAttr(elem, attr); + return (ea.lastIndexOf(value)==(ea.length-value.length)); + } + }, + "~=": function(attr, value){ + // E[foo~="bar"] + // an E element whose "foo" attribute value is a list of + // space-separated values, one of which is exactly equal + // to "bar" + + // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + var tval = " "+value+" "; + return function(elem){ + var ea = " "+_getAttr(elem, attr)+" "; + return (ea.indexOf(tval)>=0); + } + }, + "|=": function(attr, value){ + // E[hreflang|="en"] + // an E element whose "hreflang" attribute has a + // hyphen-separated list of values beginning (from the + // left) with "en" + var valueDash = " "+value+"-"; + return function(elem){ + var ea = " "+(elem.getAttribute(attr, 2) || ""); + return ( + (ea == value) || + (ea.indexOf(valueDash)==0) + ); + } + }, + "=": function(attr, value){ + return function(elem){ + return (_getAttr(elem, attr) == value); + } + } + }; + + var pseudos = { + "first-child": function(name, condition){ + return function(elem){ + if(elem.nodeType != 1){ return false; } + // check to see if any of the previous siblings are elements + var fc = elem.previousSibling; + while(fc && (fc.nodeType != 1)){ + fc = fc.previousSibling; + } + return (!fc); + } + }, + "last-child": function(name, condition){ + return function(elem){ + if(elem.nodeType != 1){ return false; } + // check to see if any of the next siblings are elements + var nc = elem.nextSibling; + while(nc && (nc.nodeType != 1)){ + nc = nc.nextSibling; + } + return (!nc); + } + }, + "empty": function(name, condition){ + return function(elem){ + // DomQuery and jQuery get this wrong, oddly enough. + // The CSS 3 selectors spec is pretty explicit about + // it, too. + var cn = elem.childNodes; + var cnl = elem.childNodes.length; + // if(!cnl){ return true; } + for(var x=cnl-1; x >= 0; x--){ + var nt = cn[x].nodeType; + if((nt == 1)||(nt == 3)){ return false; } + } + return true; + } + }, + "contains": function(name, condition){ + return function(elem){ + // FIXME: I dislike this version of "contains", as + // whimsical attribute could set it off. An inner-text + // based version might be more accurate, but since + // jQuery and DomQuery also potentially get this wrong, + // I'm leaving it for now. + return (elem.innerHTML.indexOf(condition) >= 0); + } + }, + "not": function(name, condition){ + var ntf = getFilterFunc(getQueryParts(condition)[0]); + return function(elem){ + return (!ntf(elem)); + } + }, + "nth-child": function(name, condition){ + var pi = parseInt; + if(condition == "odd"){ + return function(elem){ + return ( + ((getNodeIndex(elem)) % 2) == 1 + ); + } + }else if((condition == "2n")|| + (condition == "even")){ + return function(elem){ + return ((getNodeIndex(elem) % 2) == 0); + } + }else if(condition.indexOf("0n+") == 0){ + var ncount = pi(condition.substr(3)); + return function(elem){ + return (elem.parentNode[childNodesName][ncount-1] === elem); + } + }else if( (condition.indexOf("n+") > 0) && + (condition.length > 3) ){ + var tparts = condition.split("n+", 2); + var pred = pi(tparts[0]); + var idx = pi(tparts[1]); + return function(elem){ + return ((getNodeIndex(elem) % pred) == idx); + } + }else if(condition.indexOf("n") == -1){ + var ncount = pi(condition); + return function(elem){ + return (getNodeIndex(elem) == ncount); + } + } + } + }; + + var defaultGetter = (d.isIE) ? function(cond){ + var clc = cond.toLowerCase(); + return function(elem){ + return elem[cond]||elem[clc]; + } + } : function(cond){ + return function(elem){ + return (elem && elem.getAttribute && elem.hasAttribute(cond)); + } + }; + + var getSimpleFilterFunc = function(query){ + + var fcHit = (_simpleFiltersCache[query.query]||_filtersCache[query.query]); + if(fcHit){ return fcHit; } + + var ff = null; + + // the only case where we'll need the tag name is if we came from an ID query + if(query.id){ // do we have an ID component? + if(query.tag != "*"){ + ff = agree(ff, function(elem){ + return (elem.tagName.toLowerCase() == query.tag); + }); + } + } + + // if there's a class in our query, generate a match function for it + d.forEach(query.classes, function(cname, idx, arr){ + // get the class name + var isWildcard = cname.charAt(cname.length-1) == "*"; + if(isWildcard){ + cname = cname.substr(0, cname.length-1); + } + // I dislike the regex thing, even if memozied in a cache, but it's VERY short + var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); + ff = agree(ff, function(elem){ + return re.test(elem.className); + }); + ff.count = idx; + }); + + d.forEach(query.pseudos, function(pseudo){ + if(pseudos[pseudo.name]){ + ff = agree(ff, pseudos[pseudo.name](pseudo.name, pseudo.value)); + } + }); + + handleAttrs(attrs, query, defaultGetter, + function(tmatcher){ ff = agree(ff, tmatcher); } + ); + if(!ff){ + ff = function(){ return true; }; + } + return _simpleFiltersCache[query.query] = ff; + } + + var _getElementsFuncCache = { }; + + var getElementsFunc = function(query, root){ + var fHit = _getElementsFuncCache[query.query]; + if(fHit){ return fHit; } + + // NOTE: this function is in the fast path! not memoized!!! + + // the query doesn't contain any spaces, so there's only so many + // things it could be + + if(query.id && !query.hasLoops && !query.tag){ + // ID-only query. Easy. + return _getElementsFuncCache[query.query] = function(root){ + // FIXME: if root != document, check for parenting! + return [ d.byId(query.id) ]; + } + } + + var filterFunc = getSimpleFilterFunc(query); + + var retFunc; + if(query.tag && query.id && !query.hasLoops){ + // we got a filtered ID search (e.g., "h4#thinger") + retFunc = function(root){ + var te = d.byId(query.id); + if(filterFunc(te)){ + return [ te ]; + } + } + }else{ + var tret; + + if(!query.hasLoops){ + // it's just a plain-ol elements-by-tag-name query from the root + retFunc = function(root){ + var ret = []; + var te, x=0, tret = root.getElementsByTagName(query.tag); + while(te=tret[x++]){ + ret.push(te); + } + return ret; + } + }else{ + retFunc = function(root){ + var ret = []; + var te, x=0, tret = root.getElementsByTagName(query.tag); + while(te=tret[x++]){ + if(filterFunc(te)){ + ret.push(te); + } + } + return ret; + } + } + } + return _getElementsFuncCache[query.query] = retFunc; + } + + var _partsCache = {}; + + //////////////////////////////////////////////////////////////////////// + // the query runner + //////////////////////////////////////////////////////////////////////// + + // this is the second level of spliting, from full-length queries (e.g., + // "div.foo .bar") into simple query expressions (e.g., ["div.foo", + // ".bar"]) + var _queryFuncCache = { + "*": d.isIE ? + function(root){ + return root.all; + } : + function(root){ + return root.getElementsByTagName("*"); + }, + "~": _nextSiblings, + "+": function(root){ return _nextSiblings(root, true); }, + ">": _childElements + }; + + var getStepQueryFunc = function(query){ + // if it's trivial, get a fast-path dispatcher + var qparts = getQueryParts(d.trim(query)); + // if(query[query.length-1] == ">"){ query += " *"; } + if(qparts.length == 1){ + var tt = getElementsFunc(qparts[0]); + tt.nozip = true; + return tt; + } + + // otherwise, break it up and return a runner that iterates over the parts recursively + var sqf = function(root){ + var localQueryParts = qparts.slice(0); // clone the src arr + var candidates; + if(localQueryParts[0].oper == ">"){ // FIXME: what if it's + or ~? + candidates = [ root ]; + // root = document; + }else{ + candidates = getElementsFunc(localQueryParts.shift())(root); + } + return filterDown(candidates, localQueryParts); + } + return sqf; + } + + // a specialized method that implements our primoridal "query optimizer". + // This allows us to dispatch queries to the fastest subsystem we can get. + var _getQueryFunc = ( + // NOTE: + // XPath on the Webkit nighlies is slower than it's DOM iteration + // for most test cases + // FIXME: + // we should try to capture some runtime speed data for each query + // function to determine on the fly if we should stick w/ the + // potentially optimized variant or if we should try something + // new. + (document["evaluate"] && !d.isSafari) ? + function(query){ + // has xpath support that's faster than DOM + var qparts = query.split(" "); + // can we handle it? + if( (document["evaluate"])&& + (query.indexOf(":") == -1)&& + (query.indexOf("+") == -1) // skip direct sibling matches. See line ~344 + ){ + // dojo.debug(query); + // should we handle it? + + // kind of a lame heuristic, but it works + if( + // a "div div div" style query + ((qparts.length > 2)&&(query.indexOf(">") == -1))|| + // or something else with moderate complexity. kinda janky + (qparts.length > 3)|| + (query.indexOf("[")>=0)|| + // or if it's a ".thinger" query + ((1 == qparts.length)&&(0 <= query.indexOf("."))) + + ){ + // use get and cache a xpath runner for this selector + return getXPathFunc(query); + } + } + + // fallthrough + return getStepQueryFunc(query); + } : getStepQueryFunc + ); + // uncomment to disable XPath for testing and tuning the DOM path + // _getQueryFunc = getStepQueryFunc; + + // FIXME: we've got problems w/ the NodeList query()/filter() functions if we go XPath for everything + + // uncomment to disable DOM queries for testing and tuning XPath + // _getQueryFunc = getXPathFunc; + + // this is the primary caching for full-query results. The query dispatcher + // functions are generated here and then pickled for hash lookup in the + // future + var getQueryFunc = function(query){ + // return a cached version if one is available + var qcz = query.charAt(0); + if(d.doc["querySelectorAll"] && + ( (!d.isSafari) || (d.isSafari > 3.1) ) && // see #5832 + // as per CSS 3, we can't currently start w/ combinator: + // http://www.w3.org/TR/css3-selectors/#w3cselgrammar + (">+~".indexOf(qcz) == -1) + ){ + return function(root){ + var r = root.querySelectorAll(query); + r.nozip = true; // skip expensive duplication checks and just wrap in a NodeList + return r; + }; + } + if(_queryFuncCache[query]){ return _queryFuncCache[query]; } + if(0 > query.indexOf(",")){ + // if it's not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher + return _queryFuncCache[query] = _getQueryFunc(query); + }else{ + // if it's a complex query, break it up into it's constituent parts + // and return a dispatcher that will merge the parts when run + + // var parts = query.split(", "); + var parts = query.split(/\s*,\s*/); + var tf = function(root){ + var pindex = 0; // avoid array alloc for every invocation + var ret = []; + var tp; + while(tp = parts[pindex++]){ + ret = ret.concat(_getQueryFunc(tp, tp.indexOf(" "))(root)); + } + return ret; + } + // ...cache and return + return _queryFuncCache[query] = tf; + } + } + + // FIXME: + // Dean's Base2 uses a system whereby queries themselves note if + // they'll need duplicate filtering. We need to get on that plan!! + + // attempt to efficiently determine if an item in a list is a dupe, + // returning a list of "uniques", hopefully in doucment order + var _zipIdx = 0; + var _zip = function(arr){ + if(arr && arr.nozip){ return d.NodeList._wrap(arr); } + var ret = new d.NodeList(); + if(!arr){ return ret; } + if(arr[0]){ + ret.push(arr[0]); + } + if(arr.length < 2){ return ret; } + _zipIdx++; + arr[0]["_zipIdx"] = _zipIdx; + for(var x=1, te; te = arr[x]; x++){ + if(arr[x]["_zipIdx"] != _zipIdx){ + ret.push(te); + } + te["_zipIdx"] = _zipIdx; + } + // FIXME: should we consider stripping these properties? + return ret; + } + + // the main executor + d.query = function(/*String*/ query, /*String|DOMNode?*/ root){ + // summary: + // Returns nodes which match the given CSS3 selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an instance of dojo.NodeList. + // description: + // dojo.query() is the swiss army knife of DOM node manipulation in + // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's + // "$" function, dojo.query provides robust, high-performance + // CSS-based node selector support with the option of scoping searches + // to a particular sub-tree of a document. + // + // Supported Selectors: + // -------------------- + // + // dojo.query() supports a rich set of CSS3 selectors, including: + // + // * class selectors (e.g., `.foo`) + // * node type selectors like `span` + // * ` ` descendant selectors + // * `>` child element selectors + // * `#foo` style ID selectors + // * `*` universal selector + // * `~`, the immediately preceeded-by sibling selector + // * `+`, the preceeded-by sibling selector + // * attribute queries: + // | * `[foo]` attribute presence selector + // | * `[foo='bar']` attribute value exact match + // | * `[foo~='bar']` attribute value list item match + // | * `[foo^='bar']` attribute start match + // | * `[foo$='bar']` attribute end match + // | * `[foo*='bar']` attribute substring match + // * `:first-child`, `:last-child` positional selectors + // * `:empty` content emtpy selector + // * `:empty` content emtpy selector + // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations + // * `:nth-child(even)`, `:nth-child(odd)` positional selectors + // * `:not(...)` negation pseudo selectors + // + // Any legal combination of these selectors will work with + // `dojo.query()`, including compound selectors ("," delimited). + // Very complex and useful searches can be constructed with this + // palette of selectors and when combined with functions for + // maniplation presented by dojo.NodeList, many types of DOM + // manipulation operations become very straightforward. + // + // Unsupported Selectors: + // ---------------------- + // + // While dojo.query handles many CSS3 selectors, some fall outside of + // what's resaonable for a programmatic node querying engine to + // handle. Currently unsupported selectors include: + // + // * namespace-differentiated selectors of any form + // * all `::` pseduo-element selectors + // * certain pseduo-selectors which don't get a lot of day-to-day use: + // | * `:root`, `:lang()`, `:target`, `:focus` + // * all visual and state selectors: + // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, + // `:enabled`, `:disabled`, `:checked` + // * `:*-of-type` pseudo selectors + // + // dojo.query and XML Documents: + // ----------------------------- + // + // `dojo.query` currently only supports searching XML documents + // whose tags and attributes are 100% lower-case. This is a known + // limitation and will [be addressed soon](http://trac.dojotoolkit.org/ticket/3866) + // Non-selector Queries: + // --------------------- + // + // If something other than a String is passed for the query, + // `dojo.query` will return a new `dojo.NodeList` constructed from + // that parameter alone and all further processing will stop. This + // means that if you have a reference to a node or NodeList, you + // can quickly construct a new NodeList from the original by + // calling `dojo.query(node)` or `dojo.query(list)`. + // + // query: + // The CSS3 expression to match against. For details on the syntax of + // CSS3 selectors, see + // root: + // A DOMNode (or node id) to scope the search from. Optional. + // returns: dojo.NodeList + // An instance of `dojo.NodeList`. Many methods are available on + // NodeLists for searching, iterating, manipulating, and handling + // events on the matched nodes in the returned list. + // example: + // search the entire document for elements with the class "foo": + // | dojo.query(".foo"); + // these elements will match: + // | + // | + // |

          + // example: + // search the entire document for elements with the classes "foo" *and* "bar": + // | dojo.query(".foo.bar"); + // these elements will match: + // | + // while these will not: + // | + // |

          + // example: + // find `` elements which are descendants of paragraphs and + // which have a "highlighted" class: + // | dojo.query("p span.highlighted"); + // the innermost span in this fragment matches: + // |

          + // | ... + // | ... + // | + // |

          + // example: + // set an "odd" class on all odd table rows inside of the table + // `#tabular_data`, using the `>` (direct child) selector to avoid + // affecting any nested tables: + // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); + // example: + // remove all elements with the class "error" from the document + // and store them in a list: + // | var errors = dojo.query(".error").orphan(); + // example: + // add an onclick handler to every submit button in the document + // which causes the form to be sent via Ajax instead: + // | dojo.query("input[type='submit']").onclick(function(e){ + // | dojo.stopEvent(e); // prevent sending the form + // | var btn = e.target; + // | dojo.xhrPost({ + // | form: btn.form, + // | load: function(data){ + // | // replace the form with the response + // | var div = dojo.doc.createElement("div"); + // | dojo.place(div, btn.form, "after"); + // | div.innerHTML = data; + // | dojo.style(btn.form, "display", "none"); + // | } + // | }); + // | }); + + + // NOTE: elementsById is not currently supported + // NOTE: ignores xpath-ish queries for now + + if(query.constructor == d.NodeList){ + return query; + } + if(!d.isString(query)){ + return new d.NodeList(query); // dojo.NodeList + } + if(d.isString(root)){ + root = d.byId(root); + } + + return _zip(getQueryFunc(query)(root||d.doc)); // dojo.NodeList + } + + /* + // exposing this was a mistake + d.query.attrs = attrs; + */ + // exposing this because new pseudo matches are only executed through the + // DOM query path (never through the xpath optimizing branch) + d.query.pseudos = pseudos; + + // one-off function for filtering a NodeList based on a simple selector + d._filterQueryResult = function(nodeList, simpleFilter){ + var tnl = new d.NodeList(); + var ff = (simpleFilter) ? getFilterFunc(getQueryParts(simpleFilter)[0]) : function(){ return true; }; + for(var x=0, te; te = nodeList[x]; x++){ + if(ff(te)){ tnl.push(te); } + } + return tnl; + } +})(); + +} diff --git a/includes/js/dojo/_base/window.js b/includes/js/dojo/_base/window.js new file mode 100644 index 0000000..892768d --- /dev/null +++ b/includes/js/dojo/_base/window.js @@ -0,0 +1,145 @@ +if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.window"] = true; +dojo.provide("dojo._base.window"); + +dojo._gearsObject = function(){ + // summary: + // factory method to get a Google Gears plugin instance to + // expose in the browser runtime environment, if present + var factory; + var results; + + var gearsObj = dojo.getObject("google.gears"); + if(gearsObj){ return gearsObj; } // already defined elsewhere + + if(typeof GearsFactory != "undefined"){ // Firefox + factory = new GearsFactory(); + }else{ + if(dojo.isIE){ + // IE + try{ + factory = new ActiveXObject("Gears.Factory"); + }catch(e){ + // ok to squelch; there's no gears factory. move on. + } + }else if(navigator.mimeTypes["application/x-googlegears"]){ + // Safari? + factory = document.createElement("object"); + factory.setAttribute("type", "application/x-googlegears"); + factory.setAttribute("width", 0); + factory.setAttribute("height", 0); + factory.style.display = "none"; + document.documentElement.appendChild(factory); + } + } + + // still nothing? + if(!factory){ return null; } + + // define the global objects now; don't overwrite them though if they + // were somehow set internally by the Gears plugin, which is on their + // dev roadmap for the future + dojo.setObject("google.gears.factory", factory); + return dojo.getObject("google.gears"); +}; + +/*===== +dojo.isGears = { + // summary: True if client is using Google Gears +}; +=====*/ +// see if we have Google Gears installed, and if +// so, make it available in the runtime environment +// and in the Google standard 'google.gears' global object +dojo.isGears = (!!dojo._gearsObject())||0; + +/*===== +dojo.doc = { + // summary: + // Alias for the current document. 'dojo.doc' can be modified + // for temporary context shifting. Also see dojo.withDoc(). + // description: + // Refer to dojo.doc rather + // than referring to 'window.document' to ensure your code runs + // correctly in managed contexts. + // example: + // | n.appendChild(dojo.doc.createElement('div')); +} +=====*/ +dojo.doc = window["document"] || null; + +dojo.body = function(){ + // summary: + // Return the body element of the document + // return the body object associated with dojo.doc + // example: + // | dojo.body().appendChild(dojo.doc.createElement('div')); + + // Note: document.body is not defined for a strict xhtml document + // Would like to memoize this, but dojo.doc can change vi dojo.withDoc(). + return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node +} + +dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){ + // summary: + // changes the behavior of many core Dojo functions that deal with + // namespace and DOM lookup, changing them to work in a new global + // context (e.g., an iframe). The varibles dojo.global and dojo.doc + // are modified as a result of calling this function and the result of + // `dojo.body()` likewise differs. + dojo.global = globalObject; + dojo.doc = globalDocument; +}; + +dojo._fireCallback = function(callback, context, cbArguments){ + if(context && dojo.isString(callback)){ + callback = context[callback]; + } + return callback.apply(context, cbArguments || [ ]); +} + +dojo.withGlobal = function( /*Object*/globalObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Call callback with globalObject as dojo.global and + // globalObject.document as dojo.doc. If provided, globalObject + // will be executed in the context of object thisObject + // description: + // When callback() returns or throws an error, the dojo.global + // and dojo.doc will be restored to its previous state. + var rval; + var oldGlob = dojo.global; + var oldDoc = dojo.doc; + try{ + dojo.setContext(globalObject, globalObject.document); + rval = dojo._fireCallback(callback, thisObject, cbArguments); + }finally{ + dojo.setContext(oldGlob, oldDoc); + } + return rval; +} + +dojo.withDoc = function( /*Object*/documentObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Call callback with documentObject as dojo.doc. If provided, + // callback will be executed in the context of object thisObject + // description: + // When callback() returns or throws an error, the dojo.doc will + // be restored to its previous state. + var rval; + var oldDoc = dojo.doc; + try{ + dojo.doc = documentObject; + rval = dojo._fireCallback(callback, thisObject, cbArguments); + }finally{ + dojo.doc = oldDoc; + } + return rval; +}; + +} diff --git a/includes/js/dojo/_base/xhr.js b/includes/js/dojo/_base/xhr.js new file mode 100644 index 0000000..f6e7f1a --- /dev/null +++ b/includes/js/dojo/_base/xhr.js @@ -0,0 +1,730 @@ +if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.xhr"] = true; +dojo.provide("dojo._base.xhr"); +dojo.require("dojo._base.Deferred"); +dojo.require("dojo._base.json"); +dojo.require("dojo._base.lang"); +dojo.require("dojo._base.query"); + +(function(){ + var _d = dojo; + function setValue(/*Object*/obj, /*String*/name, /*String*/value){ + //summary: + // For the nameed property in object, set the value. If a value + // already exists and it is a string, convert the value to be an + // array of values. + var val = obj[name]; + if(_d.isString(val)){ + obj[name] = [val, value]; + }else if(_d.isArray(val)){ + val.push(value); + }else{ + obj[name] = value; + } + } + + dojo.formToObject = function(/*DOMNode||String*/ formNode){ + // summary: + // dojo.formToObject returns the values encoded in an HTML form as + // string properties in an object which it then returns. Disabled form + // elements, buttons, and other non-value form elements are skipped. + // Multi-select elements are returned as an array of string values. + // description: + // This form: + // + // |
          + // | + // | + // | + // | + // |
          + // + // yields this object structure as the result of a call to + // formToObject(): + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + + var ret = {}; + var iq = "input:not([type=file]):not([type=submit]):not([type=image]):not([type=reset]):not([type=button]), select, textarea"; + _d.query(iq, formNode).filter(function(node){ + return !node.disabled && node.name; + }).forEach(function(item){ + var _in = item.name; + var type = (item.type||"").toLowerCase(); + if(type == "radio" || type == "checkbox"){ + if(item.checked){ setValue(ret, _in, item.value); } + }else if(item.multiple){ + ret[_in] = []; + _d.query("option", item).forEach(function(opt){ + if(opt.selected){ + setValue(ret, _in, opt.value); + } + }); + }else{ + setValue(ret, _in, item.value); + if(type == "image"){ + ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0; + } + } + }); + return ret; // Object + } + + dojo.objectToQuery = function(/*Object*/ map){ + // summary: + // takes a name/value mapping object and returns a string representing + // a URL-encoded version of that object. + // example: + // this object: + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + // + // yields the following query string: + // + // | "blah=blah&multi=thud&multi=thonk" + + // FIXME: need to implement encodeAscii!! + var enc = encodeURIComponent; + var pairs = []; + var backstop = {}; + for(var name in map){ + var value = map[name]; + if(value != backstop[name]){ + var assign = enc(name) + "="; + if(_d.isArray(value)){ + for(var i=0; i < value.length; i++){ + pairs.push(assign + enc(value[i])); + } + }else{ + pairs.push(assign + enc(value)); + } + } + } + return pairs.join("&"); // String + } + + dojo.formToQuery = function(/*DOMNode||String*/ formNode){ + // summary: + // Returns a URL-encoded string representing the form passed as either a + // node or string ID identifying the form to serialize + return _d.objectToQuery(_d.formToObject(formNode)); // String + } + + dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){ + // summary: + // return a serialized JSON string from a form node or string + // ID identifying the form to serialize + return _d.toJson(_d.formToObject(formNode), prettyPrint); // String + } + + dojo.queryToObject = function(/*String*/ str){ + // summary: + // returns an object representing a de-serialized query section of a + // URL. Query keys with multiple values are returned in an array. + // description: + // This string: + // + // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" + // + // results in this object structure: + // + // | { + // | foo: [ "bar", "baz" ], + // | thinger: " spaces =blah", + // | zonk: "blarg" + // | } + // + // Note that spaces and other urlencoded entities are correctly + // handled. + + // FIXME: should we grab the URL string if we're not passed one? + var ret = {}; + var qp = str.split("&"); + var dec = decodeURIComponent; + _d.forEach(qp, function(item){ + if(item.length){ + var parts = item.split("="); + var name = dec(parts.shift()); + var val = dec(parts.join("=")); + if(_d.isString(ret[name])){ + ret[name] = [ret[name]]; + } + if(_d.isArray(ret[name])){ + ret[name].push(val); + }else{ + ret[name] = val; + } + } + }); + return ret; // Object + } + + /* + from refactor.txt: + + all bind() replacement APIs take the following argument structure: + + { + url: "blah.html", + + // all below are optional, but must be supported in some form by + // every IO API + timeout: 1000, // milliseconds + handleAs: "text", // replaces the always-wrong "mimetype" + content: { + key: "value" + }, + + // browser-specific, MAY be unsupported + sync: true, // defaults to false + form: dojo.byId("someForm") + } + */ + + // need to block async callbacks from snatching this thread as the result + // of an async callback might call another sync XHR, this hangs khtml forever + // must checked by watchInFlight() + + dojo._blockAsync = false; + + dojo._contentHandlers = { + "text": function(xhr){ return xhr.responseText; }, + "json": function(xhr){ + if(!dojo.config.usePlainJson){ + console.warn("Consider using mimetype:text/json-comment-filtered" + + " to avoid potential security issues with JSON endpoints" + + " (use djConfig.usePlainJson=true to turn off this message)"); + } + return (xhr.status == 204) ? undefined : _d.fromJson(xhr.responseText); + }, + "json-comment-filtered": function(xhr){ + // NOTE: we provide the json-comment-filtered option as one solution to + // the "JavaScript Hijacking" issue noted by Fortify and others. It is + // not appropriate for all circumstances. + + var value = xhr.responseText; + var cStartIdx = value.indexOf("\/*"); + var cEndIdx = value.lastIndexOf("*\/"); + if(cStartIdx == -1 || cEndIdx == -1){ + throw new Error("JSON was not comment filtered"); + } + return (xhr.status == 204) ? undefined : + _d.fromJson(value.substring(cStartIdx+2, cEndIdx)); + }, + "javascript": function(xhr){ + // FIXME: try Moz and IE specific eval variants? + return _d.eval(xhr.responseText); + }, + "xml": function(xhr){ + var result = xhr.responseXML; + if(_d.isIE && (!result || window.location.protocol == "file:")){ + _d.forEach(["MSXML2", "Microsoft", "MSXML", "MSXML3"], function(prefix){ + try{ + var dom = new ActiveXObject(prefix + ".XMLDOM"); + dom.async = false; + dom.loadXML(xhr.responseText); + result = dom; + }catch(e){ /* Not available. Squelch and try next one. */ } + }); + } + return result; // DOMDocument + } + }; + + dojo._contentHandlers["json-comment-optional"] = function(xhr){ + var handlers = _d._contentHandlers; + try{ + return handlers["json-comment-filtered"](xhr); + }catch(e){ + return handlers["json"](xhr); + } + }; + + /*===== + dojo.__IoArgs = function(){ + // url: String + // URL to server endpoint. + // content: Object? + // Contains properties with string values. These + // properties will be serialized as name1=value2 and + // passed in the request. + // timeout: Integer? + // Milliseconds to wait for the response. If this time + // passes, the then error callbacks are called. + // form: DOMNode? + // DOM node for a form. Used to extract the form values + // and send to the server. + // preventCache: Boolean? + // Default is false. If true, then a + // "dojo.preventCache" parameter is sent in the request + // with a value that changes with each request + // (timestamp). Useful only with GET-type requests. + // handleAs: String? + // Acceptable values depend on the type of IO + // transport (see specific IO calls for more information). + // load: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The load function will be + // called on a successful response. + // error: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The error function will + // be called in an error case. + // handle: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The handle function will + // be called in either the successful or error case. For + // the load, error and handle functions, the ioArgs object + // will contain the following properties: + this.url = url; + this.content = content; + this.timeout = timeout; + this.form = form; + this.preventCache = preventCache; + this.handleAs = handleAs; + this.load = load; + this.error = error; + this.handle = handle; + } + =====*/ + + /*===== + dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){ + // args: Object + // the original object argument to the IO call. + // xhr: XMLHttpRequest + // For XMLHttpRequest calls only, the + // XMLHttpRequest object that was used for the + // request. + // url: String + // The final URL used for the call. Many times it + // will be different than the original args.url + // value. + // query: String + // For non-GET requests, the + // name1=value1&name2=value2 parameters sent up in + // the request. + // handleAs: String + // The final indicator on how the response will be + // handled. + // id: String + // For dojo.io.script calls only, the internal + // script ID used for the request. + // canDelete: Boolean + // For dojo.io.script calls only, indicates + // whether the script tag that represents the + // request can be deleted after callbacks have + // been called. Used internally to know when + // cleanup can happen on JSONP-type requests. + // json: Object + // For dojo.io.script calls only: holds the JSON + // response for JSONP-type requests. Used + // internally to hold on to the JSON responses. + // You should not need to access it directly -- + // the same object should be passed to the success + // callbacks directly. + this.args = args; + this.xhr = xhr; + this.url = url; + this.query = query; + this.handleAs = handleAs; + this.id = id; + this.canDelete = canDelete; + this.json = json; + } + =====*/ + + + + dojo._ioSetArgs = function(/*dojo.__IoArgs*/args, + /*Function*/canceller, + /*Function*/okHandler, + /*Function*/errHandler){ + // summary: + // sets up the Deferred and ioArgs property on the Deferred so it + // can be used in an io call. + // args: + // The args object passed into the public io call. Recognized properties on + // the args object are: + // canceller: + // The canceller function used for the Deferred object. The function + // will receive one argument, the Deferred object that is related to the + // canceller. + // okHandler: + // The first OK callback to be registered with Deferred. It has the opportunity + // to transform the OK response. It will receive one argument -- the Deferred + // object returned from this function. + // errHandler: + // The first error callback to be registered with Deferred. It has the opportunity + // to do cleanup on an error. It will receive two arguments: error (the + // Error object) and dfd, the Deferred object returned from this function. + + var ioArgs = {args: args, url: args.url}; + + //Get values from form if requestd. + var formObject = null; + if(args.form){ + var form = _d.byId(args.form); + //IE requires going through getAttributeNode instead of just getAttribute in some form cases, + //so use it for all. See #2844 + var actnNode = form.getAttributeNode("action"); + ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); + formObject = _d.formToObject(form); + } + + // set up the query params + var miArgs = [{}]; + + if(formObject){ + // potentially over-ride url-provided params w/ form values + miArgs.push(formObject); + } + if(args.content){ + // stuff in content over-rides what's set by form + miArgs.push(args.content); + } + if(args.preventCache){ + miArgs.push({"dojo.preventCache": new Date().valueOf()}); + } + ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs)); + + // .. and the real work of getting the deferred in order, etc. + ioArgs.handleAs = args.handleAs || "text"; + var d = new _d.Deferred(canceller); + d.addCallbacks(okHandler, function(error){ + return errHandler(error, d); + }); + + //Support specifying load, error and handle callback functions from the args. + //For those callbacks, the "this" object will be the args object. + //The callbacks will get the deferred result value as the + //first argument and the ioArgs object as the second argument. + var ld = args.load; + if(ld && _d.isFunction(ld)){ + d.addCallback(function(value){ + return ld.call(args, value, ioArgs); + }); + } + var err = args.error; + if(err && _d.isFunction(err)){ + d.addErrback(function(value){ + return err.call(args, value, ioArgs); + }); + } + var handle = args.handle; + if(handle && _d.isFunction(handle)){ + d.addBoth(function(value){ + return handle.call(args, value, ioArgs); + }); + } + + d.ioArgs = ioArgs; + + // FIXME: need to wire up the xhr object's abort method to something + // analagous in the Deferred + return d; + } + + var _deferredCancel = function(/*Deferred*/dfd){ + //summary: canceller function for dojo._ioSetArgs call. + + dfd.canceled = true; + var xhr = dfd.ioArgs.xhr; + var _at = typeof xhr.abort; + if(_at == "function" || _at == "unknown"){ + xhr.abort(); + } + var err = new Error("xhr cancelled"); + err.dojoType = "cancel"; + return err; + } + var _deferredOk = function(/*Deferred*/dfd){ + //summary: okHandler function for dojo._ioSetArgs call. + + return _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr); + } + var _deferError = function(/*Error*/error, /*Deferred*/dfd){ + //summary: errHandler function for dojo._ioSetArgs call. + + // console.debug("xhr error in:", dfd.ioArgs.xhr); + console.debug(error); + return error; + } + + var _makeXhrDeferred = function(/*dojo.__XhrArgs*/args){ + //summary: makes the Deferred object for this xhr request. + var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError); + //Pass the args to _xhrObj, to allow xhr iframe proxy interceptions. + dfd.ioArgs.xhr = _d._xhrObj(dfd.ioArgs.args); + return dfd; + } + + // avoid setting a timer per request. It degrades performance on IE + // something fierece if we don't use unified loops. + var _inFlightIntvl = null; + var _inFlight = []; + var _watchInFlight = function(){ + //summary: + // internal method that checks each inflight XMLHttpRequest to see + // if it has completed or if the timeout situation applies. + + var now = (new Date()).getTime(); + // make sure sync calls stay thread safe, if this callback is called + // during a sync call and this results in another sync call before the + // first sync call ends the browser hangs + if(!_d._blockAsync){ + // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating + // note: the second clause is an assigment on purpose, lint may complain + for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){ + var dfd = tif.dfd; + try{ + if(!dfd || dfd.canceled || !tif.validCheck(dfd)){ + _inFlight.splice(i--, 1); + }else if(tif.ioCheck(dfd)){ + _inFlight.splice(i--, 1); + tif.resHandle(dfd); + }else if(dfd.startTime){ + //did we timeout? + if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){ + _inFlight.splice(i--, 1); + var err = new Error("timeout exceeded"); + err.dojoType = "timeout"; + dfd.errback(err); + //Cancel the request so the io module can do appropriate cleanup. + dfd.cancel(); + } + } + }catch(e){ + // FIXME: make sure we errback! (fixed? remove console.debug?) + console.debug(e); + dfd.errback(new Error("_watchInFlightError!")); + } + } + } + + if(!_inFlight.length){ + clearInterval(_inFlightIntvl); + _inFlightIntvl = null; + return; + } + + } + + dojo._ioCancelAll = function(){ + //summary: Cancels all pending IO requests, regardless of IO type + //(xhr, script, iframe). + try{ + _d.forEach(_inFlight, function(i){ + i.dfd.cancel(); + }); + }catch(e){/*squelch*/} + } + + //Automatically call cancel all io calls on unload + //in IE for trac issue #2357. + if(_d.isIE){ + _d.addOnUnload(_d._ioCancelAll); + } + + _d._ioWatch = function(/*Deferred*/dfd, + /*Function*/validCheck, + /*Function*/ioCheck, + /*Function*/resHandle){ + //summary: watches the io request represented by dfd to see if it completes. + //dfd: + // The Deferred object to watch. + //validCheck: + // Function used to check if the IO request is still valid. Gets the dfd + // object as its only argument. + //ioCheck: + // Function used to check if basic IO call worked. Gets the dfd + // object as its only argument. + //resHandle: + // Function used to process response. Gets the dfd + // object as its only argument. + if(dfd.ioArgs.args.timeout){ + dfd.startTime = (new Date()).getTime(); + } + _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle}); + if(!_inFlightIntvl){ + _inFlightIntvl = setInterval(_watchInFlight, 50); + } + _watchInFlight(); // handle sync requests + } + + var _defaultContentType = "application/x-www-form-urlencoded"; + + var _validCheck = function(/*Deferred*/dfd){ + return dfd.ioArgs.xhr.readyState; //boolean + } + var _ioCheck = function(/*Deferred*/dfd){ + return 4 == dfd.ioArgs.xhr.readyState; //boolean + } + var _resHandle = function(/*Deferred*/dfd){ + var xhr = dfd.ioArgs.xhr; + if(_d._isDocumentOk(xhr)){ + dfd.callback(dfd); + }else{ + var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status); + err.status = xhr.status; + err.responseText = xhr.responseText; + dfd.errback(err); + } + } + + var _doIt = function(/*String*/type, /*Deferred*/dfd){ + // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open). + // workaround for IE6's apply() "issues" + var ioArgs = dfd.ioArgs; + var args = ioArgs.args; + var xhr = ioArgs.xhr; + xhr.open(type, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined); + if(args.headers){ + for(var hdr in args.headers){ + if(hdr.toLowerCase() === "content-type" && !args.contentType){ + args.contentType = args.headers[hdr]; + }else{ + xhr.setRequestHeader(hdr, args.headers[hdr]); + } + } + } + // FIXME: is this appropriate for all content types? + xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType); + if(!args.headers || !args.headers["X-Requested-With"]){ + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + } + // FIXME: set other headers here! + try{ + xhr.send(ioArgs.query); + }catch(e){ + dfd.cancel(); + } + _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); + xhr = null; + return dfd; //Deferred + } + + dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){ + //summary: Adds query params discovered by the io deferred construction to the URL. + //Only use this for operations which are fundamentally GET-type operations. + if(ioArgs.query.length){ + ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query; + ioArgs.query = null; + } + } + + /*===== + dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, { + constructor: function(){ + // summary: + // In addition to the properties listed for the dojo._IoArgs type, + // the following properties are allowed for dojo.xhr* methods. + // handleAs: String? + // Acceptable values are: text (default), json, json-comment-optional, + // json-comment-filtered, javascript, xml + // sync: Boolean? + // false is default. Indicates whether the request should + // be a synchronous (blocking) request. + // headers: Object? + // Additional HTTP headers to send in the request. + this.handleAs = handleAs; + this.sync = sync; + this.headers = headers; + } + }); + =====*/ + + dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){ + // summary: + // Sends an HTTP request with the given method. If the request has an + // HTTP body, then pass true for hasBody. The method argument should be uppercase. + // Also look at dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts + // for those HTTP methods. There are also methods for "raw" PUT and POST methods + // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively. + var dfd = _makeXhrDeferred(args); + if(!hasBody){ + _d._ioAddQueryToUrl(dfd.ioArgs); + } + return _doIt(method, dfd); // dojo.Deferred + } + + dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP GET request to the server. + return _d.xhr("GET", args); //dojo.Deferred + } + + dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ + //summary: + // Sends an HTTP POST request to the server. + return _d.xhr("POST", args, true); // dojo.Deferred + } + + dojo.rawXhrPost = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP POST request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // postData: + // String. The raw data to send in the body of the POST request. + var dfd = _makeXhrDeferred(args); + dfd.ioArgs.query = args.postData; + return _doIt("POST", dfd); // dojo.Deferred + } + + dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP PUT request to the server. + return _d.xhr("PUT", args, true); // dojo.Deferred + } + + dojo.rawXhrPut = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP PUT request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // putData: + // String. The raw data to send in the body of the PUT request. + var dfd = _makeXhrDeferred(args); + var ioArgs = dfd.ioArgs; + if(args.putData){ + ioArgs.query = args.putData; + args.putData = null; + } + return _doIt("PUT", dfd); // dojo.Deferred + } + + dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP DELETE request to the server. + return _d.xhr("DELETE", args); //dojo.Deferred + } + + /* + dojo.wrapForm = function(formNode){ + //summary: + // A replacement for FormBind, but not implemented yet. + + // FIXME: need to think harder about what extensions to this we might + // want. What should we allow folks to do w/ this? What events to + // set/send? + throw new Error("dojo.wrapForm not yet implemented"); + } + */ +})(); + +} diff --git a/includes/js/dojo/_firebug/LICENSE b/includes/js/dojo/_firebug/LICENSE new file mode 100644 index 0000000..8c777a2 --- /dev/null +++ b/includes/js/dojo/_firebug/LICENSE @@ -0,0 +1,37 @@ +License Disclaimer: + +All contents of this directory are Copyright (c) the Dojo Foundation, with the +following exceptions: +------------------------------------------------------------------------------- + +firebug.html, firebug.js, errIcon.png, infoIcon.png, warningIcon.png: + * Copyright (c) 2006-2007, Joe Hewitt, All rights reserved. + Distributed under the terms of the BSD License (see below) + +------------------------------------------------------------------------------- + +Copyright (c) 2006-2007, Joe Hewitt +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. diff --git a/includes/js/dojo/_firebug/errorIcon.png b/includes/js/dojo/_firebug/errorIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d75261bb675f5f878a9ca549340d11694287ea9 GIT binary patch literal 457 zcmV;)0XF`LP)5Ui~H0X8YDC6$Gxpb|xtYf@N==`2Jc z7Ah8ji(kR7VtwakC$}D$g(o{ZGjC>QZ;f+~bR8H|#%4hcOnLVm*j;w6MZq#Egs5(a zc4lEugK?iQ0QcYtDcH902T2xS;XcvY8O)TA|L_Qo0dkkJVlXBT;dmV(QXWLO$HEed zt}ftbg3DK{l45N>4BPBOtRiE?7^^l0JFaL_w@cLT6E&N;kZtyH3~NT_jk(q5@35sP zaxP8XaIwukAMZ)K?GhDNr$f|e@AO4;e+3u-uo^Lr*!;%I00000NkvXXu0mjfj3mDh literal 0 HcmV?d00001 diff --git a/includes/js/dojo/_firebug/firebug.css b/includes/js/dojo/_firebug/firebug.css new file mode 100644 index 0000000..0b154f2 --- /dev/null +++ b/includes/js/dojo/_firebug/firebug.css @@ -0,0 +1,176 @@ +.firebug { + margin: 0; + background:#fff; + font-family: Lucida Grande, Tahoma, sans-serif; + font-size: 11px; + overflow: hidden; + border: 1px solid black; + position: relative; +} +.firebug a { + text-decoration: none; +} +.firebug a:hover { + text-decoration: underline; +} +.firebug a:visited{ + color:#0000FF; +} +.firebug #firebugToolbar { + height: 14px; + border-top: 1px solid ThreeDHighlight; + border-bottom: 1px solid ThreeDShadow; + padding: 2px 6px; + background: ThreeDFace; +} +.firebug .firebugToolbarRight { + position: absolute; + top: 4px; + right: 6px; +} +.firebug #firebugLog, .firebug #objectLog { + overflow: auto; + position: absolute; + left: 0; + width: 100%; +} +#objectLog{ + overflow:scroll; + height:258px; +} +.firebug #firebugCommandLine { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 18px; + border: none; + border-top: 1px solid ThreeDShadow; +} +.firebug .logRow { + position: relative; + border-bottom: 1px solid #D7D7D7; + padding: 2px 4px 1px 6px; + background-color: #FFFFFF; +} +.firebug .logRow-command { + font-family: Monaco, monospace; + color: blue; +} +.firebug .objectBox-null { + padding: 0 2px; + border: 1px solid #666666; + background-color: #888888; + color: #FFFFFF; +} +.firebug .objectBox-string { + font-family: Monaco, monospace; + color: red; + white-space: pre; +} +.firebug .objectBox-number { + color: #000088; +} +.firebug .objectBox-function { + font-family: Monaco, monospace; + color: DarkGreen; +} +.firebug .objectBox-object { + color: DarkGreen; + font-weight: bold; +} +.firebug .logRow-info, +.firebug .logRow-error, +.firebug .logRow-warning + { + background: #00FFFF no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} +.firebug .logRow-info { + background: #FFF url(infoIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} +.firebug .logRow-warning { + + background: #00FFFF url(warningIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} +.firebug .logRow-error { + background: LightYellow url(errorIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} +.firebug .errorMessage { + vertical-align: top; + color: #FF0000; +} +.firebug .objectBox-sourceLink { + position: absolute; + right: 4px; + top: 2px; + padding-left: 8px; + font-family: Lucida Grande, sans-serif; + font-weight: bold; + color: #0000FF; +} +.firebug .logRow-group { + background: #EEEEEE; + border-bottom: none; +} +.firebug .logGroup { + background: #EEEEEE; +} +.firebug .logGroupBox { + margin-left: 24px; + border-top: 1px solid #D7D7D7; + border-left: 1px solid #D7D7D7; +} +.firebug .selectorTag, +.firebug .selectorId, +.firebug .selectorClass { + font-family: Monaco, monospace; + font-weight: normal; +} +.firebug .selectorTag { + color: #0000FF; +} +.firebug .selectorId { + color: DarkBlue; +} +.firebug .selectorClass { + color: red; +} +.firebug .objectBox-element { + font-family: Monaco, monospace; + color: #000088; +} +.firebug .nodeChildren { + margin-left: 16px; +} +.firebug .nodeTag { + color: blue; +} +.firebug .nodeValue { + color: #FF0000; + font-weight: normal; +} +.firebug .nodeText, +.firebug .nodeComment { + margin: 0 2px; + vertical-align: top; +} +.firebug .nodeText { + color: #333333; +} +.firebug .nodeComment { + color: DarkGreen; +} +.firebug .propertyNameCell { + vertical-align: top; +} +.firebug .propertyName { + font-weight: bold; +} diff --git a/includes/js/dojo/_firebug/firebug.css.commented.css b/includes/js/dojo/_firebug/firebug.css.commented.css new file mode 100644 index 0000000..8c4c4f4 --- /dev/null +++ b/includes/js/dojo/_firebug/firebug.css.commented.css @@ -0,0 +1,222 @@ +.firebug { + margin: 0; + background:#fff; + font-family: Lucida Grande, Tahoma, sans-serif; + font-size: 11px; + overflow: hidden; + border: 1px solid black; + position: relative; +} + +.firebug a { + text-decoration: none; +} + +.firebug a:hover { + text-decoration: underline; +} +.firebug a:visited{ + color:#0000FF; +} +.firebug #firebugToolbar { + height: 14px; + border-top: 1px solid ThreeDHighlight; + border-bottom: 1px solid ThreeDShadow; + padding: 2px 6px; + background: ThreeDFace; +} + +.firebug .firebugToolbarRight { + position: absolute; + top: 4px; + right: 6px; +} + +.firebug #firebugLog, .firebug #objectLog { + overflow: auto; + position: absolute; + left: 0; + width: 100%; +} +#objectLog{ + overflow:scroll; + height:258px; +} +.firebug #firebugCommandLine { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 18px; + border: none; + border-top: 1px solid ThreeDShadow; +} + +/************************************************************************************************/ + +.firebug .logRow { + position: relative; + border-bottom: 1px solid #D7D7D7; + padding: 2px 4px 1px 6px; + background-color: #FFFFFF; +} + +.firebug .logRow-command { + font-family: Monaco, monospace; + color: blue; +} + +.firebug .objectBox-null { + padding: 0 2px; + border: 1px solid #666666; + background-color: #888888; + color: #FFFFFF; +} + +.firebug .objectBox-string { + font-family: Monaco, monospace; + color: red; + white-space: pre; +} + +.firebug .objectBox-number { + color: #000088; +} + +.firebug .objectBox-function { + font-family: Monaco, monospace; + color: DarkGreen; +} + +.firebug .objectBox-object { + color: DarkGreen; + font-weight: bold; +} + +/************************************************************************************************/ + +.firebug .logRow-info, +.firebug .logRow-error, +.firebug .logRow-warning + { + background: #00FFFF no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} + +.firebug .logRow-info { + background: #FFF url(infoIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} + +.firebug .logRow-warning { + + background: #00FFFF url(warningIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} + +.firebug .logRow-error { + + background: LightYellow url(errorIcon.png) no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} + +.firebug .errorMessage { + vertical-align: top; + color: #FF0000; +} + +.firebug .objectBox-sourceLink { + position: absolute; + right: 4px; + top: 2px; + padding-left: 8px; + font-family: Lucida Grande, sans-serif; + font-weight: bold; + color: #0000FF; +} + +/************************************************************************************************/ + +.firebug .logRow-group { + background: #EEEEEE; + border-bottom: none; +} + +.firebug .logGroup { + background: #EEEEEE; +} + +.firebug .logGroupBox { + margin-left: 24px; + border-top: 1px solid #D7D7D7; + border-left: 1px solid #D7D7D7; +} + +/************************************************************************************************/ + +.firebug .selectorTag, +.firebug .selectorId, +.firebug .selectorClass { + font-family: Monaco, monospace; + font-weight: normal; +} + +.firebug .selectorTag { + color: #0000FF; +} + +.firebug .selectorId { + color: DarkBlue; +} + +.firebug .selectorClass { + color: red; +} + +/************************************************************************************************/ + +.firebug .objectBox-element { + font-family: Monaco, monospace; + color: #000088; +} + +.firebug .nodeChildren { + margin-left: 16px; +} + +.firebug .nodeTag { + color: blue; +} + +.firebug .nodeValue { + color: #FF0000; + font-weight: normal; +} + +.firebug .nodeText, +.firebug .nodeComment { + margin: 0 2px; + vertical-align: top; +} + +.firebug .nodeText { + color: #333333; +} + +.firebug .nodeComment { + color: DarkGreen; +} + +/************************************************************************************************/ + +.firebug .propertyNameCell { + vertical-align: top; +} + +.firebug .propertyName { + font-weight: bold; +} diff --git a/includes/js/dojo/_firebug/firebug.js b/includes/js/dojo/_firebug/firebug.js new file mode 100644 index 0000000..ee189b2 --- /dev/null +++ b/includes/js/dojo/_firebug/firebug.js @@ -0,0 +1,1103 @@ +if(!dojo._hasResource["dojo._firebug.firebug"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._firebug.firebug"] = true; +dojo.provide("dojo._firebug.firebug"); + +dojo.deprecated = function(/*String*/ behaviour, /*String?*/ extra, /*String?*/ removal){ + // summary: + // Log a debug message to indicate that a behavior has been + // deprecated. + // extra: Text to append to the message. + // removal: + // Text to indicate when in the future the behavior will be removed. + var message = "DEPRECATED: " + behaviour; + if(extra){ message += " " + extra; } + if(removal){ message += " -- will be removed in version: " + removal; } + console.warn(message); +} + +dojo.experimental = function(/* String */ moduleName, /* String? */ extra){ + // summary: Marks code as experimental. + // description: + // This can be used to mark a function, file, or module as + // experimental. Experimental code is not ready to be used, and the + // APIs are subject to change without notice. Experimental code may be + // completed deleted without going through the normal deprecation + // process. + // moduleName: + // The name of a module, or the name of a module file or a specific + // function + // extra: + // some additional message for the user + // example: + // | dojo.experimental("dojo.data.Result"); + // example: + // | dojo.experimental("dojo.weather.toKelvin()", "PENDING approval from NOAA"); + var message = "EXPERIMENTAL: " + moduleName + " -- APIs subject to change without notice."; + if(extra){ message += " " + extra; } + console.warn(message); +} + +// FIREBUG LITE + // summary: Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox + // description: + // Opens a console for logging, debugging, and error messages. + // Contains partial functionality to Firebug. See function list below. + // NOTE: + // Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug. + // Firebug Lite is included in Dojo by permission from Joe Hewitt + // If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug + // functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html + // NOTE: + // To test Firebug Lite in Firefox, set console = null; + // + // example: + // Supports inline objects in object inspector window (only simple trace of dom nodes, however) + // | console.log("my object", {foo:"bar"}) + // example: + // Option for console to open in popup window + // | var djConfig = {isDebug: true, popup:true }; + // example: + // Option for console height (ignored for popup) + // | var djConfig = {isDebug: true, debugHeight:100 }; + +if((!("console" in window) || !("firebug" in console)) && + dojo.config.noFirebugLite !== true){ + +(function(){ + // don't build a firebug frame in iframes + try{ + if(window != window.parent){ + // but if we've got a parent logger, connect to it + if(window.parent["console"]){ + window.console = window.parent.console; + } + return; + } + }catch(e){/*squelch*/} + + window.console = { + _connects: [], + log: function(){ + // summary: + // Sends arguments to console. + logFormatted(arguments, ""); + }, + + debug: function(){ + // summary: + // Sends arguments to console. Missing finctionality to show script line of trace. + logFormatted(arguments, "debug"); + }, + + info: function(){ + // summary: + // Sends arguments to console, highlighted with (I) icon. + logFormatted(arguments, "info"); + }, + + warn: function(){ + // summary: + // Sends warning arguments to console, highlighted with (!) icon and blue style. + logFormatted(arguments, "warning"); + }, + + error: function(){ + // summary: + // Sends error arguments (object) to console, highlighted with (X) icon and yellow style + // NEW: error object now displays in object inspector + logFormatted(arguments, "error"); + }, + + assert: function(truth, message){ + // summary: + // Tests for true. Throws exception if false. + if(!truth){ + var args = []; + for(var i = 1; i < arguments.length; ++i){ + args.push(arguments[i]); + } + + logFormatted(args.length ? args : ["Assertion Failure"], "error"); + throw message ? message : "Assertion Failure"; + } + }, + + dir: function(object){ + // summary: + // Traces object. Only partially implemented. + + var pairs = []; + for(var prop in object){ + try{ + pairs.push([prop, object[prop]]); + }catch(e){ + /* squelch */ + } + } + + pairs.sort(function(a, b){ + return a[0] < b[0] ? -1 : 1; + }); + + var html = ['']; + for(var i = 0; i < pairs.length; ++i){ + var name = pairs[i][0], value = pairs[i][1]; + + html.push('', + '', ''); + } + html.push('
          ', + escapeHTML(name), ''); + appendObject(value, html); + html.push('
          '); + + logRow(html, "dir"); + }, + + dirxml: function(node){ + // summary: + // + var html = []; + + appendNode(node, html); + logRow(html, "dirxml"); + }, + + group: function(){ + // summary: + // collects log messages into a group, starting with this call and ending with + // groupEnd(). Missing collapse functionality + logRow(arguments, "group", pushGroup); + }, + + groupEnd: function(){ + // summary: + // Closes group. See above + logRow(arguments, "", popGroup); + }, + + time: function(name){ + // summary: + // Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title); + // example: + // | console.time("load"); + // | console.time("myFunction"); + // | console.timeEnd("load"); + // | console.timeEnd("myFunction"); + timeMap[name] = (new Date()).getTime(); + }, + + timeEnd: function(name){ + // summary: + // See above. + if(name in timeMap){ + var delta = (new Date()).getTime() - timeMap[name]; + logFormatted([name+ ":", delta+"ms"]); + delete timeMap[name]; + } + }, + + count: function(){ + // summary: + // Not supported + this.warn(["count() not supported."]); + }, + + trace: function(){ + // summary: + // Not supported + this.warn(["trace() not supported."]); + }, + + profile: function(){ + // summary: + // Not supported + this.warn(["profile() not supported."]); + }, + + profileEnd: function(){ }, + + clear: function(){ + // summary: + // Clears message console. Do not call this directly + while(consoleBody.childNodes.length){ + dojo._destroyElement(consoleBody.firstChild); + } + dojo.forEach(this._connects,dojo.disconnect); + }, + + open: function(){ + // summary: + // Opens message console. Do not call this directly + toggleConsole(true); + }, + + close: function(){ + // summary: + // Closes message console. Do not call this directly + if(frameVisible){ + toggleConsole(); + } + }, + closeObjectInspector:function(){ + // summary: + // Closes object inspector and opens message console. Do not call this directly + consoleObjectInspector.innerHTML = ""; + consoleObjectInspector.style.display = "none"; + consoleBody.style.display = "block"; + } + }; + + // *************************************************************************** + + // using global objects so they can be accessed + // most of the objects in this script are run anonomously + var _firebugDoc = document; + var _firebugWin = window; + var __consoleAnchorId__ = 0; + + var consoleFrame = null; + var consoleBody = null; + var commandLine = null; + var consoleToolbar = null; + + var frameVisible = false; + var messageQueue = []; + var groupStack = []; + var timeMap = {}; + + var clPrefix = ">>> "; + + // *************************************************************************** + + function toggleConsole(forceOpen){ + frameVisible = forceOpen || !frameVisible; + if(consoleFrame){ + consoleFrame.style.display = frameVisible ? "block" : "none"; + } + } + + function focusCommandLine(){ + toggleConsole(true); + if(commandLine){ + commandLine.focus(); + } + } + + function openWin(x,y,w,h){ + var win = window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0"); + if(!win){ + var msg = "Firebug Lite could not open a pop-up window, most likely because of a blocker.\n" + + "Either enable pop-ups for this domain, or change the djConfig to popup=false."; + alert(msg); + } + createResizeHandler(win); + var newDoc=win.document; + //Safari needs an HTML height + HTMLstring= 'Firebug Lite\n' + + '\n' + + '
          ' + + ''; + + newDoc.write(HTMLstring); + newDoc.close(); + return win; + } + + function createResizeHandler(wn){ + // summary + // Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE). + // + + var d = new Date(); + d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days + d = d.toUTCString(); + + var dc = wn.document, + getViewport; + + if (wn.innerWidth){ + getViewport = function(){ + return{w:wn.innerWidth, h:wn.innerHeight}; + } + }else if (dc.documentElement && dc.documentElement.clientWidth){ + getViewport = function(){ + return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight}; + } + }else if (dc.body){ + getViewport = function(){ + return{w:dc.body.clientWidth, h:dc.body.clientHeight}; + } + } + + + window.onFirebugResize = function(){ + + //resize the height of the console log body + layout(getViewport().h); + + clearInterval(wn._firebugWin_resize); + wn._firebugWin_resize = setTimeout(function(){ + var x = wn.screenLeft, + y = wn.screenTop, + w = wn.outerWidth || wn.document.body.offsetWidth, + h = wn.outerHeight || wn.document.body.offsetHeight; + + document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/"; + + }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move + + } + } + + + /*****************************************************************************/ + + + function createFrame(){ + if(consoleFrame){ + return; + } + + if(dojo.config.popup){ + var containerHeight = "100%"; + var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/); + var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480]; + + _firebugWin = openWin(p[0],p[1],p[2],p[3]); // global + _firebugDoc = _firebugWin.document; // global + + djConfig.debugContainerId = 'fb'; + + // connecting popup + _firebugWin.console = window.console; + _firebugWin.dojo = window.dojo; + }else{ + _firebugDoc = document; + containerHeight = (dojo.config.debugHeight || 300) + "px"; + } + + var styleElement = _firebugDoc.createElement("link"); + styleElement.href = dojo.moduleUrl("dojo._firebug", "firebug.css"); + styleElement.rel = "stylesheet"; + styleElement.type = "text/css"; + var styleParent = _firebugDoc.getElementsByTagName("head"); + if(styleParent){ + styleParent = styleParent[0]; + } + if(!styleParent){ + styleParent = _firebugDoc.getElementsByTagName("html")[0]; + } + if(dojo.isIE){ + window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0); + }else{ + styleParent.appendChild(styleElement); + } + + if(dojo.config.debugContainerId){ + consoleFrame = _firebugDoc.getElementById(dojo.config.debugContainerId); + } + if(!consoleFrame){ + consoleFrame = _firebugDoc.createElement("div"); + _firebugDoc.body.appendChild(consoleFrame); + } + consoleFrame.className += " firebug"; + consoleFrame.style.height = containerHeight; + consoleFrame.style.display = (frameVisible ? "block" : "none"); + + var closeStr = dojo.config.popup ? "" : ' Close'; + consoleFrame.innerHTML = + '
          ' + + ' Clear' + + ' ' + + closeStr + + ' ' + + '
          ' + + '' + + '
          ' + + ''; + + + consoleToolbar = _firebugDoc.getElementById("firebugToolbar"); + consoleToolbar.onmousedown = onSplitterMouseDown; + + commandLine = _firebugDoc.getElementById("firebugCommandLine"); + addEvent(commandLine, "keydown", onCommandLineKeyDown); + + addEvent(_firebugDoc, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown); + + consoleBody = _firebugDoc.getElementById("firebugLog"); + consoleObjectInspector = _firebugDoc.getElementById("objectLog"); + + layout(); + flush(); + } + + dojo.addOnLoad(createFrame); + + function clearFrame(){ + _firebugDoc = null; + + if(_firebugWin.console){ + _firebugWin.console.clear(); + } + _firebugWin = null; + consoleFrame = null; + consoleBody = null; + consoleObjectInspector = null; + commandLine = null; + messageQueue = []; + groupStack = []; + timeMap = {}; + } + dojo.addOnUnload(clearFrame); + + function evalCommandLine(){ + var text = commandLine.value; + commandLine.value = ""; + + logRow([clPrefix, text], "command"); + + var value; + try{ + value = eval(text); + }catch(e){ + console.debug(e); // put exception on the console + } + + console.log(value); + } + + function layout(h){ + var height = h ? + h - (consoleToolbar.offsetHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" : + consoleFrame.offsetHeight - (consoleToolbar.offsetHeight + commandLine.offsetHeight) + "px"; + + consoleBody.style.top = consoleToolbar.offsetHeight + "px"; + consoleBody.style.height = height; + consoleObjectInspector.style.height = height; + consoleObjectInspector.style.top = consoleToolbar.offsetHeight + "px"; + commandLine.style.bottom = 0; + } + + function logRow(message, className, handler){ + if(consoleBody){ + writeMessage(message, className, handler); + }else{ + messageQueue.push([message, className, handler]); + } + } + + function flush(){ + var queue = messageQueue; + messageQueue = []; + + for(var i = 0; i < queue.length; ++i){ + writeMessage(queue[i][0], queue[i][1], queue[i][2]); + } + } + + function writeMessage(message, className, handler){ + var isScrolledToBottom = + consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight; + + handler = handler||writeRow; + + handler(message, className); + + if(isScrolledToBottom){ + consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight; + } + } + + function appendRow(row){ + var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody; + container.appendChild(row); + } + + function writeRow(message, className){ + var row = consoleBody.ownerDocument.createElement("div"); + row.className = "logRow" + (className ? " logRow-"+className : ""); + row.innerHTML = message.join(""); + appendRow(row); + } + + function pushGroup(message, className){ + logFormatted(message, className); + + //var groupRow = consoleBody.ownerDocument.createElement("div"); + //groupRow.className = "logGroup"; + var groupRowBox = consoleBody.ownerDocument.createElement("div"); + groupRowBox.className = "logGroupBox"; + //groupRow.appendChild(groupRowBox); + appendRow(groupRowBox); + groupStack.push(groupRowBox); + } + + function popGroup(){ + groupStack.pop(); + } + + // *************************************************************************** + + function logFormatted(objects, className){ + var html = []; + + var format = objects[0]; + var objIndex = 0; + + if(typeof(format) != "string"){ + format = ""; + objIndex = -1; + } + + var parts = parseFormat(format); + + for(var i = 0; i < parts.length; ++i){ + var part = parts[i]; + if(part && typeof part == "object"){ + part.appender(objects[++objIndex], html); + }else{ + appendText(part, html); + } + } + + + var ids = []; + var obs = []; + for(i = objIndex+1; i < objects.length; ++i){ + appendText(" ", html); + + var object = objects[i]; + if(object === undefined || object === null ){ + appendNull(object, html); + + }else if(typeof(object) == "string"){ + appendText(object, html); + + }else if(object.nodeType == 9){ + appendText("[ XmlDoc ]", html); + + }else if(object.nodeType == 1){ + // simple tracing of dom nodes + appendText("< "+object.tagName+" id=\""+ object.id+"\" />", html); + + }else{ + // Create link for object inspector + // need to create an ID for this link, since it is currently text + var id = "_a" + __consoleAnchorId__++; + ids.push(id); + // need to save the object, so the arrays line up + obs.push(object); + var str = ''+getObjectAbbr(object)+''; + + appendLink( str , html); + } + } + + logRow(html, className); + + // Now that the row is inserted in the DOM, loop through all of the links that were just created + for(i=0; i" + printObject( this.obj ) + ""; + })); + } + } + + function parseFormat(format){ + var parts = []; + + var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/; + var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat}; + + for(var m = reg.exec(format); m; m = reg.exec(format)){ + var type = m[8] ? m[8] : m[5]; + var appender = type in appenderMap ? appenderMap[type] : appendObject; + var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0); + + parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1)); + parts.push({appender: appender, precision: precision}); + + format = format.substr(m.index+m[0].length); + } + + parts.push(format); + + return parts; + } + + function escapeHTML(value){ + function replaceChars(ch){ + switch(ch){ + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + case "'": + return "'"; + case '"': + return """; + } + return "?"; + } + return String(value).replace(/[<>&"']/g, replaceChars); + } + + function objectToString(object){ + try{ + return object+""; + }catch(e){ + return null; + } + } + + // *************************************************************************** + function appendLink(object, html){ + // needed for object links - no HTML escaping + html.push( objectToString(object) ); + } + + function appendText(object, html){ + html.push(escapeHTML(objectToString(object))); + } + + function appendNull(object, html){ + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendString(object, html){ + html.push('"', escapeHTML(objectToString(object)), + '"'); + } + + function appendInteger(object, html){ + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendFloat(object, html){ + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendFunction(object, html){ + html.push('', getObjectAbbr(object), ''); + } + + function appendObject(object, html){ + try{ + if(object === undefined){ + appendNull("undefined", html); + }else if(object === null){ + appendNull("null", html); + }else if(typeof object == "string"){ + appendString(object, html); + }else if(typeof object == "number"){ + appendInteger(object, html); + }else if(typeof object == "function"){ + appendFunction(object, html); + }else if(object.nodeType == 1){ + appendSelector(object, html); + }else if(typeof object == "object"){ + appendObjectFormatted(object, html); + }else{ + appendText(object, html); + } + }catch(e){ + /* squelch */ + } + } + + function appendObjectFormatted(object, html){ + var text = objectToString(object); + var reObject = /\[object (.*?)\]/; + + var m = reObject.exec(text); + html.push('', m ? m[1] : text, ''); + } + + function appendSelector(object, html){ + html.push(''); + + html.push('', escapeHTML(object.nodeName.toLowerCase()), ''); + if(object.id){ + html.push('#', escapeHTML(object.id), ''); + } + if(object.className){ + html.push('.', escapeHTML(object.className), ''); + } + + html.push(''); + } + + function appendNode(node, html){ + if(node.nodeType == 1){ + html.push( + '
          ', + '<', node.nodeName.toLowerCase(), ''); + + for(var i = 0; i < node.attributes.length; ++i){ + var attr = node.attributes[i]; + if(!attr.specified){ continue; } + + html.push(' ', attr.nodeName.toLowerCase(), + '="', escapeHTML(attr.nodeValue), + '"'); + } + + if(node.firstChild){ + html.push('>
          '); + + for(var child = node.firstChild; child; child = child.nextSibling){ + appendNode(child, html); + } + + html.push('
          </', + node.nodeName.toLowerCase(), '>
          '); + }else{ + html.push('/>

          '); + } + }else if (node.nodeType == 3){ + html.push('
          ', escapeHTML(node.nodeValue), + '
          '); + } + } + + // *************************************************************************** + + function addEvent(object, name, handler){ + if(document.all){ + object.attachEvent("on"+name, handler); + }else{ + object.addEventListener(name, handler, false); + } + } + + function removeEvent(object, name, handler){ + if(document.all){ + object.detachEvent("on"+name, handler); + }else{ + object.removeEventListener(name, handler, false); + } + } + + function cancelEvent(event){ + if(document.all){ + event.cancelBubble = true; + }else{ + event.stopPropagation(); + } + } + + function onError(msg, href, lineNo){ + var lastSlash = href.lastIndexOf("/"); + var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1); + + var html = [ + '', msg, '', + '' + ]; + + logRow(html, "error"); + } + + + //After converting to div instead of iframe, now getting two keydowns right away in IE 6. + //Make sure there is a little bit of delay. + var onKeyDownTime = (new Date()).getTime(); + + function onKeyDown(event){ + var timestamp = (new Date()).getTime(); + if(timestamp > onKeyDownTime + 200){ + event = dojo.fixEvent(event); + var keys = dojo.keys; + var ekc = event.keyCode; + onKeyDownTime = timestamp; + if(ekc == keys.F12){ + toggleConsole(); + }else if( + (ekc == keys.NUMPAD_ENTER || ekc == 76) && + event.shiftKey && + (event.metaKey || event.ctrlKey) + ){ + focusCommandLine(); + }else{ + return; + } + cancelEvent(event); + } + } + + + function onSplitterMouseDown(event){ + if(dojo.isSafari || dojo.isOpera){ + return; + } + + addEvent(document, "mousemove", onSplitterMouseMove); + addEvent(document, "mouseup", onSplitterMouseUp); + + for(var i = 0; i < frames.length; ++i){ + addEvent(frames[i].document, "mousemove", onSplitterMouseMove); + addEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onSplitterMouseMove(event){ + var win = document.all ? + event.srcElement.ownerDocument.parentWindow : + event.target.ownerDocument.defaultView; + + var clientY = event.clientY; + if(win != win.parent){ + clientY += win.frameElement ? win.frameElement.offsetTop : 0; + } + + var height = consoleFrame.offsetTop + consoleFrame.clientHeight; + var y = height - clientY; + + consoleFrame.style.height = y + "px"; + layout(); + } + + function onSplitterMouseUp(event){ + removeEvent(document, "mousemove", onSplitterMouseMove); + removeEvent(document, "mouseup", onSplitterMouseUp); + + for(var i = 0; i < frames.length; ++i){ + removeEvent(frames[i].document, "mousemove", onSplitterMouseMove); + removeEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onCommandLineKeyDown(event){ + if(event.keyCode == 13 && commandLine.value){ + addToHistory(commandLine.value); + evalCommandLine(); + }else if(event.keyCode == 27){ + commandLine.value = ""; + }else if(event.keyCode == dojo.keys.UP_ARROW || event.charCode == dojo.keys.UP_ARROW){ + navigateHistory("older"); + }else if(event.keyCode == dojo.keys.DOWN_ARROW || event.charCode == dojo.keys.DOWN_ARROW){ + navigateHistory("newer"); + }else if(event.keyCode == dojo.keys.HOME || event.charCode == dojo.keys.HOME){ + historyPosition = 1; + navigateHistory("older"); + }else if(event.keyCode == dojo.keys.END || event.charCode == dojo.keys.END){ + historyPosition = 999999; + navigateHistory("newer"); + } + } + + var historyPosition = -1; + var historyCommandLine = null; + + function addToHistory(value){ + var history = cookie("firebug_history"); + history = (history) ? dojo.fromJson(history) : []; + var pos = dojo.indexOf(history, value); + if (pos != -1){ + history.splice(pos, 1); + } + history.push(value); + cookie("firebug_history", dojo.toJson(history), 30); + while(history.length && !cookie("firebug_history")){ + history.shift(); + cookie("firebug_history", dojo.toJson(history), 30); + } + historyCommandLine = null; + historyPosition = -1; + } + + function navigateHistory(direction){ + var history = cookie("firebug_history"); + history = (history) ? dojo.fromJson(history) : []; + if(!history.length){ + return; + } + + if(historyCommandLine === null){ + historyCommandLine = commandLine.value; + } + + if(historyPosition == -1){ + historyPosition = history.length; + } + + if(direction == "older"){ + --historyPosition; + if(historyPosition < 0){ + historyPosition = 0; + } + }else if(direction == "newer"){ + ++historyPosition; + if(historyPosition > history.length){ + historyPosition = history.length; + } + } + + if(historyPosition == history.length){ + commandLine.value = historyCommandLine; + historyCommandLine = null; + }else{ + commandLine.value = history[historyPosition]; + } + } + + function cookie(name, value){ + var c = document.cookie; + if(arguments.length == 1){ + var matches = c.match(new RegExp("(?:^|; )" + name + "=([^;]*)")); + return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined + }else{ + var d = new Date(); + d.setMonth(d.getMonth()+1); + document.cookie = name + "=" + encodeURIComponent(value) + ((d.toUtcString) ? "; expires=" + d.toUTCString() : ""); + } + }; + + function isArray(it){ + return it && it instanceof Array || typeof it == "array"; + } + + //*************************************************************************************************** + // Print Object Helpers + function getAtts(o){ + //Get amount of items in an object + if(isArray(o)){ + return "[array with " + o.length + " slots]"; + }else{ + var i = 0; + for(var nm in o){ + i++; + } + return "{object with " + i + " items}"; + } + } + + function printObject(o, i, txt, used){ + // Recursively trace object, indenting to represent depth for display in object inspector + // TODO: counter to prevent overly complex or looped objects (will probably help with dom nodes) + var br = "\n"; // using a
          ... otherwise we'd need a 
          + var ind = " "; + txt = txt || ""; + i = i || ind; + used = used || []; + looking: + for(var nm in o){ + if(o[nm] === window || o[nm] === document){ + continue; + }else if(o[nm] && o[nm].nodeType){ + if(o[nm].nodeType == 1){ + txt += i+nm + " : < "+o[nm].tagName+" id=\""+ o[nm].id+"\" />" + br; + }else if(o[nm].nodeType == 3){ + txt += i+nm + " : [ TextNode "+o[nm].data + " ]" + br; + } + }else if(typeof o[nm] == "object" && (o[nm] instanceof String || o[nm] instanceof Number || o[nm] instanceof Boolean)){ + txt += i+nm + " : " + o[nm] + br; + }else if(typeof(o[nm]) == "object" && o[nm]){ + for(var j = 0, seen; seen = used[j]; j++){ + if(o[nm] === seen){ + txt += i+nm + " : RECURSION" + br; + continue looking; + } + } + used.push(o[nm]); + txt += i+nm +" -> " + getAtts(o[nm]) + br; + txt += printObject(o[nm], i+ind, "", used); + }else if(typeof o[nm] == "undefined"){ + txt += i+nm + " : undefined" + br; + }else if(nm == "toString" && typeof o[nm] == "function"){ + var toString = o[nm](); + if(typeof toString == "string" && toString.match(/function ?(.*?)\(/)){ + toString = escapeHTML(getObjectAbbr(o[nm])); + } + txt += i+nm +" : " + toString + br; + }else{ + txt += i+nm +" : "+ escapeHTML(getObjectAbbr(o[nm])) + br; + } + } + txt += br; // keeps data from running to the edge of page + return txt; + } + + function getObjectAbbr(obj){ + // Gets an abbreviation of an object for display in log + // X items in object, including id + // X items in an array + // TODO: Firebug Sr. actually goes by char count + var isError = (obj instanceof Error); + var nm = (obj && (obj.id || obj.name || obj.ObjectID || obj.widgetId)); + if(!isError && nm){ return "{"+nm+"}"; } + + var obCnt = 2; + var arCnt = 4; + var cnt = 0; + + if(isError){ + nm = "[ Error: "+(obj.message || obj.description || obj)+" ]"; + }else if(isArray(obj)){ + nm = "[" + obj.slice(0,arCnt).join(","); + if(obj.length > arCnt){ + nm += " ... ("+obj.length+" items)"; + } + nm += "]"; + }else if(typeof obj == "function"){ + nm = obj + ""; + var reg = /function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/; + var m = reg.exec(nm); + if(m){ + if(!m[1]){ + m[1] = "function"; + } + nm = m[1] + m[2]; + }else{ + nm = "function()"; + } + }else if(typeof obj != "object" || typeof obj == "string"){ + nm = obj + ""; + }else{ + nm = "{"; + for(var i in obj){ + cnt++; + if(cnt > obCnt){ break; } + nm += i+"="+obj[i]+" "; + } + nm+="}"; + } + + return nm; + } + + //************************************************************************************* + + window.onerror = onError; + addEvent(document, dojo.isIE || dojo.isSafari ? "keydown" : "keypress", onKeyDown); + + if( (document.documentElement.getAttribute("debug") == "true")|| + (dojo.config.isDebug) + ){ + toggleConsole(true); + } +})(); +} + +} diff --git a/includes/js/dojo/_firebug/infoIcon.png b/includes/js/dojo/_firebug/infoIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..da1e5334c19375c7855e04792661bf2cc15b7e14 GIT binary patch literal 524 zcmV+n0`vWeP)k!W#MOQK{ljl)GVz=%0?7rtE9wY7Lo;JgN;%aBBhkF zup$d#AvGJB@i#x7d!6%U9&aT1>bvKh+xgD9@4TZarC_79XA_3Y)u z4jj;IA&G`4T$SEtNOwJyD9b09DTwq1MCN*%!X+xO|0N{Rs4^;&b|i*sHEGPq;n|zOEfbH<6(;%L`k^mT)7z~ywlRx3h4?$ zl>}*o?-02Jb-IWCddBfMi57}>wIB`^Hlv*vh?pjx5|0aenzD001sDKWl9*QR=`djc O0000X+Z1;#G+8)`#`)nwDij+1|+};(+Jd*z{tojUrGNrgOti&26irp z_}33i3=gldFg&}%ydKD%4m4mlSOTPRRTp>8w%MHj-#%jkasQt=!|=bOgW><(yI^TB zesYWX|At9i|AA_qz?K0SLTh@t|9^bL1XtwZ!T_=ktQjT-!jEsTfHbZKahQM#GSy9g zGw=!jV;}@%)c=6I5d!peNPt)%qXt$R0@A3+&Ho=o(%2Y6D=A@WxvV2T-}@x_m?j12e;Kn75?FIa%Y*5~(_)p>;wfs>Yo>SSa9R12cEf^3|A z?HDV=w@(OLSFdJZ*t3U$;p|ydO|Ks_Gd#G$auApZ7BB&cJHLN2R-V|*!SL$`L^DVe z48y>e_e>0@wy}el)6tV$3kUcAYBiJJ3`|`A816m!$KYVc!0_$`6T_P)%nWzVvoQSm z#aIlqs1HRWRI?%|K>)EC$csSy9f(f>@eyb`{RmSF5MTfvB)oWs%O|`50000 block that lives inside the tag."); + } + return url; //String + } + + function checkLocation(){ + //console.debug("checking url"); + if(!changingUrl){ + var hsl = historyStack.length; + + var hash = getHash(); + + if((hash === initialHash||window.location.href == initialHref)&&(hsl == 1)){ + // FIXME: could this ever be a forward button? + // we can't clear it because we still need to check for forwards. Ugg. + // clearInterval(this.locationTimer); + handleBackButton(); + return; + } + + // first check to see if we could have gone forward. We always halt on + // a no-hash item. + if(forwardStack.length > 0){ + if(forwardStack[forwardStack.length-1].urlHash === hash){ + handleForwardButton(); + return; + } + } + + // ok, that didn't work, try someplace back in the history stack + if((hsl >= 2)&&(historyStack[hsl-2])){ + if(historyStack[hsl-2].urlHash === hash){ + handleBackButton(); + return; + } + } + + if(dojo.isSafari && dojo.isSafari < 3){ + var hisLen = history.length; + if(hisLen > historyCounter) handleForwardButton(); + else if(hisLen < historyCounter) handleBackButton(); + historyCounter = hisLen; + } + } + //console.debug("done checking"); + }; + + back.init = function(){ + //summary: Initializes the undo stack. This must be called from a + // | + d._modulePrefixes[module] = { name: module, value: prefix }; + } + + dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ + // summary: + // Declares translated resources and loads them if necessary, in the + // same style as dojo.require. Contents of the resource bundle are + // typically strings, but may be any name/value pair, represented in + // JSON format. See also dojo.i18n.getLocalization. + // moduleName: + // name of the package containing the "nls" directory in which the + // bundle is found + // bundleName: + // bundle name, i.e. the filename without the '.js' suffix + // locale: + // the locale to load (optional) By default, the browser's user + // locale as defined by dojo.locale + // availableFlatLocales: + // A comma-separated list of the available, flattened locales for this + // bundle. This argument should only be set by the build process. + // description: + // Load translated resource bundles provided underneath the "nls" + // directory within a package. Translated resources may be located in + // different packages throughout the source tree. For example, a + // particular widget may define one or more resource bundles, + // structured in a program as follows, where moduleName is + // mycode.mywidget and bundleNames available include bundleone and + // bundletwo: + // + // | ... + // | mycode/ + // | mywidget/ + // | nls/ + // | bundleone.js (the fallback translation, English in this example) + // | bundletwo.js (also a fallback translation) + // | de/ + // | bundleone.js + // | bundletwo.js + // | de-at/ + // | bundleone.js + // | en/ + // | (empty; use the fallback translation) + // | en-us/ + // | bundleone.js + // | en-gb/ + // | bundleone.js + // | es/ + // | bundleone.js + // | bundletwo.js + // | ...etc + // | ... + // + // Each directory is named for a locale as specified by RFC 3066, + // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase. + // Note that the two bundles in the example do not define all the + // same variants. For a given locale, bundles will be loaded for + // that locale and all more general locales above it, including a + // fallback at the root directory. For example, a declaration for + // the "de-at" locale will first load `nls/de-at/bundleone.js`, + // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The + // data will be flattened into a single Object so that lookups + // will follow this cascading pattern. An optional build step can + // preload the bundles to avoid data redundancy and the multiple + // network hits normally required to load these resources. + + d.require("dojo.i18n"); + d.i18n._requireLocalization.apply(d.hostenv, arguments); + }; + + + var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"); + var ire = new RegExp("^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$"); + + dojo._Url = function(/*dojo._Url||String...*/){ + // summary: + // Constructor to create an object representing a URL. + // It is marked as private, since we might consider removing + // or simplifying it. + // description: + // Each argument is evaluated in order relative to the next until + // a canonical uri is produced. To get an absolute Uri relative to + // the current document use: + // new dojo._Url(document.baseURI, url) + + var n = null; + + // TODO: support for IPv6, see RFC 2732 + var _a = arguments; + var uri = [_a[0]]; + // resolve uri components relative to each other + for(var i = 1; i<_a.length; i++){ + if(!_a[i]){ continue; } + + // Safari doesn't support this.constructor so we have to be explicit + // FIXME: Tracked (and fixed) in Webkit bug 3537. + // http://bugs.webkit.org/show_bug.cgi?id=3537 + var relobj = new d._Url(_a[i]+""); + var uriobj = new d._Url(uri[0]+""); + + if( + relobj.path == "" && + !relobj.scheme && + !relobj.authority && + !relobj.query + ){ + if(relobj.fragment != n){ + uriobj.fragment = relobj.fragment; + } + relobj = uriobj; + }else if(!relobj.scheme){ + relobj.scheme = uriobj.scheme; + + if(!relobj.authority){ + relobj.authority = uriobj.authority; + + if(relobj.path.charAt(0) != "/"){ + var path = uriobj.path.substring(0, + uriobj.path.lastIndexOf("/") + 1) + relobj.path; + + var segs = path.split("/"); + for(var j = 0; j < segs.length; j++){ + if(segs[j] == "."){ + // flatten "./" references + if(j == segs.length - 1){ + segs[j] = ""; + }else{ + segs.splice(j, 1); + j--; + } + }else if(j > 0 && !(j == 1 && segs[0] == "") && + segs[j] == ".." && segs[j-1] != ".."){ + // flatten "../" references + if(j == (segs.length - 1)){ + segs.splice(j, 1); + segs[j - 1] = ""; + }else{ + segs.splice(j - 1, 2); + j -= 2; + } + } + } + relobj.path = segs.join("/"); + } + } + } + + uri = []; + if(relobj.scheme){ + uri.push(relobj.scheme, ":"); + } + if(relobj.authority){ + uri.push("//", relobj.authority); + } + uri.push(relobj.path); + if(relobj.query){ + uri.push("?", relobj.query); + } + if(relobj.fragment){ + uri.push("#", relobj.fragment); + } + } + + this.uri = uri.join(""); + + // break the uri into its main components + var r = this.uri.match(ore); + + this.scheme = r[2] || (r[1] ? "" : n); + this.authority = r[4] || (r[3] ? "" : n); + this.path = r[5]; // can never be undefined + this.query = r[7] || (r[6] ? "" : n); + this.fragment = r[9] || (r[8] ? "" : n); + + if(this.authority != n){ + // server based naming authority + r = this.authority.match(ire); + + this.user = r[3] || n; + this.password = r[4] || n; + this.host = r[5]; + this.port = r[7] || n; + } + } + + dojo._Url.prototype.toString = function(){ return this.uri; }; + + dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){ + // summary: + // Returns a `dojo._Url` object relative to a module. + // example: + // | var pngPath = dojo.moduleUrl("acme","images/small.png"); + // | console.dir(pngPath); // list the object properties + // | // create an image and set it's source to pngPath's value: + // | var img = document.createElement("img"); + // | // NOTE: we assign the string representation of the url object + // | img.src = pngPath.toString(); + // | // add our image to the document + // | dojo.body().appendChild(img); + // example: + // you may de-reference as far as you like down the package + // hierarchy. This is sometimes handy to avoid lenghty relative + // urls or for building portable sub-packages. In this example, + // the `acme.widget` and `acme.util` directories may be located + // under different roots (see `dojo.registerModulePath`) but the + // the modules which reference them can be unaware of their + // relative locations on the filesystem: + // | // somewhere in a configuration block + // | dojo.registerModulePath("acme.widget", "../../acme/widget"); + // | dojo.registerModulePath("acme.util", "../../util"); + // | + // | // ... + // | + // | // code in a module using acme resources + // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html"); + // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json"); + + var loc = d._getModuleSymbols(module).join('/'); + if(!loc){ return null; } + if(loc.lastIndexOf("/") != loc.length-1){ + loc += "/"; + } + + //If the path is an absolute path (starts with a / or is on another + //domain/xdomain) then don't add the baseUrl. + var colonIndex = loc.indexOf(":"); + if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){ + loc = d.baseUrl + loc; + } + + return new d._Url(loc, url); // String + } +})(); + +/*===== +dojo.isBrowser = { + // example: + // | if(dojo.isBrowser){ ... } +}; + +dojo.isFF = { + // example: + // | if(dojo.isFF > 1){ ... } +}; + +dojo.isIE = { + // example: + // | if(dojo.isIE > 6){ + // | // we are IE7 + // | } +}; + +dojo.isSafari = { + // example: + // | if(dojo.isSafari){ ... } + // example: + // Detect iPhone: + // | if(dojo.isSafari && (navigator.userAgent.indexOf("iPhone") < 0)){ + // | // we are iPhone. iPod touch reports "iPod" above + // | } +}; + +dojo = { + // isBrowser: Boolean + // True if the client is a web-browser + isBrowser: true, + // isFF: Number + // Greater than zero if client is FireFox. 0 otherwise. Corresponds to + // major detected FireFox version (1.5, 2, 3, etc.) + isFF: 2, + // isIE: Number + // Greater than zero if client is MSIE(PC). 0 otherwise. Corresponds to + // major detected IE version (6, 7, 8, etc.) + isIE: 6, + // isKhtml: Number + // Greater than zero if client is a KTHML-derived browser (Konqueror, + // Safari, etc.). 0 otherwise. Corresponds to major detected version. + isKhtml: 0, + // isMozilla: Number + // Greater than zero if client is a Mozilla-based browser (Firefox, + // SeaMonkey). 0 otherwise. Corresponds to major detected version. + isMozilla: 0, + // isOpera: Number + // Greater than zero if client is Opera. 0 otherwise. Corresponds to + // major detected version. + isOpera: 0, + // isSafari: Number + // Greater than zero if client is Safari or iPhone. 0 otherwise. + isSafari: 0 +} +=====*/ + +if(typeof window != 'undefined'){ + dojo.isBrowser = true; + dojo._name = "browser"; + + + // attempt to figure out the path to dojo if it isn't set in the config + (function(){ + var d = dojo; + // this is a scope protection closure. We set browser versions and grab + // the URL we were loaded from here. + + // grab the node we were loaded from + if(document && document.getElementsByTagName){ + var scripts = document.getElementsByTagName("script"); + var rePkg = /dojo(\.xd)?\.js(\W|$)/i; + for(var i = 0; i < scripts.length; i++){ + var src = scripts[i].getAttribute("src"); + if(!src){ continue; } + var m = src.match(rePkg); + if(m){ + // find out where we came from + if(!d.config.baseUrl){ + d.config.baseUrl = src.substring(0, m.index); + } + // and find out if we need to modify our behavior + var cfg = scripts[i].getAttribute("djConfig"); + if(cfg){ + var cfgo = eval("({ "+cfg+" })"); + for(var x in cfgo){ + dojo.config[x] = cfgo[x]; + } + } + break; // "first Dojo wins" + } + } + } + d.baseUrl = d.config.baseUrl; + + // fill in the rendering support information in dojo.render.* + var n = navigator; + var dua = n.userAgent; + var dav = n.appVersion; + var tv = parseFloat(dav); + + d.isOpera = (dua.indexOf("Opera") >= 0) ? tv : 0; + // safari detection derived from: + // http://developer.apple.com/internet/safari/faq.html#anchor2 + // http://developer.apple.com/internet/safari/uamatrix.html + var idx = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); + if(idx){ + // try to grab the explicit Safari version first. If we don't get + // one, look for 419.3+ as the indication that we're on something + // "Safari 3-ish". Lastly, default to "Safari 2" handling. + d.isSafari = parseFloat(dav.split("Version/")[1]) || ( ( parseFloat(dav.substr(idx+7)) >= 419.3 ) ? 3 : 2 ) || 2; + } + d.isAIR = (dua.indexOf("AdobeAIR") >= 0) ? 1 : 0; + d.isKhtml = (dav.indexOf("Konqueror") >= 0 || d.isSafari) ? tv : 0; + d.isMozilla = d.isMoz = (dua.indexOf("Gecko") >= 0 && !d.isKhtml) ? tv : 0; + d.isFF = d.isIE = 0; + if(d.isMoz){ + d.isFF = parseFloat(dua.split("Firefox/")[1]) || 0; + } + if(document.all && !d.isOpera){ + d.isIE = parseFloat(dav.split("MSIE ")[1]) || 0; + } + + //Workaround to get local file loads of dojo to work on IE 7 + //by forcing to not use native xhr. + if(dojo.isIE && window.location.protocol === "file:"){ + dojo.config.ieForceActiveXXhr=true; + } + + var cm = document.compatMode; + d.isQuirks = cm == "BackCompat" || cm == "QuirksMode" || d.isIE < 6; + + // TODO: is the HTML LANG attribute relevant? + d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase(); + + // These are in order of decreasing likelihood; this will change in time. + d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; + + d._xhrObj = function(){ + // summary: + // does the work of portably generating a new XMLHTTPRequest + // object. + var http = null; + var last_e = null; + if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){ + try{ http = new XMLHttpRequest(); }catch(e){} + } + if(!http){ + for(var i=0; i<3; ++i){ + var progid = d._XMLHTTP_PROGIDS[i]; + try{ + http = new ActiveXObject(progid); + }catch(e){ + last_e = e; + } + + if(http){ + d._XMLHTTP_PROGIDS = [progid]; // so faster next time + break; + } + } + } + + if(!http){ + throw new Error("XMLHTTP not available: "+last_e); + } + + return http; // XMLHTTPRequest instance + } + + d._isDocumentOk = function(http){ + var stat = http.status || 0; + return (stat >= 200 && stat < 300) || // Boolean + stat == 304 || // allow any 2XX response code + stat == 1223 || // get it out of the cache + (!stat && (location.protocol=="file:" || location.protocol=="chrome:") ); // Internet Explorer mangled the status code + } + + //See if base tag is in use. + //This is to fix http://trac.dojotoolkit.org/ticket/3973, + //but really, we need to find out how to get rid of the dojo._Url reference + //below and still have DOH work with the dojo.i18n test following some other + //test that uses the test frame to load a document (trac #2757). + //Opera still has problems, but perhaps a larger issue of base tag support + //with XHR requests (hasBase is true, but the request is still made to document + //path, not base path). + var owloc = window.location+""; + var base = document.getElementsByTagName("base"); + var hasBase = (base && base.length > 0); + + d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){ + // summary: Read the contents of the specified uri and return those contents. + // uri: + // A relative or absolute uri. If absolute, it still must be in + // the same "domain" as we are. + // fail_ok: + // Default false. If fail_ok and loading fails, return null + // instead of throwing. + // returns: The response text. null is returned when there is a + // failure and failure is okay (an exception otherwise) + + // alert("_getText: " + uri); + + // NOTE: must be declared before scope switches ie. this._xhrObj() + var http = this._xhrObj(); + + if(!hasBase && dojo._Url){ + uri = (new dojo._Url(owloc, uri)).toString(); + } + /* + console.debug("_getText:", uri); + console.debug(window.location+""); + alert(uri); + */ + + if(d.config.cacheBust){ + uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,""); + } + + http.open('GET', uri, false); + try{ + http.send(null); + // alert(http); + if(!d._isDocumentOk(http)){ + var err = Error("Unable to load "+uri+" status:"+ http.status); + err.status = http.status; + err.responseText = http.responseText; + throw err; + } + }catch(e){ + if(fail_ok){ return null; } // null + // rethrow the exception + throw e; + } + return http.responseText; // String + } + })(); + + dojo._initFired = false; + // BEGIN DOMContentLoaded, from Dean Edwards (http://dean.edwards.name/weblog/2006/06/again/) + dojo._loadInit = function(e){ + dojo._initFired = true; + // allow multiple calls, only first one will take effect + // A bug in khtml calls events callbacks for document for event which isnt supported + // for example a created contextmenu event calls DOMContentLoaded, workaround + var type = (e && e.type) ? e.type.toLowerCase() : "load"; + if(arguments.callee.initialized || (type != "domcontentloaded" && type != "load")){ return; } + arguments.callee.initialized = true; + if("_khtmlTimer" in dojo){ + clearInterval(dojo._khtmlTimer); + delete dojo._khtmlTimer; + } + + if(dojo._inFlightCount == 0){ + dojo._modulesLoaded(); + } + } + + dojo._fakeLoadInit = function(){ + dojo._loadInit({type: "load"}); + } + + if(!dojo.config.afterOnLoad){ + // START DOMContentLoaded + // Mozilla and Opera 9 expose the event we could use + if(document.addEventListener){ + // NOTE: + // due to a threading issue in Firefox 2.0, we can't enable + // DOMContentLoaded on that platform. For more information, see: + // http://trac.dojotoolkit.org/ticket/1704 + if(dojo.isOpera || dojo.isFF >= 3 || (dojo.isMoz && dojo.config.enableMozDomContentLoaded === true)){ + document.addEventListener("DOMContentLoaded", dojo._loadInit, null); + } + + // mainly for Opera 8.5, won't be fired if DOMContentLoaded fired already. + // also used for Mozilla because of trac #1640 + window.addEventListener("load", dojo._loadInit, null); + } + + if(dojo.isAIR){ + window.addEventListener("load", dojo._loadInit, null); + }else if(/(WebKit|khtml)/i.test(navigator.userAgent)){ // sniff + dojo._khtmlTimer = setInterval(function(){ + if(/loaded|complete/.test(document.readyState)){ + dojo._loadInit(); // call the onload handler + } + }, 10); + } + // END DOMContentLoaded + } + + (function(){ + var _w = window; + var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){ + // summary: + // non-destructively adds the specified function to the node's + // evtName handler. + // evtName: should be in the form "onclick" for "onclick" handlers. + // Make sure you pass in the "on" part. + var oldHandler = _w[evtName] || function(){}; + _w[evtName] = function(){ + fp.apply(_w, arguments); + oldHandler.apply(_w, arguments); + }; + }; + + if(dojo.isIE){ + // for Internet Explorer. readyState will not be achieved on init + // call, but dojo doesn't need it however, we'll include it + // because we don't know if there are other functions added that + // might. Note that this has changed because the build process + // strips all comments -- including conditional ones. + if(!dojo.config.afterOnLoad){ + document.write('' + + '' + ); + } + + // IE WebControl hosted in an application can fire "beforeunload" and "unload" + // events when control visibility changes, causing Dojo to unload too soon. The + // following code fixes the problem + // Reference: http://support.microsoft.com/default.aspx?scid=kb;en-us;199155 + var _unloading = true; + _handleNodeEvent("onbeforeunload", function(){ + _w.setTimeout(function(){ _unloading = false; }, 0); + }); + _handleNodeEvent("onunload", function(){ + if(_unloading){ dojo.unloaded(); } + }); + + try{ + document.namespaces.add("v","urn:schemas-microsoft-com:vml"); + document.createStyleSheet().addRule("v\\:*", "behavior:url(#default#VML)"); + }catch(e){} + }else{ + // FIXME: dojo.unloaded requires dojo scope, so using anon function wrapper. + _handleNodeEvent("onbeforeunload", function() { dojo.unloaded(); }); + } + + })(); + + /* + OpenAjax.subscribe("OpenAjax", "onload", function(){ + if(dojo._inFlightCount == 0){ + dojo._modulesLoaded(); + } + }); + + OpenAjax.subscribe("OpenAjax", "onunload", function(){ + dojo.unloaded(); + }); + */ +} //if (typeof window != 'undefined') + +//Register any module paths set up in djConfig. Need to do this +//in the hostenvs since hostenv_browser can read djConfig from a +//script tag's attribute. +(function(){ + var mp = dojo.config["modulePaths"]; + if(mp){ + for(var param in mp){ + dojo.registerModulePath(param, mp[param]); + } + } +})(); + +//Load debug code if necessary. +if(dojo.config.isDebug){ + dojo.require("dojo._firebug.firebug"); +} + +if(dojo.config.debugAtAllCosts){ + dojo.config.useXDomain = true; + dojo.require("dojo._base._loader.loader_xd"); + dojo.require("dojo._base._loader.loader_debug"); + dojo.require("dojo.i18n"); +} + +if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.lang"] = true; +dojo.provide("dojo._base.lang"); + +// Crockford (ish) functions + +dojo.isString = function(/*anything*/ it){ + // summary: + // Return true if it is a String + return !!arguments.length && it != null && (typeof it == "string" || it instanceof String); // Boolean +} + +dojo.isArray = function(/*anything*/ it){ + // summary: + // Return true if it is an Array + return it && (it instanceof Array || typeof it == "array"); // Boolean +} + +/*===== +dojo.isFunction = function(it){ + // summary: Return true if it is a Function + // it: anything + // return: Boolean +} +=====*/ + +dojo.isFunction = (function(){ + var _isFunction = function(/*anything*/ it){ + return it && (typeof it == "function" || it instanceof Function); // Boolean + }; + + return dojo.isSafari ? + // only slow this down w/ gratuitious casting in Safari since it's what's b0rken + function(/*anything*/ it){ + if(typeof it == "function" && it == "[object NodeList]"){ return false; } + return _isFunction(it); // Boolean + } : _isFunction; +})(); + +dojo.isObject = function(/*anything*/ it){ + // summary: + // Returns true if it is a JavaScript object (or an Array, a Function + // or null) + return it !== undefined && + (it === null || typeof it == "object" || dojo.isArray(it) || dojo.isFunction(it)); // Boolean +} + +dojo.isArrayLike = function(/*anything*/ it){ + // summary: + // similar to dojo.isArray() but more permissive + // description: + // Doesn't strongly test for "arrayness". Instead, settles for "isn't + // a string or number and has a length property". Arguments objects + // and DOM collections will return true when passed to + // dojo.isArrayLike(), but will return false when passed to + // dojo.isArray(). + // return: + // If it walks like a duck and quicks like a duck, return `true` + var d = dojo; + return it && it !== undefined && + // keep out built-in constructors (Number, String, ...) which have length + // properties + !d.isString(it) && !d.isFunction(it) && + !(it.tagName && it.tagName.toLowerCase() == 'form') && + (d.isArray(it) || isFinite(it.length)); // Boolean +} + +dojo.isAlien = function(/*anything*/ it){ + // summary: + // Returns true if it is a built-in function or some other kind of + // oddball that *should* report as a function but doesn't + return it && !dojo.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean +} + +dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){ + // summary: + // Adds all properties and methods of props to constructor's + // prototype, making them available to all instances created with + // constructor. + for(var i=1, l=arguments.length; i 2){ + return dojo._hitchArgs.apply(dojo, arguments); // Function + } + if(!method){ + method = scope; + scope = null; + } + if(dojo.isString(method)){ + scope = scope || dojo.global; + if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); } + return function(){ return scope[method].apply(scope, arguments || []); }; // Function + } + return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function +} + +/*===== +dojo.delegate = function(obj, props){ + // summary: + // returns a new object which "looks" to obj for properties which it + // does not have a value for. Optionally takes a bag of properties to + // seed the returned object with initially. + // description: + // This is a small implementaton of the Boodman/Crockford delegation + // pattern in JavaScript. An intermediate object constructor mediates + // the prototype chain for the returned object, using it to delegate + // down to obj for property lookup when object-local lookup fails. + // This can be thought of similarly to ES4's "wrap", save that it does + // not act on types but rather on pure objects. + // obj: + // The object to delegate to for properties not found directly on the + // return object or in props. + // props: + // an object containing properties to assign to the returned object + // returns: + // an Object of anonymous type + // example: + // | var foo = { bar: "baz" }; + // | var thinger = dojo.delegate(foo, { thud: "xyzzy"}); + // | thinger.bar == "baz"; // delegated to foo + // | foo.thud == undefined; // by definition + // | thinger.thud == "xyzzy"; // mixed in from props + // | foo.bar = "thonk"; + // | thinger.bar == "thonk"; // still delegated to foo's bar +} +=====*/ + + +dojo.delegate = dojo._delegate = function(obj, props){ + + // boodman/crockford delegation + function TMP(){}; + TMP.prototype = obj; + var tmp = new TMP(); + if(props){ + dojo.mixin(tmp, props); + } + return tmp; // Object +} + +dojo.partial = function(/*Function|String*/method /*, ...*/){ + // summary: + // similar to hitch() except that the scope object is left to be + // whatever the execution context eventually becomes. + // description: + // Calling dojo.partial is the functional equivalent of calling: + // | dojo.hitch(null, funcName, ...); + var arr = [ null ]; + return dojo.hitch.apply(dojo, arr.concat(dojo._toArray(arguments))); // Function +} + +dojo._toArray = function(/*Object*/obj, /*Number?*/offset, /*Array?*/ startWith){ + // summary: + // Converts an array-like object (i.e. arguments, DOMCollection) to an + // array. Returns a new Array with the elements of obj. + // obj: + // the object to "arrayify". We expect the object to have, at a + // minimum, a length property which corresponds to integer-indexed + // properties. + // offset: + // the location in obj to start iterating from. Defaults to 0. + // Optional. + // startWith: + // An array to pack with the properties of obj. If provided, + // properties in obj are appended at the end of startWith and + // startWith is the returned array. + var arr = startWith||[]; + for(var x = offset || 0; x < obj.length; x++){ + arr.push(obj[x]); + } + return arr; // Array +} + +dojo.clone = function(/*anything*/ o){ + // summary: + // Clones objects (including DOM nodes) and all children. + // Warning: do not clone cyclic structures. + if(!o){ return o; } + if(dojo.isArray(o)){ + var r = []; + for(var i = 0; i < o.length; ++i){ + r.push(dojo.clone(o[i])); + } + return r; // Array + } + if(!dojo.isObject(o)){ + return o; /*anything*/ + } + if(o.nodeType && o.cloneNode){ // isNode + return o.cloneNode(true); // Node + } + if(o instanceof Date){ + return new Date(o.getTime()); // Date + } + // Generic objects + var r = new o.constructor(); // specific to dojo.declare()'d classes! + for(var i in o){ + if(!(i in r) || r[i] != o[i]){ + r[i] = dojo.clone(o[i]); + } + } + return r; // Object +} + +dojo.trim = function(/*String*/ str){ + // summary: + // trims whitespaces from both sides of the string + // description: + // This version of trim() was selected for inclusion into the base due + // to its compact size and relatively good performance (see Steven + // Levithan's blog: + // http://blog.stevenlevithan.com/archives/faster-trim-javascript). + // The fastest but longest version of this function is located at + // dojo.string.trim() + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); // String +} + +} + +if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.declare"] = true; +dojo.provide("dojo._base.declare"); + + +// this file courtesy of the TurboAjax group, licensed under a Dojo CLA + +dojo.declare = function(/*String*/ className, /*Function|Function[]*/ superclass, /*Object*/ props){ + // summary: + // Create a feature-rich constructor from compact notation + // className: + // The name of the constructor (loosely, a "class") + // stored in the "declaredClass" property in the created prototype + // superclass: + // May be null, a Function, or an Array of Functions. If an array, + // the first element is used as the prototypical ancestor and + // any following Functions become mixin ancestors. + // props: + // An object whose properties are copied to the + // created prototype. + // Add an instance-initialization function by making it a property + // named "constructor". + // description: + // Create a constructor using a compact notation for inheritance and + // prototype extension. + // + // All superclasses (including mixins) must be Functions (not simple Objects). + // + // Mixin ancestors provide a type of multiple inheritance. Prototypes of mixin + // ancestors are copied to the new class: changes to mixin prototypes will + // not affect classes to which they have been mixed in. + // + // "className" is cached in "declaredClass" property of the new class. + // + // example: + // | dojo.declare("my.classes.bar", my.classes.foo, { + // | // properties to be added to the class prototype + // | someValue: 2, + // | // initialization function + // | constructor: function(){ + // | this.myComplicatedObject = new ReallyComplicatedObject(); + // | }, + // | // other functions + // | someMethod: function(){ + // | doStuff(); + // | } + // | ); + + // process superclass argument + // var dd=dojo.declare, mixins=null; + var dd = arguments.callee, mixins; + if(dojo.isArray(superclass)){ + mixins = superclass; + superclass = mixins.shift(); + } + // construct intermediate classes for mixins + if(mixins){ + dojo.forEach(mixins, function(m){ + if(!m){ throw(className + ": mixin #" + i + " is null"); } // It's likely a required module is not loaded + superclass = dd._delegate(superclass, m); + }); + } + // prepare values + var init = (props||0).constructor, ctor = dd._delegate(superclass), fn; + // name methods (experimental) + for(var i in props){ if(dojo.isFunction(fn = props[i]) && !0[i]){fn.nom = i;} } // 0[i] checks Object.prototype + // decorate prototype + dojo.extend(ctor, {declaredClass: className, _constructor: init, preamble: null}, props || 0); + // special help for IE + ctor.prototype.constructor = ctor; + // create named reference + return dojo.setObject(className, ctor); // Function +}; + +dojo.mixin(dojo.declare, { + _delegate: function(base, mixin){ + var bp = (base||0).prototype, mp = (mixin||0).prototype; + // fresh constructor, fresh prototype + var ctor = dojo.declare._makeCtor(); + // cache ancestry + dojo.mixin(ctor, {superclass: bp, mixin: mp, extend: dojo.declare._extend}); + // chain prototypes + if(base){ctor.prototype = dojo._delegate(bp);} + // add mixin and core + dojo.extend(ctor, dojo.declare._core, mp||0, {_constructor: null, preamble: null}); + // special help for IE + ctor.prototype.constructor = ctor; + // name this class for debugging + ctor.prototype.declaredClass = (bp||0).declaredClass + '_' + (mp||0).declaredClass; + return ctor; + }, + _extend: function(props){ + for(var i in props){ if(dojo.isFunction(fn=props[i]) && !0[i]){fn.nom=i;} } + dojo.extend(this, props); + }, + _makeCtor: function(){ + // we have to make a function, but don't want to close over anything + return function(){ this._construct(arguments); }; + }, + _core: { + _construct: function(args){ + var c=args.callee, s=c.superclass, ct=s&&s.constructor, m=c.mixin, mct=m&&m.constructor, a=args, ii, fn; + // side-effect of = used on purpose here, lint may complain, don't try this at home + if(a[0]){ + // FIXME: preambles for each mixin should be allowed + // FIXME: + // should we allow the preamble here NOT to modify the + // default args, but instead to act on each mixin + // independently of the class instance being constructed + // (for impedence matching)? + + // allow any first argument w/ a "preamble" property to act as a + // class preamble (not exclusive of the prototype preamble) + if(/*dojo.isFunction*/((fn = a[0].preamble))){ + a = fn.apply(this, a) || a; + } + } + // prototype preamble + if((fn = c.prototype.preamble)){a = fn.apply(this, a) || a;} + // FIXME: + // need to provide an optional prototype-settable + // "_explicitSuper" property which disables this + // initialize superclass + if(ct&&ct.apply){ct.apply(this, a);} + // initialize mixin + if(mct&&mct.apply){mct.apply(this, a);} + // initialize self + if((ii=c.prototype._constructor)){ii.apply(this, args);} + // post construction + if(this.constructor.prototype==c.prototype && (ct=this.postscript)){ ct.apply(this, args); } + }, + _findMixin: function(mixin){ + var c = this.constructor, p, m; + while(c){ + p = c.superclass; + m = c.mixin; + if(m==mixin || (m instanceof mixin.constructor)){return p;} + if(m && (m=m._findMixin(mixin))){return m;} + c = p && p.constructor; + } + }, + _findMethod: function(name, method, ptype, has){ + // consciously trading readability for bytes and speed in this low-level method + var p=ptype, c, m, f; + do{ + c = p.constructor; + m = c.mixin; + // find method by name in our mixin ancestor + if(m && (m=this._findMethod(name, method, m, has))){return m;} + // if we found a named method that either exactly-is or exactly-is-not 'method' + if((f=p[name])&&(has==(f==method))){return p;} + // ascend chain + p = c.superclass; + }while(p); + // if we couldn't find an ancestor in our primary chain, try a mixin chain + return !has && (p=this._findMixin(ptype)) && this._findMethod(name, method, p, has); + }, + inherited: function(name, args, newArgs){ + // optionalize name argument (experimental) + var a = arguments; + if(!dojo.isString(a[0])){newArgs=args; args=name; name=args.callee.nom;} + a = newArgs||args; + var c = args.callee, p = this.constructor.prototype, fn, mp; + // if not an instance override + if(this[name] != c || p[name] == c){ + mp = this._findMethod(name, c, p, true); + if(!mp){throw(this.declaredClass + ': inherited method "' + name + '" mismatch');} + p = this._findMethod(name, c, mp, false); + } + fn = p && p[name]; + if(!fn){throw(mp.declaredClass + ': inherited method "' + name + '" not found');} + // if the function exists, invoke it in our scope + return fn.apply(this, a); + } + } +}); + +} + +if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.connect"] = true; +dojo.provide("dojo._base.connect"); + + +// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA + +// low-level delegation machinery +dojo._listener = { + // create a dispatcher function + getDispatcher: function(){ + // following comments pulled out-of-line to prevent cloning them + // in the returned function. + // - indices (i) that are really in the array of listeners (ls) will + // not be in Array.prototype. This is the 'sparse array' trick + // that keeps us safe from libs that take liberties with built-in + // objects + // - listener is invoked with current scope (this) + return function(){ + var ap=Array.prototype, c=arguments.callee, ls=c._listeners, t=c.target; + // return value comes from original target function + var r=t && t.apply(this, arguments); + // invoke listeners after target function + for(var i in ls){ + if(!(i in ap)){ + ls[i].apply(this, arguments); + } + } + // return value comes from original target function + return r; + } + }, + // add a listener to an object + add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ + // Whenever 'method' is invoked, 'listener' will have the same scope. + // Trying to supporting a context object for the listener led to + // complexity. + // Non trivial to provide 'once' functionality here + // because listener could be the result of a dojo.hitch call, + // in which case two references to the same hitch target would not + // be equivalent. + source = source || dojo.global; + // The source method is either null, a dispatcher, or some other function + var f = source[method]; + // Ensure a dispatcher + if(!f||!f._listeners){ + var d = dojo._listener.getDispatcher(); + // original target function is special + d.target = f; + // dispatcher holds a list of listeners + d._listeners = []; + // redirect source to dispatcher + f = source[method] = d; + } + // The contract is that a handle is returned that can + // identify this listener for disconnect. + // + // The type of the handle is private. Here is it implemented as Integer. + // DOM event code has this same contract but handle is Function + // in non-IE browsers. + // + // We could have separate lists of before and after listeners. + return f._listeners.push(listener) ; /*Handle*/ + }, + // remove a listener from an object + remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){ + var f = (source||dojo.global)[method]; + // remember that handle is the index+1 (0 is not a valid handle) + if(f && f._listeners && handle--){ + delete f._listeners[handle]; + } + } +}; + +// Multiple delegation for arbitrary methods. + +// This unit knows nothing about DOM, +// but we include DOM aware +// documentation and dontFix +// argument here to help the autodocs. +// Actual DOM aware code is in event.js. + +dojo.connect = function(/*Object|null*/ obj, + /*String*/ event, + /*Object|null*/ context, + /*String|Function*/ method, + /*Boolean*/ dontFix){ + // summary: + // Create a link that calls one function when another executes. + // + // description: + // Connects method to event, so that after event fires, method + // does too. All connected functions are passed the same arguments as + // the event function was initially called with. You may connect as + // many methods to event as needed. + // + // event must be a string. If obj is null, dojo.global is used. + // + // null arguments may simply be omitted. + // + // obj[event] can resolve to a function or undefined (null). + // If obj[event] is null, it is assigned a function. + // + // The return value is a handle that is needed to + // remove this connection with dojo.disconnect. + // + // obj: + // The source object for the event function. + // Defaults to dojo.global if null. + // If obj is a DOM node, the connection is delegated + // to the DOM event manager (unless dontFix is true). + // + // event: + // String name of the event function in obj. + // I.e. identifies a property obj[event]. + // + // context: + // The object that method will receive as "this". + // + // If context is null and method is a function, then method + // inherits the context of event. + // + // If method is a string then context must be the source + // object object for method (context[method]). If context is null, + // dojo.global is used. + // + // method: + // A function reference, or name of a function in context. + // The function identified by method fires after event does. + // method receives the same arguments as the event. + // See context argument comments for information on method's scope. + // + // dontFix: + // If obj is a DOM node, set dontFix to true to prevent delegation + // of this connection to the DOM event manager. + // + // example: + // When obj.onchange(), do ui.update(): + // | dojo.connect(obj, "onchange", ui, "update"); + // | dojo.connect(obj, "onchange", ui, ui.update); // same + // + // example: + // Using return value for disconnect: + // | var link = dojo.connect(obj, "onchange", ui, "update"); + // | ... + // | dojo.disconnect(link); + // + // example: + // When onglobalevent executes, watcher.handler is invoked: + // | dojo.connect(null, "onglobalevent", watcher, "handler"); + // + // example: + // When ob.onCustomEvent executes, customEventHandler is invoked: + // | dojo.connect(ob, "onCustomEvent", null, "customEventHandler"); + // | dojo.connect(ob, "onCustomEvent", "customEventHandler"); // same + // + // example: + // When ob.onCustomEvent executes, customEventHandler is invoked + // with the same scope (this): + // | dojo.connect(ob, "onCustomEvent", null, customEventHandler); + // | dojo.connect(ob, "onCustomEvent", customEventHandler); // same + // + // example: + // When globalEvent executes, globalHandler is invoked + // with the same scope (this): + // | dojo.connect(null, "globalEvent", null, globalHandler); + // | dojo.connect("globalEvent", globalHandler); // same + + // normalize arguments + var a=arguments, args=[], i=0; + // if a[0] is a String, obj was ommited + args.push(dojo.isString(a[0]) ? null : a[i++], a[i++]); + // if the arg-after-next is a String or Function, context was NOT omitted + var a1 = a[i+1]; + args.push(dojo.isString(a1)||dojo.isFunction(a1) ? a[i++] : null, a[i++]); + // absorb any additional arguments + for(var l=a.length; i. + // description: + // JavaScript has no threads, and even if it did, threads are hard. + // Deferreds are a way of abstracting non-blocking events, such as the + // final response to an XMLHttpRequest. Deferreds create a promise to + // return a response a some point in the future and an easy way to + // register your interest in receiving that response. + // + // The most important methods for Deffered users are: + // + // * addCallback(handler) + // * addErrback(handler) + // * callback(result) + // * errback(result) + // + // In general, when a function returns a Deferred, users then "fill + // in" the second half of the contract by registering callbacks and + // error handlers. You may register as many callback and errback + // handlers as you like and they will be executed in the order + // registered when a result is provided. Usually this result is + // provided as the result of an asynchronous operation. The code + // "managing" the Deferred (the code that made the promise to provide + // an answer later) will use the callback() and errback() methods to + // communicate with registered listeners about the result of the + // operation. At this time, all registered result handlers are called + // *with the most recent result value*. + // + // Deferred callback handlers are treated as a chain, and each item in + // the chain is required to return a value that will be fed into + // successive handlers. The most minimal callback may be registered + // like this: + // + // | var d = new dojo.Deferred(); + // | d.addCallback(function(result){ return result; }); + // + // Perhaps the most common mistake when first using Deferreds is to + // forget to return a value (in most cases, the value you were + // passed). + // + // The sequence of callbacks is internally represented as a list of + // 2-tuples containing the callback/errback pair. For example, the + // following call sequence: + // + // | var d = new dojo.Deferred(); + // | d.addCallback(myCallback); + // | d.addErrback(myErrback); + // | d.addBoth(myBoth); + // | d.addCallbacks(myCallback, myErrback); + // + // is translated into a Deferred with the following internal + // representation: + // + // | [ + // | [myCallback, null], + // | [null, myErrback], + // | [myBoth, myBoth], + // | [myCallback, myErrback] + // | ] + // + // The Deferred also keeps track of its current status (fired). Its + // status may be one of three things: + // + // * -1: no value yet (initial condition) + // * 0: success + // * 1: error + // + // A Deferred will be in the error state if one of the following three + // conditions are met: + // + // 1. The result given to callback or errback is "instanceof" Error + // 2. The previous callback or errback raised an exception while + // executing + // 3. The previous callback or errback returned a value + // "instanceof" Error + // + // Otherwise, the Deferred will be in the success state. The state of + // the Deferred determines the next element in the callback sequence + // to run. + // + // When a callback or errback occurs with the example deferred chain, + // something equivalent to the following will happen (imagine + // that exceptions are caught and returned): + // + // | // d.callback(result) or d.errback(result) + // | if(!(result instanceof Error)){ + // | result = myCallback(result); + // | } + // | if(result instanceof Error){ + // | result = myErrback(result); + // | } + // | result = myBoth(result); + // | if(result instanceof Error){ + // | result = myErrback(result); + // | }else{ + // | result = myCallback(result); + // | } + // + // The result is then stored away in case another step is added to the + // callback sequence. Since the Deferred already has a value + // available, any new callbacks added will be called immediately. + // + // There are two other "advanced" details about this implementation + // that are useful: + // + // Callbacks are allowed to return Deferred instances themselves, so + // you can build complicated sequences of events with ease. + // + // The creator of the Deferred may specify a canceller. The canceller + // is a function that will be called if Deferred.cancel is called + // before the Deferred fires. You can use this to implement clean + // aborting of an XMLHttpRequest, etc. Note that cancel will fire the + // deferred with a CancelledError (unless your canceller returns + // another kind of error), so the errbacks should be prepared to + // handle that error for cancellable Deferreds. + // example: + // | var deferred = new dojo.Deferred(); + // | setTimeout(function(){ deferred.callback({success: true}); }, 1000); + // | return deferred; + // example: + // Deferred objects are often used when making code asynchronous. It + // may be easiest to write functions in a synchronous manner and then + // split code using a deferred to trigger a response to a long-lived + // operation. For example, instead of register a callback function to + // denote when a rendering operation completes, the function can + // simply return a deferred: + // + // | // callback style: + // | function renderLotsOfData(data, callback){ + // | var success = false + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | success = true; + // | }catch(e){ } + // | if(callback){ + // | callback(success); + // | } + // | } + // + // | // using callback style + // | renderLotsOfData(someDataObj, function(success){ + // | // handles success or failure + // | if(!success){ + // | promptUserToRecover(); + // | } + // | }); + // | // NOTE: no way to add another callback here!! + // example: + // Using a Deferred doesn't simplify the sending code any, but it + // provides a standard interface for callers and senders alike, + // providing both with a simple way to service multiple callbacks for + // an operation and freeing both sides from worrying about details + // such as "did this get called already?". With Deferreds, new + // callbacks can be added at any time. + // + // | // Deferred style: + // | function renderLotsOfData(data){ + // | var d = new dojo.Deferred(); + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | d.callback(true); + // | }catch(e){ + // | d.errback(new Error("rendering failed")); + // | } + // | return d; + // | } + // + // | // using Deferred style + // | renderLotsOfData(someDataObj).addErrback(function(){ + // | promptUserToRecover(); + // | }); + // | // NOTE: addErrback and addCallback both return the Deferred + // | // again, so we could chain adding callbacks or save the + // | // deferred for later should we need to be notified again. + // example: + // In this example, renderLotsOfData is syncrhonous and so both + // versions are pretty artificial. Putting the data display on a + // timeout helps show why Deferreds rock: + // + // | // Deferred style and async func + // | function renderLotsOfData(data){ + // | var d = new dojo.Deferred(); + // | setTimeout(function(){ + // | try{ + // | for(var x in data){ + // | renderDataitem(data[x]); + // | } + // | d.callback(true); + // | }catch(e){ + // | d.errback(new Error("rendering failed")); + // | } + // | }, 100); + // | return d; + // | } + // + // | // using Deferred style + // | renderLotsOfData(someDataObj).addErrback(function(){ + // | promptUserToRecover(); + // | }); + // + // Note that the caller doesn't have to change his code at all to + // handle the asynchronous case. + + this.chain = []; + this.id = this._nextId(); + this.fired = -1; + this.paused = 0; + this.results = [null, null]; + this.canceller = canceller; + this.silentlyCancelled = false; +}; + +dojo.extend(dojo.Deferred, { + /* + makeCalled: function(){ + // summary: + // returns a new, empty deferred, which is already in the called + // state. Calling callback() or errback() on this deferred will + // yeild an error and adding new handlers to it will result in + // them being called immediately. + var deferred = new dojo.Deferred(); + deferred.callback(); + return deferred; + }, + + toString: function(){ + var state; + if(this.fired == -1){ + state = 'unfired'; + }else{ + state = this.fired ? 'success' : 'error'; + } + return 'Deferred(' + this.id + ', ' + state + ')'; + }, + */ + + _nextId: (function(){ + var n = 1; + return function(){ return n++; }; + })(), + + cancel: function(){ + // summary: + // Cancels a Deferred that has not yet received a value, or is + // waiting on another Deferred as its value. + // description: + // If a canceller is defined, the canceller is called. If the + // canceller did not return an error, or there was no canceller, + // then the errback chain is started. + var err; + if(this.fired == -1){ + if(this.canceller){ + err = this.canceller(this); + }else{ + this.silentlyCancelled = true; + } + if(this.fired == -1){ + if(!(err instanceof Error)){ + var res = err; + err = new Error("Deferred Cancelled"); + err.dojoType = "cancel"; + err.cancelResult = res; + } + this.errback(err); + } + }else if( (this.fired == 0) && + (this.results[0] instanceof dojo.Deferred) + ){ + this.results[0].cancel(); + } + }, + + + _resback: function(res){ + // summary: + // The private primitive that means either callback or errback + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + this._fire(); + }, + + _check: function(){ + if(this.fired != -1){ + if(!this.silentlyCancelled){ + throw new Error("already called!"); + } + this.silentlyCancelled = false; + return; + } + }, + + callback: function(res){ + // summary: + // Begin the callback sequence with a non-error value. + + /* + callback or errback should only be called once on a given + Deferred. + */ + this._check(); + this._resback(res); + }, + + errback: function(/*Error*/res){ + // summary: + // Begin the callback sequence with an error result. + this._check(); + if(!(res instanceof Error)){ + res = new Error(res); + } + this._resback(res); + }, + + addBoth: function(/*Function|Object*/cb, /*String?*/cbfn){ + // summary: + // Add the same function as both a callback and an errback as the + // next element on the callback sequence.This is useful for code + // that you want to guarantee to run, e.g. a finalizer. + var enclosed = dojo.hitch.apply(dojo, arguments); + return this.addCallbacks(enclosed, enclosed); + }, + + addCallback: function(/*Function|Object*/cb, /*String?*/cbfn /*...*/){ + // summary: + // Add a single callback to the end of the callback sequence. + return this.addCallbacks(dojo.hitch.apply(dojo, arguments)); + }, + + addErrback: function(cb, cbfn){ + // summary: + // Add a single callback to the end of the callback sequence. + return this.addCallbacks(null, dojo.hitch.apply(dojo, arguments)); + }, + + addCallbacks: function(cb, eb){ + // summary: + // Add separate callback and errback to the end of the callback + // sequence. + this.chain.push([cb, eb]) + if(this.fired >= 0){ + this._fire(); + } + return this; + }, + + _fire: function(){ + // summary: + // Used internally to exhaust the callback sequence when a result + // is available. + var chain = this.chain; + var fired = this.fired; + var res = this.results[fired]; + var self = this; + var cb = null; + while( + (chain.length > 0) && + (this.paused == 0) + ){ + // Array + var f = chain.shift()[fired]; + if(!f){ continue; } + try{ + res = f(res); + fired = ((res instanceof Error) ? 1 : 0); + if(res instanceof dojo.Deferred){ + cb = function(res){ + self._resback(res); + // inlined from _pause() + self.paused--; + if( + (self.paused == 0) && + (self.fired >= 0) + ){ + self._fire(); + } + } + // inlined from _unpause + this.paused++; + } + }catch(err){ + console.debug(err); + fired = 1; + res = err; + } + } + this.fired = fired; + this.results[fired] = res; + if((cb)&&(this.paused)){ + // this is for "tail recursion" in case the dependent + // deferred is already fired + res.addBoth(cb); + } + } +}); + +} + +if(!dojo._hasResource["dojo._base.json"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.json"] = true; +dojo.provide("dojo._base.json"); + +dojo.fromJson = function(/*String*/ json){ + // summary: + // Parses a [JSON](http://json.org) string to return a JavaScript object. + // json: + // a string literal of a JSON item, for instance: + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` + + return eval("(" + json + ")"); // Object +} + +dojo._escapeString = function(/*String*/str){ + //summary: + // Adds escape sequences for non-visual characters, double quote and + // backslash and surrounds with double quotes to form a valid string + // literal. + return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). + replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). + replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string +} + +dojo.toJsonIndentStr = "\t"; +dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){ + // summary: + // Returns a [JSON](http://json.org) serialization of an object. + // + // description: + // Returns a [JSON](http://json.org) serialization of an object. + // Note that this doesn't check for infinite recursion, so don't do that! + // + // it: + // an object to be serialized. Objects may define their own + // serialization via a special "__json__" or "json" function + // property. If a specialized serializer has been defined, it will + // be used as a fallback. + // + // prettyPrint: + // if true, we indent objects and arrays to make the output prettier. + // The variable dojo.toJsonIndentStr is used as the indent string + // -- to use something other than the default (tab), + // change that variable before calling dojo.toJson(). + // + // _indentStr: + // private variable for recursive calls when pretty printing, do not use. + + if(it === undefined){ + return "undefined"; + } + var objtype = typeof it; + if(objtype == "number" || objtype == "boolean"){ + return it + ""; + } + if(it === null){ + return "null"; + } + if(dojo.isString(it)){ + return dojo._escapeString(it); + } + if(it.nodeType && it.cloneNode){ // isNode + return ""; // FIXME: would something like outerHTML be better here? + } + // recurse + var recurse = arguments.callee; + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + var newObj; + _indentStr = _indentStr || ""; + var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : ""; + if(typeof it.__json__ == "function"){ + newObj = it.__json__(); + if(it !== newObj){ + return recurse(newObj, prettyPrint, nextIndent); + } + } + if(typeof it.json == "function"){ + newObj = it.json(); + if(it !== newObj){ + return recurse(newObj, prettyPrint, nextIndent); + } + } + + var sep = prettyPrint ? " " : ""; + var newLine = prettyPrint ? "\n" : ""; + + // array + if(dojo.isArray(it)){ + var res = dojo.map(it, function(obj){ + var val = recurse(obj, prettyPrint, nextIndent); + if(typeof val != "string"){ + val = "undefined"; + } + return newLine + nextIndent + val; + }); + return "[" + res.join("," + sep) + newLine + _indentStr + "]"; + } + /* + // look in the registry + try { + window.o = it; + newObj = dojo.json.jsonRegistry.match(it); + return recurse(newObj, prettyPrint, nextIndent); + }catch(e){ + // console.debug(e); + } + // it's a function with no adapter, skip it + */ + if(objtype == "function"){ + return null; // null + } + // generic object code path + var output = []; + for(var key in it){ + var keyStr; + if(typeof key == "number"){ + keyStr = '"' + key + '"'; + }else if(typeof key == "string"){ + keyStr = dojo._escapeString(key); + }else{ + // skip non-string or number keys + continue; + } + val = recurse(it[key], prettyPrint, nextIndent); + if(typeof val != "string"){ + // skip non-serializable values + continue; + } + // FIXME: use += on Moz!! + // MOW NOTE: using += is a pain because you have to account for the dangling comma... + output.push(newLine + nextIndent + keyStr + ":" + sep + val); + } + return "{" + output.join("," + sep) + newLine + _indentStr + "}"; // String +} + +} + +if(!dojo._hasResource["dojo._base.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.array"] = true; + +dojo.provide("dojo._base.array"); + +(function(){ + var _getParts = function(arr, obj, cb){ + return [ + dojo.isString(arr) ? arr.split("") : arr, + obj || dojo.global, + // FIXME: cache the anonymous functions we create here? + dojo.isString(cb) ? new Function("item", "index", "array", cb) : cb + ]; + }; + + dojo.mixin(dojo, { + indexOf: function( /*Array*/ array, + /*Object*/ value, + /*Integer?*/ fromIndex, + /*Boolean?*/ findLast){ + // summary: + // locates the first index of the provided value in the + // passed array. If the value is not found, -1 is returned. + // description: + // For details on this method, see: + // + + var step = 1, end = array.length || 0, i = 0; + if(findLast){ + i = end - 1; + step = end = -1; + } + if(fromIndex != undefined){ i = fromIndex; } + if((findLast && i > end) || i < end){ + for(; i != end; i += step){ + if(array[i] == value){ return i; } + } + } + return -1; // Number + }, + + lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){ + // summary: + // locates the last index of the provided value in the passed array. + // If the value is not found, -1 is returned. + // description: + // For details on this method, see: + // + return dojo.indexOf(array, value, fromIndex, true); // Number + }, + + forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ + // summary: + // for every item in arr, callback is invoked. Return values are ignored. + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.forEach() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + + // match the behavior of the built-in forEach WRT empty arrs + if(!arr || !arr.length){ return; } + + // FIXME: there are several ways of handilng thisObject. Is + // dojo.global always the default context? + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + for(var i=0,l=_p[0].length; i + // example: + // | dojo.every([1, 2, 3, 4], function(item){ return item>1; }); + // returns false + // example: + // | dojo.every([1, 2, 3, 4], function(item){ return item>0; }); + // returns true + return this._everyOrSome(true, arr, callback, thisObject); // Boolean + }, + + some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){ + // summary: + // Determines whether or not any item in arr satisfies the + // condition implemented by callback. + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array and returns true + // if the condition is met. + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.some() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + // example: + // | dojo.some([1, 2, 3, 4], function(item){ return item>1; }); + // returns true + // example: + // | dojo.some([1, 2, 3, 4], function(item){ return item<1; }); + // returns false + return this._everyOrSome(false, arr, callback, thisObject); // Boolean + }, + + map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){ + // summary: + // applies callback to each element of arr and returns + // an Array with the results + // arr: the array to iterate on. If a string, operates on individual characters. + // callback: a function is invoked with three arguments: item, index, and array and returns a value + // thisObject: may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.map() method. + // In environments that support JavaScript 1.6, this function is a passthrough to the built-in method. + // For more details, see: + // + // example: + // | dojo.map([1, 2, 3, 4], function(item){ return item+1 }); + // returns [2, 3, 4, 5] + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + var outArr = (arguments[3] ? (new arguments[3]()) : []); + for(var i=0;i + // example: + // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; }); + // returns [2, 3, 4] + + var _p = _getParts(arr, thisObject, callback); arr = _p[0]; + var outArr = []; + for(var i = 0; i < arr.length; i++){ + if(_p[2].call(_p[1], arr[i], i, arr)){ + outArr.push(arr[i]); + } + } + return outArr; // Array + } + }); +})(); + +} + +if(!dojo._hasResource["dojo._base.Color"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.Color"] = true; +dojo.provide("dojo._base.Color"); + + + +dojo.Color = function(/*Array|String|Object*/ color){ + // summary: + // takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another dojo.Color object + if(color){ this.setColor(color); } +}; + +// FIXME: there's got to be a more space-efficient way to encode or discover these!! Use hex? +dojo.Color.named = { + black: [0,0,0], + silver: [192,192,192], + gray: [128,128,128], + white: [255,255,255], + maroon: [128,0,0], + red: [255,0,0], + purple: [128,0,128], + fuchsia: [255,0,255], + green: [0,128,0], + lime: [0,255,0], + olive: [128,128,0], + yellow: [255,255,0], + navy: [0,0,128], + blue: [0,0,255], + teal: [0,128,128], + aqua: [0,255,255] +}; + + +dojo.extend(dojo.Color, { + r: 255, g: 255, b: 255, a: 1, + _set: function(r, g, b, a){ + var t = this; t.r = r; t.g = g; t.b = b; t.a = a; + }, + setColor: function(/*Array|String|Object*/ color){ + // summary: + // takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another dojo.Color object + var d = dojo; + if(d.isString(color)){ + d.colorFromString(color, this); + }else if(d.isArray(color)){ + d.colorFromArray(color, this); + }else{ + this._set(color.r, color.g, color.b, color.a); + if(!(color instanceof d.Color)){ this.sanitize(); } + } + return this; // dojo.Color + }, + sanitize: function(){ + // summary: + // makes sure that the object has correct attributes + // description: + // the default implementation does nothing, include dojo.colors to + // augment it to real checks + return this; // dojo.Color + }, + toRgb: function(){ + // summary: returns 3 component array of rgb values + var t = this; + return [t.r, t.g, t.b]; // Array + }, + toRgba: function(){ + // summary: returns a 4 component array of rgba values + var t = this; + return [t.r, t.g, t.b, t.a]; // Array + }, + toHex: function(){ + // summary: returns a css color string in hexadecimal representation + var arr = dojo.map(["r", "g", "b"], function(x){ + var s = this[x].toString(16); + return s.length < 2 ? "0" + s : s; + }, this); + return "#" + arr.join(""); // String + }, + toCss: function(/*Boolean?*/ includeAlpha){ + // summary: returns a css color string in rgb(a) representation + var t = this, rgb = t.r + ", " + t.g + ", " + t.b; + return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String + }, + toString: function(){ + // summary: returns a visual representation of the color + return this.toCss(true); // String + } +}); + +dojo.blendColors = function( + /*dojo.Color*/ start, + /*dojo.Color*/ end, + /*Number*/ weight, + /*dojo.Color?*/ obj +){ + // summary: + // blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend, + // can reuse a previously allocated dojo.Color object for the result + var d = dojo, t = obj || new dojo.Color(); + d.forEach(["r", "g", "b", "a"], function(x){ + t[x] = start[x] + (end[x] - start[x]) * weight; + if(x != "a"){ t[x] = Math.round(t[x]); } + }); + return t.sanitize(); // dojo.Color +}; + +dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: get rgb(a) array from css-style color declarations + var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/); + return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color +}; + +dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: converts a hex string with a '#' prefix to a color object. + // Supports 12-bit #rgb shorthand. + var d = dojo, t = obj || new d.Color(), + bits = (color.length == 4) ? 4 : 8, + mask = (1 << bits) - 1; + color = Number("0x" + color.substr(1)); + if(isNaN(color)){ + return null; // dojo.Color + } + d.forEach(["b", "g", "r"], function(x){ + var c = color & mask; + color >>= bits; + t[x] = bits == 4 ? 17 * c : c; + }); + t.a = 1; + return t; // dojo.Color +}; + +dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){ + // summary: builds a color from 1, 2, 3, or 4 element array + var t = obj || new dojo.Color(); + t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3])); + if(isNaN(t.a)){ t.a = 1; } + return t.sanitize(); // dojo.Color +}; + +dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){ + // summary: + // parses str for a color value. + // description: + // Acceptable input values for str may include arrays of any form + // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or + // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10, + // 10, 50)" + // returns: + // a dojo.Color object. If obj is passed, it will be the return value. + var a = dojo.Color.named[str]; + return a && dojo.colorFromArray(a, obj) || dojo.colorFromRgb(str, obj) || dojo.colorFromHex(str, obj); +}; + +} + +if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base"] = true; +dojo.provide("dojo._base"); + + + + + + + + + +} + +if(!dojo._hasResource["dojo._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.window"] = true; +dojo.provide("dojo._base.window"); + +dojo._gearsObject = function(){ + // summary: + // factory method to get a Google Gears plugin instance to + // expose in the browser runtime environment, if present + var factory; + var results; + + var gearsObj = dojo.getObject("google.gears"); + if(gearsObj){ return gearsObj; } // already defined elsewhere + + if(typeof GearsFactory != "undefined"){ // Firefox + factory = new GearsFactory(); + }else{ + if(dojo.isIE){ + // IE + try{ + factory = new ActiveXObject("Gears.Factory"); + }catch(e){ + // ok to squelch; there's no gears factory. move on. + } + }else if(navigator.mimeTypes["application/x-googlegears"]){ + // Safari? + factory = document.createElement("object"); + factory.setAttribute("type", "application/x-googlegears"); + factory.setAttribute("width", 0); + factory.setAttribute("height", 0); + factory.style.display = "none"; + document.documentElement.appendChild(factory); + } + } + + // still nothing? + if(!factory){ return null; } + + // define the global objects now; don't overwrite them though if they + // were somehow set internally by the Gears plugin, which is on their + // dev roadmap for the future + dojo.setObject("google.gears.factory", factory); + return dojo.getObject("google.gears"); +}; + +/*===== +dojo.isGears = { + // summary: True if client is using Google Gears +}; +=====*/ +// see if we have Google Gears installed, and if +// so, make it available in the runtime environment +// and in the Google standard 'google.gears' global object +dojo.isGears = (!!dojo._gearsObject())||0; + +/*===== +dojo.doc = { + // summary: + // Alias for the current document. 'dojo.doc' can be modified + // for temporary context shifting. Also see dojo.withDoc(). + // description: + // Refer to dojo.doc rather + // than referring to 'window.document' to ensure your code runs + // correctly in managed contexts. + // example: + // | n.appendChild(dojo.doc.createElement('div')); +} +=====*/ +dojo.doc = window["document"] || null; + +dojo.body = function(){ + // summary: + // Return the body element of the document + // return the body object associated with dojo.doc + // example: + // | dojo.body().appendChild(dojo.doc.createElement('div')); + + // Note: document.body is not defined for a strict xhtml document + // Would like to memoize this, but dojo.doc can change vi dojo.withDoc(). + return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node +} + +dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){ + // summary: + // changes the behavior of many core Dojo functions that deal with + // namespace and DOM lookup, changing them to work in a new global + // context (e.g., an iframe). The varibles dojo.global and dojo.doc + // are modified as a result of calling this function and the result of + // `dojo.body()` likewise differs. + dojo.global = globalObject; + dojo.doc = globalDocument; +}; + +dojo._fireCallback = function(callback, context, cbArguments){ + if(context && dojo.isString(callback)){ + callback = context[callback]; + } + return callback.apply(context, cbArguments || [ ]); +} + +dojo.withGlobal = function( /*Object*/globalObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Call callback with globalObject as dojo.global and + // globalObject.document as dojo.doc. If provided, globalObject + // will be executed in the context of object thisObject + // description: + // When callback() returns or throws an error, the dojo.global + // and dojo.doc will be restored to its previous state. + var rval; + var oldGlob = dojo.global; + var oldDoc = dojo.doc; + try{ + dojo.setContext(globalObject, globalObject.document); + rval = dojo._fireCallback(callback, thisObject, cbArguments); + }finally{ + dojo.setContext(oldGlob, oldDoc); + } + return rval; +} + +dojo.withDoc = function( /*Object*/documentObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Call callback with documentObject as dojo.doc. If provided, + // callback will be executed in the context of object thisObject + // description: + // When callback() returns or throws an error, the dojo.doc will + // be restored to its previous state. + var rval; + var oldDoc = dojo.doc; + try{ + dojo.doc = documentObject; + rval = dojo._fireCallback(callback, thisObject, cbArguments); + }finally{ + dojo.doc = oldDoc; + } + return rval; +}; + +} + +if(!dojo._hasResource["dojo._base.event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.event"] = true; +dojo.provide("dojo._base.event"); + + +// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA + +(function(){ + // DOM event listener machinery + var del = (dojo._event_listener = { + add: function(/*DOMNode*/node, /*String*/name, /*Function*/fp){ + if(!node){return;} + name = del._normalizeEventName(name); + fp = del._fixCallback(name, fp); + var oname = name; + if(!dojo.isIE && (name == "mouseenter" || name == "mouseleave")){ + var ofp = fp; + //oname = name; + name = (name == "mouseenter") ? "mouseover" : "mouseout"; + fp = function(e){ + // thanks ben! + if(!dojo.isDescendant(e.relatedTarget, node)){ + // e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable. + return ofp.call(this, e); + } + } + } + node.addEventListener(name, fp, false); + return fp; /*Handle*/ + }, + remove: function(/*DOMNode*/node, /*String*/event, /*Handle*/handle){ + // summary: + // clobbers the listener from the node + // node: + // DOM node to attach the event to + // event: + // the name of the handler to remove the function from + // handle: + // the handle returned from add + if (node){ + node.removeEventListener(del._normalizeEventName(event), handle, false); + } + }, + _normalizeEventName: function(/*String*/name){ + // Generally, name should be lower case, unless it is special + // somehow (e.g. a Mozilla DOM event). + // Remove 'on'. + return name.slice(0,2) =="on" ? name.slice(2) : name; + }, + _fixCallback: function(/*String*/name, fp){ + // By default, we only invoke _fixEvent for 'keypress' + // If code is added to _fixEvent for other events, we have + // to revisit this optimization. + // This also applies to _fixEvent overrides for Safari and Opera + // below. + return name != "keypress" ? fp : function(e){ return fp.call(this, del._fixEvent(e, this)); }; + }, + _fixEvent: function(evt, sender){ + // _fixCallback only attaches us to keypress. + // Switch on evt.type anyway because we might + // be called directly from dojo.fixEvent. + switch(evt.type){ + case "keypress": + del._setKeyChar(evt); + break; + } + return evt; + }, + _setKeyChar: function(evt){ + evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : ''; + } + }); + + // DOM events + + dojo.fixEvent = function(/*Event*/evt, /*DOMNode*/sender){ + // summary: + // normalizes properties on the event object including event + // bubbling methods, keystroke normalization, and x/y positions + // evt: Event + // native event object + // sender: DOMNode + // node to treat as "currentTarget" + return del._fixEvent(evt, sender); + } + + dojo.stopEvent = function(/*Event*/evt){ + // summary: + // prevents propagation and clobbers the default action of the + // passed event + // evt: Event + // The event object. If omitted, window.event is used on IE. + evt.preventDefault(); + evt.stopPropagation(); + // NOTE: below, this method is overridden for IE + } + + // the default listener to use on dontFix nodes, overriden for IE + var node_listener = dojo._listener; + + // Unify connect and event listeners + dojo._connect = function(obj, event, context, method, dontFix){ + // FIXME: need a more strict test + var isNode = obj && (obj.nodeType||obj.attachEvent||obj.addEventListener); + // choose one of three listener options: raw (connect.js), DOM event on a Node, custom event on a Node + // we need the third option to provide leak prevention on broken browsers (IE) + var lid = !isNode ? 0 : (!dontFix ? 1 : 2), l = [dojo._listener, del, node_listener][lid]; + // create a listener + var h = l.add(obj, event, dojo.hitch(context, method)); + // formerly, the disconnect package contained "l" directly, but if client code + // leaks the disconnect package (by connecting it to a node), referencing "l" + // compounds the problem. + // instead we return a listener id, which requires custom _disconnect below. + // return disconnect package + return [ obj, event, h, lid ]; + } + + dojo._disconnect = function(obj, event, handle, listener){ + ([dojo._listener, del, node_listener][listener]).remove(obj, event, handle); + } + + // Constants + + // Public: client code should test + // keyCode against these named constants, as the + // actual codes can vary by browser. + dojo.keys = { + // summary: definitions for common key values + BACKSPACE: 8, + TAB: 9, + CLEAR: 12, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + PAUSE: 19, + CAPS_LOCK: 20, + ESCAPE: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT_ARROW: 37, + UP_ARROW: 38, + RIGHT_ARROW: 39, + DOWN_ARROW: 40, + INSERT: 45, + DELETE: 46, + HELP: 47, + LEFT_WINDOW: 91, + RIGHT_WINDOW: 92, + SELECT: 93, + NUMPAD_0: 96, + NUMPAD_1: 97, + NUMPAD_2: 98, + NUMPAD_3: 99, + NUMPAD_4: 100, + NUMPAD_5: 101, + NUMPAD_6: 102, + NUMPAD_7: 103, + NUMPAD_8: 104, + NUMPAD_9: 105, + NUMPAD_MULTIPLY: 106, + NUMPAD_PLUS: 107, + NUMPAD_ENTER: 108, + NUMPAD_MINUS: 109, + NUMPAD_PERIOD: 110, + NUMPAD_DIVIDE: 111, + F1: 112, + F2: 113, + F3: 114, + F4: 115, + F5: 116, + F6: 117, + F7: 118, + F8: 119, + F9: 120, + F10: 121, + F11: 122, + F12: 123, + F13: 124, + F14: 125, + F15: 126, + NUM_LOCK: 144, + SCROLL_LOCK: 145 + }; + + // IE event normalization + if(dojo.isIE){ + var _trySetKeyCode = function(e, code){ + try{ + // squelch errors when keyCode is read-only + // (e.g. if keyCode is ctrl or shift) + return (e.keyCode = code); + }catch(e){ + return 0; + } + } + + // by default, use the standard listener + var iel = dojo._listener; + // dispatcher tracking property + if(!dojo.config._allow_leaks){ + // custom listener that handles leak protection for DOM events + node_listener = iel = dojo._ie_listener = { + // support handler indirection: event handler functions are + // referenced here. Event dispatchers hold only indices. + handlers: [], + // add a listener to an object + add: function(/*Object*/ source, /*String*/ method, /*Function*/ listener){ + source = source || dojo.global; + var f = source[method]; + if(!f||!f._listeners){ + var d = dojo._getIeDispatcher(); + // original target function is special + d.target = f && (ieh.push(f) - 1); + // dispatcher holds a list of indices into handlers table + d._listeners = []; + // redirect source to dispatcher + f = source[method] = d; + } + return f._listeners.push(ieh.push(listener) - 1) ; /*Handle*/ + }, + // remove a listener from an object + remove: function(/*Object*/ source, /*String*/ method, /*Handle*/ handle){ + var f = (source||dojo.global)[method], l = f && f._listeners; + if(f && l && handle--){ + delete ieh[l[handle]]; + delete l[handle]; + } + } + }; + // alias used above + var ieh = iel.handlers; + } + + dojo.mixin(del, { + add: function(/*DOMNode*/node, /*String*/event, /*Function*/fp){ + if(!node){return;} // undefined + event = del._normalizeEventName(event); + if(event=="onkeypress"){ + // we need to listen to onkeydown to synthesize + // keypress events that otherwise won't fire + // on IE + var kd = node.onkeydown; + if(!kd || !kd._listeners || !kd._stealthKeydownHandle){ + var h = del.add(node, "onkeydown", del._stealthKeyDown); + kd = node.onkeydown; + kd._stealthKeydownHandle = h; + kd._stealthKeydownRefs = 1; + }else{ + kd._stealthKeydownRefs++; + } + } + return iel.add(node, event, del._fixCallback(fp)); + }, + remove: function(/*DOMNode*/node, /*String*/event, /*Handle*/handle){ + event = del._normalizeEventName(event); + iel.remove(node, event, handle); + if(event=="onkeypress"){ + var kd = node.onkeydown; + if(--kd._stealthKeydownRefs <= 0){ + iel.remove(node, "onkeydown", kd._stealthKeydownHandle); + delete kd._stealthKeydownHandle; + } + } + }, + _normalizeEventName: function(/*String*/eventName){ + // Generally, eventName should be lower case, unless it is + // special somehow (e.g. a Mozilla event) + // ensure 'on' + return eventName.slice(0,2) != "on" ? "on" + eventName : eventName; + }, + _nop: function(){}, + _fixEvent: function(/*Event*/evt, /*DOMNode*/sender){ + // summary: + // normalizes properties on the event object including event + // bubbling methods, keystroke normalization, and x/y positions + // evt: native event object + // sender: node to treat as "currentTarget" + if(!evt){ + var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; + evt = w.event; + } + if(!evt){return(evt);} + evt.target = evt.srcElement; + evt.currentTarget = (sender || evt.srcElement); + evt.layerX = evt.offsetX; + evt.layerY = evt.offsetY; + // FIXME: scroll position query is duped from dojo.html to + // avoid dependency on that entire module. Now that HTML is in + // Base, we should convert back to something similar there. + var se = evt.srcElement, doc = (se && se.ownerDocument) || document; + // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used + // here rather than document.body + var docBody = ((dojo.isIE < 6) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement; + var offset = dojo._getIeDocumentElementOffset(); + evt.pageX = evt.clientX + dojo._fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; + evt.pageY = evt.clientY + (docBody.scrollTop || 0) - offset.y; + if(evt.type == "mouseover"){ + evt.relatedTarget = evt.fromElement; + } + if(evt.type == "mouseout"){ + evt.relatedTarget = evt.toElement; + } + evt.stopPropagation = del._stopPropagation; + evt.preventDefault = del._preventDefault; + return del._fixKeys(evt); + }, + _fixKeys: function(evt){ + switch(evt.type){ + case "keypress": + var c = ("charCode" in evt ? evt.charCode : evt.keyCode); + if (c==10){ + // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla + c=0; + evt.keyCode = 13; + }else if(c==13||c==27){ + c=0; // Mozilla considers ENTER and ESC non-printable + }else if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // Mozilla sets keyCode to 0 when there is a charCode + // but that stops the event on IE. + evt.charCode = c; + del._setKeyChar(evt); + break; + } + return evt; + }, + // some ctrl-key combinations (mostly w/punctuation) do not emit a char code in IE + // we map those virtual key codes to ascii here + // not valid for all (non-US) keyboards, so maybe we shouldn't bother + _punctMap: { + 106:42, + 111:47, + 186:59, + 187:43, + 188:44, + 189:45, + 190:46, + 191:47, + 192:96, + 219:91, + 220:92, + 221:93, + 222:39 + }, + _stealthKeyDown: function(evt){ + // IE doesn't fire keypress for most non-printable characters. + // other browsers do, we simulate it here. + var kp = evt.currentTarget.onkeypress; + // only works if kp exists and is a dispatcher + if(!kp || !kp._listeners){ return; } + // munge key/charCode + var k=evt.keyCode; + // These are Windows Virtual Key Codes + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp + var unprintable = (k!=13)&&(k!=32)&&(k!=27)&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222); + // synthesize keypress for most unprintables and CTRL-keys + if(unprintable||evt.ctrlKey){ + var c = unprintable ? 0 : k; + if(evt.ctrlKey){ + if(k==3 || k==13){ + return; // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ + c -= 48; // map CTRL-[numpad 0-9] to ASCII + }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ + c += 32; // map CTRL-[A-Z] to lowercase + }else{ + c = del._punctMap[c] || c; // map other problematic CTRL combinations to ASCII + } + } + // simulate a keypress event + var faux = del._synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); + kp.call(evt.currentTarget, faux); + evt.cancelBubble = faux.cancelBubble; + evt.returnValue = faux.returnValue; + _trySetKeyCode(evt, faux.keyCode); + } + }, + // Called in Event scope + _stopPropagation: function(){ + this.cancelBubble = true; + }, + _preventDefault: function(){ + // Setting keyCode to 0 is the only way to prevent certain keypresses (namely + // ctrl-combinations that correspond to menu accelerator keys). + // Otoh, it prevents upstream listeners from getting this information + // Try to split the difference here by clobbering keyCode only for ctrl + // combinations. If you still need to access the key upstream, bubbledKeyCode is + // provided as a workaround. + this.bubbledKeyCode = this.keyCode; + if(this.ctrlKey){_trySetKeyCode(this, 0);} + this.returnValue = false; + } + }); + + // override stopEvent for IE + dojo.stopEvent = function(evt){ + evt = evt || window.event; + del._stopPropagation.call(evt); + del._preventDefault.call(evt); + } + } + + del._synthesizeEvent = function(evt, props){ + var faux = dojo.mixin({}, evt, props); + del._setKeyChar(faux); + // FIXME: would prefer to use dojo.hitch: dojo.hitch(evt, evt.preventDefault); + // but it throws an error when preventDefault is invoked on Safari + // does Event.preventDefault not support "apply" on Safari? + faux.preventDefault = function(){ evt.preventDefault(); }; + faux.stopPropagation = function(){ evt.stopPropagation(); }; + return faux; + } + + // Opera event normalization + if(dojo.isOpera){ + dojo.mixin(del, { + _fixEvent: function(evt, sender){ + switch(evt.type){ + case "keypress": + var c = evt.which; + if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // can't trap some keys at all, like INSERT and DELETE + // there is no differentiating info between DELETE and ".", or INSERT and "-" + c = ((c<41)&&(!evt.shiftKey) ? 0 : c); + if((evt.ctrlKey)&&(!evt.shiftKey)&&(c>=65)&&(c<=90)){ + // lowercase CTRL-[A-Z] keys + c += 32; + } + return del._synthesizeEvent(evt, { charCode: c }); + } + return evt; + } + }); + } + + // Safari event normalization + if(dojo.isSafari){ + dojo.mixin(del, { + _fixEvent: function(evt, sender){ + switch(evt.type){ + case "keypress": + var c = evt.charCode, s = evt.shiftKey, k = evt.keyCode; + // FIXME: This is a hack, suggest we rethink keyboard strategy. + // Arrow and page keys have 0 "keyCode" in keypress events.on Safari for Windows + k = k || identifierMap[evt.keyIdentifier] || 0; + if(evt.keyIdentifier=="Enter"){ + c = 0; // differentiate Enter from CTRL-m (both code 13) + }else if((evt.ctrlKey)&&(c>0)&&(c<27)){ + c += 96; // map CTRL-[A-Z] codes to ASCII + } else if (c==dojo.keys.SHIFT_TAB) { + c = dojo.keys.TAB; // morph SHIFT_TAB into TAB + shiftKey: true + s = true; + } else { + c = (c>=32 && c<63232 ? c : 0); // avoid generating keyChar for non-printables + } + return del._synthesizeEvent(evt, {charCode: c, shiftKey: s, keyCode: k}); + } + return evt; + } + }); + + dojo.mixin(dojo.keys, { + SHIFT_TAB: 25, + UP_ARROW: 63232, + DOWN_ARROW: 63233, + LEFT_ARROW: 63234, + RIGHT_ARROW: 63235, + F1: 63236, + F2: 63237, + F3: 63238, + F4: 63239, + F5: 63240, + F6: 63241, + F7: 63242, + F8: 63243, + F9: 63244, + F10: 63245, + F11: 63246, + F12: 63247, + PAUSE: 63250, + DELETE: 63272, + HOME: 63273, + END: 63275, + PAGE_UP: 63276, + PAGE_DOWN: 63277, + INSERT: 63302, + PRINT_SCREEN: 63248, + SCROLL_LOCK: 63249, + NUM_LOCK: 63289 + }); + var dk = dojo.keys, identifierMap = { "Up": dk.UP_ARROW, "Down": dk.DOWN_ARROW, "Left": dk.LEFT_ARROW, "Right": dk.RIGHT_ARROW, "PageUp": dk.PAGE_UP, "PageDown": dk.PAGE_DOWN }; + } +})(); + +if(dojo.isIE){ + // keep this out of the closure + // closing over 'iel' or 'ieh' b0rks leak prevention + // ls[i] is an index into the master handler array + dojo._ieDispatcher = function(args, sender){ + var ap=Array.prototype, h=dojo._ie_listener.handlers, c=args.callee, ls=c._listeners, t=h[c.target]; + // return value comes from original target function + var r = t && t.apply(sender, args); + // invoke listeners after target function + for(var i in ls){ + if(!(i in ap)){ + h[ls[i]].apply(sender, args); + } + } + return r; + } + dojo._getIeDispatcher = function(){ + // ensure the returned function closes over nothing + return new Function(dojo._scopeName + "._ieDispatcher(arguments, this)"); // function + } + // keep this out of the closure to reduce RAM allocation + dojo._event_listener._fixCallback = function(fp){ + var f = dojo._event_listener._fixEvent; + return function(e){ return fp.call(this, f(e, this)); }; + } +} + +} + +if(!dojo._hasResource["dojo._base.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.html"] = true; + +dojo.provide("dojo._base.html"); + +// FIXME: need to add unit tests for all the semi-public methods + +try{ + document.execCommand("BackgroundImageCache", false, true); +}catch(e){ + // sane browsers don't have cache "issues" +} + +// ============================= +// DOM Functions +// ============================= + +/*===== +dojo.byId = function(id, doc){ + // summary: + // Returns DOM node with matching `id` attribute or `null` + // if not found, similar to "$" function in another library. + // If `id` is a DomNode, this function is a no-op. + // + // id: String|DOMNode + // A string to match an HTML id attribute or a reference to a DOM Node + // + // doc: Document? + // Document to work in. Defaults to the current value of + // dojo.doc. Can be used to retrieve + // node references from other documents. +=====*/ +if(dojo.isIE || dojo.isOpera){ + dojo.byId = function(id, doc){ + if(dojo.isString(id)){ + var _d = doc || dojo.doc; + var te = _d.getElementById(id); + // attributes.id.value is better than just id in case the + // user has a name=id inside a form + if(te && te.attributes.id.value == id){ + return te; + }else{ + var eles = _d.all[id]; + if(!eles || !eles.length){ return eles; } + // if more than 1, choose first with the correct id + var i=0; + while((te=eles[i++])){ + if(te.attributes.id.value == id){ return te; } + } + } + }else{ + return id; // DomNode + } + } +}else{ + dojo.byId = function(id, doc){ + return dojo.isString(id) ? (doc || dojo.doc).getElementById(id) : id; // DomNode + } +} +/*===== +} +=====*/ + +(function(){ + /* + dojo.createElement = function(obj, parent, position){ + // TODO: need to finish this! + } + */ + + var d = dojo; + + var _destroyContainer = null; + dojo.addOnUnload(function(){ + _destroyContainer=null; //prevent IE leak + }); + dojo._destroyElement = function(/*String||DomNode*/node){ + // summary: + // removes node from its parent, clobbers it and all of its + // children. + // node: + // the element to be destroyed, either as an ID or a reference + + node = d.byId(node); + try{ + if(!_destroyContainer){ + _destroyContainer = document.createElement("div"); + } + _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node); + // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature + _destroyContainer.innerHTML = ""; + }catch(e){ + /* squelch */ + } + }; + + dojo.isDescendant = function(/*DomNode|String*/node, /*DomNode|String*/ancestor){ + // summary: + // Returns true if node is a descendant of ancestor + // node: id or node reference to test + // ancestor: id or node reference of potential parent to test against + try{ + node = d.byId(node); + ancestor = d.byId(ancestor); + while(node){ + if(node === ancestor){ + return true; // Boolean + } + node = node.parentNode; + } + }catch(e){ /* squelch, return false */ } + return false; // Boolean + }; + + dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){ + // summary: enable or disable selection on a node + // node: + // id or reference to node + // selectable: + node = d.byId(node); + if(d.isMozilla){ + node.style.MozUserSelect = selectable ? "" : "none"; + }else if(d.isKhtml){ + node.style.KhtmlUserSelect = selectable ? "auto" : "none"; + }else if(d.isIE){ + node.unselectable = selectable ? "" : "on"; + d.query("*", node).forEach(function(descendant){ + descendant.unselectable = selectable ? "" : "on"; + }); + } + //FIXME: else? Opera? + }; + + var _insertBefore = function(/*Node*/node, /*Node*/ref){ + ref.parentNode.insertBefore(node, ref); + return true; // boolean + } + + var _insertAfter = function(/*Node*/node, /*Node*/ref){ + // summary: + // Try to insert node after ref + var pn = ref.parentNode; + if(ref == pn.lastChild){ + pn.appendChild(node); + }else{ + return _insertBefore(node, ref.nextSibling); // boolean + } + return true; // boolean + } + + dojo.place = function(/*String|DomNode*/node, /*String|DomNode*/refNode, /*String|Number*/position){ + // summary: + // Attempt to insert node into the DOM, choosing from various positioning options. + // Returns true if successful, false otherwise. + // node: + // id or node reference to place relative to refNode + // refNode: + // id or node reference to use as basis for placement + // position: + // string noting the position of node relative to refNode or a + // number indicating the location in the childNodes collection of + // refNode. Accepted string values are: + // + // * before + // * after + // * first + // * last + // + // "first" and "last" indicate positions as children of refNode. + + // FIXME: need to write tests for this!!!! + if(!node || !refNode || position === undefined){ + return false; // boolean + } + node = d.byId(node); + refNode = d.byId(refNode); + if(typeof position == "number"){ + var cn = refNode.childNodes; + if((position == 0 && cn.length == 0) || + cn.length == position){ + refNode.appendChild(node); return true; + } + if(position == 0){ + return _insertBefore(node, refNode.firstChild); + } + return _insertAfter(node, cn[position-1]); + } + switch(position.toLowerCase()){ + case "before": + return _insertBefore(node, refNode); // boolean + case "after": + return _insertAfter(node, refNode); // boolean + case "first": + if(refNode.firstChild){ + return _insertBefore(node, refNode.firstChild); // boolean + } + // else fallthrough... + default: // aka: last + refNode.appendChild(node); + return true; // boolean + } + } + + // Box functions will assume this model. + // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. + // Can be set to change behavior of box setters. + + // can be either: + // "border-box" + // "content-box" (default) + dojo.boxModel = "content-box"; + + // We punt per-node box mode testing completely. + // If anybody cares, we can provide an additional (optional) unit + // that overrides existing code to include per-node box sensitivity. + + // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. + // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. + // IIRC, earlier versions of Opera did in fact use border-box. + // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. + + if(d.isIE /*|| dojo.isOpera*/){ + var _dcm = document.compatMode; + // client code may have to adjust if compatMode varies across iframes + d.boxModel = _dcm == "BackCompat" || _dcm == "QuirksMode" || d.isIE<6 ? "border-box" : "content-box"; // FIXME: remove IE < 6 support? + } + + // ============================= + // Style Functions + // ============================= + + // getComputedStyle drives most of the style code. + // Wherever possible, reuse the returned object. + // + // API functions below that need to access computed styles accept an + // optional computedStyle parameter. + // If this parameter is omitted, the functions will call getComputedStyle themselves. + // This way, calling code can access computedStyle once, and then pass the reference to + // multiple API functions. + +/*===== + dojo.getComputedStyle = function(node){ + // summary: + // Returns a "computed style" object. + // + // description: + // Gets a "computed style" object which can be used to gather + // information about the current state of the rendered node. + // + // Note that this may behave differently on different browsers. + // Values may have different formats and value encodings across + // browsers. + // + // Note also that this method is expensive. Wherever possible, + // reuse the returned object. + // + // Use the dojo.style() method for more consistent (pixelized) + // return values. + // + // node: DOMNode + // A reference to a DOM node. Does NOT support taking an + // ID string for speed reasons. + // example: + // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth; + return; // CSS2Properties + } +=====*/ + + var gcs, dv = document.defaultView; + if(d.isSafari){ + gcs = function(/*DomNode*/node){ + var s = dv.getComputedStyle(node, null); + if(!s && node.style){ + node.style.display = ""; + s = dv.getComputedStyle(node, null); + } + return s || {}; + }; + }else if(d.isIE){ + gcs = function(node){ + return node.currentStyle; + }; + }else{ + gcs = function(node){ + return dv.getComputedStyle(node, null); + }; + } + dojo.getComputedStyle = gcs; + + if(!d.isIE){ + dojo._toPixelValue = function(element, value){ + // style values can be floats, client code may want + // to round for integer pixels. + return parseFloat(value) || 0; + } + }else{ + dojo._toPixelValue = function(element, avalue){ + if(!avalue){ return 0; } + // on IE7, medium is usually 4 pixels + if(avalue=="medium"){ return 4; } + // style values can be floats, client code may + // want to round this value for integer pixels. + if(avalue.slice && (avalue.slice(-2)=='px')){ return parseFloat(avalue); } + with(element){ + var sLeft = style.left; + var rsLeft = runtimeStyle.left; + runtimeStyle.left = currentStyle.left; + try{ + // 'avalue' may be incompatible with style.left, which can cause IE to throw + // this has been observed for border widths using "thin", "medium", "thick" constants + // those particular constants could be trapped by a lookup + // but perhaps there are more + style.left = avalue; + avalue = style.pixelLeft; + }catch(e){ + avalue = 0; + } + style.left = sLeft; + runtimeStyle.left = rsLeft; + } + return avalue; + } + } + var px = d._toPixelValue; + + // FIXME: there opacity quirks on FF that we haven't ported over. Hrm. + /*===== + dojo._getOpacity = function(node){ + // summary: + // Returns the current opacity of the passed node as a + // floating-point value between 0 and 1. + // node: DomNode + // a reference to a DOM node. Does NOT support taking an + // ID string for speed reasons. + // return: Number between 0 and 1 + } + =====*/ + + dojo._getOpacity = d.isIE ? function(node){ + try{ + return node.filters.alpha.opacity / 100; // Number + }catch(e){ + return 1; // Number + } + } : function(node){ + return gcs(node).opacity; + }; + + /*===== + dojo._setOpacity = function(node, opacity){ + // summary: + // set the opacity of the passed node portably. Returns the + // new opacity of the node. + // node: DOMNode + // a reference to a DOM node. Does NOT support taking an + // ID string for performance reasons. + // opacity: Number + // A Number between 0 and 1. 0 specifies transparent. + // return: Number between 0 and 1 + } + =====*/ + + dojo._setOpacity = d.isIE ? function(/*DomNode*/node, /*Number*/opacity){ + if(opacity == 1){ + // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so remove it altogether (bug #2661) + var filterRE = /FILTER:[^;]*;?/i; + node.style.cssText = node.style.cssText.replace(filterRE, ""); + if(node.nodeName.toLowerCase() == "tr"){ + d.query("> td", node).forEach(function(i){ + i.style.cssText = i.style.cssText.replace(filterRE, ""); + }); + } + }else{ + var o = "Alpha(Opacity="+ opacity * 100 +")"; + node.style.filter = o; + } + if(node.nodeName.toLowerCase() == "tr"){ + d.query("> td", node).forEach(function(i){ + i.style.filter = o; + }); + } + return opacity; + } : function(node, opacity){ + return node.style.opacity = opacity; + }; + + var _pixelNamesCache = { + left: true, top: true + }; + var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border + var _toStyleValue = function(node, type, value){ + type = type.toLowerCase(); + if(d.isIE && value == "auto"){ + if(type == "height"){ return node.offsetHeight; } + if(type == "width"){ return node.offsetWidth; } + } + if(!(type in _pixelNamesCache)){ + // if(dojo.isOpera && type == "cssText"){ + // FIXME: add workaround for #2855 here + // } + _pixelNamesCache[type] = _pixelRegExp.test(type); + } + return _pixelNamesCache[type] ? px(node, value) : value; + } + + var _floatStyle = d.isIE ? "styleFloat" : "cssFloat"; + var _floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle }; + + // public API + + dojo.style = function( /*DomNode|String*/ node, + /*String?|Object?*/ style, + /*String?*/ value){ + // summary: + // Accesses styles on a node. If 2 arguments are + // passed, acts as a getter. If 3 arguments are passed, acts + // as a setter. + // node: + // id or reference to node to get/set style for + // style: + // the style property to set in DOM-accessor format + // ("borderWidth", not "border-width") or an object with key/value + // pairs suitable for setting each property. + // value: + // If passed, sets value on the node for style, handling + // cross-browser concerns. + // example: + // Passing only an ID or node returns the computed style object of + // the node: + // | dojo.style("thinger"); + // example: + // Passing a node and a style property returns the current + // normalized, computed value for that property: + // | dojo.style("thinger", "opacity"); // 1 by default + // + // example: + // Passing a node, a style property, and a value changes the + // current display of the node and returns the new computed value + // | dojo.style("thinger", "opacity", 0.5); // == 0.5 + // + // example: + // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node: + // | dojo.style("thinger", { + // | "opacity": 0.5, + // | "border": "3px solid black", + // | "height": 300 + // | }); + // + // example: + // When the CSS style property is hyphenated, the JavaScript property is camelCased. + // font-size becomes fontSize, and so on. + // | dojo.style("thinger",{ + // | fontSize:"14pt", + // | letterSpacing:"1.2em" + // | }); + // + // example: + // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling + // dojo.style() on every element of the list. See: dojo.query and dojo.NodeList + // | dojo.query(".someClassName").style("visibility","hidden"); + // | // or + // | dojo.query("#baz > div").style({ + // | opacity:0.75, + // | fontSize:"13pt" + // | }); + + var n = d.byId(node), args = arguments.length, op = (style=="opacity"); + style = _floatAliases[style] || style; + if(args == 3){ + return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/ + } + if(args == 2 && op){ + return d._getOpacity(n); + } + var s = gcs(n); + if(args == 2 && !d.isString(style)){ + for(var x in style){ + d.style(node, x, style[x]); + } + return s; + } + return (args == 1) ? s : _toStyleValue(n, style, s[style]); /* CSS2Properties||String||Number */ + } + + // ============================= + // Box Functions + // ============================= + + dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // Returns object with special values specifically useful for node + // fitting. + // + // * l/t = left/top padding (respectively) + // * w = the total of the left and right padding + // * h = the total of the top and bottom padding + // + // If 'node' has position, l/t forms the origin for child nodes. + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + l = px(n, s.paddingLeft), + t = px(n, s.paddingTop); + return { + l: l, + t: t, + w: l+px(n, s.paddingRight), + h: t+px(n, s.paddingBottom) + }; + } + + dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // returns an object with properties useful for noting the border + // dimensions. + // + // * l/t = the sum of left/top border (respectively) + // * w = the sum of the left and right border + // * h = the sum of the top and bottom border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + ne = "none", + s = computedStyle||gcs(n), + bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0), + bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0); + return { + l: bl, + t: bt, + w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0), + h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0) + }; + } + + dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ + // summary: + // returns object with properties useful for box fitting with + // regards to padding. + // + // * l/t = the sum of left/top padding and left/top border (respectively) + // * w = the sum of the left and right padding and border + // * h = the sum of the top and bottom padding and border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + p = d._getPadExtents(n, s), + b = d._getBorderExtents(n, s); + return { + l: p.l + b.l, + t: p.t + b.t, + w: p.w + b.w, + h: p.h + b.h + }; + } + + dojo._getMarginExtents = function(n, computedStyle){ + // summary: + // returns object with properties useful for box fitting with + // regards to box margins (i.e., the outer-box). + // + // * l/t = marginLeft, marginTop, respectively + // * w = total width, margin inclusive + // * h = total height, margin inclusive + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + var + s = computedStyle||gcs(n), + l = px(n, s.marginLeft), + t = px(n, s.marginTop), + r = px(n, s.marginRight), + b = px(n, s.marginBottom); + if(d.isSafari && (s.position != "absolute")){ + // FIXME: Safari's version of the computed right margin + // is the space between our right edge and the right edge + // of our offsetParent. + // What we are looking for is the actual margin value as + // determined by CSS. + // Hack solution is to assume left/right margins are the same. + r = l; + } + return { + l: l, + t: t, + w: l+r, + h: t+b + }; + } + + // Box getters work in any box context because offsetWidth/clientWidth + // are invariant wrt box context + // + // They do *not* work for display: inline objects that have padding styles + // because the user agent ignores padding (it's bogus styling in any case) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + + // Although it would be easier to read, there are not separate versions of + // _getMarginBox for each browser because: + // 1. the branching is not expensive + // 2. factoring the shared code wastes cycles (function call overhead) + // 3. duplicating the shared code wastes bytes + + dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){ + // summary: + // returns an object that encodes the width, height, left and top + // positions of the node's margin box. + var s = computedStyle||gcs(node), me = d._getMarginExtents(node, s); + var l = node.offsetLeft - me.l, t = node.offsetTop - me.t; + if(d.isMoz){ + // Mozilla: + // If offsetParent has a computed overflow != visible, the offsetLeft is decreased + // by the parent's border. + // We don't want to compute the parent's style, so instead we examine node's + // computed left/top which is more stable. + var sl = parseFloat(s.left), st = parseFloat(s.top); + if(!isNaN(sl) && !isNaN(st)){ + l = sl, t = st; + }else{ + // If child's computed left/top are not parseable as a number (e.g. "auto"), we + // have no choice but to examine the parent's computed style. + var p = node.parentNode; + if(p && p.style){ + var pcs = gcs(p); + if(pcs.overflow != "visible"){ + var be = d._getBorderExtents(p, pcs); + l += be.l, t += be.t; + } + } + } + }else if(d.isOpera){ + // On Opera, offsetLeft includes the parent's border + var p = node.parentNode; + if(p){ + var be = d._getBorderExtents(p); + l -= be.l, t -= be.t; + } + } + return { + l: l, + t: t, + w: node.offsetWidth + me.w, + h: node.offsetHeight + me.h + }; + } + + dojo._getContentBox = function(node, computedStyle){ + // summary: + // Returns an object that encodes the width, height, left and top + // positions of the node's content box, irrespective of the + // current box model. + + // clientWidth/Height are important since the automatically account for scrollbars + // fallback to offsetWidth/Height for special cases (see #3378) + var s=computedStyle||gcs(node), pe=d._getPadExtents(node, s), be=d._getBorderExtents(node, s), w=node.clientWidth, h; + if(!w){ + w=node.offsetWidth, h=node.offsetHeight; + }else{ + h=node.clientHeight, be.w = be.h = 0; + } + // On Opera, offsetLeft includes the parent's border + if(d.isOpera){ pe.l += be.l; pe.t += be.t; }; + return { + l: pe.l, + t: pe.t, + w: w - pe.w - be.w, + h: h - pe.h - be.h + }; + } + + dojo._getBorderBox = function(node, computedStyle){ + var s=computedStyle||gcs(node), pe=d._getPadExtents(node, s), cb=d._getContentBox(node, s); + return { + l: cb.l - pe.l, + t: cb.t - pe.t, + w: cb.w + pe.w, + h: cb.h + pe.h + }; + } + + // Box setters depend on box context because interpretation of width/height styles + // vary wrt box context. + // + // The value of dojo.boxModel is used to determine box context. + // dojo.boxModel can be set directly to change behavior. + // + // Beware of display: inline objects that have padding styles + // because the user agent ignores padding (it's a bogus setup anyway) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + // + // Elements other than DIV may have special quirks, like built-in + // margins or padding, or values not detectable via computedStyle. + // In particular, margins on TABLE do not seems to appear + // at all in computedStyle on Mozilla. + + dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ + // summary: + // sets width/height/left/top in the current (native) box-model + // dimentions. Uses the unit passed in u. + // node: DOM Node reference. Id string not supported for performance reasons. + // l: optional. left offset from parent. + // t: optional. top offset from parent. + // w: optional. width in current box model. + // h: optional. width in current box model. + // u: optional. unit measure to use for other measures. Defaults to "px". + u = u || "px"; + var s = node.style; + if(!isNaN(l)){ s.left = l+u; } + if(!isNaN(t)){ s.top = t+u; } + if(w>=0){ s.width = w+u; } + if(h>=0){ s.height = h+u; } + } + + dojo._usesBorderBox = function(/*DomNode*/node){ + // summary: + // True if the node uses border-box layout. + + // We could test the computed style of node to see if a particular box + // has been specified, but there are details and we choose not to bother. + var n = node.tagName; + // For whatever reason, TABLE and BUTTON are always border-box by default. + // If you have assigned a different box to either one via CSS then + // box functions will break. + return d.boxModel=="border-box" || n=="TABLE" || n=="BUTTON"; // boolean + } + + dojo._setContentSize = function(/*DomNode*/node, /*Number*/widthPx, /*Number*/heightPx, /*Object*/computedStyle){ + // summary: + // Sets the size of the node's contents, irrespective of margins, + // padding, or borders. + if(d._usesBorderBox(node)){ + var pb = d._getPadBorderExtents(node, computedStyle); + if(widthPx >= 0){ widthPx += pb.w; } + if(heightPx >= 0){ heightPx += pb.h; } + } + d._setBox(node, NaN, NaN, widthPx, heightPx); + } + + dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx, + /*Number?*/widthPx, /*Number?*/heightPx, + /*Object*/computedStyle){ + // summary: + // sets the size of the node's margin box and placement + // (left/top), irrespective of box model. Think of it as a + // passthrough to dojo._setBox that handles box-model vagaries for + // you. + + var s = computedStyle||gcs(node); + // Some elements have special padding, margin, and box-model settings. + // To use box functions you may need to set padding, margin explicitly. + // Controlling box-model is harder, in a pinch you might set dojo.boxModel. + var bb=d._usesBorderBox(node), + pb=bb ? _nilExtents : d._getPadBorderExtents(node, s), + mb=d._getMarginExtents(node, s); + if(widthPx>=0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); } + if(heightPx>=0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); } + d._setBox(node, leftPx, topPx, widthPx, heightPx); + } + + var _nilExtents = { l:0, t:0, w:0, h:0 }; + + // public API + + dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){ + // summary: + // Getter/setter for the margin-box of node. + // description: + // Returns an object in the expected format of box (regardless + // if box is passed). The object might look like: + // `{ l: 50, t: 200, w: 300: h: 150 }` + // for a node offset from its parent 50px to the left, 200px from + // the top with a margin width of 300px and a margin-height of + // 150px. + // node: + // id or reference to DOM Node to get/set box for + // box: + // If passed, denotes that dojo.marginBox() should + // update/set the margin box for node. Box is an object in the + // above format. All properties are optional if passed. + var n=d.byId(node), s=gcs(n), b=box; + return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object + } + + dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){ + // summary: + // Getter/setter for the content-box of node. + // description: + // Returns an object in the expected format of box (regardless if box is passed). + // The object might look like: + // `{ l: 50, t: 200, w: 300: h: 150 }` + // for a node offset from its parent 50px to the left, 200px from + // the top with a content width of 300px and a content-height of + // 150px. Note that the content box may have a much larger border + // or margin box, depending on the box model currently in use and + // CSS values set/inherited for node. + // node: + // id or reference to DOM Node to get/set box for + // box: + // If passed, denotes that dojo.contentBox() should + // update/set the content box for node. Box is an object in the + // above format. All properties are optional if passed. + var n=dojo.byId(node), s=gcs(n), b=box; + return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object + } + + // ============================= + // Positioning + // ============================= + + var _sumAncestorProperties = function(node, prop){ + if(!(node = (node||0).parentNode)){return 0}; + var val, retVal = 0, _b = d.body(); + while(node && node.style){ + if(gcs(node).position == "fixed"){ + return 0; + } + val = node[prop]; + if(val){ + retVal += val - 0; + // opera and khtml #body & #html has the same values, we only + // need one value + if(node == _b){ break; } + } + node = node.parentNode; + } + return retVal; // integer + } + + dojo._docScroll = function(){ + var + _b = d.body(), + _w = d.global, + de = d.doc.documentElement; + return { + y: (_w.pageYOffset || de.scrollTop || _b.scrollTop || 0), + x: (_w.pageXOffset || d._fixIeBiDiScrollLeft(de.scrollLeft) || _b.scrollLeft || 0) + }; + }; + + dojo._isBodyLtr = function(){ + //FIXME: could check html and body tags directly instead of computed style? need to ignore case, accept empty values + return !("_bodyLtr" in d) ? + d._bodyLtr = gcs(d.body()).direction == "ltr" : + d._bodyLtr; // Boolean + } + + dojo._getIeDocumentElementOffset = function(){ + // summary + // The following values in IE contain an offset: + // event.clientX + // event.clientY + // node.getBoundingClientRect().left + // node.getBoundingClientRect().top + // But other position related values do not contain this offset, such as + // node.offsetLeft, node.offsetTop, node.style.left and node.style.top. + // The offset is always (2, 2) in LTR direction. When the body is in RTL + // direction, the offset counts the width of left scroll bar's width. + // This function computes the actual offset. + + //NOTE: assumes we're being called in an IE browser + + var de = d.doc.documentElement; + //FIXME: use this instead? var de = d.compatMode == "BackCompat" ? d.body : d.documentElement; + + return (d.isIE >= 7) ? + {x: de.getBoundingClientRect().left, y: de.getBoundingClientRect().top} + : + // IE 6.0 + {x: d._isBodyLtr() || window.parent == window ? + de.clientLeft : de.offsetWidth - de.clientWidth - de.clientLeft, + y: de.clientTop}; // Object + }; + + dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){ + // In RTL direction, scrollLeft should be a negative value, but IE + // returns a positive one. All codes using documentElement.scrollLeft + // must call this function to fix this error, otherwise the position + // will offset to right when there is a horizontal scrollbar. + var dd = d.doc; + if(d.isIE && !dojo._isBodyLtr()){ + var de = dd.compatMode == "BackCompat" ? dd.body : dd.documentElement; + return scrollLeft + de.clientWidth - de.scrollWidth; // Integer + } + return scrollLeft; // Integer + } + + dojo._abs = function(/*DomNode*/node, /*Boolean?*/includeScroll){ + // summary: + // Gets the position of the passed element relative to + // the viewport (if includeScroll==false), or relative to the + // document root (if includeScroll==true). + // + // Returns an object of the form: + // { x: 100, y: 300 } + // if includeScroll is passed, the x and y values will include any + // document offsets that may affect the position relative to the + // viewport. + + // FIXME: need to decide in the brave-new-world if we're going to be + // margin-box or border-box. + var ownerDocument = node.ownerDocument; + var ret = { + x: 0, + y: 0 + }; + + // targetBoxType == "border-box" + var db = d.body(); + if(d.isIE || (d.isFF >= 3)){ + var client = node.getBoundingClientRect(); + var offset = (d.isIE) ? d._getIeDocumentElementOffset() : { x: 0, y: 0}; + ret.x = client.left - offset.x; + ret.y = client.top - offset.y; + }else if(ownerDocument["getBoxObjectFor"]){ + // mozilla + var bo = ownerDocument.getBoxObjectFor(node), + b = d._getBorderExtents(node); + ret.x = bo.x - b.l - _sumAncestorProperties(node, "scrollLeft"); + ret.y = bo.y - b.t - _sumAncestorProperties(node, "scrollTop"); + }else{ + if(node["offsetParent"]){ + var endNode; + // in Safari, if the node is an absolutely positioned child of + // the body and the body has a margin the offset of the child + // and the body contain the body's margins, so we need to end + // at the body + // FIXME: getting contrary results to the above in latest WebKit. + if(d.isSafari && + //(node.style.getPropertyValue("position") == "absolute") && + (gcs(node).position == "absolute") && + (node.parentNode == db)){ + endNode = db; + }else{ + endNode = db.parentNode; + } + if(node.parentNode != db){ + var nd = node; + if(d.isOpera){ nd = db; } + ret.x -= _sumAncestorProperties(nd, "scrollLeft"); + ret.y -= _sumAncestorProperties(nd, "scrollTop"); + } + var curnode = node; + do{ + var n = curnode.offsetLeft; + //FIXME: ugly hack to workaround the submenu in + //popupmenu2 does not shown up correctly in opera. + //Someone have a better workaround? + if(!d.isOpera || n > 0){ + ret.x += isNaN(n) ? 0 : n; + } + var t = curnode.offsetTop; + ret.y += isNaN(t) ? 0 : t; + if(d.isSafari && curnode != node){ + var cs = gcs(curnode); + ret.x += px(curnode, cs.borderLeftWidth); + ret.y += px(curnode, cs.borderTopWidth); + } + curnode = curnode.offsetParent; + }while((curnode != endNode) && curnode); + }else if(node.x && node.y){ + ret.x += isNaN(node.x) ? 0 : node.x; + ret.y += isNaN(node.y) ? 0 : node.y; + } + } + // account for document scrolling + // if offsetParent is used, ret value already includes scroll position + // so we may have to actually remove that value if !includeScroll + if(includeScroll){ + var scroll = d._docScroll(); + ret.y += scroll.y; + ret.x += scroll.x; + } + + return ret; // object + } + + // FIXME: need a setter for coords or a moveTo!! + dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){ + // summary: + // Returns an object that measures margin box width/height and + // absolute positioning data from dojo._abs(). + // + // description: + // Returns an object that measures margin box width/height and + // absolute positioning data from dojo._abs(). + // Return value will be in the form: + // `{ l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }` + // Does not act as a setter. If includeScroll is passed, the x and + // y params are affected as one would expect in dojo._abs(). + var n=d.byId(node), s=gcs(n), mb=d._getMarginBox(n, s); + var abs = d._abs(n, includeScroll); + mb.x = abs.x; + mb.y = abs.y; + return mb; + } + + // ============================= + // Element attribute Functions + // ============================= + + var _fixAttrName = function(/*String*/name){ + switch(name.toLowerCase()){ + case "tabindex": + // Internet Explorer will only set or remove tabindex + // if it is spelled "tabIndex" + // console.debug((dojo.isIE && dojo.isIE < 8)? "tabIndex" : "tabindex"); + return (d.isIE && d.isIE < 8) ? "tabIndex" : "tabindex"; + default: + return name; + } + } + + // non-deprecated HTML4 attributes with default values + // http://www.w3.org/TR/html401/index/attributes.html + // FF and Safari will return the default values if you + // access the attributes via a property but not + // via getAttribute() + var _attrProps = { + colspan: "colSpan", + enctype: "enctype", + frameborder: "frameborder", + method: "method", + rowspan: "rowSpan", + scrolling: "scrolling", + shape: "shape", + span: "span", + type: "type", + valuetype: "valueType" + } + + dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){ + // summary: + // Returns true if the requested attribute is specified on the + // given element, and false otherwise. + // node: + // id or reference to the element to check + // name: + // the name of the attribute + // returns: + // true if the requested attribute is specified on the + // given element, and false otherwise + var attr = d.byId(node).getAttributeNode(_fixAttrName(name)); + return attr ? attr.specified : false; // Boolean + } + + var _evtHdlrMap = { + + } + + var _ctr = 0; + var _attrId = dojo._scopeName + "attrid"; + + dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){ + // summary: + // Gets or sets an attribute on an HTML element. + // description: + // Handles normalized getting and setting of attributes on DOM + // Nodes. If 2 arguments are passed, and a the second argumnt is a + // string, acts as a getter. + // + // If a third argument is passed, or if the second argumnt is a + // map of attributes, acts as a setter. + // + // When passing functions as values, note that they will not be + // directly assigned to slots on the node, but rather the default + // behavior will be removed and the new behavior will be added + // using `dojo.connect()`, meaning that event handler properties + // will be normalized and that some caveats with regards to + // non-standard behaviors for onsubmit apply. Namely that you + // should cancel form submission using `dojo.stopEvent()` on the + // passed event object instead of returning a boolean value from + // the handler itself. + // node: + // id or reference to the element to get or set the attribute on + // name: + // the name of the attribute to get or set. + // value: + // The value to set for the attribute + // returns: + // when used as a getter, the value of the requested attribute + // or null if that attribute does not have a specified or + // default value; + // + // when user as a setter, undefined + // example: + // | // get the current value of the "foo" attribute on a node + // | dojo.attr(dojo.byId("nodeId"), "foo"); + // | + // | // we can just pass the id: + // | dojo.attr("nodeId", "foo"); + // | + // | // use attr() to set the tab index + // | dojo.attr("nodeId", "tabindex", 3); + // | + // | // set multiple values at once, including event handlers: + // | dojo.attr("formId", { + // | "foo": "bar", + // | "tabindex": -1, + // | "method": "POST", + // | "onsubmit": function(e){ + // | // stop submitting the form. Note that the IE behavior + // | // of returning true or false will have no effect here + // | // since our handler is connect()ed to the built-in + // | // onsubmit behavior and so we need to use + // | // dojo.stopEvent() to ensure that the submission + // | // doesn't proceed. + // | dojo.stopEvent(e); + // | + // | // submit the form with Ajax + // | dojo.xhrPost({ form: "formId" }); + // | } + // | }); + + var args = arguments.length; + if(args == 2 && !d.isString(name)){ + for(var x in name){ d.attr(node, x, name[x]); } + return; + } + node = d.byId(node); + name = _fixAttrName(name); + if(args == 3){ + if(d.isFunction(value)){ + // clobber if we can + var attrId = d.attr(node, _attrId); + if(!attrId){ + attrId = _ctr++; + d.attr(node, _attrId, attrId); + } + if(!_evtHdlrMap[attrId]){ + _evtHdlrMap[attrId] = {}; + } + var h = _evtHdlrMap[attrId][name]; + if(h){ + d.disconnect(h); + }else{ + try{ + delete node[name]; + }catch(e){} + } + + // ensure that event objects are normalized, etc. + _evtHdlrMap[attrId][name] = d.connect(node, name, value); + + }else if(typeof value == "boolean"){ // e.g. onsubmit, disabled + // if a function, we should normalize the event object here!!! + node[name] = value; + }else{ + node.setAttribute(name, value); + } + return; + }else{ + // should we access this attribute via a property or + // via getAttribute()? + var prop = _attrProps[name.toLowerCase()]; + if(prop){ + return node[prop]; + }else{ + var value = node[name]; + return (typeof value == 'boolean' || typeof value == 'function') ? value : (d.hasAttr(node, name) ? node.getAttribute(name) : null); + } + } + } + + dojo.removeAttr = function(/*DomNode|String*/node, /*String*/name){ + // summary: + // Removes an attribute from an HTML element. + // node: + // id or reference to the element to remove the attribute from + // name: + // the name of the attribute to remove + d.byId(node).removeAttribute(_fixAttrName(name)); + } +})(); + +// ============================= +// (CSS) Class Functions +// ============================= + +dojo.hasClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: + // Returns whether or not the specified classes are a portion of the + // class list currently applied to the node. + return ((" "+dojo.byId(node).className+" ").indexOf(" "+classStr+" ") >= 0); // Boolean +}; + +dojo.addClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: + // Adds the specified classes to the end of the class list on the + // passed node. + node = dojo.byId(node); + var cls = node.className; + if((" "+cls+" ").indexOf(" "+classStr+" ") < 0){ + node.className = cls + (cls ? ' ' : '') + classStr; + } +}; + +dojo.removeClass = function(/*DomNode|String*/node, /*String*/classStr){ + // summary: Removes the specified classes from node. + node = dojo.byId(node); + var t = dojo.trim((" " + node.className + " ").replace(" " + classStr + " ", " ")); + if(node.className != t){ node.className = t; } +}; + +dojo.toggleClass = function(/*DomNode|String*/node, /*String*/classStr, /*Boolean?*/condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // condition: + // If passed, true means to add the class, false means to remove. + if(condition === undefined){ + condition = !dojo.hasClass(node, classStr); + } + dojo[condition ? "addClass" : "removeClass"](node, classStr); +}; + +} + +if(!dojo._hasResource["dojo._base.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.NodeList"] = true; +dojo.provide("dojo._base.NodeList"); + + + +(function(){ + + var d = dojo; + + var tnl = function(arr){ + // decorate an array to make it look like a NodeList + arr.constructor = dojo.NodeList; + dojo._mixin(arr, dojo.NodeList.prototype); + return arr; + } + + var _mapIntoDojo = function(func, alwaysThis){ + // returns a function which, when executed in the scope of its caller, + // applies the passed arguments to a particular dojo.* function (named + // in func) and aggregates the returns. if alwaysThis is true, it + // always returns the scope object and not the collected returns from + // the Dojo method + return function(){ + var _a = arguments; + var aa = d._toArray(_a, 0, [null]); + var s = this.map(function(i){ + aa[0] = i; + return d[func].apply(d, aa); + }); + return (alwaysThis || ( (_a.length > 1) || !d.isString(_a[0]) )) ? this : s; // String||dojo.NodeList + } + }; + + dojo.NodeList = function(){ + // summary: + // dojo.NodeList is as subclass of Array which adds syntactic + // sugar for chaining, common iteration operations, animation, + // and node manipulation. NodeLists are most often returned as + // the result of dojo.query() calls. + // example: + // create a node list from a node + // | new dojo.NodeList(dojo.byId("foo")); + + return tnl(Array.apply(null, arguments)); + } + + dojo.NodeList._wrap = tnl; + + dojo.extend(dojo.NodeList, { + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods + + // FIXME: handle return values for #3244 + // http://trac.dojotoolkit.org/ticket/3244 + + // FIXME: + // need to wrap or implement: + // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?) + // reduce + // reduceRight + + slice: function(/*===== begin, end =====*/){ + // summary: + // Returns a new NodeList, maintaining this one in place + // description: + // This method behaves exactly like the Array.slice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice + // begin: Integer + // Can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // end: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + var a = dojo._toArray(arguments); + return tnl(a.slice.apply(this, a)); + }, + + splice: function(/*===== index, howmany, item =====*/){ + // summary: + // Returns a new NodeList, manipulating this NodeList based on + // the arguments passed, potentially splicing in new elements + // at an offset, optionally deleting elements + // description: + // This method behaves exactly like the Array.splice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // + // index: Integer + // begin can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // howmany: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + // item: Object...? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + var a = dojo._toArray(arguments); + return tnl(a.splice.apply(this, a)); + }, + + concat: function(/*===== item =====*/){ + // summary: + // Returns a new NodeList comprised of items in this NodeList + // as well as items passed in as parameters + // description: + // This method behaves exactly like the Array.concat method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see: + // + // item: Object...? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + var a = dojo._toArray(arguments, 0, [this]); + return tnl(a.concat.apply([], a)); + }, + + indexOf: function(/*Object*/ value, /*Integer?*/ fromIndex){ + // summary: + // see dojo.indexOf(). The primary difference is that the acted-on + // array is implicitly this NodeList + // value: + // The value to search for. + // fromIndex: + // The loction to start searching from. Optional. Defaults to 0. + // description: + // For more details on the behavior of indexOf, see: + // + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.indexOf(this, value, fromIndex); // Integer + }, + + lastIndexOf: function(/*===== value, fromIndex =====*/){ + // summary: + // see dojo.lastIndexOf(). The primary difference is that the + // acted-on array is implicitly this NodeList + // description: + // For more details on the behavior of lastIndexOf, see: + // + // value: Object + // The value to search for. + // fromIndex: Integer? + // The loction to start searching from. Optional. Defaults to 0. + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.lastIndexOf.apply(d, d._toArray(arguments, 0, [this])); // Integer + }, + + every: function(/*Function*/callback, /*Object?*/thisObject){ + // summary: + // see `dojo.every()` and: + // + // Takes the same structure of arguments and returns as + // dojo.every() with the caveat that the passed array is + // implicitly this NodeList + return d.every(this, callback, thisObject); // Boolean + }, + + some: function(/*Function*/callback, /*Object?*/thisObject){ + // summary: + // see dojo.some() and: + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some + // Takes the same structure of arguments and returns as + // dojo.some() with the caveat that the passed array is + // implicitly this NodeList + return d.some(this, callback, thisObject); // Boolean + }, + + map: function(/*Function*/ func, /*Function?*/ obj){ + // summary: + // see dojo.map(). The primary difference is that the acted-on + // array is implicitly this NodeList and the return is a + // dojo.NodeList (a subclass of Array) + + return d.map(this, func, obj, d.NodeList); // dojo.NodeList + }, + + forEach: function(callback, thisObj){ + // summary: + // see dojo.forEach(). The primary difference is that the acted-on + // array is implicitly this NodeList + + d.forEach(this, callback, thisObj); + // non-standard return to allow easier chaining + return this; // dojo.NodeList + }, + + // custom methods + + coords: function(){ + // summary: + // Returns the box objects all elements in a node list as + // an Array (*not* a NodeList) + + return d.map(this, d.coords); // Array + }, + + /*===== + attr: function(property, value){ + // summary: + // gets or sets the DOM attribute for every element in the + // NodeList + // property: String + // the attribute to get/set + // value: String? + // optional. The value to set the property to + // return: + // if no value is passed, the result is an array of attribute values + // If a value is passed, the return is this NodeList + }, + + style: function(property, value){ + // summary: + // gets or sets the CSS property for every element in the NodeList + // property: String + // the CSS property to get/set, in JavaScript notation + // ("lineHieght" instead of "line-height") + // value: String? + // optional. The value to set the property to + // return: + // if no value is passed, the result is an array of strings. + // If a value is passed, the return is this NodeList + }, + + addClass: function(className){ + // summary: + // adds the specified class to every node in the list + // className: String + // the CSS class to add + // return: + // dojo.NodeList, this list + }, + + removeClass: function(className){ + // summary: + // removes the specified class from every node in the list + // className: String + // the CSS class to add + // return: + // dojo.NodeList, this list + }, + + toggleClass: function(className, condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // condition: Boolean? + // If passed, true means to add the class, false means to remove. + // className: String + // the CSS class to add + // return: dojo.NodeList + // this list + }, + + connect: function(methodName, objOrFunc, funcName){ + // summary: + // attach event handlers to every item of the NodeList. Uses dojo.connect() + // so event properties are normalized + // methodName: String + // the name of the method to attach to. For DOM events, this should be + // the lower-case name of the event + // objOrFunc: Object|Function|String + // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should + // reference a function or be the name of the function in the global + // namespace to attach. If 3 arguments are provided + // (methodName, objOrFunc, funcName), objOrFunc must be the scope to + // locate the bound function in + // funcName: String? + // optional. A string naming the function in objOrFunc to bind to the + // event. May also be a function reference. + // example: + // add an onclick handler to every button on the page + // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){ + // | console.debug("clicked!"); + // | }); + // example: + // attach foo.bar() to every odd div's onmouseover + // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar"); + }, + =====*/ + attr: _mapIntoDojo("attr"), + style: _mapIntoDojo("style"), + addClass: _mapIntoDojo("addClass", true), + removeClass: _mapIntoDojo("removeClass", true), + toggleClass: _mapIntoDojo("toggleClass", true), + connect: _mapIntoDojo("connect", true), + + // FIXME: connectPublisher()? connectRunOnce()? + + place: function(/*String||Node*/ queryOrNode, /*String*/ position){ + // summary: + // places elements of this node list relative to the first element matched + // by queryOrNode. Returns the original NodeList. + // queryOrNode: + // may be a string representing any valid CSS3 selector or a DOM node. + // In the selector case, only the first matching element will be used + // for relative positioning. + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + var item = d.query(queryOrNode)[0]; + return this.forEach(function(i){ d.place(i, item, (position||"last")); }); // dojo.NodeList + }, + + orphan: function(/*String?*/ simpleFilter){ + // summary: + // removes elements in this list that match the simple + // filter from their parents and returns them as a new + // NodeList. + // simpleFilter: + // single-expression CSS filter + // return: + // `dojo.NodeList` the orpahned elements + var orphans = simpleFilter ? d._filterQueryResult(this, simpleFilter) : this; + orphans.forEach(function(item){ + if(item.parentNode){ + item.parentNode.removeChild(item); + } + }); + return orphans; // dojo.NodeList + }, + + adopt: function(/*String||Array||DomNode*/ queryOrListOrNode, /*String?*/ position){ + // summary: + // places any/all elements in queryOrListOrNode at a + // position relative to the first element in this list. + // Returns a dojo.NodeList of the adopted elements. + // queryOrListOrNode: + // a DOM node or a query string or a query result. + // Represents the nodes to be adopted relative to the + // first element of this NodeList. + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + var item = this[0]; + return d.query(queryOrListOrNode).forEach(function(ai){ d.place(ai, item, position || "last"); }); // dojo.NodeList + }, + + // FIXME: do we need this? + query: function(/*String*/ queryStr){ + // summary: + // Returns a new, flattened NodeList. Elements of the new list + // satisfy the passed query but use elements of the + // current NodeList as query roots. + + if(!queryStr){ return this; } + + // FIXME: probably slow + // FIXME: use map? + var ret = d.NodeList(); + this.forEach(function(item){ + d.query(queryStr, item).forEach(function(subItem){ + if(subItem !== undefined){ + ret.push(subItem); + } + }); + }); + return ret; // dojo.NodeList + }, + + filter: function(/*String*/ simpleQuery){ + // summary: + // "masks" the built-in javascript filter() method to support + // passing a simple string filter in addition to supporting + // filtering function objects. + // example: + // "regular" JS filter syntax as exposed in dojo.filter: + // | dojo.query("*").filter(function(item){ + // | // highlight every paragraph + // | return (item.nodeName == "p"); + // | }).styles("backgroundColor", "yellow"); + // example: + // the same filtering using a CSS selector + // | dojo.query("*").filter("p").styles("backgroundColor", "yellow"); + + var items = this; + var _a = arguments; + var r = d.NodeList(); + var rp = function(t){ + if(t !== undefined){ + r.push(t); + } + } + if(d.isString(simpleQuery)){ + items = d._filterQueryResult(this, _a[0]); + if(_a.length == 1){ + // if we only got a string query, pass back the filtered results + return items; // dojo.NodeList + } + // if we got a callback, run it over the filtered items + _a.shift(); + } + // handle the (callback, [thisObject]) case + d.forEach(d.filter(items, _a[0], _a[1]), rp); + return r; // dojo.NodeList + }, + + /* + // FIXME: should this be "copyTo" and include parenting info? + clone: function(){ + // summary: + // creates node clones of each element of this list + // and returns a new list containing the clones + }, + */ + + addContent: function(/*String*/ content, /*String||Integer?*/ position){ + // summary: + // add a node or some HTML as a string to every item in the list. + // Returns the original list. + // description: + // a copy of the HTML content is added to each item in the + // list, with an optional position argument. If no position + // argument is provided, the content is appended to the end of + // each item. + // content: + // the HTML in string format to add at position to every item + // position: + // can be one of: + // * "last"||"end" (default) + // * "first||"start" + // * "before" + // * "after" + // or an offset in the childNodes property + // example: + // appends content to the end if the position is ommitted + // | dojo.query("h3 > p").addContent("hey there!"); + // example: + // add something to the front of each element that has a "thinger" property: + // | dojo.query("[thinger]").addContent("...", "first"); + // example: + // adds a header before each element of the list + // | dojo.query(".note").addContent("

          NOTE:

          ", "before"); + var ta = d.doc.createElement("span"); + if(d.isString(content)){ + ta.innerHTML = content; + }else{ + ta.appendChild(content); + } + if(position === undefined){ + position = "last"; + } + var ct = (position == "first" || position == "after") ? "lastChild" : "firstChild"; + this.forEach(function(item){ + var tn = ta.cloneNode(true); + while(tn[ct]){ + d.place(tn[ct], item, position); + } + }); + return this; // dojo.NodeList + }, + + empty: function(){ + // summary: + // clears all content from each node in the list + return this.forEach("item.innerHTML='';"); // dojo.NodeList + + // FIXME: should we be checking for and/or disposing of widgets below these nodes? + }, + + instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){ + // summary: + // Create a new instance of a specified class, using the + // specified properties and each node in the nodeList as a + // srcNodeRef + // + var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass); + return this.forEach(function(i){ + new c(properties||{},i); + }) // dojo.NodeList + } + + }); + + // syntactic sugar for DOM events + d.forEach([ + "blur", "focus", "click", "keydown", "keypress", "keyup", "mousedown", + "mouseenter", "mouseleave", "mousemove", "mouseout", "mouseover", + "mouseup" + ], function(evt){ + var _oe = "on"+evt; + dojo.NodeList.prototype[_oe] = function(a, b){ + return this.connect(_oe, a, b); + } + // FIXME: should these events trigger publishes? + /* + return (a ? this.connect(_oe, a, b) : + this.forEach(function(n){ + // FIXME: + // listeners get buried by + // addEventListener and can't be dug back + // out to be triggered externally. + // see: + // http://developer.mozilla.org/en/docs/DOM:element + + console.debug(n, evt, _oe); + + // FIXME: need synthetic event support! + var _e = { target: n, faux: true, type: evt }; + // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt }); + try{ n[evt](_e); }catch(e){ console.debug(e); } + try{ n[_oe](_e); }catch(e){ console.debug(e); } + }) + ); + } + */ + } + ); + +})(); + +} + +if(!dojo._hasResource["dojo._base.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.query"] = true; +dojo.provide("dojo._base.query"); + + +/* + dojo.query() architectural overview: + + dojo.query is a relatively full-featured CSS3 query library. It is + designed to take any valid CSS3 selector and return the nodes matching + the selector. To do this quickly, it processes queries in several + steps, applying caching where profitable. + + The steps (roughly in reverse order of the way they appear in the code): + 1.) check to see if we already have a "query dispatcher" + - if so, use that with the given parameterization. Skip to step 4. + 2.) attempt to determine which branch to dispatch the query to: + - JS (optimized DOM iteration) + - xpath (for browsers that support it and where it's fast) + - native (not available in any browser yet) + 3.) tokenize and convert to executable "query dispatcher" + - this is where the lion's share of the complexity in the + system lies. In the DOM version, the query dispatcher is + assembled as a chain of "yes/no" test functions pertaining to + a section of a simple query statement (".blah:nth-child(odd)" + but not "div div", which is 2 simple statements). Individual + statement dispatchers are cached (to prevent re-definition) + as are entire dispatch chains (to make re-execution of the + same query fast) + - in the xpath path, tokenization yeilds a concatenation of + parameterized xpath selectors. As with the DOM version, both + simple selector blocks and overall evaluators are cached to + prevent re-defintion + 4.) the resulting query dispatcher is called in the passed scope (by default the top-level document) + - for DOM queries, this results in a recursive, top-down + evaluation of nodes based on each simple query section + - xpath queries can, thankfully, be executed in one shot + 5.) matched nodes are pruned to ensure they are unique +*/ + +;(function(){ + // define everything in a closure for compressability reasons. "d" is an + // alias to "dojo" since it's so frequently used. This seems a + // transformation that the build system could perform on a per-file basis. + + //////////////////////////////////////////////////////////////////////// + // Utility code + //////////////////////////////////////////////////////////////////////// + + var d = dojo; + var childNodesName = dojo.isIE ? "children" : "childNodes"; + var caseSensitive = false; + + var getQueryParts = function(query){ + // summary: state machine for query tokenization + if(">~+".indexOf(query.charAt(query.length-1)) >= 0){ + query += " *" + } + query += " "; // ensure that we terminate the state machine + + var ts = function(s, e){ + return d.trim(query.slice(s, e)); + } + + // the overall data graph of the full query, as represented by queryPart objects + var qparts = []; + // state keeping vars + var inBrackets = -1; + var inParens = -1; + var inMatchFor = -1; + var inPseudo = -1; + var inClass = -1; + var inId = -1; + var inTag = -1; + var lc = ""; // the last character + var cc = ""; // the current character + var pStart; + // iteration vars + var x = 0; // index in the query + var ql = query.length; + var currentPart = null; // data structure representing the entire clause + var _cp = null; // the current pseudo or attr matcher + + var endTag = function(){ + if(inTag >= 0){ + var tv = (inTag == x) ? null : ts(inTag, x).toLowerCase(); + currentPart[ (">~+".indexOf(tv) < 0) ? "tag" : "oper" ] = tv; + inTag = -1; + } + } + + var endId = function(){ + if(inId >= 0){ + currentPart.id = ts(inId, x).replace(/\\/g, ""); + inId = -1; + } + } + + var endClass = function(){ + if(inClass >= 0){ + currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, "")); + inClass = -1; + } + } + + var endAll = function(){ + endId(); endTag(); endClass(); + } + + for(; lc=cc, cc=query.charAt(x),x= 0){ + // look for a the close first + if(cc == "]"){ + if(!_cp.attr){ + _cp.attr = ts(inBrackets+1, x); + }else{ + _cp.matchFor = ts((inMatchFor||inBrackets+1), x); + } + var cmf = _cp.matchFor; + if(cmf){ + if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ + _cp.matchFor = cmf.substring(1, cmf.length-1); + } + } + currentPart.attrs.push(_cp); + _cp = null; // necessaray? + inBrackets = inMatchFor = -1; + }else if(cc == "="){ + var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; + _cp.type = addToCc+cc; + _cp.attr = ts(inBrackets+1, x-addToCc.length); + inMatchFor = x+1; + } + // now look for other clause parts + }else if(inParens >= 0){ + if(cc == ")"){ + if(inPseudo >= 0){ + _cp.value = ts(inParens+1, x); + } + inPseudo = inParens = -1; + } + }else if(cc == "#"){ + endAll(); + inId = x+1; + }else if(cc == "."){ + endAll(); + inClass = x; + }else if(cc == ":"){ + endAll(); + inPseudo = x; + }else if(cc == "["){ + endAll(); + inBrackets = x; + _cp = { + /*===== + attr: null, type: null, matchFor: null + =====*/ + }; + }else if(cc == "("){ + if(inPseudo >= 0){ + _cp = { + name: ts(inPseudo+1, x), + value: null + } + currentPart.pseudos.push(_cp); + } + inParens = x; + }else if(cc == " " && lc != cc){ + // note that we expect the string to be " " terminated + endAll(); + if(inPseudo >= 0){ + currentPart.pseudos.push({ name: ts(inPseudo+1, x) }); + } + currentPart.hasLoops = ( + currentPart.pseudos.length || + currentPart.attrs.length || + currentPart.classes.length ); + currentPart.query = ts(pStart, x); + currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); + qparts.push(currentPart); + currentPart = null; + } + } + return qparts; + }; + + + //////////////////////////////////////////////////////////////////////// + // XPath query code + //////////////////////////////////////////////////////////////////////// + + // this array is a lookup used to generate an attribute matching function. + // There is a similar lookup/generator list for the DOM branch with similar + // calling semantics. + var xPathAttrs = { + "*=": function(attr, value){ + return "[contains(@"+attr+", '"+ value +"')]"; + }, + "^=": function(attr, value){ + return "[starts-with(@"+attr+", '"+ value +"')]"; + }, + "$=": function(attr, value){ + return "[substring(@"+attr+", string-length(@"+attr+")-"+(value.length-1)+")='"+value+"']"; + }, + "~=": function(attr, value){ + return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + }, + "|=": function(attr, value){ + return "[contains(concat(' ',@"+attr+",' '), ' "+ value +"-')]"; + }, + "=": function(attr, value){ + return "[@"+attr+"='"+ value +"']"; + } + }; + + // takes a list of attribute searches, the overall query, a function to + // generate a default matcher, and a closure-bound method for providing a + // matching function that generates whatever type of yes/no distinguisher + // the query method needs. The method is a bit tortured and hard to read + // because it needs to be used in both the XPath and DOM branches. + var handleAttrs = function( attrList, + query, + getDefault, + handleMatch){ + d.forEach(query.attrs, function(attr){ + var matcher; + // type, attr, matchFor + if(attr.type && attrList[attr.type]){ + matcher = attrList[attr.type](attr.attr, attr.matchFor); + }else if(attr.attr.length){ + matcher = getDefault(attr.attr); + } + if(matcher){ handleMatch(matcher); } + }); + } + + var buildPath = function(query){ + var xpath = "."; + var qparts = getQueryParts(d.trim(query)); + while(qparts.length){ + var tqp = qparts.shift(); + var prefix; + var postfix = ""; + if(tqp.oper == ">"){ + prefix = "/"; + // prefix = "/child::*"; + tqp = qparts.shift(); + }else if(tqp.oper == "~"){ + prefix = "/following-sibling::"; // get element following siblings + tqp = qparts.shift(); + }else if(tqp.oper == "+"){ + // FIXME: + // fails when selecting subsequent siblings by node type + // because the position() checks the position in the list + // of matching elements and not the localized siblings + prefix = "/following-sibling::"; + postfix = "[position()=1]"; + tqp = qparts.shift(); + }else{ + prefix = "//"; + // prefix = "/descendant::*" + } + + // get the tag name (if any) + + xpath += prefix + tqp.tag + postfix; + + // check to see if it's got an id. Needs to come first in xpath. + if(tqp.id){ + xpath += "[@id='"+tqp.id+"'][1]"; + } + + d.forEach(tqp.classes, function(cn){ + var cnl = cn.length; + var padding = " "; + if(cn.charAt(cnl-1) == "*"){ + padding = ""; cn = cn.substr(0, cnl-1); + } + xpath += + "[contains(concat(' ',@class,' '), ' "+ + cn + padding + "')]"; + }); + + handleAttrs(xPathAttrs, tqp, + function(condition){ + return "[@"+condition+"]"; + }, + function(matcher){ + xpath += matcher; + } + ); + + // FIXME: need to implement pseudo-class checks!! + }; + return xpath; + }; + + var _xpathFuncCache = {}; + var getXPathFunc = function(path){ + if(_xpathFuncCache[path]){ + return _xpathFuncCache[path]; + } + + var doc = d.doc; + // don't need to memoize. The closure scope handles it for us. + var xpath = buildPath(path); + + var tf = function(parent){ + // XPath query strings are memoized. + var ret = []; + var xpathResult; + try{ + xpathResult = doc.evaluate(xpath, parent, null, + // XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); + XPathResult.ANY_TYPE, null); + }catch(e){ + console.debug("failure in exprssion:", xpath, "under:", parent); + console.debug(e); + } + var result = xpathResult.iterateNext(); + while(result){ + ret.push(result); + result = xpathResult.iterateNext(); + } + return ret; + } + return _xpathFuncCache[path] = tf; + }; + + /* + d.xPathMatch = function(query){ + // XPath based DOM query system. Handles a small subset of CSS + // selectors, subset is identical to the non-XPath version of this + // function. + + return getXPathFunc(query)(); + } + */ + + //////////////////////////////////////////////////////////////////////// + // DOM query code + //////////////////////////////////////////////////////////////////////// + + var _filtersCache = {}; + var _simpleFiltersCache = {}; + + // the basic building block of the yes/no chaining system. agree(f1, f2) + // generates a new function which returns the boolean results of both of + // the passed functions to a single logical-anded result. + var agree = function(first, second){ + if(!first){ return second; } + if(!second){ return first; } + + return function(){ + return first.apply(window, arguments) && second.apply(window, arguments); + } + } + + var _childElements = function(root){ + var ret = []; + var te, x=0, tret = root[childNodesName]; + while(te=tret[x++]){ + if(te.nodeType == 1){ ret.push(te); } + } + return ret; + } + + var _nextSiblings = function(root, single){ + var ret = []; + var te = root; + while(te = te.nextSibling){ + if(te.nodeType == 1){ + ret.push(te); + if(single){ break; } + } + } + return ret; + } + + var _filterDown = function(element, queryParts, matchArr, idx){ + // NOTE: + // in the fast path! this function is called recursively and for + // every run of a query. + var nidx = idx+1; + var isFinal = (queryParts.length == nidx); + var tqp = queryParts[idx]; + + // see if we can constrain our next level to direct children + if(tqp.oper){ + var ecn = (tqp.oper == ">") ? + _childElements(element) : + _nextSiblings(element, (tqp.oper == "+")); + + if(!ecn || !ecn.length){ + return; + } + nidx++; + isFinal = (queryParts.length == nidx); + // kinda janky, too much array alloc + var tf = getFilterFunc(queryParts[idx+1]); + // for(var x=ecn.length-1, te; x>=0, te=ecn[x]; x--){ + for(var x=0, ecnl=ecn.length, te; x=0, te=elements[x]; x--){ + var x = elements.length - 1, te; + while(te = elements[x--]){ + _filterDown(te, queryParts, ret, 0); + } + return ret; + } + + var getFilterFunc = function(q){ + // note: query can't have spaces! + if(_filtersCache[q.query]){ + return _filtersCache[q.query]; + } + var ff = null; + + // does it have a tagName component? + if(q.tag){ + if(q.tag == "*"){ + ff = agree(ff, + function(elem){ + return (elem.nodeType == 1); + } + ); + }else{ + // tag name match + ff = agree(ff, + function(elem){ + return ( + (elem.nodeType == 1) && + (q.tag == elem.tagName.toLowerCase()) + ); + // return isTn; + } + ); + } + } + + // does the node have an ID? + if(q.id){ + ff = agree(ff, + function(elem){ + return ( + (elem.nodeType == 1) && + (elem.id == q.id) + ); + } + ); + } + + if(q.hasLoops){ + // if we have other query param parts, make sure we add them to the + // filter chain + ff = agree(ff, getSimpleFilterFunc(q)); + } + + return _filtersCache[q.query] = ff; + } + + var getNodeIndex = function(node){ + // NOTE: + // we could have a more accurate caching mechanism by invalidating + // caches after the query has finished, but I think that'd lead to + // significantly more cache churn than the cache would provide + // value for in the common case. Generally, we're more + // conservative (and therefore, more accurate) than jQuery and + // DomQuery WRT node node indexes, but there may be corner cases + // in which we fall down. How much we care about them is TBD. + + var pn = node.parentNode; + var pnc = pn.childNodes; + + // check to see if we can trust the cache. If not, re-key the whole + // thing and return our node match from that. + + var nidx = -1; + var child = pn.firstChild; + if(!child){ + return nidx; + } + + var ci = node["__cachedIndex"]; + var cl = pn["__cachedLength"]; + + // only handle cache building if we've gone out of sync + if(((typeof cl == "number")&&(cl != pnc.length))||(typeof ci != "number")){ + // rip though the whole set, building cache indexes as we go + pn["__cachedLength"] = pnc.length; + var idx = 1; + do{ + // we only assign indexes for nodes with nodeType == 1, as per: + // http://www.w3.org/TR/css3-selectors/#nth-child-pseudo + // only elements are counted in the search order, and they + // begin at 1 for the first child's index + + if(child === node){ + nidx = idx; + } + if(child.nodeType == 1){ + child["__cachedIndex"] = idx; + idx++; + } + child = child.nextSibling; + }while(child); + }else{ + // NOTE: + // could be incorrect in some cases (node swaps involving the + // passed node, etc.), but we ignore those due to the relative + // unlikelihood of that occuring + nidx = ci; + } + return nidx; + } + + var firedCount = 0; + + var blank = ""; + var _getAttr = function(elem, attr){ + if(attr == "class"){ + return elem.className || blank; + } + if(attr == "for"){ + return elem.htmlFor || blank; + } + return elem.getAttribute(attr, 2) || blank; + } + + var attrs = { + "*=": function(attr, value){ + return function(elem){ + // E[foo*="bar"] + // an E element whose "foo" attribute value contains + // the substring "bar" + return (_getAttr(elem, attr).indexOf(value)>=0); + } + }, + "^=": function(attr, value){ + // E[foo^="bar"] + // an E element whose "foo" attribute value begins exactly + // with the string "bar" + return function(elem){ + return (_getAttr(elem, attr).indexOf(value)==0); + } + }, + "$=": function(attr, value){ + // E[foo$="bar"] + // an E element whose "foo" attribute value ends exactly + // with the string "bar" + var tval = " "+value; + return function(elem){ + var ea = " "+_getAttr(elem, attr); + return (ea.lastIndexOf(value)==(ea.length-value.length)); + } + }, + "~=": function(attr, value){ + // E[foo~="bar"] + // an E element whose "foo" attribute value is a list of + // space-separated values, one of which is exactly equal + // to "bar" + + // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + var tval = " "+value+" "; + return function(elem){ + var ea = " "+_getAttr(elem, attr)+" "; + return (ea.indexOf(tval)>=0); + } + }, + "|=": function(attr, value){ + // E[hreflang|="en"] + // an E element whose "hreflang" attribute has a + // hyphen-separated list of values beginning (from the + // left) with "en" + var valueDash = " "+value+"-"; + return function(elem){ + var ea = " "+(elem.getAttribute(attr, 2) || ""); + return ( + (ea == value) || + (ea.indexOf(valueDash)==0) + ); + } + }, + "=": function(attr, value){ + return function(elem){ + return (_getAttr(elem, attr) == value); + } + } + }; + + var pseudos = { + "first-child": function(name, condition){ + return function(elem){ + if(elem.nodeType != 1){ return false; } + // check to see if any of the previous siblings are elements + var fc = elem.previousSibling; + while(fc && (fc.nodeType != 1)){ + fc = fc.previousSibling; + } + return (!fc); + } + }, + "last-child": function(name, condition){ + return function(elem){ + if(elem.nodeType != 1){ return false; } + // check to see if any of the next siblings are elements + var nc = elem.nextSibling; + while(nc && (nc.nodeType != 1)){ + nc = nc.nextSibling; + } + return (!nc); + } + }, + "empty": function(name, condition){ + return function(elem){ + // DomQuery and jQuery get this wrong, oddly enough. + // The CSS 3 selectors spec is pretty explicit about + // it, too. + var cn = elem.childNodes; + var cnl = elem.childNodes.length; + // if(!cnl){ return true; } + for(var x=cnl-1; x >= 0; x--){ + var nt = cn[x].nodeType; + if((nt == 1)||(nt == 3)){ return false; } + } + return true; + } + }, + "contains": function(name, condition){ + return function(elem){ + // FIXME: I dislike this version of "contains", as + // whimsical attribute could set it off. An inner-text + // based version might be more accurate, but since + // jQuery and DomQuery also potentially get this wrong, + // I'm leaving it for now. + return (elem.innerHTML.indexOf(condition) >= 0); + } + }, + "not": function(name, condition){ + var ntf = getFilterFunc(getQueryParts(condition)[0]); + return function(elem){ + return (!ntf(elem)); + } + }, + "nth-child": function(name, condition){ + var pi = parseInt; + if(condition == "odd"){ + return function(elem){ + return ( + ((getNodeIndex(elem)) % 2) == 1 + ); + } + }else if((condition == "2n")|| + (condition == "even")){ + return function(elem){ + return ((getNodeIndex(elem) % 2) == 0); + } + }else if(condition.indexOf("0n+") == 0){ + var ncount = pi(condition.substr(3)); + return function(elem){ + return (elem.parentNode[childNodesName][ncount-1] === elem); + } + }else if( (condition.indexOf("n+") > 0) && + (condition.length > 3) ){ + var tparts = condition.split("n+", 2); + var pred = pi(tparts[0]); + var idx = pi(tparts[1]); + return function(elem){ + return ((getNodeIndex(elem) % pred) == idx); + } + }else if(condition.indexOf("n") == -1){ + var ncount = pi(condition); + return function(elem){ + return (getNodeIndex(elem) == ncount); + } + } + } + }; + + var defaultGetter = (d.isIE) ? function(cond){ + var clc = cond.toLowerCase(); + return function(elem){ + return elem[cond]||elem[clc]; + } + } : function(cond){ + return function(elem){ + return (elem && elem.getAttribute && elem.hasAttribute(cond)); + } + }; + + var getSimpleFilterFunc = function(query){ + + var fcHit = (_simpleFiltersCache[query.query]||_filtersCache[query.query]); + if(fcHit){ return fcHit; } + + var ff = null; + + // the only case where we'll need the tag name is if we came from an ID query + if(query.id){ // do we have an ID component? + if(query.tag != "*"){ + ff = agree(ff, function(elem){ + return (elem.tagName.toLowerCase() == query.tag); + }); + } + } + + // if there's a class in our query, generate a match function for it + d.forEach(query.classes, function(cname, idx, arr){ + // get the class name + var isWildcard = cname.charAt(cname.length-1) == "*"; + if(isWildcard){ + cname = cname.substr(0, cname.length-1); + } + // I dislike the regex thing, even if memozied in a cache, but it's VERY short + var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); + ff = agree(ff, function(elem){ + return re.test(elem.className); + }); + ff.count = idx; + }); + + d.forEach(query.pseudos, function(pseudo){ + if(pseudos[pseudo.name]){ + ff = agree(ff, pseudos[pseudo.name](pseudo.name, pseudo.value)); + } + }); + + handleAttrs(attrs, query, defaultGetter, + function(tmatcher){ ff = agree(ff, tmatcher); } + ); + if(!ff){ + ff = function(){ return true; }; + } + return _simpleFiltersCache[query.query] = ff; + } + + var _getElementsFuncCache = { }; + + var getElementsFunc = function(query, root){ + var fHit = _getElementsFuncCache[query.query]; + if(fHit){ return fHit; } + + // NOTE: this function is in the fast path! not memoized!!! + + // the query doesn't contain any spaces, so there's only so many + // things it could be + + if(query.id && !query.hasLoops && !query.tag){ + // ID-only query. Easy. + return _getElementsFuncCache[query.query] = function(root){ + // FIXME: if root != document, check for parenting! + return [ d.byId(query.id) ]; + } + } + + var filterFunc = getSimpleFilterFunc(query); + + var retFunc; + if(query.tag && query.id && !query.hasLoops){ + // we got a filtered ID search (e.g., "h4#thinger") + retFunc = function(root){ + var te = d.byId(query.id); + if(filterFunc(te)){ + return [ te ]; + } + } + }else{ + var tret; + + if(!query.hasLoops){ + // it's just a plain-ol elements-by-tag-name query from the root + retFunc = function(root){ + var ret = []; + var te, x=0, tret = root.getElementsByTagName(query.tag); + while(te=tret[x++]){ + ret.push(te); + } + return ret; + } + }else{ + retFunc = function(root){ + var ret = []; + var te, x=0, tret = root.getElementsByTagName(query.tag); + while(te=tret[x++]){ + if(filterFunc(te)){ + ret.push(te); + } + } + return ret; + } + } + } + return _getElementsFuncCache[query.query] = retFunc; + } + + var _partsCache = {}; + + //////////////////////////////////////////////////////////////////////// + // the query runner + //////////////////////////////////////////////////////////////////////// + + // this is the second level of spliting, from full-length queries (e.g., + // "div.foo .bar") into simple query expressions (e.g., ["div.foo", + // ".bar"]) + var _queryFuncCache = { + "*": d.isIE ? + function(root){ + return root.all; + } : + function(root){ + return root.getElementsByTagName("*"); + }, + "~": _nextSiblings, + "+": function(root){ return _nextSiblings(root, true); }, + ">": _childElements + }; + + var getStepQueryFunc = function(query){ + // if it's trivial, get a fast-path dispatcher + var qparts = getQueryParts(d.trim(query)); + // if(query[query.length-1] == ">"){ query += " *"; } + if(qparts.length == 1){ + var tt = getElementsFunc(qparts[0]); + tt.nozip = true; + return tt; + } + + // otherwise, break it up and return a runner that iterates over the parts recursively + var sqf = function(root){ + var localQueryParts = qparts.slice(0); // clone the src arr + var candidates; + if(localQueryParts[0].oper == ">"){ // FIXME: what if it's + or ~? + candidates = [ root ]; + // root = document; + }else{ + candidates = getElementsFunc(localQueryParts.shift())(root); + } + return filterDown(candidates, localQueryParts); + } + return sqf; + } + + // a specialized method that implements our primoridal "query optimizer". + // This allows us to dispatch queries to the fastest subsystem we can get. + var _getQueryFunc = ( + // NOTE: + // XPath on the Webkit nighlies is slower than it's DOM iteration + // for most test cases + // FIXME: + // we should try to capture some runtime speed data for each query + // function to determine on the fly if we should stick w/ the + // potentially optimized variant or if we should try something + // new. + (document["evaluate"] && !d.isSafari) ? + function(query){ + // has xpath support that's faster than DOM + var qparts = query.split(" "); + // can we handle it? + if( (document["evaluate"])&& + (query.indexOf(":") == -1)&& + (query.indexOf("+") == -1) // skip direct sibling matches. See line ~344 + ){ + // dojo.debug(query); + // should we handle it? + + // kind of a lame heuristic, but it works + if( + // a "div div div" style query + ((qparts.length > 2)&&(query.indexOf(">") == -1))|| + // or something else with moderate complexity. kinda janky + (qparts.length > 3)|| + (query.indexOf("[")>=0)|| + // or if it's a ".thinger" query + ((1 == qparts.length)&&(0 <= query.indexOf("."))) + + ){ + // use get and cache a xpath runner for this selector + return getXPathFunc(query); + } + } + + // fallthrough + return getStepQueryFunc(query); + } : getStepQueryFunc + ); + // uncomment to disable XPath for testing and tuning the DOM path + // _getQueryFunc = getStepQueryFunc; + + // FIXME: we've got problems w/ the NodeList query()/filter() functions if we go XPath for everything + + // uncomment to disable DOM queries for testing and tuning XPath + // _getQueryFunc = getXPathFunc; + + // this is the primary caching for full-query results. The query dispatcher + // functions are generated here and then pickled for hash lookup in the + // future + var getQueryFunc = function(query){ + // return a cached version if one is available + var qcz = query.charAt(0); + if(d.doc["querySelectorAll"] && + ( (!d.isSafari) || (d.isSafari > 3.1) ) && // see #5832 + // as per CSS 3, we can't currently start w/ combinator: + // http://www.w3.org/TR/css3-selectors/#w3cselgrammar + (">+~".indexOf(qcz) == -1) + ){ + return function(root){ + var r = root.querySelectorAll(query); + r.nozip = true; // skip expensive duplication checks and just wrap in a NodeList + return r; + }; + } + if(_queryFuncCache[query]){ return _queryFuncCache[query]; } + if(0 > query.indexOf(",")){ + // if it's not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher + return _queryFuncCache[query] = _getQueryFunc(query); + }else{ + // if it's a complex query, break it up into it's constituent parts + // and return a dispatcher that will merge the parts when run + + // var parts = query.split(", "); + var parts = query.split(/\s*,\s*/); + var tf = function(root){ + var pindex = 0; // avoid array alloc for every invocation + var ret = []; + var tp; + while(tp = parts[pindex++]){ + ret = ret.concat(_getQueryFunc(tp, tp.indexOf(" "))(root)); + } + return ret; + } + // ...cache and return + return _queryFuncCache[query] = tf; + } + } + + // FIXME: + // Dean's Base2 uses a system whereby queries themselves note if + // they'll need duplicate filtering. We need to get on that plan!! + + // attempt to efficiently determine if an item in a list is a dupe, + // returning a list of "uniques", hopefully in doucment order + var _zipIdx = 0; + var _zip = function(arr){ + if(arr && arr.nozip){ return d.NodeList._wrap(arr); } + var ret = new d.NodeList(); + if(!arr){ return ret; } + if(arr[0]){ + ret.push(arr[0]); + } + if(arr.length < 2){ return ret; } + _zipIdx++; + arr[0]["_zipIdx"] = _zipIdx; + for(var x=1, te; te = arr[x]; x++){ + if(arr[x]["_zipIdx"] != _zipIdx){ + ret.push(te); + } + te["_zipIdx"] = _zipIdx; + } + // FIXME: should we consider stripping these properties? + return ret; + } + + // the main executor + d.query = function(/*String*/ query, /*String|DOMNode?*/ root){ + // summary: + // Returns nodes which match the given CSS3 selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an instance of dojo.NodeList. + // description: + // dojo.query() is the swiss army knife of DOM node manipulation in + // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's + // "$" function, dojo.query provides robust, high-performance + // CSS-based node selector support with the option of scoping searches + // to a particular sub-tree of a document. + // + // Supported Selectors: + // -------------------- + // + // dojo.query() supports a rich set of CSS3 selectors, including: + // + // * class selectors (e.g., `.foo`) + // * node type selectors like `span` + // * ` ` descendant selectors + // * `>` child element selectors + // * `#foo` style ID selectors + // * `*` universal selector + // * `~`, the immediately preceeded-by sibling selector + // * `+`, the preceeded-by sibling selector + // * attribute queries: + // | * `[foo]` attribute presence selector + // | * `[foo='bar']` attribute value exact match + // | * `[foo~='bar']` attribute value list item match + // | * `[foo^='bar']` attribute start match + // | * `[foo$='bar']` attribute end match + // | * `[foo*='bar']` attribute substring match + // * `:first-child`, `:last-child` positional selectors + // * `:empty` content emtpy selector + // * `:empty` content emtpy selector + // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations + // * `:nth-child(even)`, `:nth-child(odd)` positional selectors + // * `:not(...)` negation pseudo selectors + // + // Any legal combination of these selectors will work with + // `dojo.query()`, including compound selectors ("," delimited). + // Very complex and useful searches can be constructed with this + // palette of selectors and when combined with functions for + // maniplation presented by dojo.NodeList, many types of DOM + // manipulation operations become very straightforward. + // + // Unsupported Selectors: + // ---------------------- + // + // While dojo.query handles many CSS3 selectors, some fall outside of + // what's resaonable for a programmatic node querying engine to + // handle. Currently unsupported selectors include: + // + // * namespace-differentiated selectors of any form + // * all `::` pseduo-element selectors + // * certain pseduo-selectors which don't get a lot of day-to-day use: + // | * `:root`, `:lang()`, `:target`, `:focus` + // * all visual and state selectors: + // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, + // `:enabled`, `:disabled`, `:checked` + // * `:*-of-type` pseudo selectors + // + // dojo.query and XML Documents: + // ----------------------------- + // + // `dojo.query` currently only supports searching XML documents + // whose tags and attributes are 100% lower-case. This is a known + // limitation and will [be addressed soon](http://trac.dojotoolkit.org/ticket/3866) + // Non-selector Queries: + // --------------------- + // + // If something other than a String is passed for the query, + // `dojo.query` will return a new `dojo.NodeList` constructed from + // that parameter alone and all further processing will stop. This + // means that if you have a reference to a node or NodeList, you + // can quickly construct a new NodeList from the original by + // calling `dojo.query(node)` or `dojo.query(list)`. + // + // query: + // The CSS3 expression to match against. For details on the syntax of + // CSS3 selectors, see + // root: + // A DOMNode (or node id) to scope the search from. Optional. + // returns: dojo.NodeList + // An instance of `dojo.NodeList`. Many methods are available on + // NodeLists for searching, iterating, manipulating, and handling + // events on the matched nodes in the returned list. + // example: + // search the entire document for elements with the class "foo": + // | dojo.query(".foo"); + // these elements will match: + // | + // | + // |

          + // example: + // search the entire document for elements with the classes "foo" *and* "bar": + // | dojo.query(".foo.bar"); + // these elements will match: + // | + // while these will not: + // | + // |

          + // example: + // find `` elements which are descendants of paragraphs and + // which have a "highlighted" class: + // | dojo.query("p span.highlighted"); + // the innermost span in this fragment matches: + // |

          + // | ... + // | ... + // | + // |

          + // example: + // set an "odd" class on all odd table rows inside of the table + // `#tabular_data`, using the `>` (direct child) selector to avoid + // affecting any nested tables: + // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); + // example: + // remove all elements with the class "error" from the document + // and store them in a list: + // | var errors = dojo.query(".error").orphan(); + // example: + // add an onclick handler to every submit button in the document + // which causes the form to be sent via Ajax instead: + // | dojo.query("input[type='submit']").onclick(function(e){ + // | dojo.stopEvent(e); // prevent sending the form + // | var btn = e.target; + // | dojo.xhrPost({ + // | form: btn.form, + // | load: function(data){ + // | // replace the form with the response + // | var div = dojo.doc.createElement("div"); + // | dojo.place(div, btn.form, "after"); + // | div.innerHTML = data; + // | dojo.style(btn.form, "display", "none"); + // | } + // | }); + // | }); + + + // NOTE: elementsById is not currently supported + // NOTE: ignores xpath-ish queries for now + + if(query.constructor == d.NodeList){ + return query; + } + if(!d.isString(query)){ + return new d.NodeList(query); // dojo.NodeList + } + if(d.isString(root)){ + root = d.byId(root); + } + + return _zip(getQueryFunc(query)(root||d.doc)); // dojo.NodeList + } + + /* + // exposing this was a mistake + d.query.attrs = attrs; + */ + // exposing this because new pseudo matches are only executed through the + // DOM query path (never through the xpath optimizing branch) + d.query.pseudos = pseudos; + + // one-off function for filtering a NodeList based on a simple selector + d._filterQueryResult = function(nodeList, simpleFilter){ + var tnl = new d.NodeList(); + var ff = (simpleFilter) ? getFilterFunc(getQueryParts(simpleFilter)[0]) : function(){ return true; }; + for(var x=0, te; te = nodeList[x]; x++){ + if(ff(te)){ tnl.push(te); } + } + return tnl; + } +})(); + +} + +if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.xhr"] = true; +dojo.provide("dojo._base.xhr"); + + + + + +(function(){ + var _d = dojo; + function setValue(/*Object*/obj, /*String*/name, /*String*/value){ + //summary: + // For the nameed property in object, set the value. If a value + // already exists and it is a string, convert the value to be an + // array of values. + var val = obj[name]; + if(_d.isString(val)){ + obj[name] = [val, value]; + }else if(_d.isArray(val)){ + val.push(value); + }else{ + obj[name] = value; + } + } + + dojo.formToObject = function(/*DOMNode||String*/ formNode){ + // summary: + // dojo.formToObject returns the values encoded in an HTML form as + // string properties in an object which it then returns. Disabled form + // elements, buttons, and other non-value form elements are skipped. + // Multi-select elements are returned as an array of string values. + // description: + // This form: + // + // |
          + // | + // | + // | + // | + // |
          + // + // yields this object structure as the result of a call to + // formToObject(): + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + + var ret = {}; + var iq = "input:not([type=file]):not([type=submit]):not([type=image]):not([type=reset]):not([type=button]), select, textarea"; + _d.query(iq, formNode).filter(function(node){ + return !node.disabled && node.name; + }).forEach(function(item){ + var _in = item.name; + var type = (item.type||"").toLowerCase(); + if(type == "radio" || type == "checkbox"){ + if(item.checked){ setValue(ret, _in, item.value); } + }else if(item.multiple){ + ret[_in] = []; + _d.query("option", item).forEach(function(opt){ + if(opt.selected){ + setValue(ret, _in, opt.value); + } + }); + }else{ + setValue(ret, _in, item.value); + if(type == "image"){ + ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0; + } + } + }); + return ret; // Object + } + + dojo.objectToQuery = function(/*Object*/ map){ + // summary: + // takes a name/value mapping object and returns a string representing + // a URL-encoded version of that object. + // example: + // this object: + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + // + // yields the following query string: + // + // | "blah=blah&multi=thud&multi=thonk" + + // FIXME: need to implement encodeAscii!! + var enc = encodeURIComponent; + var pairs = []; + var backstop = {}; + for(var name in map){ + var value = map[name]; + if(value != backstop[name]){ + var assign = enc(name) + "="; + if(_d.isArray(value)){ + for(var i=0; i < value.length; i++){ + pairs.push(assign + enc(value[i])); + } + }else{ + pairs.push(assign + enc(value)); + } + } + } + return pairs.join("&"); // String + } + + dojo.formToQuery = function(/*DOMNode||String*/ formNode){ + // summary: + // Returns a URL-encoded string representing the form passed as either a + // node or string ID identifying the form to serialize + return _d.objectToQuery(_d.formToObject(formNode)); // String + } + + dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){ + // summary: + // return a serialized JSON string from a form node or string + // ID identifying the form to serialize + return _d.toJson(_d.formToObject(formNode), prettyPrint); // String + } + + dojo.queryToObject = function(/*String*/ str){ + // summary: + // returns an object representing a de-serialized query section of a + // URL. Query keys with multiple values are returned in an array. + // description: + // This string: + // + // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" + // + // results in this object structure: + // + // | { + // | foo: [ "bar", "baz" ], + // | thinger: " spaces =blah", + // | zonk: "blarg" + // | } + // + // Note that spaces and other urlencoded entities are correctly + // handled. + + // FIXME: should we grab the URL string if we're not passed one? + var ret = {}; + var qp = str.split("&"); + var dec = decodeURIComponent; + _d.forEach(qp, function(item){ + if(item.length){ + var parts = item.split("="); + var name = dec(parts.shift()); + var val = dec(parts.join("=")); + if(_d.isString(ret[name])){ + ret[name] = [ret[name]]; + } + if(_d.isArray(ret[name])){ + ret[name].push(val); + }else{ + ret[name] = val; + } + } + }); + return ret; // Object + } + + /* + from refactor.txt: + + all bind() replacement APIs take the following argument structure: + + { + url: "blah.html", + + // all below are optional, but must be supported in some form by + // every IO API + timeout: 1000, // milliseconds + handleAs: "text", // replaces the always-wrong "mimetype" + content: { + key: "value" + }, + + // browser-specific, MAY be unsupported + sync: true, // defaults to false + form: dojo.byId("someForm") + } + */ + + // need to block async callbacks from snatching this thread as the result + // of an async callback might call another sync XHR, this hangs khtml forever + // must checked by watchInFlight() + + dojo._blockAsync = false; + + dojo._contentHandlers = { + "text": function(xhr){ return xhr.responseText; }, + "json": function(xhr){ + if(!dojo.config.usePlainJson){ + console.warn("Consider using mimetype:text/json-comment-filtered" + + " to avoid potential security issues with JSON endpoints" + + " (use djConfig.usePlainJson=true to turn off this message)"); + } + return (xhr.status == 204) ? undefined : _d.fromJson(xhr.responseText); + }, + "json-comment-filtered": function(xhr){ + // NOTE: we provide the json-comment-filtered option as one solution to + // the "JavaScript Hijacking" issue noted by Fortify and others. It is + // not appropriate for all circumstances. + + var value = xhr.responseText; + var cStartIdx = value.indexOf("\/*"); + var cEndIdx = value.lastIndexOf("*\/"); + if(cStartIdx == -1 || cEndIdx == -1){ + throw new Error("JSON was not comment filtered"); + } + return (xhr.status == 204) ? undefined : + _d.fromJson(value.substring(cStartIdx+2, cEndIdx)); + }, + "javascript": function(xhr){ + // FIXME: try Moz and IE specific eval variants? + return _d.eval(xhr.responseText); + }, + "xml": function(xhr){ + var result = xhr.responseXML; + if(_d.isIE && (!result || window.location.protocol == "file:")){ + _d.forEach(["MSXML2", "Microsoft", "MSXML", "MSXML3"], function(prefix){ + try{ + var dom = new ActiveXObject(prefix + ".XMLDOM"); + dom.async = false; + dom.loadXML(xhr.responseText); + result = dom; + }catch(e){ /* Not available. Squelch and try next one. */ } + }); + } + return result; // DOMDocument + } + }; + + dojo._contentHandlers["json-comment-optional"] = function(xhr){ + var handlers = _d._contentHandlers; + try{ + return handlers["json-comment-filtered"](xhr); + }catch(e){ + return handlers["json"](xhr); + } + }; + + /*===== + dojo.__IoArgs = function(){ + // url: String + // URL to server endpoint. + // content: Object? + // Contains properties with string values. These + // properties will be serialized as name1=value2 and + // passed in the request. + // timeout: Integer? + // Milliseconds to wait for the response. If this time + // passes, the then error callbacks are called. + // form: DOMNode? + // DOM node for a form. Used to extract the form values + // and send to the server. + // preventCache: Boolean? + // Default is false. If true, then a + // "dojo.preventCache" parameter is sent in the request + // with a value that changes with each request + // (timestamp). Useful only with GET-type requests. + // handleAs: String? + // Acceptable values depend on the type of IO + // transport (see specific IO calls for more information). + // load: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The load function will be + // called on a successful response. + // error: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The error function will + // be called in an error case. + // handle: Function? + // function(response, ioArgs){}. response is an Object, ioArgs + // is of type dojo.__IoCallbackArgs. The handle function will + // be called in either the successful or error case. For + // the load, error and handle functions, the ioArgs object + // will contain the following properties: + this.url = url; + this.content = content; + this.timeout = timeout; + this.form = form; + this.preventCache = preventCache; + this.handleAs = handleAs; + this.load = load; + this.error = error; + this.handle = handle; + } + =====*/ + + /*===== + dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){ + // args: Object + // the original object argument to the IO call. + // xhr: XMLHttpRequest + // For XMLHttpRequest calls only, the + // XMLHttpRequest object that was used for the + // request. + // url: String + // The final URL used for the call. Many times it + // will be different than the original args.url + // value. + // query: String + // For non-GET requests, the + // name1=value1&name2=value2 parameters sent up in + // the request. + // handleAs: String + // The final indicator on how the response will be + // handled. + // id: String + // For dojo.io.script calls only, the internal + // script ID used for the request. + // canDelete: Boolean + // For dojo.io.script calls only, indicates + // whether the script tag that represents the + // request can be deleted after callbacks have + // been called. Used internally to know when + // cleanup can happen on JSONP-type requests. + // json: Object + // For dojo.io.script calls only: holds the JSON + // response for JSONP-type requests. Used + // internally to hold on to the JSON responses. + // You should not need to access it directly -- + // the same object should be passed to the success + // callbacks directly. + this.args = args; + this.xhr = xhr; + this.url = url; + this.query = query; + this.handleAs = handleAs; + this.id = id; + this.canDelete = canDelete; + this.json = json; + } + =====*/ + + + + dojo._ioSetArgs = function(/*dojo.__IoArgs*/args, + /*Function*/canceller, + /*Function*/okHandler, + /*Function*/errHandler){ + // summary: + // sets up the Deferred and ioArgs property on the Deferred so it + // can be used in an io call. + // args: + // The args object passed into the public io call. Recognized properties on + // the args object are: + // canceller: + // The canceller function used for the Deferred object. The function + // will receive one argument, the Deferred object that is related to the + // canceller. + // okHandler: + // The first OK callback to be registered with Deferred. It has the opportunity + // to transform the OK response. It will receive one argument -- the Deferred + // object returned from this function. + // errHandler: + // The first error callback to be registered with Deferred. It has the opportunity + // to do cleanup on an error. It will receive two arguments: error (the + // Error object) and dfd, the Deferred object returned from this function. + + var ioArgs = {args: args, url: args.url}; + + //Get values from form if requestd. + var formObject = null; + if(args.form){ + var form = _d.byId(args.form); + //IE requires going through getAttributeNode instead of just getAttribute in some form cases, + //so use it for all. See #2844 + var actnNode = form.getAttributeNode("action"); + ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); + formObject = _d.formToObject(form); + } + + // set up the query params + var miArgs = [{}]; + + if(formObject){ + // potentially over-ride url-provided params w/ form values + miArgs.push(formObject); + } + if(args.content){ + // stuff in content over-rides what's set by form + miArgs.push(args.content); + } + if(args.preventCache){ + miArgs.push({"dojo.preventCache": new Date().valueOf()}); + } + ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs)); + + // .. and the real work of getting the deferred in order, etc. + ioArgs.handleAs = args.handleAs || "text"; + var d = new _d.Deferred(canceller); + d.addCallbacks(okHandler, function(error){ + return errHandler(error, d); + }); + + //Support specifying load, error and handle callback functions from the args. + //For those callbacks, the "this" object will be the args object. + //The callbacks will get the deferred result value as the + //first argument and the ioArgs object as the second argument. + var ld = args.load; + if(ld && _d.isFunction(ld)){ + d.addCallback(function(value){ + return ld.call(args, value, ioArgs); + }); + } + var err = args.error; + if(err && _d.isFunction(err)){ + d.addErrback(function(value){ + return err.call(args, value, ioArgs); + }); + } + var handle = args.handle; + if(handle && _d.isFunction(handle)){ + d.addBoth(function(value){ + return handle.call(args, value, ioArgs); + }); + } + + d.ioArgs = ioArgs; + + // FIXME: need to wire up the xhr object's abort method to something + // analagous in the Deferred + return d; + } + + var _deferredCancel = function(/*Deferred*/dfd){ + //summary: canceller function for dojo._ioSetArgs call. + + dfd.canceled = true; + var xhr = dfd.ioArgs.xhr; + var _at = typeof xhr.abort; + if(_at == "function" || _at == "unknown"){ + xhr.abort(); + } + var err = new Error("xhr cancelled"); + err.dojoType = "cancel"; + return err; + } + var _deferredOk = function(/*Deferred*/dfd){ + //summary: okHandler function for dojo._ioSetArgs call. + + return _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr); + } + var _deferError = function(/*Error*/error, /*Deferred*/dfd){ + //summary: errHandler function for dojo._ioSetArgs call. + + // console.debug("xhr error in:", dfd.ioArgs.xhr); + console.debug(error); + return error; + } + + var _makeXhrDeferred = function(/*dojo.__XhrArgs*/args){ + //summary: makes the Deferred object for this xhr request. + var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError); + //Pass the args to _xhrObj, to allow xhr iframe proxy interceptions. + dfd.ioArgs.xhr = _d._xhrObj(dfd.ioArgs.args); + return dfd; + } + + // avoid setting a timer per request. It degrades performance on IE + // something fierece if we don't use unified loops. + var _inFlightIntvl = null; + var _inFlight = []; + var _watchInFlight = function(){ + //summary: + // internal method that checks each inflight XMLHttpRequest to see + // if it has completed or if the timeout situation applies. + + var now = (new Date()).getTime(); + // make sure sync calls stay thread safe, if this callback is called + // during a sync call and this results in another sync call before the + // first sync call ends the browser hangs + if(!_d._blockAsync){ + // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating + // note: the second clause is an assigment on purpose, lint may complain + for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){ + var dfd = tif.dfd; + try{ + if(!dfd || dfd.canceled || !tif.validCheck(dfd)){ + _inFlight.splice(i--, 1); + }else if(tif.ioCheck(dfd)){ + _inFlight.splice(i--, 1); + tif.resHandle(dfd); + }else if(dfd.startTime){ + //did we timeout? + if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){ + _inFlight.splice(i--, 1); + var err = new Error("timeout exceeded"); + err.dojoType = "timeout"; + dfd.errback(err); + //Cancel the request so the io module can do appropriate cleanup. + dfd.cancel(); + } + } + }catch(e){ + // FIXME: make sure we errback! (fixed? remove console.debug?) + console.debug(e); + dfd.errback(new Error("_watchInFlightError!")); + } + } + } + + if(!_inFlight.length){ + clearInterval(_inFlightIntvl); + _inFlightIntvl = null; + return; + } + + } + + dojo._ioCancelAll = function(){ + //summary: Cancels all pending IO requests, regardless of IO type + //(xhr, script, iframe). + try{ + _d.forEach(_inFlight, function(i){ + i.dfd.cancel(); + }); + }catch(e){/*squelch*/} + } + + //Automatically call cancel all io calls on unload + //in IE for trac issue #2357. + if(_d.isIE){ + _d.addOnUnload(_d._ioCancelAll); + } + + _d._ioWatch = function(/*Deferred*/dfd, + /*Function*/validCheck, + /*Function*/ioCheck, + /*Function*/resHandle){ + //summary: watches the io request represented by dfd to see if it completes. + //dfd: + // The Deferred object to watch. + //validCheck: + // Function used to check if the IO request is still valid. Gets the dfd + // object as its only argument. + //ioCheck: + // Function used to check if basic IO call worked. Gets the dfd + // object as its only argument. + //resHandle: + // Function used to process response. Gets the dfd + // object as its only argument. + if(dfd.ioArgs.args.timeout){ + dfd.startTime = (new Date()).getTime(); + } + _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle}); + if(!_inFlightIntvl){ + _inFlightIntvl = setInterval(_watchInFlight, 50); + } + _watchInFlight(); // handle sync requests + } + + var _defaultContentType = "application/x-www-form-urlencoded"; + + var _validCheck = function(/*Deferred*/dfd){ + return dfd.ioArgs.xhr.readyState; //boolean + } + var _ioCheck = function(/*Deferred*/dfd){ + return 4 == dfd.ioArgs.xhr.readyState; //boolean + } + var _resHandle = function(/*Deferred*/dfd){ + var xhr = dfd.ioArgs.xhr; + if(_d._isDocumentOk(xhr)){ + dfd.callback(dfd); + }else{ + var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status); + err.status = xhr.status; + err.responseText = xhr.responseText; + dfd.errback(err); + } + } + + var _doIt = function(/*String*/type, /*Deferred*/dfd){ + // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open). + // workaround for IE6's apply() "issues" + var ioArgs = dfd.ioArgs; + var args = ioArgs.args; + var xhr = ioArgs.xhr; + xhr.open(type, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined); + if(args.headers){ + for(var hdr in args.headers){ + if(hdr.toLowerCase() === "content-type" && !args.contentType){ + args.contentType = args.headers[hdr]; + }else{ + xhr.setRequestHeader(hdr, args.headers[hdr]); + } + } + } + // FIXME: is this appropriate for all content types? + xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType); + if(!args.headers || !args.headers["X-Requested-With"]){ + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + } + // FIXME: set other headers here! + try{ + xhr.send(ioArgs.query); + }catch(e){ + dfd.cancel(); + } + _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); + xhr = null; + return dfd; //Deferred + } + + dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){ + //summary: Adds query params discovered by the io deferred construction to the URL. + //Only use this for operations which are fundamentally GET-type operations. + if(ioArgs.query.length){ + ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query; + ioArgs.query = null; + } + } + + /*===== + dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, { + constructor: function(){ + // summary: + // In addition to the properties listed for the dojo._IoArgs type, + // the following properties are allowed for dojo.xhr* methods. + // handleAs: String? + // Acceptable values are: text (default), json, json-comment-optional, + // json-comment-filtered, javascript, xml + // sync: Boolean? + // false is default. Indicates whether the request should + // be a synchronous (blocking) request. + // headers: Object? + // Additional HTTP headers to send in the request. + this.handleAs = handleAs; + this.sync = sync; + this.headers = headers; + } + }); + =====*/ + + dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){ + // summary: + // Sends an HTTP request with the given method. If the request has an + // HTTP body, then pass true for hasBody. The method argument should be uppercase. + // Also look at dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts + // for those HTTP methods. There are also methods for "raw" PUT and POST methods + // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively. + var dfd = _makeXhrDeferred(args); + if(!hasBody){ + _d._ioAddQueryToUrl(dfd.ioArgs); + } + return _doIt(method, dfd); // dojo.Deferred + } + + dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP GET request to the server. + return _d.xhr("GET", args); //dojo.Deferred + } + + dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ + //summary: + // Sends an HTTP POST request to the server. + return _d.xhr("POST", args, true); // dojo.Deferred + } + + dojo.rawXhrPost = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP POST request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // postData: + // String. The raw data to send in the body of the POST request. + var dfd = _makeXhrDeferred(args); + dfd.ioArgs.query = args.postData; + return _doIt("POST", dfd); // dojo.Deferred + } + + dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP PUT request to the server. + return _d.xhr("PUT", args, true); // dojo.Deferred + } + + dojo.rawXhrPut = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP PUT request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // putData: + // String. The raw data to send in the body of the PUT request. + var dfd = _makeXhrDeferred(args); + var ioArgs = dfd.ioArgs; + if(args.putData){ + ioArgs.query = args.putData; + args.putData = null; + } + return _doIt("PUT", dfd); // dojo.Deferred + } + + dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP DELETE request to the server. + return _d.xhr("DELETE", args); //dojo.Deferred + } + + /* + dojo.wrapForm = function(formNode){ + //summary: + // A replacement for FormBind, but not implemented yet. + + // FIXME: need to think harder about what extensions to this we might + // want. What should we allow folks to do w/ this? What events to + // set/send? + throw new Error("dojo.wrapForm not yet implemented"); + } + */ +})(); + +} + +if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.fx"] = true; +dojo.provide("dojo._base.fx"); + + + + + + +/* + Animation losely package based on Dan Pupius' work, contributed under CLA: + http://pupius.co.uk/js/Toolkit.Drawing.js +*/ +(function(){ + + var d = dojo; + + dojo._Line = function(/*int*/ start, /*int*/ end){ + // summary: + // dojo._Line is the object used to generate values from a start value + // to an end value + // start: int + // Beginning value for range + // end: int + // Ending value for range + this.start = start; + this.end = end; + this.getValue = function(/*float*/ n){ + // summary: returns the point on the line + // n: a floating point number greater than 0 and less than 1 + return ((this.end - this.start) * n) + this.start; // Decimal + } + } + + d.declare("dojo._Animation", null, { + // summary + // A generic animation class that fires callbacks into its handlers + // object at various states. Nearly all dojo animation functions + // return an instance of this method, usually without calling the + // .play() method beforehand. Therefore, you will likely need to + // call .play() on instances of dojo._Animation when one is + // returned. + constructor: function(/*Object*/ args){ + d.mixin(this, args); + if(d.isArray(this.curve)){ + /* curve: Array + pId: a */ + this.curve = new d._Line(this.curve[0], this.curve[1]); + } + }, + + // duration: Integer + // The time in milliseonds the animation will take to run + duration: 350, + + /*===== + // curve: dojo._Line||Array + // A two element array of start and end values, or a dojo._Line instance to be + // used in the Animation. + curve: null, + + // easing: Function + // A Function to adjust the acceleration (or deceleration) of the progress + // across a dojo._Line + easing: null, + =====*/ + + // repeat: Integer + // The number of times to loop the animation + repeat: 0, + + // rate: Integer + // the time in milliseconds to wait before advancing to next frame + // (used as a fps timer: rate/1000 = fps) + rate: 10 /* 100 fps */, + + /*===== + // delay: Integer + // The time in milliseconds to wait before starting animation after it has been .play()'ed + delay: null, + + // events + // + // beforeBegin: Event + // Synthetic event fired before a dojo._Animation begins playing (synchronous) + beforeBegin: null, + + // onBegin: Event + // Synthetic event fired as a dojo._Animation begins playing (useful?) + onBegin: null, + + // onAnimate: Event + // Synthetic event fired at each interval of a dojo._Animation + onAnimate: null, + + // onEnd: Event + // Synthetic event fired after the final frame of a dojo._Animation + onEnd: null, + + // onPlay: Event + // Synthetic event fired any time a dojo._Animation is play()'ed + onPlay: null, + + // onPause: Event + // Synthetic event fired when a dojo._Animation is paused + onPause: null, + + // onStop: Event + // Synthetic event fires when a dojo._Animation is stopped + onStop: null, + + =====*/ + + _percent: 0, + _startRepeatCount: 0, + + _fire: function(/*Event*/ evt, /*Array?*/ args){ + // summary: + // Convenience function. Fire event "evt" and pass it the + // arguments specified in "args". + // evt: + // The event to fire. + // args: + // The arguments to pass to the event. + try{ + if(this[evt]){ + this[evt].apply(this, args||[]); + } + }catch(e){ + // squelch and log because we shouldn't allow exceptions in + // synthetic event handlers to cause the internal timer to run + // amuck, potentially pegging the CPU. I'm not a fan of this + // squelch, but hopefully logging will make it clear what's + // going on + console.error("exception in animation handler for:", evt); + console.error(e); + } + return this; // dojo._Animation + }, + + play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ + // summary: + // Start the animation. + // delay: + // How many milliseconds to delay before starting. + // gotoStart: + // If true, starts the animation from the beginning; otherwise, + // starts it from its current position. + var _t = this; + if(gotoStart){ + _t._stopTimer(); + _t._active = _t._paused = false; + _t._percent = 0; + }else if(_t._active && !_t._paused){ + return _t; // dojo._Animation + } + + _t._fire("beforeBegin"); + + var de = delay||_t.delay; + var _p = dojo.hitch(_t, "_play", gotoStart); + if(de > 0){ + setTimeout(_p, de); + return _t; // dojo._Animation + } + _p(); + return _t; + }, + + _play: function(gotoStart){ + var _t = this; + _t._startTime = new Date().valueOf(); + if(_t._paused){ + _t._startTime -= _t.duration * _t._percent; + } + _t._endTime = _t._startTime + _t.duration; + + _t._active = true; + _t._paused = false; + + var value = _t.curve.getValue(_t._percent); + if(!_t._percent){ + if(!_t._startRepeatCount){ + _t._startRepeatCount = _t.repeat; + } + _t._fire("onBegin", [value]); + } + + _t._fire("onPlay", [value]); + + _t._cycle(); + return _t; // dojo._Animation + }, + + pause: function(){ + // summary: Pauses a running animation. + this._stopTimer(); + if(!this._active){ return this; /*dojo._Animation*/ } + this._paused = true; + this._fire("onPause", [this.curve.getValue(this._percent)]); + return this; // dojo._Animation + }, + + gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){ + // summary: + // Sets the progress of the animation. + // percent: + // A percentage in decimal notation (between and including 0.0 and 1.0). + // andPlay: + // If true, play the animation after setting the progress. + this._stopTimer(); + this._active = this._paused = true; + this._percent = percent; + if(andPlay){ this.play(); } + return this; // dojo._Animation + }, + + stop: function(/*boolean?*/ gotoEnd){ + // summary: Stops a running animation. + // gotoEnd: If true, the animation will end. + if(!this._timer){ return this; /* dojo._Animation */ } + this._stopTimer(); + if(gotoEnd){ + this._percent = 1; + } + this._fire("onStop", [this.curve.getValue(this._percent)]); + this._active = this._paused = false; + return this; // dojo._Animation + }, + + status: function(){ + // summary: Returns a string token representation of the status of + // the animation, one of: "paused", "playing", "stopped" + if(this._active){ + return this._paused ? "paused" : "playing"; // String + } + return "stopped"; // String + }, + + _cycle: function(){ + var _t = this; + if(_t._active){ + var curr = new Date().valueOf(); + var step = (curr - _t._startTime) / (_t._endTime - _t._startTime); + + if(step >= 1){ + step = 1; + } + _t._percent = step; + + // Perform easing + if(_t.easing){ + step = _t.easing(step); + } + + _t._fire("onAnimate", [_t.curve.getValue(step)]); + + if(_t._percent < 1){ + _t._startTimer(); + }else{ + _t._active = false; + + if(_t.repeat > 0){ + _t.repeat--; + _t.play(null, true); + }else if(_t.repeat == -1){ + _t.play(null, true); + }else{ + if(_t._startRepeatCount){ + _t.repeat = _t._startRepeatCount; + _t._startRepeatCount = 0; + } + } + _t._percent = 0; + _t._fire("onEnd"); + _t._stopTimer(); + } + } + return _t; // dojo._Animation + } + }); + + var ctr = 0; + var _globalTimerList = []; + var runner = { + run: function(){ } + }; + var timer = null; + dojo._Animation.prototype._startTimer = function(){ + // this._timer = setTimeout(dojo.hitch(this, "_cycle"), this.rate); + if(!this._timer){ + this._timer = d.connect(runner, "run", this, "_cycle"); + ctr++; + } + if(!timer){ + timer = setInterval(d.hitch(runner, "run"), this.rate); + } + }; + + dojo._Animation.prototype._stopTimer = function(){ + if(this._timer){ + d.disconnect(this._timer); + this._timer = null; + ctr--; + } + if(ctr <= 0){ + clearInterval(timer); + timer = null; + ctr = 0; + } + }; + + var _makeFadeable = (d.isIE) ? function(node){ + // only set the zoom if the "tickle" value would be the same as the + // default + var ns = node.style; + if(!ns.zoom.length && d.style(node, "zoom") == "normal"){ + // make sure the node "hasLayout" + // NOTE: this has been tested with larger and smaller user-set text + // sizes and works fine + ns.zoom = "1"; + // node.style.zoom = "normal"; + } + // don't set the width to auto if it didn't already cascade that way. + // We don't want to f anyones designs + if(!ns.width.length && d.style(node, "width") == "auto"){ + ns.width = "auto"; + } + } : function(){}; + + dojo._fade = function(/*Object*/ args){ + // summary: + // Returns an animation that will fade the node defined by + // args.node from the start to end values passed (args.start + // args.end) (end is mandatory, start is optional) + + args.node = d.byId(args.node); + var fArgs = d.mixin({ properties: {} }, args); + var props = (fArgs.properties.opacity = {}); + props.start = !("start" in fArgs) ? + function(){ + return Number(d.style(fArgs.node, "opacity")); + } : fArgs.start; + props.end = fArgs.end; + + var anim = d.animateProperty(fArgs); + d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node)); + + return anim; // dojo._Animation + } + + /*===== + dojo.__FadeArgs = function(node, duration, easing){ + // node: DOMNode|String + // The node referenced in the animation + // duration: Integer? + // Duration of the animation in milliseconds. + // easing: Function? + // An easing function. + this.node = node; + this.duration = duration; + this.easing = easing; + } + =====*/ + + dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){ + // summary: + // Returns an animation that will fade node defined in 'args' from + // its current opacity to fully opaque. + return d._fade(d.mixin({ end: 1 }, args)); // dojo._Animation + } + + dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){ + // summary: + // Returns an animation that will fade node defined in 'args' + // from its current opacity to fully transparent. + return d._fade(d.mixin({ end: 0 }, args)); // dojo._Animation + } + + dojo._defaultEasing = function(/*Decimal?*/ n){ + // summary: The default easing function for dojo._Animation(s) + return 0.5 + ((Math.sin((n + 1.5) * Math.PI))/2); + } + + var PropLine = function(properties){ + // PropLine is an internal class which is used to model the values of + // an a group of CSS properties across an animation lifecycle. In + // particular, the "getValue" function handles getting interpolated + // values between start and end for a particular CSS value. + this._properties = properties; + for(var p in properties){ + var prop = properties[p]; + if(prop.start instanceof d.Color){ + // create a reusable temp color object to keep intermediate results + prop.tempColor = new d.Color(); + } + } + this.getValue = function(r){ + var ret = {}; + for(var p in this._properties){ + var prop = this._properties[p]; + var start = prop.start; + if(start instanceof d.Color){ + ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss(); + }else if(!d.isArray(start)){ + ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units||"px" : ""); + } + } + return ret; + } + } + + /*===== + dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], { + // Properties: Object? + // A hash map of style properties to Objects describing the transition, + // such as the properties of dojo._Line with an additional 'unit' property + properties: {} + + //TODOC: add event callbacks + }); + =====*/ + + dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){ + // summary: + // Returns an animation that will transition the properties of + // node defined in 'args' depending how they are defined in + // 'args.properties' + // + // description: + // dojo.animateProperty is the foundation of most dojo.fx + // animations. It takes an object of "properties" corresponding to + // style properties, and animates them in parallel over a set + // duration. + // + // example: + // A simple animation that changes the width of the specified node. + // | dojo.animateProperty({ + // | node: "nodeId", + // | properties: { width: 400 }, + // | }).play(); + // Dojo figures out the start value for the width and converts the + // integer specified for the width to the more expressive but + // verbose form `{ width: { end: '400', units: 'px' } }` which you + // can also specify directly + // example: + // animate width, height, and padding over 2 seconds...the + // pedantic way: + // | dojo.animateProperty({ node: node, duration:2000, + // | properties: { + // | width: { start: '200', end: '400', unit:"px" }, + // | height: { start:'200', end: '400', unit:"px" }, + // | paddingTop: { start:'5', end:'50', unit:"px" } + // | } + // | }).play(); + // + // example: + // plug in a different easing function and register a callback for + // when the animation ends. Easing functions accept values between + // zero and one and return a value on that basis. In this case, an + // exponential-in curve. + // | dojo.animateProperty({ + // | node: "nodeId", + // | // dojo figures out the start value + // | properties: { width: { end: 400 } }, + // | easing: function(n){ + // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1)); + // | }, + // | onEnd: function(){ + // | // called when the animation finishes + // | } + // | }).play(500); // delay playing half a second + + args.node = d.byId(args.node); + if(!args.easing){ args.easing = d._defaultEasing; } + + var anim = new d._Animation(args); + d.connect(anim, "beforeBegin", anim, function(){ + var pm = {}; + for(var p in this.properties){ + // Make shallow copy of properties into pm because we overwrite + // some values below. In particular if start/end are functions + // we don't want to overwrite them or the functions won't be + // called if the animation is reused. + if(p == "width" || p == "height"){ + this.node.display = "block"; + } + var prop = this.properties[p]; + prop = pm[p] = d.mixin({}, (d.isObject(prop) ? prop: { end: prop })); + + if(d.isFunction(prop.start)){ + prop.start = prop.start(); + } + if(d.isFunction(prop.end)){ + prop.end = prop.end(); + } + var isColor = (p.toLowerCase().indexOf("color") >= 0); + function getStyle(node, p){ + // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable: + var v = ({height: node.offsetHeight, width: node.offsetWidth})[p]; + if(v !== undefined){ return v; } + v = d.style(node, p); + return (p=="opacity") ? Number(v) : (isColor ? v : parseFloat(v)); + } + if(!("end" in prop)){ + prop.end = getStyle(this.node, p); + }else if(!("start" in prop)){ + prop.start = getStyle(this.node, p); + } + + if(isColor){ + prop.start = new d.Color(prop.start); + prop.end = new d.Color(prop.end); + }else{ + prop.start = (p == "opacity") ? Number(prop.start) : parseFloat(prop.start); + } + } + this.curve = new PropLine(pm); + }); + d.connect(anim, "onAnimate", anim, function(propValues){ + // try{ + for(var s in propValues){ + d.style(this.node, s, propValues[s]); + // this.node.style[s] = propValues[s]; + } + }); + return anim; // dojo._Animation + } + + dojo.anim = function( /*DOMNode|String*/ node, + /*Object*/ properties, + /*Integer?*/ duration, + /*Function?*/ easing, + /*Function?*/ onEnd, + /*Integer?*/ delay){ + // summary: + // A simpler interface to `dojo.animateProperty()`, also returns + // an instance of `dojo._Animation` but begins the animation + // immediately, unlike nearly every other Dojo animation API. + // description: + // `dojo.anim` is a simpler (but somewhat less powerful) version + // of `dojo.animateProperty`. It uses defaults for many basic properties + // and allows for positional parameters to be used in place of the + // packed "property bag" which is used for other Dojo animation + // methods. + // + // The `dojo._Animation` object returned from `dojo.anim` will be + // already playing when it is returned from this function, so + // calling play() on it again is (usually) a no-op. + // node: + // a DOM node or the id of a node to animate CSS properties on + // duration: + // The number of milliseconds over which the animation + // should run. Defaults to the global animation default duration + // (350ms). + // easing: + // An easing function over which to calculate acceleration + // and deceleration of the animation through its duration. + // A default easing algorithm is provided, but you may + // plug in any you wish. A large selection of easing algorithms + // are available in `dojox.fx.easing`. + // onEnd: + // A function to be called when the animation finishes + // running. + // delay: + // The number of milliseconds to delay beginning the + // animation by. The default is 0. + // example: + // Fade out a node + // | dojo.anim("id", { opacity: 0 }); + // example: + // Fade out a node over a full second + // | dojo.anim("id", { opacity: 0 }, 1000); + return d.animateProperty({ + node: node, + duration: duration||d._Animation.prototype.duration, + properties: properties, + easing: easing, + onEnd: onEnd + }).play(delay||0); + } +})(); + +} + +if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojo._base.browser"] = true; +dojo.provide("dojo._base.browser"); + + + + + + + + + +//Need this to be the last code segment in base, so do not place any +//dojo.requireIf calls in this file. Otherwise, due to how the build system +//puts all requireIf dependencies after the current file, the require calls +//could be called before all of base is defined. +if(dojo.config.require){ + dojo.forEach(dojo.config.require, "dojo['require'](item);"); +} + +} + + + if(dojo.config.afterOnLoad && dojo.isBrowser){ + //Dojo is being added to the page after page load, so just trigger + //the init sequence after a timeout. Using a timeout so the rest of this + //script gets evaluated properly. This work needs to happen after the + //dojo.config.require work done in dojo._base. + window.setTimeout(dojo._fakeLoadInit, 1000); + } + +})(); + diff --git a/includes/js/dojo/fx.js b/includes/js/dojo/fx.js new file mode 100644 index 0000000..1473531 --- /dev/null +++ b/includes/js/dojo/fx.js @@ -0,0 +1,415 @@ +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 +} + +} diff --git a/includes/js/dojo/i18n.js b/includes/js/dojo/i18n.js new file mode 100644 index 0000000..6f417b3 --- /dev/null +++ b/includes/js/dojo/i18n.js @@ -0,0 +1,249 @@ +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 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
          ]]> + + + 1 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo Demo Engine Update]]> + + http://shaneosullivan.wordpress.com/2008/01/07/dojo-demo-engine-update/ + 2008-01-12T13:22:38Z + 2008-01-07T01:02:43Z + +

          A short while ago I posted about the demo engine I’m writing for the Dojo Ajax Toolkit. Click here to read that post or go to http://www.skynet.ie/~sos/js/demo/dojo/dojoc/demos/featureexplorer.html to see it in action.

          + +

          Features

          +

          Since that post, quite a lot of work has gone into both the features and the content of the demo engine, and the development process has solidified nicely. Some of the features include:

          +
            +
          • Tree navigation. A dijit.Tree widget, reading from a remote JSON data store is used to navigate the various demos.
          • +
          • Search feature. A dijit.form.ComboBox widget, reading from the same JSON data store as the tree, can be used to dynamically search for demos by matching any part of their name.
          • + +
          • Theme switcher. A dijit.form.ComboBox widget is used to switch between the CSS styles that Dojo provides.
          • +
          • URL addressability. Using a hash identifier (e.g. #Dojo_Query_By%20Class) in the URL of the demo engine causes it to open that demo when it has finished loading. For example, if you click this link, it will open the dojo.query demo showing you how to select nodes by class name. Opening any demo changes the URL in the browser to the URL for that demo, for easy bookmarking.
          • + +
          • Integrated build process. A simple build script is integrated with the Dojo build process. It builds a JSON data file listing all the existing demos and their respective files. It also builds files with URL links for each demo.
          • +
          +

          Content

          +

          To date, a lot of content has been added. Many, many widgets in Dijit and DojoX
          +
          have have been added, including the majority of the Form Controls.

          + +

          The latest, pretty cool additions have been the IO and dojo.query demos. These cover things such as:

          +
            +
          • Performing a XMLHttpRequest request
          • +
          • Using an iFrame transport
          • +
          • Submitting a form asynchronously
          • +
          • Loading remote JavaScript files from another domain
          • +
          • Selecting nodes using CSS selectors with dojo.query
          • + +
          • Performing operations on the NodeList returned from dojo.query
          • +
          • Attaching events to the NodeList returned from dojo.query
          • +
          +

          File Naming Scheme
          +A simple file naming scheme is used to add content to the demo framework. Each folder beneath the root folder represents a demo. Each file in a folder must be named the same as the folder, with five possible extensions. For example, given a folder with the name ‘Button‘, the possible files are:

          +
            + +
          • Button.html - this contains the demo to be displayed. Any JavaScript code inside <script> tags is executed, and any <link type=”text/css”> and <style> tags have their CSS loaded. The executed code is shown in the View tab, and and the source code is shown in the XML tab. The <html>, <head> and <body> tags are not required.
          • + +
          • Button.js - this contains pure JavaScript code that performs the same operations as Button.html, if applicable. It is not executed however. It is shown in the JS tab.
          • +
          • Button.txt - this contains the text description of the demo. It is loaded above the tabs.
          • +
          • Button.links - this contains a JSON array of URL links. The build script transforms these links into HTML, and the result is loaded into the Links tab. One neat feature of this is that all links from sub folders are integrated with the parent folder and displayed in a nested structure. Do, for example, clicking on Dijit will show all the links for all widgets in the Dijit project.
          • + +
          • Button.full.html - this is standalone demo, that is designed to run outside the demo engine. The View tab provides a link to the external file.
          • +
          • sort.txt - this contains a comma separated list of the child folders contained in this folder. It specifies the order in which to display the child demos in the tree. If this file is not specified, then an alphabetical ordering is used.
          • +
          +

          All of these files are optional. If a file in a folder does not match this naming scheme, it is assumed to be some kind of resource that the demo needs, such as an image or a JSON data file. In this case, the file can be named whatever you like.

          +

          The tree structure in the demo engine mirrors the folder layout.

          + +

          Still To Do

          +

          There remains quite a lot of work ahead. There are a few bugs remaining, some more cross browser testing is needed, and of course more content is required, particularly the base Dojo package.

          +

          In the relatively near future this should be opened up to the public for development. The Dojo folks are setting up a source control server for community additions, and this demo engine should be part of that. Once that is done, people can start adding all sorts of cool stuff!
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 3 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Navigating in an IE Modal Dialog]]> + + http://shaneosullivan.wordpress.com/2007/12/31/navigating-in-an-ie-modal-dialog/ + 2007-12-31T16:36:21Z + 2007-12-31T16:36:21Z + +

          Internet Explorer has a nice feature where a new window can be opened modally using the window.showModalDialog function, meaning that the page that opened it cannot be accessed until the new window is closed. This can be useful in many situations.

          + +

          However, the main limitation of IE Modal Dialogs (other than being non-standard), is that any hyperlink clicked in a modal dialog causes another, non modal, dialog to be opened, rather than opening the page linked to in the same window, as would happen in a normal pop up window.

          +

          The key to solving this problem is to note that a modal dialog only opens another window when a GET request is made, not when a POST request is made. However, an anchor tag automatically causes a GET request, so the solution is to:

          +
            +
          1. Catch the click on each anchor tag, cancel it,
          2. +
          3. Submit a dynamically created FORM element, with it’s method set to ‘POST’ and it’s action set to the URL of the link clicked.
          4. + +
          +

          While it is possible to put a listener on each anchor tag to achieve this, such an approach will not scale well. Instead, place a listener on the body tag. The example below is done using methods from the Dojo Ajax Toolkit, since that the toolkit I use the most, but you can of course use whatever methods you like to achieve the same result:

          +

          <script type="text/javascript">
          +dojo.addOnLoad(function(){
          +dojo.connect(dojo.body(), “onclick”, function(evt) {
          +if(evt.target.tagName != “A”) {return true;}
          +dojo.stopEvent(evt);
          +var form = document.createElement(”form”);
          +form.setAttribute(”target”, window.name ? window.name : “SrPopUp”);
          +form.setAttribute(”action”, url);
          +form.setAttribute(”method”,”POST”);
          +document.appendChild(form);
          +form.submit();
          +return false;
          +});
          +});
          + +</script>

          +

          This method assumes that you have control over the content of the page being shown in the modal dialog. It would also make sense to add a similar listener to the body tag for key events, as a user can trigger an anchor tag by tabbing to it and hitting enter.

          +

          Thanks to Danny Goodman and Steiner Overbeck Cook for coming up with this solution.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 1 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[A new Demo engine for Dojo]]> + + http://shaneosullivan.wordpress.com/2007/12/04/a-new-demo-engine-for-dojo/ + 2008-01-12T13:23:15Z + 2007-12-04T09:29:16Z + +

          A couple of weeks ago I saw a cool demo framework for an Ajax toolkit just released as open source. It’s a very slick implementation, with a tree listing all the various demos, and a tabbed area showing the implementation, and the widget in practice.

          + +

          So, I think to myself, this is exactly what the Dojo Ajax Toolkit is missing! Cut to today, and I’ve put the first rough cut at the demo framework on the web for people’s perusal. Check it out at http://www.skynet.ie/~sos/js/demo/dojo/dojoc/demos/featureexplorer.html .

          +

          Note: I have written a follow up post here.

          +

          Some of the features include:

          +
            + +
          • Tree navigation for the demos. Demos can be nested as deep as required.
          • +
          • View tab. This shows the widgets in action.
          • +
          • HTML tab. This shows how to instantiate the widget using HTML markup.
          • +
          • JS tab. This shows how to instantiate the widget using JavaScript code.
          • +
          • Links tab. This shows various hyperlinks to alternate content for that demo, e.g. the Dojo Book.
          • +
          • Demo description. Gives a text description of the demo.
          • +
          • Theme selector. This allows you to change from one CSS theme to another
          • +
          • Ability to link to standalone demos that open in a new page. This is useful for large demos that show the integration of many widgets together, and may not fit well within the demo framework itself. See the Dijit/Mail demo for an example of this.
          • + +
          • A build system that takes a very simple naming scheme for the demos, and creates a JSON data store that the framework runs off of. So, whenever a user adds a new demo, they simply have to re-run the build step, and that’s it! No need for a server side script, so you can run this right off your hard drive.
          • +
          +

          This is still very much beta code, and there are a couple of errors floating around, but those will of course be hunted down. There are also some Internet Explorer issues that I’ll get to soon, so try this in Firefox for now (update Dec 05 2007 - most of these have been solved, with one or two small bugs remaining). I’m in discussions to get this into the Dojo toolkit, so that the community at large can start adding in demos. I’ve put in quite a few already, but it’s so easy to do that this could become a huge resource for the Dojo community.

          +

          If you have any suggestions, please let me know.

          +

          Demo Framework
          + +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 3 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Upgrading Ubuntu Feisty Fawn (7.04) to Gutsy Gibbon (7.10)]]> + + http://shaneosullivan.wordpress.com/2007/10/18/upgrading-ubuntu-feisty-fawn-704-to-gutsy-gibbon-710/ + 2008-01-12T10:26:42Z + 2007-10-18T16:11:37Z + +

          Today I’ve begun the process of upgrading my Ubuntu installation of version 7.04 to version 7.10. To see my previous tutorial of getting Ubuntu installed on my IBM Thinkpad X41, see http://shaneosullivan.wordpress.com/2007/02/16/installing-ubuntu-edgy-on-a-thinkpad-x41-tablet/.

          + +

          This post lists whatever issues I found when upgrading, and my solutions to them. For the official instructions, see https://help.ubuntu.com/community/GutsyUpgrades.

          +

          Third Party software sources cause problems

          +

          My first problem was caused by having links to third party software distribution sites. When running the “update-manager -d” command, I received an error, saying the dbus couldn’t run.

          +

          This was caused by having third party software sources enabled that no longer existed, for whatever reason.

          + +

          To fix this:

          +
            +
          1. click “System/Administration/Software Sources”
          2. +
          3. Click the “Third-Party Software” tab
          4. +
          5. Deselect any non-Ubuntu software sources. You can always reselect them after the upgrade
          6. + +
          +

          Modifying the software channels gets stuck

          +

          When the second step in the “Distribution Upgrade” application is running, that is, the “Modifying the software channels” step, it got stuck downloading files. It would say

          +

          Downloading file 36 of 97

          +

          and stay at that number for a long time. This was not a bandwidth issue, it simply stopped. To fix this

          +
            +
          1. Click the “Cancel” button.
          2. + +
          3. Run the “update-manager -d” command again.
          4. +
          5. Repeat this each time it gets stuck downloading files. I had to do this four times for it to work completely.
          6. +
          +

          Dual monitors didn’t work correctly

          +

          When booted up with an external monitor plugged in, the desktop was fixed at 640 * 480 pixels resolution. I found someone else with a similar issue at http://ubuntuforums.org/showthread.php?t=566947 , but their solution didn’t work for me. I solved this by:

          + +
            +
          1. Unplugging the monitor.
          2. +
          3. Restart the machine, and log in.
          4. +
          5. Click “System/Administration/Screens and Graphics
          6. +
          7. Click the “Graphics Card” tab.
          8. + +
          9. Click the “Driver” button
          10. +
          11. From the “Driver” dropdown list, choose “i810 - Intel Integrated Graphics Chipsets
          12. +
          13. Restart the machine.
          14. + +
          +

          Compiz has problems with dual monitors

          +

          Compiz (the 3D graphics stuff) causes problems and refuses to work at all if I am using dual monitors. Still working on this one.

          +

          Some Eclipse plug-ins no longer work

          +

          As a Java developer, I often use the Eclipse development platform. I include some non-standard plugins in the application, like plugins for Subversion support. However, when Ubuntu is upgraded to 7.10, the base Eclipse platform in upgraded, but not the non-standard plugins, which stops some of them from working.

          +

          Update: actually, this didn’t fix my Eclipse problems, please ignore :-)

          + +

          The solution is to upgrade the plugins in the usual Eclipse manner:

          +
            +
          1. Open Eclipse
          2. +
          3. Click Help/Software Updates/Find and Install
          4. +
          5. Click Finish
          6. +
          7. Wait a while…
          8. +
          + +

          Running low on disk space after upgrade

          +

          My laptop was running out of disk space after the install, as it downloaded quite a few packages. I found a very good blog post on how to clean up your Ubuntu install at http://www.ubuntugeek.com/cleaning-up-all-unnecessary-junk-files-in-ubuntu.html.

          +

          Make sure to read comment #7 also, that alone saved me 1GB.

          +

          Some Thinkpad features no longer work

          +

          I found that some things didn’t work that did work before, for example the stylus pen and the middle ’scroller’ button of the mouse. If this happens, just reapply the settings I describe here, as the upgrade removed them. This solved the problems for me.

          + +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 25 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Introducing the new Dojo Image Widgets]]> + + http://shaneosullivan.wordpress.com/2007/10/13/introducing-the-new-dojo-image-widgets/ + 2008-01-08T11:23:13Z + 2007-10-13T11:09:13Z + + + + + + + + + + + + + + + + +

          In previous posts (here for the Dojo 0.4.3 version, here and here), I wrote how I wrote an image gallery for version 0.4.3 of the Dojo Ajax Toolkit, and how I was translating it for the latest version of the toolkit, version 1.0.

          + +

          Well, that work is now, finally, complete, and I have to say, I’m pretty damn happy with the results. The code is now part of the dojox.image project (dojox is the Dojo extensions project, for cool new code that may in the future make it into the core code base if enough people like/want it).

          +

          If you’d like to just see the gallery in action, have a look at the Photos page on my personal website, or see the links at the bottom of the post, otherwise, read on!

          +

          Update: changes have been made to the widgets since this post was written, resulting in some badly aligned images. This will be fixed in the next few days. (Oct 25th 2007)

          +

          Update: issue above has been fixed (Oct 29th 2007)

          + +

          All For One….

          +

          The gallery is composed of three widgets:

          +
            +
          • dojox.image.ThumbnailPicker - a widget to list many small images in either a horizontal or vertical orientation, scroll through them, and attach click events that other widgets can listen to
          • +
          • dojox.image.SlideShow - a widget that displays one image at a time, and can run a slideshow, changing the images every ‘x’ seconds.
          • +
          • dojox.image.Gallery - A wrapper around the ThumbnailPicker, and SlideShow widgets.
          • + +
          +

          Both the ThumbnailPicker and Slideshow widgets can also be used on their own, and have no dependencies on each other.
          +

          +

          Dojo Data Is Too Cool for School

          +

          One of the coolest features of all of these widgets is that they all feed off image data provided by the dojo.data API. What this basically means is that each widget can display images from any source, with no modification whatsoever. You simply pass it a Dojo data store, and is shows the pictures. Some of the data stores currently in the Dojo toolkit include:

          +
            +
          • dojo.data.ItemFileReadStore - pull in simple JSON data in an array. You could use this if you simply have a directory of images on your own web server you would like to display
          • +
          • dojox.data.FlickrRestStore (demo) - query the Flickr photo sharing website for images. This is all done on the browser, with no need for any server-side redirects. This is another of my additions to the Dojo toolkit - I love Flickr, feel free to check out my photo stream here. I previously wrote another blog post on this data store here.
          • + +
          • dojox.data.PicasaStore (demo) - query Google’s Picasa image sharing website for images. As with the Flickr data store, this is done on the browser, with no need for server side support.
          • +
          +

          and many more….. You can also write your own data store if you so desire, but the ones included in the toolkit should cover almost everything you might need.

          +

          Gimme, Gimme, Gimme!

          +

          So, how can I get this, you ask! Well, you can:

          + +

          Update: Dojo 1.0 is now released. Get it at http://www.dojotoolkit.org/downloads
          +As always, any and all feedback is welcome. Also, a big thanks to Peter Higgins, owner of the dojox.image project, and Jared Jurkiewicz, owner of the dojo.data project, for all their helpful ideas, and for reviewing/committing my code to the Dojo project.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 46 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo Grid has landed]]> + + http://shaneosullivan.wordpress.com/2007/10/05/dojo-grid-has-landed/ + 2007-10-14T21:46:03Z + 2007-10-05T13:23:17Z + +

          The previously announced Dojo Grid has landed in source control, and is in the nightly builds. It has all sorts of fancy functionality, like support for lazy loading huge data sets, individual styling of rows and columns, inline editing etc.

          + +

          Check it out at http://archive.dojotoolkit.org/nightly/checkout/dojox/grid/tests/

          +

          Very cool stuff!

          +

          Update: The Sitepen guys have recently blogged about the grid at http://www.sitepen.com/blog/2007/10/13/dojo-grid-update/

          +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 0 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[A TortoiseSVN replacement for Ubuntu]]> + + http://shaneosullivan.wordpress.com/2007/10/04/a-tortoisesvn-replacement-for-ubuntu/ + 2007-10-04T15:50:50Z + 2007-10-04T15:50:50Z + +

          I work on a number of open source projects, and many of them use the Subversion version control system to manage their code. Before my switch from Windows XP to Ubuntu Linux (which I am still ecstatically happy with btw), I became a big fan of TortoiseSVN, an extremely useful Subversion client that integrates itself directly into Windows Explorer.

          + +

          TortoiseSVN is simple to use, very intuitive, and does everything I need from it. You simply right click on a folder you want to store your checked out files in, give it the URL of the Subversion server, and it checks out the code, updates it, checks it back in (if you have permission), performs file diffs ….. basically everything you need to do is integrated right in with your file browser.

          +

          So, I miss this in Ubuntu, as TortoiseSVN is Windows only. However, I recently found a replacement, which integrates nicely with Nautilus, the Ubuntu file browser. While it is not as slick as TortoiseSVN, it works in a very similar way. You right click on a folder, and have a selection of SVN operations you can perform.

          +

          See http://marius.scurtescu.com/2005/08/24/nautilus_scripts_for_subversion for details.

          +

          Nautilus Subversion Menu

          +

          Nautilus Subversion Dialog

          +

          One thing that is missing from this is the display of icons in the file browser (Nautilus) to inform you of the state of a file - checked out, modified, not added to source control etc. Another person has developed a solution to this, which unfortunately I have not, yet, been able to get working, but perhaps you will have more luck.

          + +

          See http://www.kryogenix.org/days/2006/09/12/extremely-noddy-tortoisesvn-for-the-gnome-desktop for details on this.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 3 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Querying Flickr with Dojo!]]> + + http://shaneosullivan.wordpress.com/2007/09/22/querying-flickr-with-dojo/ + 2007-09-22T18:26:51Z + 2007-09-22T16:10:05Z + +

          I’ve recently submitted a new data store for the Dojo Ajax Toolkit that makes it very simple to query Flickr for your and other peoples images. For those not familiar with Flickr, it is a photo sharing website, one of the most popular on the net. However, what makes it quite special is the comprehensive public APIs that it exposes.

          + +

          While these APIs are extremely useful, however, they are also very complex, with a steep learning curve before you can even get started. In steps Dojo and their new Data API specification, whose stated aim is to have a single unified interface to all data sources, so that users of a data store won’t have to care if they’re reading from a database, from a XML or JSON file, or from some remote service like Flickr.

          +

          So, long story short, I’ve written an implementation of the Dojo Data APIs to query data from Flickr. It is part of the DojoX project, and is called dojox.data.FlickrRestStore. It provides quite a few methods of querying for photos:

          +
            +
          • By one or more tags, matchine any or all of them
          • +
          • By user id
          • + +
          • By set id
          • +
          • Full text search
          • +
          • Sorting on date taken, date published or ‘interestingness’
          • +
          +

          FlickrRestStore also performs caching of image data, so if you request the data twice it won’t make a second remote request.

          +

          The store is also designed to be accessed by multiple clients simultaneously. If two clients request the same data, only one request is made, with both clients being notified of the identical results.

          +

          Examples

          + +

          I’ve put a fairly comprehensive set of examples in the Dojo book at http://dojotoolkit.org/book/dojo-book-0-9/part-3-programmatic-dijit-and-dojo
          +/using-dojo-data/available-stores/flickr-rest-s#examples
          .

          +

          You can see a Demo of it running at http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/data/demos/demo_FlickrRestStore.html .

          +

          The unit tests cover quite a few cases also, and you can see them at http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/data/tests/stores/FlickrRestStore.js

          +

          To get the code, you can:

          + + +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 3 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Specifying the callback function with the Flickr JSON APIs]]> + + http://shaneosullivan.wordpress.com/2007/09/13/specifying-the-callback-function-with-the-flickr-json-apis/ + 2007-09-13T09:54:53Z + 2007-09-13T09:31:30Z + +

          Flickr is a photo sharing website that has a very flexible set of APIs that other applications and websites can use to access the photos it stores. This post shows you how to specify a callback function that Flickr can call to pass your web application information on photos it stores.

          + +

          Quite a while ago I looked into the Flickr APIs for a website I was writing. Looking at the service that returns photo data in JSON (Javascript Object Notation), I noticed that it did so by calling a predefined function, jsonFlickrApi, passing in the data to that function. This seemed to be an obvious weak spot, since if more than one widget on a page were accessing the Flickr REST services, they would clash with each other, possibly receiving each others data. Obviously not a good thing.

          +

          Cut to today. I’ve been working on a JavaScript data store that operates against the Flickr REST services for the Dojo Ajax Toolkit, and had another look at the Flickr APIs. Now, whether I missed it before (doubtful, as I looked specifically for it), or the fine Flickr folk have listened to complaints (very likely), but there is now a parameter that can be passed to the Flickr API that specifies the callback function to use when the data is retrieved from Flickr.

          +

          All you have to do is pass a parameter jsoncallback to Flickr, with the name of the function you want to be called with the data, and thats it.

          + +

          E.g. if I had a function:

          +

          function myCallbackFunction(data) {

          +

          alert(”I received ” + data.photos.photo.length +” photos”);

          +

          }

          +

          I could then specify a <script> element in my HTML page to retrieve the data in a cross site manner (since you can’t make cross site XmlHttpRequest calls), like so:

          + +

          <SCRIPT type=”text/javascript” src=”http://www.flickr.com/services/rest/?format=json&jsoncallback=myCallbackFunction
          +&method=flickr.people.getPublicPhotos
          +&api_key=8c6803164dbc395fb7131c9d54843627
          +&user_id=44153025%40N00&per_page=1″>

          + +

          </SCRIPT>

          +

          Note the jsoncallback parameter in the src attribute. This results in JavaScript similar to:

          +

          myCallbackFunction({”photos”:{”page”:1, “pages”:489, “perpage”:1, “total”:”489″, “photo”:[{”id”:”1352049918″, “owner”:”44153025@N00″, “secret”:”5636009306″, “server”:”1111″, “farm”:2, “title”:”The Liffey Panorama”, “ispublic”:1, “isfriend”:0, “isfamily”:0}]}, “stat”:”ok”});

          + +

          being called.

          +

          Thanks Flickr! Nice to see them listening, and continually improving. This will make web applications built on Flickr much more robust, without the need of ridiculous hackery to get around unnecessarily difficult APIs. See http://www.flickr.com/services/api/response.json.html for the offical info on JSON responses.

          +

          Keep an eye out for my dojox.data.FlickrRestStore being release some day soon!!
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 0 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Image Gallery, Slideshow, and Flickr data source for Dojo 0.9]]> + + http://shaneosullivan.wordpress.com/2007/09/04/image-gallery-slideshow-and-flickr-data-source-for-dojo-09/ + 2007-09-05T08:32:22Z + 2007-09-04T23:32:51Z + +

          In a previous post (see here) I spoke about how I’d written an Image Gallery widget that worked with Dojo Ajax Toolkit version 0.4.2 and 0.4.3. I contacted the good folks at Dojo about updating it for the latest release, 0.9, and adding it to the toolkit.

          + +

          They were very receptive to the idea, with a few suggestions. Firstly, rather than having its own method of storing information, it should run off the dojo.data API, and secondly, it should go into the newly created dojox.image project.

          +

          Both of these suggestions were perfectly reasonable, so, cut to a few weeks later and I’ve finished my first pass at converting over the code from 0.4.3 to 0.9. As the Dojo APIs have changed drastically recently, this was no simple matter, but thats the subject of another blog post.

          +

          The code is not finished (or even checked in) yet, but you can see some examples of it running from test pages. There are two separate widgets:

          +
            +
          • dojox.image.SlideShow - a simple widget that runs a slide show of images, with urls loaded from a dojo.data store.
          • +
          • dojox.image.ImageGallery - this wraps the SlideShow widget, adding thumbnail views. This is also loaded from a dojo.data store.
          • +
          +

          Finally, I’ve implemented a dojo.data store that reads from the Flickr REST APIs, to pull down lists of photos. This store is more complex than the existing Flickr store, as it does caching of results, as well as going against a much more flexible API, meaning that expanding its capabilities later is possible.

          + +

          Whether or not this goes into dojox or not is still undecided. However, you can see the widgets running using this data store.

          +

          See the test files at http://www.skynet.ie/~sos/js2/dojox/image/tests for examples of this working.

          +

          Note that this is NOT the final code. It may still be buggy, may look different in the future (it’s pretty basic now), and the code will be cleaned up. However, if you have any suggestions, please feel free to leave comments on this post.

          +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 1 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo event performance tip]]> + + http://shaneosullivan.wordpress.com/2007/08/23/dojo-event-performance-tip/ + 2007-08-23T12:38:36Z + 2007-08-23T12:29:08Z + +

          When working with the Dojo Ajax Toolkit and using it’s dojo.event package to listen to DOM and custom events, the two most common approaches are:

          + +
            +
          1. Listen for an event (or function call) to be triggered on an object, and when it is to run a custom function, e.g.
            + var alertFn = function() {alert(”widget is showing”);};
            +dojo.event.connect(myWidget, “onShow”, alertFn);
          2. +

            This basically says that when the “onShow” function is called on some widget, called myWidget, run a function that does a simple alert. Of course you can do whatever you like inside this function.

            + +
          3. Listen for an event (or function call) to be triggered on an object, and when it is to run a custom function defined in the scope of an object, e.g.
            + var myObj = {
            +alertFn: function() {alert(”widget is showing”);}
            +};
            +dojo.event.connect(myWidget, “onShow”,myObj, “alertFn”);

            +

            This is saying that I have an object called “myObj“, which has a function called “alertFn“, and when the “onShow” method on “myWidget” is called, call the “alertFn” function on “myObj“.

          4. + +
          +

          I’ve found that when working with Dojo version 0.4.2 and 0.4.3, using the second approach is far far quicker. It turns out that internally, if you simply pass an anonymous function to Dojo, it will add that function to an internal structure and do a brute force search on that internal structure to make sure that this function is unique. This can result in a very significant performance hit - I’ve seen it take up over 50% of the startup time of a page on one of our more JavaScript heavy applications.

          +

          So, the conclusion is that if you are dojo.event.connect, which is one of the most useful functions in the toolkit, make sure to use four arguments to the function (approach #2 above), rather than just three (approach #1 above). If necessary, place a simple wrapper around the function as I have shown.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 0 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo 0.9 released]]> + + http://shaneosullivan.wordpress.com/2007/08/22/dojo-09-released/ + 2007-09-04T15:23:50Z + 2007-08-22T10:24:51Z + +

          The latest version of the Dojo Ajax Toolkit has just been released into the wild. Version 0.9 is a very streamlined progression of the toolkit, with many of the less essential features pushed out to another project, DojoX, and the Dojo widgets given their own project, Dijit.

          + +

          Another big change is the the main JavaScript file in Dojo, dojo.js, is no longer customisable. It now contains the most common features required by most web developers, and nothing more. As a result, it is far smaller than previous incarnations, down to ~24k when gzipped.

          +

          Some resources:

          +

          James Burke has written up a very informative post about what exactly is baked into the default build of dojo.js, which you can find at http://dojotoolkit.org/2007/08/22/dissecting-0-9s-dojo-js . Well worth a read.

          +

          Bill Keese wrote up a guided tour of 0.9 at http://dojotoolkit.org/2007/08/20/dijit-0-9-guided-tour.

          +

          The Dojo book for version 0.9 can be found at http://dojotoolkit.org/book/dojo-book-0-9-0. It’s almost finished (almost!) as of today, Aug 22 2007.

          + +

          The Ajaxian post on Dojo 0.9 can be read at http://ajaxian.com/archives/dojo-09-final-version-released.

          +

          Download the toolkit from http://build.dojotoolkit.org/0.9.0. This page gives some information on how you can use Dojo from AOL’s hosting servers, so you never have to download it at all.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 2 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo theme browser shows off Dijit widgets]]> + + http://shaneosullivan.wordpress.com/2007/08/17/dojo-theme-browser-shows-off-dijit-widgets/ + 2007-11-05T13:45:45Z + 2007-08-17T12:18:57Z + +

          The Dojo/Dijit (Dojo’s widget project) toolkit has created a page where you can view many of their widgets using the four CSS themes written so far for Dojo. This is cool for a couple of reasons.

          + +

          Firstly, it showcases the excellent work the Dijit developers have put into new themeing skins. There are four themes completed so far, and changing the look of Dojo is now as simple as including a different CSS file on your web page. All Dijit widgets now run off a single CSS file, rather than each having their own CSS file.

          +

          Secondly, it shows the usage of many of Dijit’s widgets (say that five times in a row! :-) ). Many of the demos from the 0.4.* days are gone now, and this is about as comprehensive a demo of Dojo’s widgets as you’re likely to see for a while. And yes, they are very nice indeed.

          +

          Go to http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/themes/themeTester.html to see the default theme (tundra) in use. Click on the “Alternate Themes” tab at the bottom of the page to switch themes to one of the alternate themes.

          + +

          Enjoy!

          +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 2 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Why is my web page slow? YSlow for Firebug can tell you.]]> + + http://shaneosullivan.wordpress.com/2007/07/25/why-is-my-web-page-slow-yslow-for-firebug-can-tell-you/ + 2007-07-26T08:28:03Z + 2007-07-25T15:08:30Z + +

          Yahoo have released a very useful extension for Firebug, which is itself an extension for Firefox, which can be used to analyze a web page’s performance. The extension, called YSlow, appears as a separate pane in Firebug, and gives you a whole load of statistics about your page.

          + +

          However, in addition to the bare numbers, it also gives your page a ranking, from zero to a hundred, and offers tips in plain English on you can improve the performance of your page.

          +

          All in all, a very handy little addition to a web developer’s toolkit.

          +

          One caveat is that it is of course not perfect - I tried to use it on Gmail, and it gave the site a 98% mark (practically impossible to achieve in reality), as the initial page of the Gmail application simply loads a single JavaScript page and not much else. Therefore, YSlow seems to only analyze content sent down the wire to browser upon page load, and ignores generated content. However, this does not take away from the fact that it is perfectly suitable for the vast majority of websites out there.

          +

          More information available here, or read Ajaxian’s post here.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 1 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Flickr and Dojo Image Gallery]]> + + http://shaneosullivan.wordpress.com/2007/07/03/flickr-and-dojo-image-gallery/ + 2007-07-19T10:44:19Z + 2007-07-03T15:53:33Z + +

          I have created an Image Gallery widget built on Dojo 0.4.3 that integrates nicely with Flickr. The widget it written entirely using JavaScript and CSS as a standalone Dojo widget, and is released under the same open source license as Dojo, the Academic Free License.

          + +

          For more information, including the code and examples, see http://www.skynet.ie/~sos/ajax/imagegallery.php.

          +

          Some of the features of the widget include:

          +
            +
          • Pages of thumbnails.
          • +
          • Intelligent pre-loading of images so the images you are looking at are loaded first.
          • +
          • Fade effects for transitioning of images
          • +
          • Populated using JSON data - any JSON data, not just Flickr.
          • +
          • Flickr integration - remotely load your Flickr images.
          • + +
          • Paging through a Flickr collection.
          • +
          • Slideshow
          • +
          +

          The widget can be instantiated from both HTML markup and programmatically in JavaScript.

          +

          To view your own Flickr pictures on the widget, without installing it on your own site, go to http://www.skynet.ie/~sos/ajax/yourpics.php .

          +

          There is a discussion thread in the Flickr API group at http://www.flickr.com/groups/api/discuss/72157600624623643.

          +

          So, why create this widget? Well, firstly I wanted a JavaScript image gallery that would list thumbnails and allow me to page through Flickr photos. Also, a slide show would have been nice. I was surprised to discover that I couldn’t find one that I liked in the twenty or so minutes I spent looking for one. I found a handy Flash based one, but I wanted a HTML and JavaScript only widget. So I grabbed Dojo 0.4.3 (my JavaScript library of choice right now) and wrote one.

          + +

          Here is a screen shot:

          +


          +Screenshot

          +

          The widget has all the features that I personally require at the moment, but will probably evolve as I think of new things to add. If you have any suggestions/bug reports, please comment on this post.

          +

          Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 7 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Is Dojo being ignored by developers?]]> + + http://shaneosullivan.wordpress.com/2007/06/19/is-dojo-being-ignored-by-developers/ + 2007-06-26T10:18:09Z + 2007-06-19T10:36:49Z + +

          The two main areas of interest for me over the last year or two, blog-wise that is, have been the Dojo Ajax toolkit, one of the more popular open source JavaScript toolkits, and Ubuntu Linux, the very popular operating system that is seen by many as the best chance Linux has of succeeding on the desktop.

          + +

          Due to the fact that my blog is hosted on Wordpress.com, I am provided with very detailed statistics on which blog posts are more popular, what days they are accessed on etc. Looking at these, a very definite trend has become apparent

          +

          While the number of hits received by the Ubuntu blogs remains more or less steady, hits on Dojo blog posts falls dramatically on the weekend.

          +

          While this is not an exact measurement by any means, it points to a worrying possibility. People are obviously working with Ubuntu on their spare time, installing it, upgrading, adding applications and window managers etc, and need help doing this. They are personally interested in Ubuntu, not just professionally. This is one of the main reasons for Ubuntu’s success - people are excited and motivated by it. They want to work and play with it on their own time.

          + +

          This does not seem to be the case for Dojo.

          +

          Dojo has the backing of many large and small companies, including two I have worked for, my previous employer IBM, and my current employer Curam. Both of these are attracted to Dojo for a number of reasons, chief among them being it’s good design and wide range of features. The very large size of the toolkit is not a problem for them (and corporations in general) because it will be included in websites that employees will use to do their everyday work tasks (e.g. using a corporate installation of IBM WebSphere Portal), so the JavaScript is cached and the performance hit is avoided.

          +

          However, for hobbyists, this is not the case. A person might only visit a single page on their website, and a ~200KB overhead for perhaps something simple like a collapsible menu and some fading effects is simply not feasible. I’ve experienced this recently when writing a simple website for myself - all I wanted was some fading/sliding effects, but the huge overhead just wasn’t worth it. And I am a very big supporter of Dojo (I’ve contributed code even - here and here), and use it every day at work.

          + +

          The Dojo team are working hard on the 0.9 release, which is addressing many of these issues, bringing the base size down to a more manageable size (at time of writing dojo.js is down to 68KB). I look forward to the day when my site statistics change, when Dojo can stand on the shoulders of many thousands of enthusiastic hackers rather than being held up by a few big corporations. I really do.

          +

          However, this does not seem to be the case today. Version 0.9 has a lot of work to do.
          +Share this post: digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 5 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Dojo Charting example to show website statistics]]> + + http://shaneosullivan.wordpress.com/2007/06/15/dojo-charting-example-to-show-website-statistics-2/ + 2007-06-15T12:38:24Z + 2007-06-15T12:35:35Z + +

          I’ve created an example usage of the Dojo Charting engine, which you can find at http://www.skynet.ie/~sos/pageStats.php. View the source to see how it works.
          +It’s a modified version of the unit test available with the Dojo toolkit, but used in a specific scenario - in this case, to graph the page impressions for my personal website . The JSON data on the page is dynamically generated by PHP, however all other processing is done in JavaScript.

          + +

          You can filter the data to show info on any combination of pages, and also use a number of different chart types.

          +

          The code is well documented, so should be easy to follow.
          +Some other good examples of using the Dojo Charting engine can be found here and here.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 4 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[GreaseMonkey script to add Digg-like links to posts]]> + + http://shaneosullivan.wordpress.com/2007/05/22/greasemonkey-script-to-add-digg-like-links-to-posts/ + 2007-05-23T14:56:07Z + 2007-05-22T16:57:02Z + +

          I decided today that I wanted to put links at the bottom of each of my blog posts that would allow people to perform actions on the post, e.g:

          + + +

          My blog is on Wordpress.com which doesn’t seem to have a plugin that will allow me to do this. So, I got off my ass and wrote a GreaseMonkey Firefox script that’ll do it for me. You can download this script by going to http://userscripts.org/scripts/show/9421 and clicking the “Install This Script” button.

          + +

          The links that are inserted are at the bottom of this post. The script is open source (GPL license), so take it, play with it, whatever. If you find any bugs, please let me know by commenting on this post.
          +Share this post:digg it|kick it|Email it|bookmark it|reddit|liveIt

          + +
          ]]> + + + 8 + + + + Shane O'Sullivan + http://shaneosullivan.wordpress.com/ + + <![CDATA[Article on the square pegs and round holes of desktop and web applications]]> + + http://shaneosullivan.wordpress.com/2007/05/22/article-on-the-square-pegs-and-round-holes-of-desktop-and-web-applications/ + 2007-05-22T08:57:59Z + 2007-05-22T08:49:00Z + +

          Bill Higgins of IBM has written a very well thought out article of why web applications should look and act like web applications, and not the desktop variety. Well worth a read - http://billhiggins.us/weblog/2007/05/17/the-uncanny-valley-of-user-interface-design

          + + ]]>
          + + + 0 +
          + + diff --git a/includes/js/dojox/data/tests/stores/books.html b/includes/js/dojox/data/tests/stores/books.html new file mode 100644 index 0000000..8535cec --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books.html @@ -0,0 +1,118 @@ + + + Books.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          isbntitleauthor
          1Title of 1Author of 1
          2Title of 2Author of 2
          3Title of 3Author of 3
          4Title of 4Author of 4
          5Title of 5Author of 5
          6Title of 6Author of 6
          7Title of 7Author of 7
          8Title of 8Author of 8
          9Title of 9Author of 9
          10Title of 10Author of 10
          11Title of 11Author of 11
          12Title of 12Author of 12
          13Title of 13Author of 13
          14Title of 14Author of 14
          15Title of 15Author of 15
          16Title of 16Author of 16
          17Title of 17Author of 17
          18Title of 18Author of 18
          19Title of 19Author of 19
          20Title of 20Author of 20
          + + diff --git a/includes/js/dojox/data/tests/stores/books.xml b/includes/js/dojox/data/tests/stores/books.xml new file mode 100644 index 0000000..4c330e6 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books.xml @@ -0,0 +1,103 @@ + + + + 1 + Title of 1 + Author of 1 + + + 2 + Title of 2 + Author of 2 + + + 3 + Title of 3 + Author of 3 + + + 4 + Title of 4 + Author of 4 + + + 5 + Title of 5 + Author of 5 + + + 6 + Title of 6 + Author of 6 + + + 7 + Title of 7 + Author of 7 + + + 8 + Title of 8 + Author of 8 + + + 9 + Title of 9 + Author of 9 + + + 10 + Title of 10 + Author of 10 + + + 11 + Title of 11 + Author of 11 + + + 12 + Title of 12 + Author of 12 + + + 13 + Title of 13 + Author of 13 + + + 14 + Title of 14 + Author of 14 + + + 15 + Title of 15 + Author of 15 + + + 16 + Title of 16 + Author of 16 + + + 17 + Title of 17 + Author of 17 + + + 18 + Title of 18 + Author of 18 + + + 19 + Title of 19 + Author of 19 + + + 20 + Title of 20 + Author of 20 + + diff --git a/includes/js/dojox/data/tests/stores/books2.html b/includes/js/dojox/data/tests/stores/books2.html new file mode 100644 index 0000000..c0b3550 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books2.html @@ -0,0 +1,43 @@ + + + Books2.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          isbntitleauthor
          A9B57CTitle of 1Author of 1
          A9B57FTitle of 2Author of 2
          A9B577Title of 3Author of 3
          A9B574Title of 4Author of 4
          A9B5CCTitle of 5Author of 5
          + + \ No newline at end of file diff --git a/includes/js/dojox/data/tests/stores/books2.xml b/includes/js/dojox/data/tests/stores/books2.xml new file mode 100644 index 0000000..d1fa494 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books2.xml @@ -0,0 +1,28 @@ + + + + A9B57C + Title of 1 + Author of 1 + + + A9B57F + Title of 2 + Author of 2 + + + A9B577 + Title of 3 + Author of 3 + + + A9B574 + Title of 4 + Author of 4 + + + A9B5CC + Title of 5 + Author of 5 + + diff --git a/includes/js/dojox/data/tests/stores/books3.html b/includes/js/dojox/data/tests/stores/books3.html new file mode 100644 index 0000000..7d0f81d --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books3.html @@ -0,0 +1,14 @@ + + + Books2.html + + +
            +
          • A9B57C - Title of 1 - Author of 1
          • +
          • A9B57F - Title of 2 - Author of 2
          • +
          • A9B577 - Title of 3 - Author of 3
          • +
          • A9B574 - Title of 4 - Author of 4
          • +
          • A9B5CC - Title of 5 - Author of 5
          • +
          + + \ No newline at end of file diff --git a/includes/js/dojox/data/tests/stores/books3.xml b/includes/js/dojox/data/tests/stores/books3.xml new file mode 100644 index 0000000..c44b4c3 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books3.xml @@ -0,0 +1,31 @@ + + + + Category 1 + + 1 + Title of 1 + Author of 1 + + + 2 + Title of 2 + Author of 2 + + + 3 + Title of 3 + Author of 3 + + + 4 + Title of 4 + Author of 4 + + + 5 + Title of 5 + Author of 5 + + + diff --git a/includes/js/dojox/data/tests/stores/books_isbnAttr.xml b/includes/js/dojox/data/tests/stores/books_isbnAttr.xml new file mode 100644 index 0000000..b9f3d27 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books_isbnAttr.xml @@ -0,0 +1,23 @@ + + + + Title of 1 + Author of 1 + + + Title of 2 + Author of 2 + + + Title of 3 + Author of 3 + + + Title of 4 + Author of 4 + + + Title of 5 + Author of 5 + + diff --git a/includes/js/dojox/data/tests/stores/books_isbnAttr2.xml b/includes/js/dojox/data/tests/stores/books_isbnAttr2.xml new file mode 100644 index 0000000..a6ce005 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/books_isbnAttr2.xml @@ -0,0 +1,23 @@ + + + + Title of 1 + Author of 1 + + + Title of 2 + Author of 2 + + + Title of 3 + Author of 3 + + + Title of 4 + Author of 4 + + + Title of 5 + Author of 5 + + diff --git a/includes/js/dojox/data/tests/stores/geography.xml b/includes/js/dojox/data/tests/stores/geography.xml new file mode 100644 index 0000000..070a8c1 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/geography.xml @@ -0,0 +1,51 @@ + + + + geography.opml + 2006-11-10 + 2006-11-13 + Magellan, Ferdinand + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/data/tests/stores/geography_withspeciallabel.xml b/includes/js/dojox/data/tests/stores/geography_withspeciallabel.xml new file mode 100644 index 0000000..597c164 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/geography_withspeciallabel.xml @@ -0,0 +1,51 @@ + + + + geography.opml + 2006-11-10 + 2006-11-13 + Magellan, Ferdinand + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/data/tests/stores/jsonPathStore.js b/includes/js/dojox/data/tests/stores/jsonPathStore.js new file mode 100644 index 0000000..9a42a18 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/jsonPathStore.js @@ -0,0 +1,604 @@ +if(!dojo._hasResource["dojox.data.tests.stores.jsonPathStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.tests.stores.jsonPathStore"] = true; +dojo.provide("dojox.data.tests.stores.jsonPathStore"); +dojo.require("dojox.data.jsonPathStore"); + +dojox.data.tests.stores.jsonPathStore.error = function(t, d, errData){ + // summary: + // The error callback function to be used for all of the tests. + d.errback(errData); +} + +dojox.data.tests.testData=dojo.toJson({"store": {"book": [{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99}], "bicycle": {"color": "red", "price": 19.95}}}); + +dojox.data.tests.test_ID_Data=dojo.toJson({"gadgetList": {"myId": "product", "1000": {"name": "Gadget", "type": "Junk", "myId": "1000", "price": "19.99"}, "1001": {"name": "Gadget2", "type": "Junk", "myId": "1010", "price": "17.99"}, "1003": {"name": "Gadget3", "type": "Junk", "myId": "1009", "price": "15.99"}, "1004": {"name": "Gadget4", "type": "Junk", "myId": "1008", "price": "13.99"}, "1005": {"name": "Gadget5", "type": "Junk", "myId": "1007", "price": "11.99"}, "1006": {"name": "Gadget6", "type": "Junk", "myId": "1006", "price": "9.99"}}, "testList": {"a": {"name": "test", "type": "Junk", "myId": "3000", "price": "19.99"}, "b": {"name": "test2", "type": "Junk", "myId": "3010", "price": "17.99"}, "c": {"name": "test3", "type": "Junk", "myId": "3009", "price": "15.99"}, "d": {"name": "test4", "type": "Junk", "myId": "3008", "price": "13.99"}, "e": {"name": "test5", "type": "Junk", "myId": "3007", "price": "11.99"}, "f": {"name": "test6", "type": "Junk", "myId": "3006", "price": "9.99"}}, "bricknbrack": [{"name": "BrickNBrack", "type": "Junk", "myId": "2000", "price": "19.99"}, {"name": "BrickNBrack2", "type": "Junk", "myId": "2010", "price": "17.99"}, {"name": "BrickNBrack3", "type": "Junk", "myId": "2009", "price": "15.99"}, {"name": "BrickNBrack4", "type": "Junk", "myId": "2008", "price": "13.99"}, {"name": "BrickNBrack5", "type": "Junk", "myId": "2007", "price": "11.99"}, {"name": "BrickNBrack6", "type": "Junk", "myId": "2006", "price": "9.99"}]}); + +doh.register("dojox.data.tests.stores.jsonPathStore", + [ + { + name: "Create, Index, Export: {clone: true, suppressExportMeta: true}", + options: {clone: true, suppressExportMeta: true}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + //snapshot of the store after creation; + var storeWithMeta = dojo.toJson(store._data); + var result = store.dump(this.options); + doh.assertEqual(storeWithMeta, result); + } + }, + { + name: "Create, Index, Export: {cleanMeta: true, clone: true}", + options: {cleanMeta: true, clone: true, suppressExportMeta: true}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + var result = store.dump(this.options); + doh.assertEqual(original, result); + } + }, + { + name: "Create, Index, Export: {suppressExportMeta: true}", + options: {suppressExportMeta: true}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + //snapshot of the store after creation; + var storeWithMeta = dojo.toJson(store._data); + var result = store.dump(this.options); + doh.assertEqual(storeWithMeta, result); + } + }, + { + name: "Create, Index, Export: {clone: true, type: 'raw', suppressExportMeta: true}", + options: {clone: true, type: "raw", suppressExportMeta: true}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + //snapshot of the store after creation; + var storeWithMeta = dojo.toJson(store._data); + var result = dojo.toJson(store.dump(this.options)); + doh.assertEqual(storeWithMeta, result); + } + }, + { + name: "Create, Index, Export: {clone: true, suppressExportMeta: true}", + options: {cleanMeta: true}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + //snapshot of the store after creation; + var result = store.dump(this.options); + doh.assertEqual(original, result); + } + }, + { + name: "Create, Index, Export: {type: raw}", + options: {type: "raw"}, + runTest: function(t) { + var original= dojox.data.tests.test_ID_Data; + var store= new dojox.data.jsonPathStore({ + data: original, + mode: dojox.data.SYNC_MODE, + idAttribute: "myId", + indexOnLoad: true + }); + + //snapshot of the store after creation; + var result = dojo.toJson(store.dump(this.options)); + var storeWithMeta = dojo.toJson(store._data); + doh.assertEqual(storeWithMeta, result); + } + }, + { + name: "ReadAPI: fetch() Empty Request Test [SYNC_MODE]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var success = dojo.toJson([{"book": [{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "_meta": {"path": "$['store']['book'][1]", "autoId": true, "referenceIds": ["_ref_2"]}, "_id": "_auto_4"}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}], "bicycle": {"color": "red", "price": 19.95, "_meta": {"path": "$['store']['bicycle']", "autoId": true, "referenceIds": ["_ref_5"]}, "_id": "_auto_2"}, "_meta": {"path": "$['store']", "autoId": true, "referenceIds": ["_ref_0"]}, "_id": "_auto_0"}, [{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "_meta": {"path": "$['store']['book'][1]", "autoId": true, "referenceIds": ["_ref_2"]}, "_id": "_auto_4"}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}], {"color": "red", "price": 19.95, "_meta": {"path": "$['store']['bicycle']", "autoId": true, "referenceIds": ["_ref_5"]}, "_id": "_auto_2"}, {"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "_meta": {"path": "$['store']['book'][1]", "autoId": true, "referenceIds": ["_ref_2"]}, "_id": "_auto_4"}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}]); + var result = dojo.toJson(store.fetch()); + doh.assertEqual(success, result); + return true; + } + }, + + { + name: "ReadAPI: fetch('$.store.book[*]') test [SYNC_MODE]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var success = dojo.toJson([{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "_meta": {"path": "$['store']['book'][1]", "autoId": true, "referenceIds": ["_ref_2"]}, "_id": "_auto_4"}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}]); + var result = dojo.toJson(store.fetch({query:"$.store.book[*]"})); + doh.assertEqual(success, result); + return true; + } + }, + { + name: "ReadAPI: fetch('$.store.book[*]') test [ASYNC_MODE forced SYNC_MODE by string parameter]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.ASYNC_MODE}); + var success = dojo.toJson([{"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}, {"category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "_meta": {"path": "$['store']['book'][1]", "autoId": true, "referenceIds": ["_ref_2"]}, "_id": "_auto_4"}, {"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}]); + var result = dojo.toJson(store.fetch("$.store.book[*]")); + doh.assertEqual(success, result); + return true; + } + }, + { + name: "ReadAPI: fetch({query: '$.store.book[*]', start: 2})", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var success = dojo.toJson([{"category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "_meta": {"path": "$['store']['book'][2]", "autoId": true, "referenceIds": ["_ref_3"]}, "_id": "_auto_5"}, {"category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "_meta": {"path": "$['store']['book'][3]", "autoId": true, "referenceIds": ["_ref_4"]}, "_id": "_auto_6"}]); + var result = dojo.toJson(store.fetch({query: '$.store.book[*]', start: 2})); + doh.assertEqual(success, result); + return true; + } + }, + { + name: "ReadAPI: fetch({query: '$.store.book[*]', start: 2, count: 1})", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch({query: "$.store.book[*]", start: 2, count: 1}); + doh.assertEqual(result[0].author, 'Herman Melville'); + return true; + } + }, + + { + name: "ReadAPI: fetch(query: '$.store.book[0]'...callbacks...) [ASYNC_MODE]", + runTest: function(datastore, t){ + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData}); + var d = new doh.Deferred(); + function onBegin(count, args){ + doh.assertEqual(1, count); + } + function onItem(item){ + doh.assertTrue(store.isItem(item)); + } + + function onComplete(results){ + doh.assertEqual(1, results.length); + doh.assertEqual("Nigel Rees", results[0]["author"]); + d.callback(true); + } + + function onError(errData){ + t.assertTrue(false); + d.errback(errData); + } + + store.fetch({query: "$.store.book[0]", onBegin: onBegin, onItem: onItem, onError: onError, onComplete: onComplete}); + return d; // Deferred + } + }, + { + name: "ReadAPI: isItem() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch("$.store.book[*].author"); + doh.assertFalse(store.isItem(result[0])); + result = store.fetch("$.store.book[*]"); + doh.assertTrue(store.isItem(result[0])); + return true; + } + }, + { + name: "ReadAPI: getValue() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var data = store.fetch("$.store.book[*]"); + var result = store.getValue(data[0], "author"); + doh.assertEqual("Nigel Rees", result); + return true; + } + }, + { + name: "ReadAPI: getValues() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch("$.store.book[*]"); + doh.assertEqual(dojo.toJson(store.getValues(result[0], "author")),dojo.toJson(["Nigel Rees"])); + return true; + } + }, + { + name: "ReadAPI: getAttributes() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch("$.store.book[*]"); + doh.assertEqual(dojo.toJson(store.getAttributes(result[0])),'["category","author","title","price","_meta","_id"]'); + return true; + } + }, + { + name: "ReadAPI: getAttributes() test [hideMetaAttributes]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, hideMetaAttributes: true}); + var result = store.fetch("$.store.book[*]"); + doh.assertEqual('["category","author","title","price","_id"]',dojo.toJson(store.getAttributes(result[0]))); + return true; + } + }, + { + name: "ReadAPI: hasAttribute() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch("$.store.book[*]"); + doh.assertTrue(store.hasAttribute(result[0], "author")); + doh.assertFalse(store.hasAttribute(result[0],"_im_invalid_fooBar")); + return true; + } + }, + + { + name: "ReadAPI: containsValue() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + var result = store.fetch("$.store.book[*]"); + doh.assertTrue(store.containsValue(result[0], "author", "Nigel Rees")); + doh.assertFalse(store.containsValue(result[0], "author", "_im_invalid_fooBar")); + return true; + } + }, + { + name: "ReadAPI: getFeatures() test", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE}); + //doh.debug("Store Features: ", dojo.toJson(store.getFeatures())); + var success='{"dojo.data.api.Read":true,"dojo.data.api.Identity":true,"dojo.data.api.Write":true,"dojo.data.api.Notification":true}'; + doh.assertEqual(success,dojo.toJson(store.getFeatures())); + return true; + } + }, + { + name: "ReadAPI: getLabel(item) test [multiple label attributes]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, labelAttribute: ["title", "author"]}); + var result = store.fetch("$.store.book[0]")[0]; + doh.assertEqual("Sayings of the Century Nigel Rees",store.getLabel(result)); + return true; + } + }, + { + name: "ReadAPI: getLabelAttributes(item) test [multiple label attributes]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, labelAttribute: ["title", "author"]}); + var result = store.fetch("$.store.book[0]")[0]; + doh.assertEqual('["title","author"]',dojo.toJson(store.getLabelAttributes(result))); + return true; + } + }, + { + name: "ReadAPI: getLabelAttributes(item) test [single label attribute]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, labelAttribute: ["title"]}); + var result = store.fetch("$.store.book[0]")[0]; + doh.assertEqual('["title"]',dojo.toJson(store.getLabelAttributes(result))); + return true; + } + }, + { + name: "jsonPathStore Feature: override createLabel", + runTest: function(t) { + var createLabel = function(item){ + return item[this.labelAttribute[0]] + " By " + item[this.labelAttribute[1]]; + }; + + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, labelAttribute: ["title", "author"], createLabel: createLabel}); + var result = store.fetch("$.store.book[0]")[0]; + doh.assertEqual('Sayings of the Century By Nigel Rees',store.getLabel(result)); + return true; + } + }, + { + name: "jsonPathStore Feature: autoIdentity", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + var result = dojo.toJson(store.fetch("$.store.book[0]")[0]); + var success=dojo.toJson( {"category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "_meta": {"path": "$['store']['book'][0]", "autoId": true, "referenceIds": ["_ref_1"]}, "_id": "_auto_3"}); + doh.assertEqual(success,result); + return true; + } + }, + + { + name: "jsonPathStore Feature: autoIdentity [clean export removing added id attributes in addition to meta]", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + //do a search to popuplate some of the itesm with autoId data + var result = store.fetch("$.store.book[0]"); + result = store.dump({cleanMeta: true}); + doh.assertEqual(dojox.data.tests.testData,result); + return true; + } + }, + + { + name: "IdentityAPI: getIdentity(item)", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + var data= store.fetch("$.store.book[0]")[0]; + var result= store.getIdentity(data); + var success="_auto_3"; + doh.assertEqual(success,result); + return true; + } + }, + + { + + name: "IdentityAPI: fetchItemByIdentity(item) [SYNC_MODE]", + runTest: function(t){ + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var data= store.fetch("$.store.book[0]")[0]; + var id = store.getIdentity(data); + var result = dojo.toJson(store.fetchItemByIdentity({identity:id})); + var success = dojo.toJson(data); + doh.assertEqual(success,result); + return true; + } + }, + { + + name: "jsonPathStore Feature: byId(item) [fetchItemByIdentity alias] [SYNC_MODE]", + runTest: function(t){ + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var data= store.fetch("$.store.book[0]")[0]; + var id = store.getIdentity(data); + var result = dojo.toJson(store.byId({identity:id})); + var success = dojo.toJson(data); + doh.assertEqual(success,result); + return true; + } + }, + + { + name: "IdentityAPI: fetchItemByIdentity(id) single Item [ASYNC_MODE]", + timeout: 1000, + runTest: function(datastore, t){ + // summary: + // Simple test of the fetchItemByIdentity function of the store. + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, indexOnLoad: true}); + var d = new doh.Deferred(); + var query = {query: "$.store.book[0]", mode: dojox.data.SYNC_MODE}; + var data = store.fetch(query)[0]; + var id = store.getIdentity(data); + + function onItem(item){ + doh.assertTrue(store.isItem(item)); + doh.assertEqual(data["author"], item["author"]); + d.callback(true); + } + + function onError(errData){ + + t.assertTrue(false); + d.errback(errData); + } + + store.fetchItemByIdentity({identity: id, onItem: onItem, onError: onError}); + + return d; // Deferred + } + }, + { + name: "IdentityAPI: getIdentityAttributes(item) ", + runTest: function(t) { + var store= new dojox.data.jsonPathStore({data:dojox.data.tests.testData, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + var data= store.fetch("$.store.book[0]")[0]; + var result = dojo.toJson(store.getIdentityAttributes(data)); + var success = '["_id"]'; + doh.assertEqual(success,result); + return true; + } + }, + { + name: "WriteAPI: newItem(item) add to store root.", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var testObject = { + propA: "foo", + propB: "bar" + } + + var testObject2 = { + propA: "foo", + propB: "bar" + } + + var newItem = store.newItem(testObject); + doh.assertTrue(store.isItem(newItem)); + + newItem = store.newItem(testObject2); + doh.assertTrue(store.isItem(newItem)); + + return true; + } + }, + { + name: "WriteAPI: newItem(item) no idAttribute on data item, added only with pInfo", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE}); + + var parentItem = store.fetch("$.store.book[0]")[0]; + + var testObject = { + propA: "foo", + propB: "bar" + } + + var newItem = store.newItem(testObject,{parent: parentItem, attribute: "TEST_PROPERTY"}); + doh.assertTrue(store.isItem(newItem)); + return true; + } + }, + { + name: "WriteAPI: newItem(item) given id, no parent Attribute", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var parentItem = store.fetch("$.store.book[0]")[0]; + + var testObject = { + _id: "99999", + propA: "foo", + propB: "bar" + } + + var newItem = store.newItem(testObject,{parent: parentItem}); + doh.assertTrue(store.isItem(newItem)); + return true; + } + }, + { + name: "WriteAPI: newItem(item) given id and parent Attribute", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var parentItem = store.fetch("$.store.book[0]")[0]; + + var testObject = { + _id: "99999", + propA: "foo", + propB: "bar" + } + + var newItem = store.newItem(testObject,{parent: parentItem, attribute: "TEST"}); + doh.assertTrue(store.isItem(newItem)); + return true; + } + }, + { + name: "WriteAPI: newItem(item) adding to an array", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, idAttribute: "_id"}); + + var parentItem = store.fetch("$.store")[0]; + + var testObject = { + _id: "99999", + propA: "foo", + propB: "bar" + } + + var newItem = store.newItem(testObject,{parent: parentItem, attribute: "book"}); + doh.assertTrue(store.isItem(newItem)); + return true; + } + }, + { + name: "WriteAPI: setValue(item, value)", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, indexOnLoad: true, idAttribute: "_id"}); + var item = store.fetch("$.store")[0]; + + var snapshot = store.dump({clone:true, cleanMeta: false, suppressExportMeta: true}); + + store.setValue(item, "Foo", "Bar"); + doh.assertEqual(store._data.store.Foo, "Bar"); + doh.assertTrue(store._data.store._meta.isDirty); + store.save(); + doh.assertFalse(store._data.store._meta.isDirty); + return true; + } + }, + { + name: "WriteAPI: setValues(item, value)", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, indexOnLoad: true, idAttribute: "_id"}); + var item = store.fetch("$.store")[0]; + + var snapshot = store.dump({clone:true, cleanMeta: false, suppressExportMeta: true}); + + store.setValues(item, "Foo", ["Bar", "Diddly", "Ar"]); + doh.assertEqual(store._data.store.Foo[0], "Bar"); + doh.assertEqual(store._data.store.Foo.length, 3); + doh.assertTrue(store._data.store._meta.isDirty); + store.save(); + doh.assertFalse(store._data.store._meta.isDirty); + return true; + } + }, + { + name: "WriteAPI: unsetAttribute(item, attribute)", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, indexOnLoad: true, idAttribute: "_id"}); + var item = store.fetch("$.store")[0]; + + var snapshot = store.dump({clone:true, cleanMeta: false, suppressExportMeta: true}); + + store.setValues(item, "Foo", ["Bar", "Diddly", "Ar"]); + doh.assertEqual(store._data.store.Foo[0], "Bar"); + doh.assertEqual(store._data.store.Foo.length, 3); + doh.assertTrue(store._data.store._meta.isDirty); + store.save(); + doh.assertFalse(store._data.store._meta.isDirty); + store.unsetAttribute(item,"Foo"); + doh.assertFalse(item.Foo); + doh.assertTrue(store._data.store._meta.isDirty); + store.save(); + doh.assertFalse(store._data.store._meta.isDirty); + return true; + } + }, + { + name: "WriteAPI: revert()", + runTest: function(t) { + var original = dojox.data.tests.testData; + var store= new dojox.data.jsonPathStore({data:original, mode: dojox.data.SYNC_MODE, indexOnLoad: true, idAttribute: "_id"}); + var item = store.fetch("$.store")[0]; + + var snapshot = store.dump({clone:true, cleanMeta: false, suppressExportMeta: true}); + + store.setValues(item, "Foo", ["Bar", "Diddly", "Ar"]); + doh.assertEqual(store._data.store.Foo[0], "Bar"); + doh.assertEqual(store._data.store.Foo.length, 3); + doh.assertTrue(store._data.store._meta.isDirty); + store.revert(); + doh.assertFalse(store._data.store._meta.isDirty); + doh.assertFalse(store._data.store.Foo); + return true; + } + } + ] +); + +} diff --git a/includes/js/dojox/data/tests/stores/movies.csv b/includes/js/dojox/data/tests/stores/movies.csv new file mode 100644 index 0000000..baf71eb --- /dev/null +++ b/includes/js/dojox/data/tests/stores/movies.csv @@ -0,0 +1,9 @@ +Title, Year, Producer +City of God, 2002, Katia Lund +Rain,, Christine Jeffs +2001: A Space Odyssey, , Stanley Kubrick +"This is a ""fake"" movie title", 1957, Sidney Lumet +Alien, 1979 , Ridley Scott +"The Sequel to ""Dances With Wolves.""", 1982, Ridley Scott +"Caine Mutiny, The", 1954, "Dymtryk ""the King"", Edward" + diff --git a/includes/js/dojox/data/tests/stores/movies2.csv b/includes/js/dojox/data/tests/stores/movies2.csv new file mode 100644 index 0000000..401bcfc --- /dev/null +++ b/includes/js/dojox/data/tests/stores/movies2.csv @@ -0,0 +1,9 @@ +Title, Year, Producer +City of God, 2002, Katia Lund +Rain,"", Christine Jeffs +2001: A Space Odyssey, , Stanley Kubrick +"This is a ""fake"" movie title", 1957, Sidney Lumet +Alien, 1979 , Ridley Scott +"The Sequel to ""Dances With Wolves.""", 1982, Ridley Scott +"Caine Mutiny, The", 1954, "Dymtryk ""the King"", Edward" + diff --git a/includes/js/dojox/data/tests/stores/patterns.csv b/includes/js/dojox/data/tests/stores/patterns.csv new file mode 100644 index 0000000..a9bee64 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/patterns.csv @@ -0,0 +1,11 @@ +uniqueId, value +9, jfq4@#!$!@Rf14r14i5u +6, BaBaMaSaRa***Foo +2, bar*foo +8, 123abc +4, bit$Bite +3, 123abc +10, 123abcdefg +1, foo*bar +7, +5, 123abc diff --git a/includes/js/dojox/data/tests/stores/properties.js b/includes/js/dojox/data/tests/stores/properties.js new file mode 100644 index 0000000..bbdd38d --- /dev/null +++ b/includes/js/dojox/data/tests/stores/properties.js @@ -0,0 +1,10 @@ +/*[ + // Properties of December 1, 2007 + { "year": "2007" }, + { "nmonth": "12" }, + { "month": "December" }, + { "nday": "1" }, + { "day": "Saturday" }, + { "dayOfYear": "335" }, + { "weekOfYear": "48" } +]*/ diff --git a/includes/js/dojox/data/tests/stores/snap_pipeline.php b/includes/js/dojox/data/tests/stores/snap_pipeline.php new file mode 100644 index 0000000..a7e6033 --- /dev/null +++ b/includes/js/dojox/data/tests/stores/snap_pipeline.php @@ -0,0 +1,72 @@ += count($rows) || $limit < 0) { + header("HTTP/1.1 400 Bad Request"); + echo "sn.start and/or sn.limit out of range"; + exit(0); + } + + $slice = array_slice($rows, $start, $limit); + + header("Content-type: application/javascript"); + echo $prefix . "(["; + + $out_rows = array("[" . join(", ", $field_names) . "]"); + foreach($slice as $r) { + $out_rows[] = "[" . join(", ", $r) . "]"; + } + + echo join(", ", $out_rows); + echo "])"; + } + +?> + diff --git a/includes/js/dojox/data/tests/test_Tree_vs_jsonPathStore.html b/includes/js/dojox/data/tests/test_Tree_vs_jsonPathStore.html new file mode 100644 index 0000000..f06bafe --- /dev/null +++ b/includes/js/dojox/data/tests/test_Tree_vs_jsonPathStore.html @@ -0,0 +1,105 @@ + + + + Dijit Tree Test + + + + + + + + + + + + +

          Dijit Tree Test - dojo.data.Notification API support

          + +
          + +
          + +
          +

          Current Selection: Tree Root + +

          Selected Item:

          + Name:
          + Description:

          +
          Update Item
          + +

          New Item

          +

          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.

          + Id:
          + Name:
          + Description:

          + +
          Add Item to Store
          +
          + + + + + diff --git a/includes/js/dojox/data/tests/treeTest.json b/includes/js/dojox/data/tests/treeTest.json new file mode 100644 index 0000000..70cc7d8 --- /dev/null +++ b/includes/js/dojox/data/tests/treeTest.json @@ -0,0 +1,10 @@ +{ + node1: { id: 'node1', name:'node1', someProperty:'somePropertyA', children:[ + { id: 'node1.1',name:'node1.1', someProperty:'somePropertyA1'}, + { id: 'node1.2',name:'node1.2', someProperty:'somePropertyA2'} + ]}, + node2:{ id: 'node2', name:'node2', someProperty:'somePropertyB'}, + node3:{ id: 'node3', name:'node3', someProperty:'somePropertyC'}, + node4:{ id: 'node4', name:'node4', someProperty:'somePropertyA'}, + node5:{ id: 'node5', name:'node5', someProperty:'somePropertyB'} +} diff --git a/includes/js/dojox/date/README b/includes/js/dojox/date/README new file mode 100644 index 0000000..8ad5aba --- /dev/null +++ b/includes/js/dojox/date/README @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------- +DojoX Date +------------------------------------------------------------------------------- +Version 0.9 +Release date: 5/17/2007 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Paul Sowden, Adam Peller (dojox.date.posix) + Neil Roberts (dojox.date.php) +------------------------------------------------------------------------------- +Project description + +Placeholder for any kind of date operations, including formatters that are +common to other languages (posix and php). +------------------------------------------------------------------------------- +Dependencies: + +Depends only on the Dojo Core. +------------------------------------------------------------------------------- +Documentation + +See the API documentation for details. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/date/* + +Install into the following directory structure: +/dojox/date/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/date/php.js b/includes/js/dojox/date/php.js new file mode 100644 index 0000000..3cee1a2 --- /dev/null +++ b/includes/js/dojox/date/php.js @@ -0,0 +1,312 @@ +if(!dojo._hasResource["dojox.date.php"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.date.php"] = true; +dojo.provide("dojox.date.php"); +dojo.require("dojo.date"); +dojo.require("dojox.string.tokenize"); + +dojox.date.php.format = function(/*Date*/ date, /*String*/ format){ + // summary: Get a formatted string for a given date object + var df = new dojox.date.php.DateFormat(format); + return df.format(date); +} + +dojox.date.php.DateFormat = function(/*String*/ format){ + // summary: Format the internal date object + if(!this.regex){ + var keys = []; + for(var key in this.constructor.prototype){ + if(dojo.isString(key) && key.length == 1 && dojo.isFunction(this[key])){ + keys.push(key); + } + } + this.constructor.prototype.regex = new RegExp("(?:(\\\\.)|([" + keys.join("") + "]))", "g"); + } + + var replacements = []; + + this.tokens = dojox.string.tokenize(format, this.regex, function(escape, token, i){ + if(token){ + replacements.push([i, token]); + return token; + } + if(escape){ + return escape.charAt(1); + } + }); + + this.replacements = replacements; +} +dojo.extend(dojox.date.php.DateFormat, { + weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + weekdays_3: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + months_3: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + monthdays: [31,28,31,30,31,30,31,31,30,31,30,31], + + format: function(/*Date*/ date){ + this.date = date; + for(var i = 0, replacement; replacement = this.replacements[i]; i++){ + this.tokens[replacement[0]] = this[replacement[1]](); + } + return this.tokens.join(""); + }, + + // Day + + d: function(){ + // summary: Day of the month, 2 digits with leading zeros + var j = this.j(); + return (j.length == 1) ? "0" + j : j; + }, + + D: function(){ + // summary: A textual representation of a day, three letters + return this.weekdays_3[this.date.getDay()]; + }, + + j: function(){ + // summary: Day of the month without leading zeros + return this.date.getDate() + ""; + }, + + l: function(){ + // summary: A full textual representation of the day of the week + return this.weekdays[this.date.getDay()]; + }, + + N: function(){ + // summary: ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) + var w = this.w(); + return (!w) ? 7 : w; + }, + + S: function(){ + // summary: English ordinal suffix for the day of the month, 2 characters + switch(this.date.getDate()){ + case 11: case 12: case 13: return "th"; + case 1: case 21: case 31: return "st"; + case 2: case 22: return "nd"; + case 3: case 23: return "rd"; + default: return "th"; + } + }, + + w: function(){ + // summary: Numeric representation of the day of the week + return this.date.getDay() + ""; + }, + + z: function(){ + // summary: The day of the year (starting from 0) + var millis = this.date.getTime() - new Date(this.date.getFullYear(), 0, 1).getTime(); + return Math.floor(millis/86400000) + ""; + }, + + // Week + + W: function(){ + // summary: ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) + var week; + var jan1_w = new Date(this.date.getFullYear(), 0, 1).getDay() + 1; + var w = this.date.getDay() + 1; + var z = parseInt(this.z()); + + if(z <= (8 - jan1_w) && jan1_w > 4){ + var last_year = new Date(this.date.getFullYear() - 1, this.date.getMonth(), this.date.getDate()); + if(jan1_w == 5 || (jan1_w == 6 && dojo.date.isLeapYear(last_year))){ + week = 53; + }else{ + week = 52; + } + }else{ + var i; + if(Boolean(this.L())){ + i = 366; + }else{ + i = 365; + } + if((i - z) < (4 - w)){ + week = 1; + }else{ + var j = z + (7 - w) + (jan1_w - 1); + week = Math.ceil(j / 7); + if(jan1_w > 4){ + --week; + } + } + } + + return week; + }, + + // Month + + F: function(){ + // summary: A full textual representation of a month, such as January or March + return this.months[this.date.getMonth()]; + }, + + m: function(){ + // summary: Numeric representation of a month, with leading zeros + var n = this.n(); + return (n.length == 1) ? "0" + n : n; + }, + + M: function(){ + // summary: A short textual representation of a month, three letters + return this.months_3[this.date.getMonth()]; + }, + + n: function(){ + // summary: Numeric representation of a month, without leading zeros + return this.date.getMonth() + 1 + ""; + }, + + t: function(){ + // summary: Number of days in the given month + return (Boolean(this.L()) && this.date.getMonth() == 1) ? 29 : this.monthdays[this.getMonth()]; + }, + + // Year + + L: function(){ + // summary: Whether it's a leap year + return (dojo.date.isLeapYear(this.date)) ? "1" : "0"; + }, + + o: function(){ + // summary: + // ISO-8601 year number. This has the same value as Y, except that if + // the ISO week number (W) belongs to the previous or next year, that year is used instead. (added in PHP 5.1.0) + // TODO: Figure out what this means + }, + + Y: function(){ + // summary: A full numeric representation of a year, 4 digits + return this.date.getFullYear() + ""; + }, + + y: function(){ + // summary: A two digit representation of a year + return this.Y().slice(-2); + }, + + // Time + + a: function(){ + // summary: Lowercase Ante meridiem and Post meridiem + return this.date.getHours() >= 12 ? "pm" : "am"; + }, + + b: function(){ + // summary: Uppercase Ante meridiem and Post meridiem + return this.a().toUpperCase(); + }, + + B: function(){ + // summary: + // Swatch Internet time + // A day is 1,000 beats. All time is measured from GMT + 1 + var off = this.date.getTimezoneOffset() + 60; + var secs = (this.date.getHours() * 3600) + (this.date.getMinutes() * 60) + this.getSeconds() + (off * 60); + var beat = Math.abs(Math.floor(secs / 86.4) % 1000) + ""; + while(beat.length < 2) beat = "0" + beat; + return beat; + }, + + g: function(){ + // summary: 12-hour format of an hour without leading zeros + return (this.date.getHours() > 12) ? this.date.getHours() - 12 + "" : this.date.getHours() + ""; + }, + + G: function(){ + // summary: 24-hour format of an hour without leading zeros + return this.date.getHours() + ""; + }, + + h: function(){ + // summary: 12-hour format of an hour with leading zeros + var g = this.g(); + return (g.length == 1) ? "0" + g : g; + }, + + H: function(){ + // summary: 24-hour format of an hour with leading zeros + var G = this.G(); + return (G.length == 1) ? "0" + G : G; + }, + + i: function(){ + // summary: Minutes with leading zeros + var mins = this.date.getMinutes() + ""; + return (mins.length == 1) ? "0" + mins : mins; + }, + + s: function(){ + // summary: Seconds, with leading zeros + var secs = this.date.getSeconds() + ""; + return (secs.length == 1) ? "0" + secs : secs; + }, + + // Timezone + + e: function(){ + // summary: Timezone identifier (added in PHP 5.1.0) + return dojo.date.getTimezoneName(this.date); + }, + + I: function(){ + // summary: Whether or not the date is in daylight saving time + // TODO: Can dojo.date do this? + }, + + O: function(){ + // summary: Difference to Greenwich time (GMT) in hours + var off = Math.abs(this.date.getTimezoneOffset()); + var hours = Math.floor(off / 60) + ""; + var mins = (off % 60) + ""; + if(hours.length == 1) hours = "0" + hours; + if(mins.length == 1) hours = "0" + mins; + return ((this.date.getTimezoneOffset() < 0) ? "+" : "-") + hours + mins; + }, + + P: function(){ + // summary: Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3) + var O = this.O(); + return O.substring(0, 2) + ":" + O.substring(2, 4); + }, + + T: function(){ + // summary: Timezone abbreviation + + // Guess... + return this.e().substring(0, 3); + }, + + Z: function(){ + // summary: + // Timezone offset in seconds. The offset for timezones west of UTC is always negative, + // and for those east of UTC is always positive. + return this.date.getTimezoneOffset() * -60; + }, + + // Full Date/Time + + c: function(){ + // summary: ISO 8601 date (added in PHP 5) + return this.Y() + "-" + this.m() + "-" + this.d() + "T" + this.h() + ":" + this.i() + ":" + this.s() + this.P(); + }, + + r: function(){ + // summary: RFC 2822 formatted date + return this.D() + ", " + this.d() + " " + this.M() + " " + this.Y() + " " + this.H() + ":" + this.i() + ":" + this.s() + " " + this.O(); + }, + + U: function(){ + // summary: Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) + return Math.floor(this.date.getTime() / 1000); + } + +}); + +} diff --git a/includes/js/dojox/date/posix.js b/includes/js/dojox/date/posix.js new file mode 100644 index 0000000..88e9c47 --- /dev/null +++ b/includes/js/dojox/date/posix.js @@ -0,0 +1,293 @@ +if(!dojo._hasResource["dojox.date.posix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.date.posix"] = true; +dojo.provide("dojox.date.posix"); + +dojo.require("dojo.date"); +dojo.require("dojo.date.locale"); +dojo.require("dojo.string"); + +dojox.date.posix.strftime = function(/*Date*/dateObject, /*String*/format, /*String?*/locale){ +// +// summary: +// Formats the date object using the specifications of the POSIX strftime function +// +// description: +// see http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html + + // zero pad + var padChar = null; + var _ = function(s, n){ + return dojo.string.pad(s, n || 2, padChar || "0"); + }; + + var bundle = dojo.date.locale._getGregorianBundle(locale); + + var $ = function(property){ + switch(property){ + case "a": // abbreviated weekday name according to the current locale + return dojo.date.locale.getNames('days', 'abbr', 'format', locale)[dateObject.getDay()]; + + case "A": // full weekday name according to the current locale + return dojo.date.locale.getNames('days', 'wide', 'format', locale)[dateObject.getDay()]; + + case "b": + case "h": // abbreviated month name according to the current locale + return dojo.date.locale.getNames('months', 'abbr', 'format', locale)[dateObject.getMonth()]; + + case "B": // full month name according to the current locale + return dojo.date.locale.getNames('months', 'wide', 'format', locale)[dateObject.getMonth()]; + + case "c": // preferred date and time representation for the current + // locale + return dojo.date.locale.format(dateObject, {formatLength: 'full', locale: locale}); + + case "C": // century number (the year divided by 100 and truncated + // to an integer, range 00 to 99) + return _(Math.floor(dateObject.getFullYear()/100)); + + case "d": // day of the month as a decimal number (range 01 to 31) + return _(dateObject.getDate()); + + case "D": // same as %m/%d/%y + return $("m") + "/" + $("d") + "/" + $("y"); + + case "e": // day of the month as a decimal number, a single digit is + // preceded by a space (range ' 1' to '31') + if(padChar == null){ padChar = " "; } + return _(dateObject.getDate()); + + case "f": // month as a decimal number, a single digit is + // preceded by a space (range ' 1' to '12') + if(padChar == null){ padChar = " "; } + return _(dateObject.getMonth()+1); + + case "g": // like %G, but without the century. + break; + + case "G": // The 4-digit year corresponding to the ISO week number + // (see %V). This has the same format and value as %Y, + // except that if the ISO week number belongs to the + // previous or next year, that year is used instead. + dojo.unimplemented("unimplemented modifier 'G'"); + break; + + case "F": // same as %Y-%m-%d + return $("Y") + "-" + $("m") + "-" + $("d"); + + case "H": // hour as a decimal number using a 24-hour clock (range + // 00 to 23) + return _(dateObject.getHours()); + + case "I": // hour as a decimal number using a 12-hour clock (range + // 01 to 12) + return _(dateObject.getHours() % 12 || 12); + + case "j": // day of the year as a decimal number (range 001 to 366) + return _(dojo.date.locale._getDayOfYear(dateObject), 3); + + case "k": // Hour as a decimal number using a 24-hour clock (range + // 0 to 23 (space-padded)) + if(padChar == null){ padChar = " "; } + return _(dateObject.getHours()); + + case "l": // Hour as a decimal number using a 12-hour clock (range + // 1 to 12 (space-padded)) + if(padChar == null){ padChar = " "; } + return _(dateObject.getHours() % 12 || 12); + + case "m": // month as a decimal number (range 01 to 12) + return _(dateObject.getMonth() + 1); + + case "M": // minute as a decimal number + return _(dateObject.getMinutes()); + + case "n": + return "\n"; + + case "p": // either `am' or `pm' according to the given time value, + // or the corresponding strings for the current locale + return bundle[dateObject.getHours() < 12 ? "am" : "pm"]; + + case "r": // time in a.m. and p.m. notation + return $("I") + ":" + $("M") + ":" + $("S") + " " + $("p"); + + case "R": // time in 24 hour notation + return $("H") + ":" + $("M"); + + case "S": // second as a decimal number + return _(dateObject.getSeconds()); + + case "t": + return "\t"; + + case "T": // current time, equal to %H:%M:%S + return $("H") + ":" + $("M") + ":" + $("S"); + + case "u": // weekday as a decimal number [1,7], with 1 representing + // Monday + return String(dateObject.getDay() || 7); + + case "U": // week number of the current year as a decimal number, + // starting with the first Sunday as the first day of the + // first week + return _(dojo.date.locale._getWeekOfYear(dateObject)); + + case "V": // week number of the year (Monday as the first day of the + // week) as a decimal number [01,53]. If the week containing + // 1 January has four or more days in the new year, then it + // is considered week 1. Otherwise, it is the last week of + // the previous year, and the next week is week 1. + return _(dojox.date.posix.getIsoWeekOfYear(dateObject)); + + case "W": // week number of the current year as a decimal number, + // starting with the first Monday as the first day of the + // first week + return _(dojo.date.locale._getWeekOfYear(dateObject, 1)); + + case "w": // day of the week as a decimal, Sunday being 0 + return String(dateObject.getDay()); + + case "x": // preferred date representation for the current locale + // without the time + return dojo.date.locale.format(dateObject, {selector:'date', formatLength: 'full', locale:locale}); + + case "X": // preferred time representation for the current locale + // without the date + return dojo.date.locale.format(dateObject, {selector:'time', formatLength: 'full', locale:locale}); + + case "y": // year as a decimal number without a century (range 00 to + // 99) + return _(dateObject.getFullYear()%100); + + case "Y": // year as a decimal number including the century + return String(dateObject.getFullYear()); + + case "z": // time zone or name or abbreviation + var timezoneOffset = dateObject.getTimezoneOffset(); + return (timezoneOffset > 0 ? "-" : "+") + + _(Math.floor(Math.abs(timezoneOffset)/60)) + ":" + + _(Math.abs(timezoneOffset)%60); + + case "Z": // time zone or name or abbreviation + return dojo.date.getTimezoneName(dateObject); + + case "%": + return "%"; + } + }; + + // parse the formatting string and construct the resulting string + var string = ""; + var i = 0; + var index = 0; + var switchCase = null; + while ((index = format.indexOf("%", i)) != -1){ + string += format.substring(i, index++); + + // inspect modifier flag + switch (format.charAt(index++)) { + case "_": // Pad a numeric result string with spaces. + padChar = " "; break; + case "-": // Do not pad a numeric result string. + padChar = ""; break; + case "0": // Pad a numeric result string with zeros. + padChar = "0"; break; + case "^": // Convert characters in result string to uppercase. + switchCase = "upper"; break; + case "*": // Convert characters in result string to lowercase + switchCase = "lower"; break; + case "#": // Swap the case of the result string. + switchCase = "swap"; break; + default: // no modifier flag so decrement the index + padChar = null; index--; break; + } + + // toggle case if a flag is set + var property = $(format.charAt(index++)); + switch (switchCase){ + case "upper": + property = property.toUpperCase(); + break; + case "lower": + property = property.toLowerCase(); + break; + case "swap": // Upper to lower, and versey-vicea + var compareString = property.toLowerCase(); + var swapString = ''; + var ch = ''; + for (var j = 0; j < property.length; j++){ + ch = property.charAt(j); + swapString += (ch == compareString.charAt(j)) ? + ch.toUpperCase() : ch.toLowerCase(); + } + property = swapString; + break; + default: + break; + } + switchCase = null; + + string += property; + i = index; + } + string += format.substring(i); + + return string; // String +}; + +dojox.date.posix.getStartOfWeek = function(/*Date*/dateObject, /*Number*/firstDay){ + // summary: Return a date object representing the first day of the given + // date's week. + if(isNaN(firstDay)){ + firstDay = dojo.cldr.supplemental.getFirstDayOfWeek ? dojo.cldr.supplemental.getFirstDayOfWeek() : 0; + } + var offset = firstDay; + if(dateObject.getDay() >= firstDay){ + offset -= dateObject.getDay(); + }else{ + offset -= (7 - dateObject.getDay()); + } + var date = new Date(dateObject); + date.setHours(0, 0, 0, 0); + return dojo.date.add(date, "day", offset); // Date +} + +dojox.date.posix.setIsoWeekOfYear = function(/*Date*/dateObject, /*Number*/week){ + // summary: Set the ISO8601 week number of the given date. + // The week containing January 4th is the first week of the year. + // week: + // can be positive or negative: -1 is the year's last week. + if(!week){ return dateObject; } + var currentWeek = dojox.date.posix.getIsoWeekOfYear(dateObject); + var offset = week - currentWeek; + if(week < 0){ + var weeks = dojox.date.posix.getIsoWeeksInYear(dateObject); + offset = (weeks + week + 1) - currentWeek; + } + return dojo.date.add(dateObject, "week", offset); // Date +} + +dojox.date.posix.getIsoWeekOfYear = function(/*Date*/dateObject){ + // summary: Get the ISO8601 week number of the given date. + // The week containing January 4th is the first week of the year. + // See http://en.wikipedia.org/wiki/ISO_week_date + var weekStart = dojox.date.posix.getStartOfWeek(dateObject, 1); + var yearStart = new Date(dateObject.getFullYear(), 0, 4); // January 4th + yearStart = dojox.date.posix.getStartOfWeek(yearStart, 1); + var diff = weekStart.getTime() - yearStart.getTime(); + if(diff < 0){ return dojox.date.posix.getIsoWeeksInYear(weekStart); } // Integer + return Math.ceil(diff / 604800000) + 1; // Integer +} + +dojox.date.posix.getIsoWeeksInYear = function(/*Date*/dateObject) { + // summary: Determine the number of ISO8601 weeks in the year of the given + // date. Most years have 52 but some have 53. + // See http://www.phys.uu.nl/~vgent/calendar/isocalendar_text3.htm + function p(y) { + return y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400); + } + var y = dateObject.getFullYear(); + return ( p(y) % 7 == 4 || p(y-1) % 7 == 3 ) ? 53 : 52; // Integer +} + +} diff --git a/includes/js/dojox/date/tests/module.js b/includes/js/dojox/date/tests/module.js new file mode 100644 index 0000000..9e1a297 --- /dev/null +++ b/includes/js/dojox/date/tests/module.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.date.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.date.tests.module"] = true; +dojo.provide("dojox.date.tests.module"); + +try{ + dojo.require("dojox.date.tests.posix"); +}catch(e){ + doh.debug(e); +} + + +} diff --git a/includes/js/dojox/date/tests/posix.js b/includes/js/dojox/date/tests/posix.js new file mode 100644 index 0000000..84039f9 --- /dev/null +++ b/includes/js/dojox/date/tests/posix.js @@ -0,0 +1,236 @@ +if(!dojo._hasResource["dojox.date.tests.posix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.date.tests.posix"] = true; +dojo.provide("dojox.date.tests.posix"); +dojo.require("dojox.date.posix"); + +tests.register("dojox.date.tests.posix", + [ + + //FIXME: set up by loading 'en' resources +function test_date_strftime(t){ + var date = new Date(2006, 7, 11, 0, 55, 12, 3456); + t.is("06/08/11", dojox.date.posix.strftime(date, "%y/%m/%d")); + + var dt = null; // Date to test + var fmt = ''; // Format to test + var res = ''; // Expected result + + dt = new Date(2006, 0, 1, 18, 23); + fmt = '%a'; + res = 'Sun'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%A'; + res = 'Sunday'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%b'; + res = 'Jan'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%B'; + res = 'January'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%c'; + res = 'Sunday, January 1, 2006 6:23:00 PM'; + t.is(res, dojox.date.posix.strftime(dt, fmt).substring(0, res.length)); + + fmt = '%C'; + res = '20'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%d'; + res = '01'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%D'; + res = '01/01/06'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%e'; + res = ' 1'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%h'; + res = 'Jan'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%H'; + res = '18'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%I'; + res = '06'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%j'; + res = '001'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%k'; + res = '18'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%l'; + res = ' 6'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%m'; + res = '01'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%M'; + res = '23'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%p'; + res = 'PM'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%r'; + res = '06:23:00 PM'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%R'; + res = '18:23'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%S'; + res = '00'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%T'; + res = '18:23:00'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%u'; + res = '7'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%w'; + res = '0'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%x'; + res = 'Sunday, January 1, 2006'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en')); + + fmt = '%X'; + res = '6:23:00 PM'; + t.is(res, dojox.date.posix.strftime(dt, fmt, 'en').substring(0,res.length)); + + fmt = '%y'; + res = '06'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%Y'; + res = '2006'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); + + fmt = '%%'; + res = '%'; + t.is(res, dojox.date.posix.strftime(dt, fmt)); +}, +function test_date_getStartOfWeek(t){ + var weekStart; + + // Monday + var date = new Date(2007, 0, 1); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 1), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 2), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 3), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 4), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 5), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 6), 1); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 7), 1); + t.is(date, weekStart); + + // Sunday + date = new Date(2007, 0, 7); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 7), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 8), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 9), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 10), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 11), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 12), 0); + t.is(date, weekStart); + weekStart = dojox.date.posix.getStartOfWeek(new Date(2007, 0, 13), 0); + t.is(date, weekStart); +}, + +function test_date_setIsoWeekOfYear(t){ + var date = new Date(2006,10,10); + var result = dojox.date.posix.setIsoWeekOfYear(date, 1); + t.is(new Date(2006,0,6), result); + result = dojox.date.posix.setIsoWeekOfYear(date, 10); + result = dojox.date.posix.setIsoWeekOfYear(date, 2); + t.is(new Date(2006,0,13), result); + result = dojox.date.posix.setIsoWeekOfYear(date, 10); + t.is(new Date(2006,2,10), result); + result = dojox.date.posix.setIsoWeekOfYear(date, 52); + t.is(new Date(2006,11,29), result); + var result = dojox.date.posix.setIsoWeekOfYear(date, -1); + t.is(new Date(2006,11,29), result); + var result = dojox.date.posix.setIsoWeekOfYear(date, -2); + t.is(new Date(2006,11,22), result); + var result = dojox.date.posix.setIsoWeekOfYear(date, -10); + t.is(new Date(2006,9,27), result); + + date = new Date(2004,10,10); + result = dojox.date.posix.setIsoWeekOfYear(date, 1); + t.is(new Date(2003,11,31), result); + result = dojox.date.posix.setIsoWeekOfYear(date, 2); + t.is(new Date(2004,0,7), result); + result = dojox.date.posix.setIsoWeekOfYear(date, -1); + t.is(new Date(2004,11,29), result); +}, + +function test_date_getIsoWeekOfYear(t){ + var week = dojox.date.posix.getIsoWeekOfYear(new Date(2006,0,1)); + t.is(52, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2006,0,4)); + t.is(1, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2006,11,31)); + t.is(52, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2007,0,1)); + t.is(1, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2007,11,31)); + t.is(53, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2008,0,1)); + t.is(1, week); + week = dojox.date.posix.getIsoWeekOfYear(new Date(2007,11,31)); + t.is(53, week); +}, + +function test_date_getIsoWeeksInYear(t){ + // 44 long years in a 400 year cycle. + var longYears = [4, 9, 15, 20, 26, 32, 37, 43, 48, 54, 60, 65, 71, 76, 82, + 88, 93, 99, 105, 111, 116, 122, 128, 133, 139, 144, 150, 156, 161, 167, + 172, 178, 184, 189, 195, 201, 207, 212, 218, 224, 229, 235, 240, 246, + 252, 257, 263, 268, 274, 280, 285, 291, 296, 303, 308, 314, 320, 325, + 331, 336, 342, 348, 353, 359, 364, 370, 376, 381, 387, 392, 398]; + + var i, j, weeks, result; + for(i=0; i < 400; i++) { + weeks = 52; + if(i == longYears[0]) { weeks = 53; longYears.shift(); } + result = dojox.date.posix.getIsoWeeksInYear(new Date(2000 + i, 0, 1)); + t.is(/*weeks +" weeks in "+ (2000+i), */weeks, result); + } +} + ] +); + +} diff --git a/includes/js/dojox/date/tests/runTests.html b/includes/js/dojox/date/tests/runTests.html new file mode 100644 index 0000000..57f6ba1 --- /dev/null +++ b/includes/js/dojox/date/tests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/dtl.js b/includes/js/dojox/dtl.js new file mode 100644 index 0000000..2128ab6 --- /dev/null +++ b/includes/js/dojox/dtl.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.dtl"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl"] = true; +dojo.provide("dojox.dtl"); +dojo.require("dojox.dtl._base"); + +} diff --git a/includes/js/dojox/dtl/Context.js b/includes/js/dojox/dtl/Context.js new file mode 100644 index 0000000..f608506 --- /dev/null +++ b/includes/js/dojox/dtl/Context.js @@ -0,0 +1,87 @@ +if(!dojo._hasResource["dojox.dtl.Context"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.Context"] = true; +dojo.provide("dojox.dtl.Context"); +dojo.require("dojox.dtl._base"); + +dojox.dtl.Context = dojo.extend(function(dict){ + this._this = {}; + dojox.dtl._Context.call(this, dict); +}, dojox.dtl._Context.prototype, +{ + extend: function(/*dojox.dtl.Context|Object*/ obj){ + // summary: Returns a clone of this context object, with the items from the + // passed objecct mixed in. + var context = new dojox.dtl.Context(); + var keys = this.getKeys(); + var i, key; + for(i = 0; key = keys[i]; i++){ + if(typeof obj[key] != "undefined"){ + context[key] = obj[key]; + }else{ + context[key] = this[key]; + } + } + + if(obj instanceof dojox.dtl.Context){ + keys = obj.getKeys(); + }else if(typeof obj == "object"){ + keys = []; + for(key in obj){ + keys.push(key); + } + } + + for(i = 0; key = keys[i]; i++){ + context[key] = obj[key]; + } + + return context; + }, + filter: function(/*dojox.dtl.Context|Object|String...*/ filter){ + // summary: Returns a clone of this context, only containing the items + // defined in the filter. + var context = new dojox.dtl.Context(); + var keys = []; + var i, arg; + if(filter instanceof dojox.dtl.Context){ + keys = filter.getKeys(); + }else if(typeof filter == "object"){ + for(var key in filter){ + keys.push(key); + } + }else{ + for(i = 0; arg = arguments[i]; i++){ + if(typeof arg == "string"){ + keys.push(arg); + } + } + } + + for(i = 0, key; key = keys[i]; i++){ + context[key] = this[key]; + } + + return context; + }, + setThis: function(/*Object*/ _this){ + this._this = _this; + }, + getThis: function(){ + return this._this; + }, + hasKey: function(key){ + if(typeof this[key] != "undefined"){ + return true; + } + + for(var i = 0, dict; dict = this._dicts[i]; i++){ + if(typeof dict[key] != "undefined"){ + return true; + } + } + + return false; + } +}); + +} diff --git a/includes/js/dojox/dtl/README b/includes/js/dojox/dtl/README new file mode 100644 index 0000000..a6cc8c3 --- /dev/null +++ b/includes/js/dojox/dtl/README @@ -0,0 +1,207 @@ +------------------------------------------------------------------------------- +DojoX Django Template Language +------------------------------------------------------------------------------- +Version 0.0 +Release date: 09/20/2007 +------------------------------------------------------------------------------- +Project state: experimental/feature incomplete +------------------------------------------------------------------------------- +Project authors + Neil Roberts (pottedmeat@dojotoolkit.org) +------------------------------------------------------------------------------- +Project description + +The Django Template language uses a system of templates that can be compiled +once and rendered indefinitely afterwards. It uses a simple system of tags +and filters. + +This is a 1:1 match with the Django Template Language as outlined in +http://www.djangoproject.com/documentation/templates/. All applicable tags and +filters have been implemented (see below), along with new filters and tags as +necessary (see below). + +The Django Template Language is intended within Django to only handle text. +Our implementation is able to handle HTML in addition to text. Actually, the +text and HTML portions of dojox.dtl are two separate layers, the HTML layer +sits on top of the text layer (base). It's also been implemented in such a way +that you have little to fear when moving your code from Django to dojox.dtl. +Your existing templates should work, and will benefit from the massive +performance gain of being able to manipulate nodes, rather than having to do +clunky innerHTML swaps you would have to do with a text-only system. It also +allows for new HTML-centric abilities, outlined below. + +Despite having two levels of complexity, if you write your tags correctly, they +will work in both environments. +------------------------------------------------------------------------------- +Dependencies + +Base: +dojox.string.Builder + +Date filters and tags: +dojox.date.php + +Widget: +dijit._Widget +dijit._Container +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/dtl.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/dtl/* + +Install into the following directory structure: +/dojox/dtl/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- +What's Been Done + +Note: HTML Unit Tests should only be around for the oddities of HTML, tag/filter +code is the same for each environment with minor exceptions. Cloning of all tags +should be tested inside a for loop. + +| Implemented | Tag | Text Unit Test | HTML Unit Test | +| X | block | X | | +| X | comment | X | | +| X | cycle | X | | +| X | debug | X | | +| X | extends | X | | +| X | filter | X | | +| X | firstof | X | | +| X | for | X | | +| X | if | X | | +| X | ifchanged | X | X | +| X | ifequal | X | | +| X | ifnotequal | X | | +| X | include | X | X | +| X | load | X | | +| X | now | X | | +| X | regroup | X | | +| X | spaceless | X | X | +| X | ssi | X | X | +| X | templatetag | X | | +| N/A | url | | | +| X | widthratio | X | | +| X | with | X | | + +| Implemented | Filter | Text Unit Test | HTML Unit Test | +| X | add | X | | +| X | addslashes | X | | +| X | capfirst | X | | +| X | center | X | | +| X | cut | X | | +| X | date | X | | +| X | default | X | | +| X | default_if_none | X | | +| X | dictsort | X | | +| X | dictsort_reversed | X | | +| X | divisibleby | X | | +| X | escape | X | | +| X | filesizeformat | X | | +| X | first | X | | +| X | fix_ampersands | X | | +| X | floatformat | X | | +| X | get_digit | X | | +| X | iriencode | X | | +| X | join | X | | +| X | length | X | | +| X | length_is | X | | +| X | linebreaks | X | | +| X | linebreaksbr | X | | +| X | linenumbers | X | | +| X | ljust | X | | +| X | lower | X | | +| X | make_list | X | | +| X | phone2numeric | X | | +| X | pluralize | X | | +| X | pprint | X | | +| X | random | X | | +| X | removetags | X | | +| X | rjust | X | | +| X | slice | X | | +| X | slugify | X | | +| X | stringformat | X | | +| X | striptags | X | | +| X | time | X | | +| X | timesince | X | | +| X | timeuntil | X | | +| X | title | X | | +| X | truncatewords | X | | +| X | truncatewords_html | X | | +| X | unordered_list | X | | +| X | upper | X | | +| X | urlencode | X | | +| X | urlize | X | | +| X | urlizetrunc | X | | +| X | wordcount | X | | +| X | wordwrap | X | | +| X | yesno | X | | +------------------------------------------------------------------------------- +HTML-Specific Additions +------------------------------------------------------------------------------- +{%extends "shared:templates/template.html" %} + +When using the {% extends %} tag, we don't always want to replace the parent +node in DOM. For example, if we have a list view and a detail view, but both +share the same base template, we want it to share the parent template. This +basically means that the same nodes will be used in the parent for both views. + +To use this, simply add "shared:" to the beginning of the specified template. +------------------------------------------------------------------------------- + + +Some browsers treat comment nodes as full fledged nodes. If performance is +important to you, you can wrap your markup in comments. The comments will be +automatically stripped for browsers that cannot support this. +------------------------------------------------------------------------------- +Attribute Tags + +If a tag name begins with "attr:" then it will be able to inject an object +into the parsed template. (See dojox.dtl.tag.event.EventNode) + +onclick/onmouseover/etc attributes work by attaching to the rendering object. + +tstyle attribute allows for styles to be changed dynamically. Use them just +like a "style" attribute. + +attach attribute attaches the node to the rendering object. +------------------------------------------------------------------------------- +New Context Functions + +setThis() and getThis() returns the object "in charge" of the current rendering. +This is used so that we can attach events. + +mixin() and filter() clone the current context, and either add to or reduce +the keys in the context. +------------------------------------------------------------------------------- +Buffers + +Both the base and HTML versions of dojox.dtl use buffers. The base version uses +dojox.string.Builder and the HTML version uses dojox.dtl.HtmlBuffer. + +The HTML buffer has several calls important to rendering: + +setParent/getParent/concat/remove: + +setParent and concat are used in order to render our HTML. As we move through +the parsed template, different nodes change the parent or add on to the +current parent. getParent is useful in things like the attribute tags, since +they can use getParent to find the node that they're an attribute on. remove is +used during unrendering. + +setAttribute: + +Sets an attribute on the current parent +------------------------------------------------------------------------------- +Tags Need clone/unrender Functions. + +One of the biggest challenges of getting dojox.dtl to work in an HTML +environment was logic blocks. Nodes and objects inside a for loop need to be +cloned, they can't simply be re-rendered, especially if they involve a Node. +Also, in the case of an if/else block, we need to be able to not just render +one of the blocks, but also unrender the second. + +This is really simple code, a good example is the dojox.dtl.HtmlNode +object. Each function in this object is only one line long. \ No newline at end of file diff --git a/includes/js/dojox/dtl/_HtmlTemplated.js b/includes/js/dojox/dtl/_HtmlTemplated.js new file mode 100644 index 0000000..8947a8d --- /dev/null +++ b/includes/js/dojox/dtl/_HtmlTemplated.js @@ -0,0 +1,72 @@ +if(!dojo._hasResource["dojox.dtl._HtmlTemplated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl._HtmlTemplated"] = true; +dojo.provide("dojox.dtl._HtmlTemplated"); +dojo.require("dijit._Templated"); +dojo.require("dojox.dtl.html"); +dojo.require("dojox.dtl.render.html"); +dojo.require("dojox.dtl.contrib.dijit"); + +dojox.dtl._HtmlTemplated = { + prototype: { + _dijitTemplateCompat: false, + buildRendering: function(){ + this.domNode = this.srcNodeRef; + + if(!this._render){ + var ddcd = dojox.dtl.contrib.dijit; + var old = ddcd.widgetsInTemplate; + ddcd.widgetsInTemplate = this.widgetsInTemplate; + this._template = this._getCachedTemplate(this.templatePath, this.templateString); + this._render = new dojox.dtl.render.html.Render(this.domNode, this._template); + ddcd.widgetsInTemplate = old; + } + + var self = this; + this._rendering = setTimeout(function(){ self.render(); }, 10); + }, + setTemplate: function(/*String|dojo._Url*/ template, /*dojox.dtl.Context?*/ context){ + // summary: + // Quickly switch between templated by location + if(dojox.dtl.text._isTemplate(template)){ + this._template = this._getCachedTemplate(null, template); + }else{ + this._template = this._getCachedTemplate(template); + } + this.render(context); + }, + render: function(/*dojox.dtl.Context?*/ context){ + if(this._rendering){ + clearTimeout(this._rendering); + delete this._rendering; + } + this._render.render(this._getContext(context)); + }, + _getContext: function(context){ + if (!(context instanceof dojox.dtl.Context)) { + context = false; + } + context = context || new dojox.dtl.Context(this); + context.setThis(this); + return context; + }, + _getCachedTemplate: function(templatePath, templateString){ + if(!this._templates){ + this._templates = {}; + } + var key = templateString || templatePath.toString(); + var tmplts = this._templates; + if(tmplts[key]){ + return tmplts[key]; + } + return (tmplts[key] = new dojox.dtl.HtmlTemplate( + dijit._Templated.getCachedTemplate( + templatePath, + templateString, + true + ) + )); + } + } +}; + +} diff --git a/includes/js/dojox/dtl/_Templated.js b/includes/js/dojox/dtl/_Templated.js new file mode 100644 index 0000000..1472fe9 --- /dev/null +++ b/includes/js/dojox/dtl/_Templated.js @@ -0,0 +1,93 @@ +if(!dojo._hasResource["dojox.dtl._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl._Templated"] = true; +dojo.provide("dojox.dtl._Templated"); +dojo.require("dijit._Templated"); +dojo.require("dojox.dtl._base"); + +dojo.declare("dojox.dtl._Templated", dijit._Templated, { + _dijitTemplateCompat: false, + buildRendering: function(){ + var node; + + if(this.domNode && !this._template){ + return; + } + + if(!this._template){ + var t = this.getCachedTemplate( + this.templatePath, + this.templateString, + this._skipNodeCache + ); + if(t instanceof dojox.dtl.Template) { + this._template = t; + }else{ + node = t; + } + } + if(!node){ + var nodes = dijit._Templated._createNodesFromText( + this._template.render(new dojox.dtl._Context(this)) + ); + for(var i = 0; i < nodes.length; i++){ + if(nodes[i].nodeType == 1){ + node = nodes[i]; + break; + } + } + } + + this._attachTemplateNodes(node); + + var source = this.srcNodeRef; + if(source && source.parentNode){ + source.parentNode.replaceChild(node, source); + } + + if(this.widgetsInTemplate){ + var childWidgets = dojo.parser.parse(node); + this._attachTemplateNodes(childWidgets, function(n,p){ + return n[p]; + }); + } + + if(this.domNode){ + dojo.place(node, this.domNode, "before"); + this.destroyDescendants(); + dojo._destroyElement(this.domNode); + } + this.domNode = node; + + this._fillContent(source); + }, + _templateCache: {}, + getCachedTemplate: function(templatePath, templateString, alwaysUseString){ + // summary: + // Layer for dijit._Templated.getCachedTemplate + var tmplts = this._templateCache; + var key = templateString || templatePath; + if(tmplts[key]){ + return tmplts[key]; + } + + templateString = dojo.string.trim(templateString || dijit._Templated._sanitizeTemplateString(dojo._getText(templatePath))); + + if( this._dijitTemplateCompat && + (alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)) + ){ + templateString = this._stringRepl(templateString); + } + + // If we always use a string, or find no variables, just store it as a node + if(alwaysUseString || !templateString.match(/\{[{%]([^\}]+)[%}]\}/g)){ + return (tmplts[key] = dijit._Templated._createNodesFromText(templateString)[0]); + }else{ + return (tmplts[key] = new dojox.dtl.Template(templateString)); + } + }, + render: function(){ + this.buildRendering(); + } +}); + +} diff --git a/includes/js/dojox/dtl/_base.js b/includes/js/dojox/dtl/_base.js new file mode 100644 index 0000000..f42f245 --- /dev/null +++ b/includes/js/dojox/dtl/_base.js @@ -0,0 +1,570 @@ +if(!dojo._hasResource["dojox.dtl._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl._base"] = true; +dojo.provide("dojox.dtl._base"); + +dojo.require("dojox.string.Builder"); +dojo.require("dojox.string.tokenize"); + +(function(){ + var dd = dojox.dtl; + + dd._Context = dojo.extend(function(dict){ + // summary: Pass one of these when rendering a template to tell the template what values to use. + dojo.mixin(this, dict || {}); + this._dicts = []; + }, + { + push: function(){ + var dict = {}; + var keys = this.getKeys(); + for(var i = 0, key; key = keys[i]; i++){ + dict[key] = this[key]; + delete this[key]; + } + this._dicts.unshift(dict); + }, + pop: function(){ + if(!this._dicts.length){ + throw new Error("pop() called on empty Context"); + } + var dict = this._dicts.shift(); + dojo.mixin(this, dict); + }, + getKeys: function(){ + var keys = []; + for(var key in this){ + if(this.hasOwnProperty(key) && key != "_dicts" && key != "_this"){ + keys.push(key); + } + } + return keys; + }, + get: function(key, otherwise){ + if(typeof this[key] != "undefined"){ + return this._normalize(this[key]); + } + + for(var i = 0, dict; dict = this._dicts[i]; i++){ + if(typeof dict[key] != "undefined"){ + return this._normalize(dict[key]); + } + } + + return otherwise; + }, + _normalize: function(value){ + if(value instanceof Date){ + value.year = value.getFullYear(); + value.month = value.getMonth() + 1; + value.day = value.getDate(); + value.date = value.year + "-" + ("0" + value.month).slice(-2) + "-" + ("0" + value.day).slice(-2); + value.hour = value.getHours(); + value.minute = value.getMinutes(); + value.second = value.getSeconds(); + value.microsecond = value.getMilliseconds(); + } + return value; + }, + update: function(dict){ + this.push(); + if(dict){ + dojo.mixin(this, dict); + } + } + }); + + var ddt = dd.text = { + types: {tag: -1, varr: -2, text: 3}, + pySplit: function(str){ + // summary: Split a string according to Python's split function + str = dojo.trim(str); + return (!str.length) ? [] : str.split(/\s+/g); + }, + _get: function(module, name, errorless){ + // summary: Used to find both tags and filters + var params = dd.register.get(module, name.toLowerCase(), errorless); + if(!params){ + if(!errorless){ + throw new Error("No tag found for " + name); + } + return null; + } + + var fn = params[1]; + var require = params[2]; + + var parts; + if(fn.indexOf(":") != -1){ + parts = fn.split(":"); + fn = parts.pop(); + } + + dojo["require"](require); + + var parent = dojo.getObject(require); + + return parent[fn || name] || parent[name + "_"]; + }, + getTag: function(name, errorless){ + return ddt._get("tag", name, errorless); + }, + getFilter: function(name, errorless){ + return ddt._get("filter", name, errorless); + }, + getTemplate: function(file){ + return new dd.Template(dd.getTemplateString(file)); + }, + getTemplateString: function(file){ + return dojo._getText(file.toString()) || ""; + }, + _resolveLazy: function(location, sync, json){ + if(sync){ + if(json){ + return dojo.fromJson(dojo._getText(location)) || {}; + }else{ + return dd.text.getTemplateString(location); + } + }else{ + return dojo.xhrGet({ + handleAs: (json) ? "json" : "text", + url: location + }); + } + }, + _resolveTemplateArg: function(arg, sync){ + if(ddt._isTemplate(arg)){ + if(!sync){ + var d = new dojo.Deferred(); + d.callback(arg); + return d; + } + return arg; + } + return ddt._resolveLazy(arg, sync); + }, + _isTemplate: function(arg){ + return (typeof arg == "undefined") || (dojo.isString(arg) && (arg.match(/^\s*[<{]/) || arg.indexOf(" ") != -1)); + }, + _resolveContextArg: function(arg, sync){ + if(arg.constructor == Object){ + if(!sync){ + var d = new dojo.Deferred; + d.callback(arg); + return d; + } + return arg; + } + return ddt._resolveLazy(arg, sync, true); + }, + _re: /(?:\{\{\s*(.+?)\s*\}\}|\{%\s*(load\s*)?(.+?)\s*%\})/g, + tokenize: function(str){ + return dojox.string.tokenize(str, ddt._re, ddt._parseDelims); + }, + _parseDelims: function(varr, load, tag){ + var types = ddt.types; + if(varr){ + return [types.varr, varr]; + }else if(load){ + var parts = dd.text.pySplit(tag); + for(var i = 0, part; part = parts[i]; i++){ + dojo["require"](part); + } + }else{ + return [types.tag, tag]; + } + } + } + + dd.Template = dojo.extend(function(/*String|dojo._Url*/ template){ + // template: + // The string or location of the string to + // use as a template + var str = ddt._resolveTemplateArg(template, true) || ""; + var tokens = ddt.tokenize(str); + var parser = new dd._Parser(tokens); + this.nodelist = parser.parse(); + }, + { + update: function(node, context){ + // node: DOMNode|String|dojo.NodeList + // A node reference or set of nodes + // context: dojo._Url|String|Object + // The context object or location + return ddt._resolveContextArg(context).addCallback(this, function(contextObject){ + var content = this.render(new dd._Context(contextObject)); + if(node.forEach){ + node.forEach(function(item){ + item.innerHTML = content; + }); + }else{ + dojo.byId(node).innerHTML = content; + } + return this; + }); + }, + render: function(context, /*concatenatable?*/ buffer){ + buffer = buffer || this.getBuffer(); + context = context || new dd._Context({}); + return this.nodelist.render(context, buffer) + ""; + }, + getBuffer: function(){ + dojo.require("dojox.string.Builder"); + return new dojox.string.Builder(); + } + }); + + dd._Filter = dojo.extend(function(token){ + // summary: Uses a string to find (and manipulate) a variable + if(!token) throw new Error("Filter must be called with variable name"); + this.contents = token; + + var cache = this._cache[token]; + if(cache){ + this.key = cache[0]; + this.filters = cache[1]; + }else{ + this.filters = []; + dojox.string.tokenize(token, this._re, this._tokenize, this); + this._cache[token] = [this.key, this.filters]; + } + }, + { + _cache: {}, + _re: /(?:^_\("([^\\"]*(?:\\.[^\\"])*)"\)|^"([^\\"]*(?:\\.[^\\"]*)*)"|^([a-zA-Z0-9_.]+)|\|(\w+)(?::(?:_\("([^\\"]*(?:\\.[^\\"])*)"\)|"([^\\"]*(?:\\.[^\\"]*)*)"|([a-zA-Z0-9_.]+)|'([^\\']*(?:\\.[^\\']*)*)'))?|^'([^\\']*(?:\\.[^\\']*)*)')/g, + _values: { + 0: '"', // _("text") + 1: '"', // "text" + 2: "", // variable + 8: '"' // 'text' + }, + _args: { + 4: '"', // :_("text") + 5: '"', // :"text" + 6: "", // :variable + 7: "'"// :'text' + }, + _tokenize: function(){ + var pos, arg; + + for(var i = 0, has = []; i < arguments.length; i++){ + has[i] = (typeof arguments[i] != "undefined" && dojo.isString(arguments[i]) && arguments[i]); + } + + if(!this.key){ + for(pos in this._values){ + if(has[pos]){ + this.key = this._values[pos] + arguments[pos] + this._values[pos]; + break; + } + } + }else{ + for(pos in this._args){ + if(has[pos]){ + var value = arguments[pos]; + if(this._args[pos] == "'"){ + value = value.replace(/\\'/g, "'"); + }else if(this._args[pos] == '"'){ + value = value.replace(/\\"/g, '"'); + } + arg = [!this._args[pos], value]; + break; + } + } + // Get a named filter + var fn = ddt.getFilter(arguments[3]); + if(!dojo.isFunction(fn)) throw new Error(arguments[3] + " is not registered as a filter"); + this.filters.push([fn, arg]); + } + }, + getExpression: function(){ + return this.contents; + }, + resolve: function(context){ + var str = this.resolvePath(this.key, context); + for(var i = 0, filter; filter = this.filters[i]; i++){ + // Each filter has the function in [0], a boolean in [1][0] of whether it's a variable or a string + // and [1][1] is either the variable name of the string content. + if(filter[1]){ + if(filter[1][0]){ + str = filter[0](str, this.resolvePath(filter[1][1], context)); + }else{ + str = filter[0](str, filter[1][1]); + } + }else{ + str = filter[0](str); + } + } + return str; + }, + resolvePath: function(path, context){ + var current, parts; + var first = path.charAt(0); + var last = path.slice(-1); + if(!isNaN(parseInt(first))){ + current = (path.indexOf(".") == -1) ? parseInt(path) : parseFloat(path); + }else if(first == '"' && first == last){ + current = path.slice(1, -1); + }else{ + if(path == "true"){ return true; } + if(path == "false"){ return false; } + if(path == "null" || path == "None"){ return null; } + parts = path.split("."); + current = context.get(parts[0]); + for(var i = 1; i < parts.length; i++){ + var part = parts[i]; + if(current){ + if(dojo.isObject(current) && part == "items" && typeof current[part] == "undefined"){ + var items = []; + for(var key in current){ + items.push([key, current[key]]); + } + current = items; + continue; + } + + if(current.get && dojo.isFunction(current.get)){ + current = current.get(part); + }else if(typeof current[part] == "undefined"){ + current = current[part]; + break; + }else{ + current = current[part]; + } + + if(dojo.isFunction(current)){ + if(current.alters_data){ + current = ""; + }else{ + current = current(); + } + } + }else{ + return ""; + } + } + } + return current; + } + }); + + dd._TextNode = dd._Node = dojo.extend(function(/*Object*/ obj){ + // summary: Basic catch-all node + this.contents = obj; + }, + { + set: function(data){ + this.contents = data; + }, + render: function(context, buffer){ + // summary: Adds content onto the buffer + return buffer.concat(this.contents); + } + }); + + dd._NodeList = dojo.extend(function(/*Node[]*/ nodes){ + // summary: Allows us to render a group of nodes + this.contents = nodes || []; + this.last = ""; + }, + { + push: function(node){ + // summary: Add a new node to the list + this.contents.push(node); + }, + render: function(context, buffer){ + // summary: Adds all content onto the buffer + for(var i = 0; i < this.contents.length; i++){ + buffer = this.contents[i].render(context, buffer); + if(!buffer) throw new Error("Template must return buffer"); + } + return buffer; + }, + dummyRender: function(context){ + return this.render(context, dd.Template.prototype.getBuffer()).toString(); + }, + unrender: function(){ return arguments[1]; }, + clone: function(){ return this; } + }); + + dd._VarNode = dojo.extend(function(str){ + // summary: A node to be processed as a variable + this.contents = new dd._Filter(str); + }, + { + render: function(context, buffer){ + var str = this.contents.resolve(context); + return buffer.concat(str); + } + }); + + dd._noOpNode = new function(){ + // summary: Adds a no-op node. Useful in custom tags + this.render = this.unrender = function(){ return arguments[1]; } + this.clone = function(){ return this; } + } + + dd._Parser = dojo.extend(function(tokens){ + // summary: Parser used during initialization and for tag groups. + this.contents = tokens; + }, + { + i: 0, + parse: function(/*Array?*/ stop_at){ + // summary: Turns tokens into nodes + // description: Steps into tags are they're found. Blocks use the parse object + // to find their closing tag (the stop_at array). stop_at is inclusive, it + // returns the node that matched. + var types = ddt.types; + var terminators = {}; + stop_at = stop_at || []; + for(var i = 0; i < stop_at.length; i++){ + terminators[stop_at[i]] = true; + } + + var nodelist = new dd._NodeList(); + while(this.i < this.contents.length){ + token = this.contents[this.i++]; + if(dojo.isString(token)){ + nodelist.push(new dd._TextNode(token)); + }else{ + var type = token[0]; + var text = token[1]; + if(type == types.varr){ + nodelist.push(new dd._VarNode(text)); + }else if(type == types.tag){ + if(terminators[text]){ + --this.i; + return nodelist; + } + var cmd = text.split(/\s+/g); + if(cmd.length){ + cmd = cmd[0]; + var fn = ddt.getTag(cmd); + if(fn){ + nodelist.push(fn(this, text)); + } + } + } + } + } + + if(stop_at.length){ + throw new Error("Could not find closing tag(s): " + stop_at.toString()); + } + + this.contents.length = 0; + return nodelist; + }, + next: function(){ + // summary: Returns the next token in the list. + var token = this.contents[this.i++]; + return {type: token[0], text: token[1]}; + }, + skipPast: function(endtag){ + var types = ddt.types; + while(this.i < this.contents.length){ + var token = this.contents[this.i++]; + if(token[0] == types.tag && token[1] == endtag){ + return; + } + } + throw new Error("Unclosed tag found when looking for " + endtag); + }, + getVarNodeConstructor: function(){ + return dd._VarNode; + }, + getTextNodeConstructor: function(){ + return dd._TextNode; + }, + getTemplate: function(file){ + return new dd.Template(file); + } + }); + + dd.register = { + _registry: { + attributes: [], + tags: [], + filters: [] + }, + get: function(/*String*/ module, /*String*/ name){ + var registry = dd.register._registry[module + "s"]; + for(var i = 0, entry; entry = registry[i]; i++){ + if(dojo.isString(entry[0])){ + if(entry[0] == name){ + return entry; + } + }else if(name.match(entry[0])){ + return entry; + } + } + }, + getAttributeTags: function(){ + var tags = []; + var registry = dd.register._registry.attributes; + for(var i = 0, entry; entry = registry[i]; i++){ + if(entry.length == 3){ + tags.push(entry); + }else{ + var fn = dojo.getObject(entry[1]); + if(fn && dojo.isFunction(fn)){ + entry.push(fn); + tags.push(entry); + } + } + } + return tags; + }, + _any: function(type, base, locations){ + for(var path in locations){ + for(var i = 0, fn; fn = locations[path][i]; i++){ + var key = fn; + if(dojo.isArray(fn)){ + key = fn[0]; + fn = fn[1]; + } + if(dojo.isString(key)){ + if(key.substr(0, 5) == "attr:"){ + var attr = fn; + if(attr.substr(0, 5) == "attr:"){ + attr = attr.slice(5); + } + dd.register._registry.attributes.push([attr, base + "." + path + "." + attr]); + } + key = key.toLowerCase(); + } + dd.register._registry[type].push([ + key, + fn, + base + "." + path + ]); + } + } + }, + tags: function(/*String*/ base, /*Object*/ locations){ + dd.register._any("tags", base, locations); + }, + filters: function(/*String*/ base, /*Object*/ locations){ + dd.register._any("filters", base, locations); + } + } + + dd.register.tags("dojox.dtl.tag", { + "date": ["now"], + "logic": ["if", "for", "ifequal", "ifnotequal"], + "loader": ["extends", "block", "include", "load", "ssi"], + "misc": ["comment", "debug", "filter", "firstof", "spaceless", "templatetag", "widthratio", "with"], + "loop": ["cycle", "ifchanged", "regroup"] + }); + dd.register.filters("dojox.dtl.filter", { + "dates": ["date", "time", "timesince", "timeuntil"], + "htmlstrings": ["escape", "linebreaks", "linebreaksbr", "removetags", "striptags"], + "integers": ["add", "get_digit"], + "lists": ["dictsort", "dictsortreversed", "first", "join", "length", "length_is", "random", "slice", "unordered_list"], + "logic": ["default", "default_if_none", "divisibleby", "yesno"], + "misc": ["filesizeformat", "pluralize", "phone2numeric", "pprint"], + "strings": ["addslashes", "capfirst", "center", "cut", "fix_ampersands", "floatformat", "iriencode", "linenumbers", "ljust", "lower", "make_list", "rjust", "slugify", "stringformat", "title", "truncatewords", "truncatewords_html", "upper", "urlencode", "urlize", "urlizetrunc", "wordcount", "wordwrap"] + }); +})(); + +} diff --git a/includes/js/dojox/dtl/contrib/data.js b/includes/js/dojox/dtl/contrib/data.js new file mode 100644 index 0000000..5ca3aa7 --- /dev/null +++ b/includes/js/dojox/dtl/contrib/data.js @@ -0,0 +1,89 @@ +if(!dojo._hasResource["dojox.dtl.contrib.data"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.contrib.data"] = true; +dojo.provide("dojox.dtl.contrib.data"); +dojo.require("dojox.dtl._base"); + +(function(){ + var dd = dojox.dtl; + var ddcd = dd.contrib.data; + + ddcd._BoundItem = dojo.extend(function(item, store){ + this.item = item; + this.store = store; + }, + { + get: function(key){ + var store = this.store; + var item = this.item; + + if(key == "getLabel"){ + return store.getLabel(item); + }else if(key == "getAttributes"){ + return store.getAttributes(item); + }else if(key == "getIdentity"){ + if(store.getIdentity){ + return store.getIdentity(item); + } + return "Store has no identity API"; + }else{ + if(store.hasAttribute(item, key)){ + var value = store.getValue(item, key); + return (dojo.isObject(value) && store.isItem(value)) ? new ddcd._BoundItem(value, store) : value; + }else if(key.slice(-1) == "s" && store.hasAttribute(item, key.slice(0, -1))){ + return dojo.map(store.getValues(item, key.slice(0, -1)), function(value){ + return (dojo.isObject(value) && store.isItem(value)) ? new ddcd._BoundItem(value, store) : value; + }); + } + } + } + }); + + ddcd.BindDataNode = dojo.extend(function(items, store, alias){ + this.items = new dd._Filter(items); + this.store = new dd._Filter(store); + this.alias = alias; + }, + { + render: function(context, buffer){ + var items = this.items.resolve(context); + var store = this.store.resolve(context); + if(!store){ + throw new Error("data_bind didn't receive a store"); + } + + var list = []; + if(items){ + for(var i = 0, item; item = items[i]; i++){ + list.push(new ddcd._BoundItem(item, store)); + } + } + + context[this.alias] = list; + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(){ + return this; + } + }); + + dojo.mixin(ddcd, { + bind_data: function(parser, text){ + var parts = dd.text.pySplit(text); + + if(parts[2] != 'to' || parts[4] != 'as' || !parts[5]){ + throw new Error("data_bind expects the format: 'data_bind items to store as varName'"); + } + + return new ddcd.BindDataNode(parts[1], parts[3], parts[5]); + } + }); + + dd.register.tags("dojox.dtl.contrib", { + "data": ["bind_data"] + }); +})(); + +} diff --git a/includes/js/dojox/dtl/contrib/dijit.js b/includes/js/dojox/dtl/contrib/dijit.js new file mode 100644 index 0000000..41caf33 --- /dev/null +++ b/includes/js/dojox/dtl/contrib/dijit.js @@ -0,0 +1,220 @@ +if(!dojo._hasResource["dojox.dtl.contrib.dijit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.contrib.dijit"] = true; +dojo.provide("dojox.dtl.contrib.dijit"); + +dojo.require("dojox.dtl.html"); +dojo.require("dojo.parser"); + +(function(){ + var dd = dojox.dtl; + var ddcd = dd.contrib.dijit; + + ddcd.AttachNode = dojo.extend(function(keys, object){ + this._keys = keys; + this._object = object; + }, + { + render: function(context, buffer){ + if(!this._rendered){ + this._rendered = true; + for(var i=0, key; key = this._keys[i]; i++){ + context.getThis()[key] = this._object || buffer.getParent(); + } + } + return buffer; + }, + unrender: function(context, buffer){ + if(this._rendered){ + this._rendered = false; + for(var i=0, key; key = this._keys[i]; i++){ + if(context.getThis()[key] === (this._object || buffer.getParent())){ + delete context.getThis()[key]; + } + } + } + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this._keys, this._object); + } + }); + + ddcd.EventNode = dojo.extend(function(command, obj){ + this._command = command; + + var type, events = command.split(/\s*,\s*/); + var trim = dojo.trim; + var types = []; + var fns = []; + while(type = events.pop()){ + if(type){ + var fn = null; + if(type.indexOf(":") != -1){ + // oh, if only JS had tuple assignment + var funcNameArr = type.split(":"); + type = trim(funcNameArr[0]); + fn = trim(funcNameArr[1]); + }else{ + type = trim(type); + } + if(!fn){ + fn = type; + } + types.push(type); + fns.push(fn); + } + } + + this._types = types; + this._fns = fns; + this._object = obj; + this._rendered = []; + }, + { + // _clear: Boolean + // Make sure we kill the actual tags (onclick problems, etc) + _clear: false, + render: function(context, buffer){ + for(var i = 0, type; type = this._types[i]; i++){ + if(!this._clear && !this._object){ + buffer.getParent()[type] = null; + } + var fn = this._fns[i]; + var args; + if(fn.indexOf(" ") != -1){ + if(this._rendered[i]){ + dojo.disconnect(this._rendered[i]); + this._rendered[i] = false; + } + args = dojo.map(fn.split(" ").slice(1), function(item){ + return new dd._Filter(item).resolve(context); + }); + fn = fn[0]; + } + if(!this._rendered[i]){ + if(!this._object){ + this._rendered[i] = buffer.addEvent(context, type, fn, args); + }else{ + this._rendered[i] = dojo.connect(this._object, type, context.getThis(), fn); + } + } + } + this._clear = true; + + return buffer; + }, + unrender: function(context, buffer){ + while(this._rendered.length){ + dojo.disconnect(this._rendered.pop()); + } + return buffer; + }, + clone: function(){ + return new this.constructor(this._command, this._object); + } + }); + + function cloneNode(n1){ + var n2 = n1.cloneNode(true); + if(dojo.isIE){ + dojo.query("script", n2).forEach("item.text = this[index].text;", dojo.query("script", n1)); + } + return n2; + } + + ddcd.DojoTypeNode = dojo.extend(function(node, parsed){ + this._node = node; + this._parsed = parsed; + + var events = node.getAttribute("dojoAttachEvent"); + if(events){ + this._events = new ddcd.EventNode(dojo.trim(events)); + } + var attach = node.getAttribute("dojoAttachPoint"); + if(attach){ + this._attach = new ddcd.AttachNode(dojo.trim(attach).split(/\s*,\s*/)); + } + + if (!parsed){ + this._dijit = dojo.parser.instantiate([cloneNode(node)])[0]; + }else{ + node = cloneNode(node); + var old = ddcd.widgetsInTemplate; + ddcd.widgetsInTemplate = false; + this._template = new dd.HtmlTemplate(node); + ddcd.widgetsInTemplate = old; + } + }, + { + render: function(context, buffer){ + if(this._parsed){ + var _buffer = new dd.HtmlBuffer(); + this._template.render(context, _buffer); + var root = cloneNode(_buffer.getRootNode()); + var div = document.createElement("div"); + div.appendChild(root); + var rendered = div.innerHTML; + div.removeChild(root); + if(rendered != this._rendered){ + this._rendered = rendered; + if(this._dijit){ + this._dijit.destroyRecursive(); + } + this._dijit = dojo.parser.instantiate([root])[0]; + } + } + + var node = this._dijit.domNode; + + if(this._events){ + this._events._object = this._dijit; + this._events.render(context, buffer); + } + if(this._attach){ + this._attach._object = this._dijit; + this._attach.render(context, buffer); + } + + return buffer.concat(node); + }, + unrender: function(context, buffer){ + return buffer.remove(this._dijit.domNode); + }, + clone: function(){ + return new this.constructor(this._node, this._parsed); + } + }); + + dojo.mixin(ddcd, { + widgetsInTemplate: true, + dojoAttachPoint: function(parser, text){ + return new ddcd.AttachNode(dojo.trim(text).slice(16).split(/\s*,\s*/)); + }, + dojoAttachEvent: function(parser, text){ + return new ddcd.EventNode(text.slice(16)); + }, + dojoType: function(parser, text){ + if(ddcd.widgetsInTemplate){ + var node = parser.swallowNode(); + var parsed = false; + if(text.slice(-7) == " parsed"){ + parsed = true; + node.setAttribute("dojoType", dojo.trim(text).slice(0, -7)); + } + return new ddcd.DojoTypeNode(node, parsed); + } + return dd._noOpNode; + }, + on: function(parser, text){ + // summary: Associates an event type to a function (on the current widget) by name + var parts = text.split(" "); + return new ddcd.EventNode(parts[0] + ":" + parts.slice(1).join(" ")); + } + }); + + dd.register.tags("dojox.dtl.contrib", { + "dijit": ["attr:dojoType", "attr:dojoAttachPoint", ["attr:attach", "dojoAttachPoint"], "attr:dojoAttachEvent", [/(attr:)?on(click|key(up))/i, "on"]] + }); +})(); + +} diff --git a/includes/js/dojox/dtl/contrib/html.js b/includes/js/dojox/dtl/contrib/html.js new file mode 100644 index 0000000..260bbe2 --- /dev/null +++ b/includes/js/dojox/dtl/contrib/html.js @@ -0,0 +1,107 @@ +if(!dojo._hasResource["dojox.dtl.contrib.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.contrib.html"] = true; +dojo.provide("dojox.dtl.contrib.html"); + +dojo.require("dojox.dtl.html"); + +(function(){ + var dd = dojox.dtl; + var ddch = dd.contrib.html; + + ddch.HtmlNode = dojo.extend(function(name){ + this.contents = new dd._Filter(name); + this._div = document.createElement("div"); + this._lasts = []; + }, + { + render: function(context, buffer){ + var text = this.contents.resolve(context); + if(text){ + text = text.replace(/<(\/?script)/ig, '<$1').replace(/\bon[a-z]+\s*=/ig, ''); + if(this._rendered && this._last != text){ + buffer = this.unrender(context, buffer); + } + this._last = text; + + // This can get reset in the above tag + if(!this._rendered){ + this._rendered = true; + var div = this._div; + div.innerHTML = text; + var children = div.childNodes; + while(children.length){ + var removed = div.removeChild(children[0]); + this._lasts.push(removed); + buffer = buffer.concat(removed); + } + } + } + + return buffer; + }, + unrender: function(context, buffer){ + if(this._rendered){ + this._rendered = false; + this._last = ""; + for(var i = 0, node; node = this._lasts[i++];){ + buffer = buffer.remove(node); + dojo._destroyElement(node); + } + this._lasts = []; + } + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this.contents.getExpression()); + } + }); + + ddch.StyleNode = dojo.extend(function(styles){ + this.contents = {}; + this._styles = styles; + for(var key in styles){ + this.contents[key] = new dd.Template(styles[key]); + } + }, + { + render: function(context, buffer){ + for(var key in this.contents){ + dojo.style(buffer.getParent(), key, this.contents[key].render(context)); + } + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this._styles); + } + }); + + dojo.mixin(ddch, { + html: function(parser, text){ + var parts = text.split(" ", 2); + return new ddch.HtmlNode(parts[1]); + }, + tstyle: function(parser, text){ + var styles = {}; + text = text.replace(/^tstyle\s+/, ""); + var rules = text.split(/\s*;\s*/g); + for(var i = 0, rule; rule = rules[i]; i++){ + var parts = rule.split(/\s*:\s*/g); + var key = parts[0]; + var value = parts[1]; + if(value.indexOf("{{") == 0){ + styles[key] = value; + } + } + return new ddch.StyleNode(styles); + } + }); + + dd.register.tags("dojox.dtl.contrib", { + "html": ["html", "attr:tstyle"] + }); +})(); + +} diff --git a/includes/js/dojox/dtl/contrib/objects.js b/includes/js/dojox/dtl/contrib/objects.js new file mode 100644 index 0000000..d29c0df --- /dev/null +++ b/includes/js/dojox/dtl/contrib/objects.js @@ -0,0 +1,15 @@ +if(!dojo._hasResource["dojox.dtl.contrib.objects"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.contrib.objects"] = true; +dojo.provide("dojox.dtl.contrib.objects"); + +dojo.mixin(dojox.dtl.contrib.objects, { + key: function(value, arg){ + return value[arg]; + } +}); + +dojox.dtl.register.filters("dojox.dtl.contrib", { + "objects": ["key"] +}); + +} diff --git a/includes/js/dojox/dtl/demos/demo_Animation.html b/includes/js/dojox/dtl/demos/demo_Animation.html new file mode 100644 index 0000000..1a5e278 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Animation.html @@ -0,0 +1,45 @@ + + + Testing dojox.dtl using animation to change attributes + + + + +
          + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/demo_Blog.html b/includes/js/dojox/dtl/demos/demo_Blog.html new file mode 100644 index 0000000..c9bd990 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Blog.html @@ -0,0 +1,96 @@ + + + Testing dojox.dtl using a blog example + + + + +
          + + diff --git a/includes/js/dojox/dtl/demos/demo_Data.html b/includes/js/dojox/dtl/demos/demo_Data.html new file mode 100644 index 0000000..93bb76f --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Data.html @@ -0,0 +1,58 @@ + + + Demo using the dojo.data bind_data tag + + + + +
          + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/demo_Dijitless.html b/includes/js/dojox/dtl/demos/demo_Dijitless.html new file mode 100644 index 0000000..2aaceaa --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Dijitless.html @@ -0,0 +1,50 @@ + + + Demo using dojox.dtl._HtmlTemplated without Dijit + + + + +
          + + diff --git a/includes/js/dojox/dtl/demos/demo_Events.html b/includes/js/dojox/dtl/demos/demo_Events.html new file mode 100644 index 0000000..aa3da46 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Events.html @@ -0,0 +1,46 @@ + + + Demo using dojox.dtl._Templated + + + + + +
          + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/demo_HtmlTemplated.html b/includes/js/dojox/dtl/demos/demo_HtmlTemplated.html new file mode 100644 index 0000000..71dabe4 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_HtmlTemplated.html @@ -0,0 +1,40 @@ + + + Demo using dojox.dtl._HtmlTemplated + + + + + +
          + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/demo_Inline.html b/includes/js/dojox/dtl/demos/demo_Inline.html new file mode 100644 index 0000000..6e17d8e --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Inline.html @@ -0,0 +1,48 @@ + + + Demo using dojox.dtl._HtmlTemplated inline in DOM + + + + +
            + {% for item in items %} +
          • {{ item }}
          • + {% endfor %} +
          + +
            + {% for item in items reversed %} +
          • {{ item }}
          • + {% endfor %} +
          + + diff --git a/includes/js/dojox/dtl/demos/demo_NodeList.html b/includes/js/dojox/dtl/demos/demo_NodeList.html new file mode 100644 index 0000000..d1ab0a8 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_NodeList.html @@ -0,0 +1,37 @@ + + + Demo using dojox.dtl._Templated + + + + +
          +
          +
          +
          + + diff --git a/includes/js/dojox/dtl/demos/demo_Table.html b/includes/js/dojox/dtl/demos/demo_Table.html new file mode 100644 index 0000000..56dc8ac --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Table.html @@ -0,0 +1,4072 @@ + + + Demo to show a massive nested for loop to render a table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          IndexNumericTextCurrencyDate
          0158.9Bill$22.442008-12-28
          1690.4Joe$3.032009-07-03
          2843Bob$11.142010-09-30
          357.8Matt$70.642009-12-16
          4494.6Mark$9.132010-05-11
          5766.3Tom$55.342008-03-10
          6699.3Jake$26.242008-11-26
          7487.8Greg$72.942010-06-23
          8786.2Adam$34.642008-09-19
          9188.6Steve$6.332009-01-01
          10898.4George$22.242009-09-18
          11222.2John$91.242009-10-23
          12707.9Phil$75.542010-02-28
          13585.5Jack$81.342009-03-24
          14213.8Paul$30.742009-07-08
          15968.5Rob$7.332008-02-06
          1639.3Walt$77.342008-12-05
          17335.7Nathan$26.142008-01-27
          18127.6Dan$4.732009-03-03
          19365.3Jeff$23.542009-05-15
          20692.9Bill$13.342010-01-26
          21244.9Joe$35.642009-10-16
          22827Bob$6.332009-01-06
          23519.6Matt$64.942008-06-03
          24917.8Mark$86.342009-05-24
          25407.1Tom$83.142009-08-17
          26449.3Jake$87.042008-11-27
          27753.5Greg$20.642009-09-25
          28787Adam$33.442009-11-18
          29166.9Steve$69.942010-08-17
          30609.6George$39.242011-01-18
          31274John$63.642009-01-02
          32850.3Phil$46.342009-03-17
          33181.4Jack$98.342008-02-04
          34325.3Paul$90.142010-10-30
          35776.3Rob$30.842010-04-17
          36300.8Walt$75.742009-11-18
          37598Nathan$51.042010-07-15
          38155.6Dan$29.742008-06-04
          39759.8Jeff$46.442010-08-21
          40599.2Bill$7.432008-09-16
          41571.9Joe$34.842010-09-23
          42900.3Bob$19.842009-01-09
          43292.2Matt$37.942008-12-21
          44333Mark$70.542008-08-28
          45236.4Tom$48.142009-08-19
          46970.9Jake$78.242008-11-10
          47575.8Greg$37.942010-06-24
          48386.7Adam$53.542008-04-02
          49531.1Steve$29.542009-09-21
          50374.3George$89.442009-12-15
          51609.1John$46.642011-01-22
          52480.3Phil$36.642008-07-07
          53814.8Jack$65.842009-09-19
          54132.2Paul$99.142008-10-12
          55350.1Rob$22.842010-04-22
          56875.7Walt$19.842009-08-12
          57158.1Nathan$77.442010-10-25
          58950.9Dan$16.142009-05-05
          5941.1Jeff$69.242010-04-11
          60595.4Bill$6.632009-12-09
          61223.4Joe$67.542008-03-30
          62199.2Bob$15.642009-05-28
          63372.8Matt$97.042008-04-28
          64925.7Mark$10.242008-04-17
          65183.1Tom$45.342009-01-05
          66921.2Jake$32.842009-08-23
          67440.8Greg$48.642008-12-04
          68339.8Adam$43.742009-06-08
          69773.7Steve$47.842008-06-17
          70502.3George$7.332008-09-01
          71124.8John$29.742010-10-22
          72213Phil$49.642008-02-18
          73667.3Jack$86.942008-01-14
          74779.8Paul$79.442008-05-12
          75883.3Rob$97.742009-10-17
          76214.4Walt$89.942010-11-01
          77743.7Nathan$33.942009-03-16
          7847Dan$67.942010-08-04
          79511Jeff$45.342008-12-08
          80666.7Bill$95.542009-03-03
          81888.5Joe$8.032010-02-09
          82785.4Bob$29.342008-07-06
          83837.7Matt$96.042008-02-05
          84860.2Mark$74.042010-08-12
          85985Tom$62.342010-07-17
          86562.3Jake$83.742010-03-21
          87467.6Greg$58.142008-02-16
          88859Adam$62.842010-04-12
          89687.5Steve$13.942008-07-17
          90993.9George$80.542008-05-26
          91373.8John$69.442008-08-26
          9250.4Phil$47.942009-07-30
          93222.8Jack$31.742009-06-14
          94263.9Paul$17.742008-08-16
          9599.2Rob$16.242010-08-07
          96911.8Walt$72.442010-01-31
          97623Nathan$19.242008-10-03
          98673.4Dan$5.032010-09-29
          99402.8Jeff$73.842008-01-06
          100584.8Bill$73.242010-07-26
          101721.7Joe$10.642009-08-06
          102938.1Bob$15.642011-02-11
          103447.1Matt$37.942008-12-12
          104915.9Mark$64.342009-07-05
          105124.2Tom$74.242010-01-08
          106955.3Jake$65.342009-02-23
          107623.6Greg$27.642009-10-02
          108872.6Adam$95.042009-11-30
          109749.4Steve$35.342009-01-30
          110764.7George$93.742008-03-26
          111585.4John$65.942008-07-26
          11299.8Phil$59.742009-01-23
          11393.2Jack$4.432010-04-06
          114403.3Paul$96.042009-02-16
          115890.2Rob$8.432008-04-23
          116538.9Walt$3.932010-05-19
          117911.6Nathan$66.342008-02-02
          118475.9Dan$53.542011-02-05
          11990.7Jeff$28.542009-01-16
          120443.3Bill$5.032008-11-05
          121527.7Joe$63.542010-12-07
          122717.7Bob$73.542009-08-28
          12363.5Matt$82.842009-10-18
          124788Mark$23.142009-09-02
          125155Tom$12.142009-12-08
          126263.6Jake$66.042010-01-22
          12725.6Greg$57.242008-12-28
          12863.9Adam$4.732010-09-09
          12952Steve$13.842008-06-03
          130392.5George$58.142008-07-31
          131670.3John$10.942010-08-04
          132607Phil$82.742009-10-01
          133140.7Jack$89.042009-03-16
          134718.3Paul$67.842009-12-08
          135255.9Rob$83.342010-04-27
          136877.6Walt$9.732009-03-29
          137538.6Nathan$12.242011-01-20
          138862.5Dan$18.642008-01-13
          139721.9Jeff$23.842008-06-21
          140866.2Bill$63.042010-04-25
          14159.9Joe$30.142010-08-29
          142888.4Bob$90.842010-02-09
          143451.5Matt$4.832009-10-05
          144842.2Mark$76.742008-09-27
          145463.9Tom$2.232008-03-18
          146206.6Jake$90.042008-07-08
          147609.3Greg$43.842008-11-26
          148583.6Adam$30.142009-06-29
          149605.2Steve$2.332010-03-31
          150764.8George$88.942009-01-27
          151505.6John$94.942010-01-10
          152355.4Phil$83.742009-09-25
          15331.9Jack$28.842009-11-20
          154598.4Paul$13.142009-02-23
          155842.9Rob$59.442009-03-20
          156920.5Walt$80.142008-11-24
          15794.5Nathan$41.042010-04-16
          158390.6Dan$99.442008-01-28
          159872.6Jeff$59.942008-02-23
          160592.3Bill$36.442010-12-18
          161942.4Joe$86.942010-10-19
          162593Bob$22.442010-04-13
          163151.1Matt$25.642008-01-11
          164757.4Mark$85.542008-06-10
          165130Tom$69.842010-04-29
          166525Jake$61.842009-09-10
          167819.8Greg$71.342010-12-29
          168552.9Adam$10.342010-12-22
          169586.8Steve$97.542009-09-13
          170643.5George$56.842010-11-08
          171588.9John$51.042010-06-10
          172482.9Phil$10.342007-12-25
          173213.9Jack$25.442008-10-17
          174233.2Paul$1.132008-05-01
          175383Rob$14.242010-07-18
          176127.1Walt$66.742009-05-01
          177672.2Nathan$48.642008-06-03
          178627.4Dan$3.932008-09-30
          179576.3Jeff$62.642008-09-01
          180124.1Bill$26.942010-06-20
          18135.3Joe$85.842008-11-30
          182815.7Bob$34.142009-03-30
          183820.6Matt$55.542010-01-18
          18481.8Mark$78.842010-01-31
          185197.5Tom$17.142010-07-14
          18610.8Jake$29.842009-06-23
          187442Greg$97.042011-01-06
          188585.7Adam$59.742007-12-21
          189832.2Steve$17.442009-12-14
          19054.3George$29.842010-10-22
          191844John$33.342010-05-10
          192143.9Phil$14.942008-04-07
          193546.8Jack$96.942010-01-09
          194203.8Paul$5.132009-05-09
          195872.3Rob$24.842009-11-22
          196682.3Walt$25.942010-11-02
          197158.7Nathan$70.142010-09-28
          198121.2Dan$28.742009-06-19
          199122.6Jeff$11.942010-01-06
          200749.8Bill$17.342010-12-17
          201646.1Joe$1.732008-11-05
          202400.4Bob$16.142009-04-26
          203495.5Matt$70.842009-03-21
          204145.3Mark$91.242009-05-19
          205582.9Tom$78.442010-03-02
          206191.3Jake$46.642010-12-27
          20797.5Greg$62.542010-01-15
          208973.7Adam$74.642010-12-13
          209447.2Steve$86.842008-02-27
          21094.3George$61.842008-09-15
          21139John$26.442008-10-04
          212316.7Phil$66.542009-04-09
          213743Jack$16.042008-05-05
          214138.4Paul$30.542008-01-24
          215584.7Rob$88.842010-07-19
          216279.3Walt$7.932008-11-08
          217233Nathan$17.742010-11-01
          218887.8Dan$15.042010-01-11
          219829.3Jeff$59.842009-08-12
          220889.7Bill$69.242008-05-27
          221123.3Joe$73.142009-03-29
          222373.9Bob$4.732008-03-06
          223785.6Matt$79.042008-09-07
          224904.9Mark$92.942009-08-26
          225935.8Tom$51.342009-04-19
          226750.5Jake$79.342009-07-19
          22731.2Greg$2.532010-02-09
          228936.7Adam$91.342010-08-02
          229588Steve$74.242009-04-23
          230107.7George$63.242008-05-01
          231245.7John$75.542010-08-25
          232647.8Phil$12.942010-10-19
          233714.6Jack$91.542010-02-18
          234941.3Paul$82.042009-11-28
          235473.3Rob$75.542008-05-13
          236893.4Walt$50.642010-11-17
          237392.7Nathan$53.742010-12-16
          23868.8Dan$47.442010-09-06
          239895.2Jeff$6.132009-11-12
          240319.1Bill$16.942008-09-12
          241434.7Joe$41.542011-02-04
          242281.1Bob$6.332008-05-02
          243174.8Matt$77.742008-01-24
          244859Mark$71.842010-08-30
          245471.8Tom$19.142009-11-19
          246597.9Jake$8.532008-04-26
          247516.5Greg$47.842010-01-08
          248460.6Adam$54.642008-05-08
          249317.8Steve$44.142008-07-18
          250917.4George$76.042009-01-30
          251149.1John$19.542010-05-25
          252136.1Phil$47.642010-08-05
          253252.2Jack$65.142009-11-20
          254283Paul$51.042008-12-29
          255133.3Rob$98.242009-08-08
          256739Walt$57.942009-11-14
          257850.4Nathan$9.632008-03-19
          258498.6Dan$55.642009-12-11
          259620.3Jeff$87.442008-03-04
          260803.4Bill$79.142010-08-01
          261155.5Joe$94.042008-01-13
          262922.3Bob$7.632009-07-17
          263751.6Matt$32.942008-06-07
          264357.9Mark$61.142010-01-18
          265682.4Tom$74.542009-12-28
          266198.4Jake$48.442008-08-28
          267799.1Greg$33.442008-12-17
          268877.4Adam$83.342010-09-21
          269501.7Steve$45.342010-04-28
          270567.4George$25.642009-08-30
          271393.4John$41.142009-06-22
          272414.4Phil$33.442009-09-18
          273911.4Jack$8.532010-10-03
          27459.2Paul$44.342009-07-10
          275716.7Rob$12.642008-09-18
          276355.7Walt$32.442010-04-01
          277573.9Nathan$12.342008-02-20
          278887.7Dan$0.032010-10-10
          279757.8Jeff$50.242009-01-15
          280501.7Bill$6.932009-11-07
          28136.9Joe$46.342007-12-27
          282512.4Bob$87.742009-01-16
          28364.3Matt$78.842009-04-25
          284944.6Mark$84.742010-09-20
          285436.3Tom$56.442011-02-12
          286672.6Jake$92.042008-12-21
          287392.6Greg$49.442009-05-13
          288446.5Adam$38.142009-05-13
          289333Steve$13.942010-12-15
          290672.1George$64.142008-01-02
          291267.3John$67.842009-06-21
          292273.9Phil$19.042009-01-29
          293614.3Jack$25.442008-05-29
          29440Paul$19.942011-02-04
          295908.8Rob$63.542009-09-17
          296903.1Walt$30.842009-06-17
          297221.2Nathan$70.042011-01-09
          298662.1Dan$14.742009-01-23
          299103.2Jeff$47.942009-07-03
          30046.2Bill$15.242008-05-13
          30158.3Joe$41.942010-07-06
          302533Bob$69.342011-02-10
          303884.6Matt$30.742008-09-30
          30424.5Mark$34.742009-05-18
          30511.7Tom$25.642008-03-22
          306563Jake$15.942009-03-12
          30734.1Greg$38.042008-03-30
          308998.8Adam$4.232008-09-16
          309344.7Steve$14.542010-03-25
          310829.5George$19.142010-09-16
          311955John$24.942008-11-12
          312758Phil$78.342011-01-23
          313750.8Jack$66.742008-11-11
          314997.8Paul$69.142009-12-18
          315443.5Rob$70.342010-10-10
          316524Walt$26.642008-02-09
          317912Nathan$30.042009-04-24
          3181000Dan$29.942009-06-11
          319234.5Jeff$64.342009-11-26
          320948.4Bill$47.342010-07-05
          321813.7Joe$42.842008-02-18
          32297.7Bob$18.642010-08-11
          32374.3Matt$93.742009-07-22
          324357.7Mark$93.442008-07-29
          325988Tom$37.842010-10-21
          326873.8Jake$90.242008-06-24
          327918.3Greg$81.442009-06-06
          328342.7Adam$81.442010-05-18
          329809Steve$4.832009-03-31
          330420.4George$99.742010-09-30
          331223John$81.042008-12-06
          332275Phil$90.842009-07-09
          333109.5Jack$98.242009-04-27
          334610.9Paul$34.042009-02-10
          335803.7Rob$32.842010-04-23
          336699.6Walt$20.142009-12-30
          337861.4Nathan$12.042009-05-28
          338323.4Dan$46.242008-10-25
          33984.3Jeff$27.142008-12-19
          340488.6Bill$69.242008-12-15
          341365.7Joe$91.542008-05-10
          342670.8Bob$19.042008-01-24
          343161.5Matt$29.942008-01-03
          344588.8Mark$91.042009-01-30
          345950.3Tom$71.442010-02-13
          346689.5Jake$41.342010-10-04
          347330.4Greg$27.442007-12-20
          348785Adam$59.842009-06-07
          34953.2Steve$68.242010-04-17
          350369.6George$17.142009-04-25
          351682.4John$53.642009-01-17
          352805.3Phil$20.742009-08-24
          353836Jack$36.942010-08-05
          354848.6Paul$95.742010-04-23
          355201Rob$90.742009-05-26
          356880.9Walt$59.742010-09-16
          357762.2Nathan$92.742008-05-29
          358763.1Dan$71.242010-04-21
          359226.4Jeff$76.542009-04-18
          360960.8Bill$13.542009-11-02
          361386.9Joe$81.742008-05-14
          362727.6Bob$62.342009-01-08
          363257.8Matt$45.942010-03-11
          36487Mark$30.742010-01-20
          365826Tom$50.842009-10-05
          366278.6Jake$38.942008-06-25
          367144.2Greg$15.142008-04-02
          368284.2Adam$91.442010-07-05
          36922Steve$14.142009-10-07
          370441.8George$10.142010-03-12
          37132.2John$48.842009-08-13
          372158.8Phil$21.642008-06-02
          373492.4Jack$47.342009-11-14
          374194.4Paul$56.042010-11-05
          375853.5Rob$38.642009-04-14
          376420Walt$66.542010-07-09
          377583.4Nathan$80.942010-12-30
          378674Dan$9.332010-09-22
          379476.8Jeff$11.542008-01-01
          38044.9Bill$55.742008-04-27
          381748Joe$58.942009-11-13
          382268.4Bob$74.842010-07-21
          383411.3Matt$24.042008-11-18
          38412.8Mark$43.442010-08-29
          385921.3Tom$28.842008-09-18
          386337.8Jake$70.842010-10-27
          387143.3Greg$29.142010-03-20
          38899.8Adam$96.542010-07-06
          389970.4Steve$44.242010-11-16
          390981.5George$48.742009-06-21
          39193.8John$23.442008-03-02
          392694.2Phil$50.342010-07-16
          393510.3Jack$91.442008-02-17
          394799.7Paul$92.742009-07-04
          395649.5Rob$84.842010-06-02
          396885.6Walt$18.642009-06-28
          397786.6Nathan$32.942010-05-31
          398496.7Dan$42.942010-04-21
          399299.9Jeff$39.942008-07-13
          400218.1Bill$38.142010-01-27
          401693.2Joe$47.442010-10-26
          402757.2Bob$16.942009-03-29
          403568.9Matt$67.942008-12-20
          404620.5Mark$47.842008-09-26
          405106.4Tom$12.842008-04-04
          406880.1Jake$1.332008-11-05
          407361.5Greg$80.042009-11-20
          408133.8Adam$29.742008-01-29
          409871.1Steve$59.642009-05-05
          41050George$81.542010-07-20
          411715.4John$50.842008-11-18
          412615.3Phil$26.542009-06-01
          41318.1Jack$83.442008-05-25
          414335Paul$45.442009-11-30
          415578.7Rob$56.042010-04-27
          416670.5Walt$44.042010-05-12
          417948.2Nathan$80.242009-09-23
          418554.8Dan$93.642010-09-01
          419590.3Jeff$80.742009-05-22
          42024.8Bill$85.742008-10-19
          421839.9Joe$57.242010-05-29
          422129.3Bob$18.742008-01-29
          423587.2Matt$20.542010-09-20
          424723.7Mark$54.042008-12-27
          425338.5Tom$11.942010-10-07
          42681Jake$78.942008-12-28
          427836.9Greg$73.842008-05-13
          428392.7Adam$29.242008-02-29
          429245Steve$88.342010-09-19
          430693.7George$90.742010-04-06
          431956.8John$74.742008-11-27
          432727.5Phil$87.742009-07-02
          433763Jack$46.442010-02-24
          434632Paul$18.742008-09-10
          435955.1Rob$52.642009-01-26
          436838.7Walt$60.742008-05-27
          437162.7Nathan$44.442010-09-27
          438288.6Dan$83.642008-06-30
          439350.1Jeff$8.132008-02-15
          440218.4Bill$77.542010-12-31
          441943.2Joe$73.142010-03-14
          442240Bob$45.942009-10-22
          443724Matt$22.242008-02-09
          444413.3Mark$85.442008-09-13
          445642.8Tom$80.942010-05-14
          446991.3Jake$64.842009-02-13
          447129.2Greg$81.042010-07-11
          4484.6Adam$9.932010-01-02
          449172.2Steve$44.942010-04-06
          450222.3George$66.742009-07-19
          451179.7John$61.042008-09-11
          452884.3Phil$85.042010-02-24
          453465.3Jack$57.442010-11-08
          454510Paul$98.742010-05-22
          455741.8Rob$63.042009-10-13
          456499.2Walt$62.142008-08-31
          457863.3Nathan$75.042008-01-24
          458670.7Dan$75.542008-05-17
          459314.2Jeff$92.742009-10-19
          46038.7Bill$14.942008-09-28
          461537.8Joe$32.942010-09-05
          462768.2Bob$21.342010-03-15
          463457.5Matt$67.942008-11-07
          464368.5Mark$18.942008-10-23
          465133.3Tom$93.042010-10-22
          466706.9Jake$43.042009-08-10
          467927.9Greg$29.342008-10-25
          468959.1Adam$96.342008-01-16
          46988.8Steve$27.842010-12-24
          470667.2George$31.642008-04-13
          471912.6John$85.442009-04-29
          472768.1Phil$62.242010-01-01
          473473.8Jack$8.032008-12-25
          474753.4Paul$44.842009-07-31
          47520.3Rob$58.142009-05-11
          476917.3Walt$28.842010-09-20
          477435.6Nathan$21.642008-06-24
          478704.3Dan$17.542008-05-12
          479728.1Jeff$26.442009-03-29
          480678.9Bill$93.142010-03-30
          481779.1Joe$84.342009-10-12
          482208.3Bob$61.142008-07-31
          483850.8Matt$8.532008-10-31
          484171.8Mark$83.842010-04-03
          485681.4Tom$85.942008-12-04
          486121.1Jake$77.642009-11-02
          487990.2Greg$21.142010-07-10
          488152Adam$91.642011-01-28
          489277Steve$64.442008-09-28
          490679.5George$32.342008-07-10
          491398John$10.242008-01-10
          492970.4Phil$31.042009-12-18
          493164.7Jack$16.142010-03-26
          494438.5Paul$33.242009-09-20
          495160.2Rob$1.432009-04-10
          496463Walt$13.542008-07-24
          49753.9Nathan$12.542009-03-26
          498860.6Dan$27.742008-12-18
          499842.2Jeff$55.442011-01-02
          + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/demo_Templated.html b/includes/js/dojox/dtl/demos/demo_Templated.html new file mode 100644 index 0000000..b538811 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Templated.html @@ -0,0 +1,36 @@ + + + Demo using dojox.dtl._Templated + + + + +
          + + + diff --git a/includes/js/dojox/dtl/demos/demo_Tree.html b/includes/js/dojox/dtl/demos/demo_Tree.html new file mode 100644 index 0000000..692d863 --- /dev/null +++ b/includes/js/dojox/dtl/demos/demo_Tree.html @@ -0,0 +1,33 @@ + + + Demo to show recursion in DTL + + + + +
          + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/blog/get_blog_1.json b/includes/js/dojox/dtl/demos/json/blog/get_blog_1.json new file mode 100644 index 0000000..9c7dd9f --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/blog/get_blog_1.json @@ -0,0 +1 @@ +{"teaser":"I'd be able to write a lot faster.","body":"I think I wouldn't be able to think.","date":1189125242601,"author":"jim"} \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/blog/get_blog_3.json b/includes/js/dojox/dtl/demos/json/blog/get_blog_3.json new file mode 100644 index 0000000..7c0a937 --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/blog/get_blog_3.json @@ -0,0 +1 @@ +{"teaser":"There was SO much sand","body":"I tried to walk so fast that I wouldn't leave foot prints.","date":1190245842601,"author":"jim"} \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/blog/get_blog_list.json b/includes/js/dojox/dtl/demos/json/blog/get_blog_list.json new file mode 100644 index 0000000..40f14a7 --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/blog/get_blog_list.json @@ -0,0 +1 @@ +{"blog_list":{"3":{"title":"My Trip to the Beach"},"1":{"title":"If I Were a Robot"}}} \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/blog/get_page_about.json b/includes/js/dojox/dtl/demos/json/blog/get_page_about.json new file mode 100644 index 0000000..05ddb9c --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/blog/get_page_about.json @@ -0,0 +1 @@ +{"title":"About Jim","body":"

          Jim is an avid golfer, enjoys long walks on the beach, and eating hot pockets

          When he's not scalding his mouth, you'll find him throwing rocks at pigeons.

          "} \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/fruit.json b/includes/js/dojox/dtl/demos/json/fruit.json new file mode 100644 index 0000000..e7a0bf8 --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/fruit.json @@ -0,0 +1 @@ +{ items: ["apple", "banana", "pear"] } \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/json/morefruit.json b/includes/js/dojox/dtl/demos/json/morefruit.json new file mode 100644 index 0000000..6a8beea --- /dev/null +++ b/includes/js/dojox/dtl/demos/json/morefruit.json @@ -0,0 +1 @@ +{ items: ["pineapple", "orange", "tomato"] } \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/animation.html b/includes/js/dojox/dtl/demos/templates/animation.html new file mode 100644 index 0000000..56c38f3 --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/animation.html @@ -0,0 +1,5 @@ +{% load dojox.dtl.contrib.dijit dojox.dtl.contrib.html %} +
          +
           
          +
           
          +
          \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/blog_base.html b/includes/js/dojox/dtl/demos/templates/blog_base.html new file mode 100644 index 0000000..1438a6b --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/blog_base.html @@ -0,0 +1,8 @@ +
          +

          + + +
          \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/blog_detail.html b/includes/js/dojox/dtl/demos/templates/blog_detail.html new file mode 100644 index 0000000..2b6146d --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/blog_detail.html @@ -0,0 +1,10 @@ + + + +
          +

          +
          posted on by
          +

          +

          +
          + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/blog_list.html b/includes/js/dojox/dtl/demos/templates/blog_list.html new file mode 100644 index 0000000..2413605 --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/blog_list.html @@ -0,0 +1,9 @@ + + + +
            + +
          • {{ blog.title }}
          • + +
          + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/blog_page.html b/includes/js/dojox/dtl/demos/templates/blog_page.html new file mode 100644 index 0000000..aeeb762 --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/blog_page.html @@ -0,0 +1,7 @@ + + + +
          + +
          + \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/countrychildren.html b/includes/js/dojox/dtl/demos/templates/countrychildren.html new file mode 100644 index 0000000..fbdbebe --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/countrychildren.html @@ -0,0 +1 @@ +
        1. {{ country.type }}: {{ country.name }}{% if country.children %}
            {% for country in country.childrens %}{% include countrychildren %}{% endfor %}
          {% endif %}
        2. \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/gallery.html b/includes/js/dojox/dtl/demos/templates/gallery.html new file mode 100644 index 0000000..7fe6d8c --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/gallery.html @@ -0,0 +1,16 @@ +{% load dojox.dtl.contrib.data %} +{% bind_data items to store as flickr %} +
          + + + + {% for item in flickr %}{% endfor %} + + + + + +
          + {% if selected %}{% endif %} +
          +
          \ No newline at end of file diff --git a/includes/js/dojox/dtl/demos/templates/nodelist.html b/includes/js/dojox/dtl/demos/templates/nodelist.html new file mode 100644 index 0000000..ddf7def --- /dev/null +++ b/includes/js/dojox/dtl/demos/templates/nodelist.html @@ -0,0 +1,5 @@ +
          +
            + {% for item in items %}
          • {{ item }}
          • {% endfor %} +
          +
          \ No newline at end of file diff --git a/includes/js/dojox/dtl/ext-dojo/NodeList.js b/includes/js/dojox/dtl/ext-dojo/NodeList.js new file mode 100644 index 0000000..64e9a93 --- /dev/null +++ b/includes/js/dojox/dtl/ext-dojo/NodeList.js @@ -0,0 +1,33 @@ +if(!dojo._hasResource["dojox.dtl.ext-dojo.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.ext-dojo.NodeList"] = true; +dojo.provide("dojox.dtl.ext-dojo.NodeList"); +dojo.require("dojox.dtl._base"); + +dojo.extend(dojo.NodeList, { + dtl: function(template, context){ + // args: dojox.dtl.__StringArgs|String + // The template string or location + // context: dojox.dtl.__ObjectArgs|Object + // The context object or location + var d = dojox.dtl; + + var self = this; + var render = function(data){ + var content = template.render(new d._Context(context)); + self.forEach(function(node){ + node.innerHTML = content; + }); + } + + d.text._resolveTemplateArg(template).addCallback(function(templateString){ + template = new d.Template(templateString); + d.text._resolveContextArg(context).addCallback(function(contextObject){ + render(contextObject); + }); + }); + + return this; + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/dates.js b/includes/js/dojox/dtl/filter/dates.js new file mode 100644 index 0000000..3ca2022 --- /dev/null +++ b/includes/js/dojox/dtl/filter/dates.js @@ -0,0 +1,54 @@ +if(!dojo._hasResource["dojox.dtl.filter.dates"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.dates"] = true; +dojo.provide("dojox.dtl.filter.dates"); + +dojo.require("dojox.dtl.utils.date"); + +(function(){ + var ddfd = dojox.dtl.filter.dates; + + dojo.mixin(ddfd, { + _toDate: function(value){ + if(value instanceof Date){ + return value; + } + value = new Date(value); + if(value.getTime() == new Date(0).getTime()){ + return ""; + } + return value; + }, + date: function(value, arg){ + // summary: Formats a date according to the given format + value = ddfd._toDate(value); + if(!value) return ""; + arg = arg || "N j, Y"; + return dojox.dtl.utils.date.format(value, arg); + }, + time: function(value, arg){ + // summary: Formats a time according to the given format + value = ddfd._toDate(value); + if(!value) return ""; + arg = arg || "P"; + return dojox.dtl.utils.date.format(value, arg); + }, + timesince: function(value, arg){ + // summary: Formats a date as the time since that date (i.e. "4 days, 6 hours") + value = ddfd._toDate(value); + if(!value) return ""; + var timesince = dojox.dtl.utils.date.timesince; + if(arg) return timesince(arg, value); + return timesince(value); + }, + timeuntil: function(value, arg){ + // summary: Formats a date as the time until that date (i.e. "4 days, 6 hours") + value = ddfd._toDate(value); + if(!value) return ""; + var timesince = dojox.dtl.utils.date.timesince; + if(arg) return timesince(arg, value); + return timesince(new Date(), value); + } + }); +})(); + +} diff --git a/includes/js/dojox/dtl/filter/htmlstrings.js b/includes/js/dojox/dtl/filter/htmlstrings.js new file mode 100644 index 0000000..d4feb93 --- /dev/null +++ b/includes/js/dojox/dtl/filter/htmlstrings.js @@ -0,0 +1,59 @@ +if(!dojo._hasResource["dojox.dtl.filter.htmlstrings"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.htmlstrings"] = true; +dojo.provide("dojox.dtl.filter.htmlstrings"); + +dojo.require("dojox.dtl._base"); + +dojo.mixin(dojox.dtl.filter.htmlstrings, { + _escapeamp: /&/g, + _escapelt: //g, + _escapeqt: /'/g, + _escapedblqt: /"/g, + _linebreaksrn: /(\r\n|\n\r)/g, + _linebreaksn: /\n{2,}/g, + _linebreakss: /(^\s+|\s+$)/g, + _linebreaksbr: /\n/g, + _removetagsfind: /[a-z0-9]+/g, + _striptags: /<[^>]*?>/g, + escape: function(value){ + // summary: Escapes a string's HTML + var dh = dojox.dtl.filter.htmlstrings; + return value.replace(dh._escapeamp, '&').replace(dh._escapelt, '<').replace(dh._escapegt, '>').replace(dh._escapedblqt, '"').replace(dh._escapeqt, '''); + }, + linebreaks: function(value){ + // summary: Converts newlines into

          and
          s + var output = []; + var dh = dojox.dtl.filter.htmlstrings; + value = value.replace(dh._linebreaksrn, "\n"); + var parts = value.split(dh._linebreaksn); + for(var i = 0; i < parts.length; i++){ + var part = parts[i].replace(dh._linebreakss, "").replace(dh._linebreaksbr, "
          ") + output.push("

          " + part + "

          "); + } + + return output.join("\n\n"); + }, + linebreaksbr: function(value){ + // summary: Converts newlines into
          s + var dh = dojox.dtl.filter.htmlstrings; + return value.replace(dh._linebreaksrn, "\n").replace(dh._linebreaksbr, "
          "); + }, + removetags: function(value, arg){ + // summary: Removes a space separated list of [X]HTML tags from the output" + var dh = dojox.dtl.filter.htmlstrings; + var tags = []; + var group; + while(group = dh._removetagsfind.exec(arg)){ + tags.push(group[0]); + } + tags = "(" + tags.join("|") + ")"; + return value.replace(new RegExp("]*>", "gi"), ""); + }, + striptags: function(value){ + // summary: Strips all [X]HTML tags + return value.replace(dojox.dtl.filter.htmlstrings._striptags, ""); + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/integers.js b/includes/js/dojox/dtl/filter/integers.js new file mode 100644 index 0000000..0c54a90 --- /dev/null +++ b/includes/js/dojox/dtl/filter/integers.js @@ -0,0 +1,32 @@ +if(!dojo._hasResource["dojox.dtl.filter.integers"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.integers"] = true; +dojo.provide("dojox.dtl.filter.integers"); + +dojo.mixin(dojox.dtl.filter.integers, { + add: function(value, arg){ + value = parseInt(value); + arg = parseInt(arg); + return isNaN(arg) ? value : value + arg; + }, + get_digit: function(value, arg){ + // summary: + // Given a whole number, returns the 1-based requested digit of it + // desciprtion: + // 1 is the right-most digit, 2 is the second-right-most digit, etc. Returns the + // original value for invalid input (if input or argument is not an integer, + // or if argument is less than 1). Otherwise, output is always an integer. + value = parseInt(value); + arg = parseInt(arg) - 1; + if(arg >= 0){ + value += ""; + if(arg < value.length){ + value = parseInt(value.charAt(arg)); + }else{ + value = 0; + } + } + return (isNaN(value) ? 0 : value); + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/lists.js b/includes/js/dojox/dtl/filter/lists.js new file mode 100644 index 0000000..b095242 --- /dev/null +++ b/includes/js/dojox/dtl/filter/lists.js @@ -0,0 +1,137 @@ +if(!dojo._hasResource["dojox.dtl.filter.lists"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.lists"] = true; +dojo.provide("dojox.dtl.filter.lists") + +dojo.require("dojox.dtl._base"); + +dojo.mixin(dojox.dtl.filter.lists, { + _dictsort: function(a, b){ + if(a[0] == b[0]) return 0; + return (a[0] < b[0]) ? -1 : 1; + }, + dictsort: function(value, arg){ + // summary: Takes a list of dicts, returns that list sorted by the property given in the argument. + if(!arg) return value; + + var i, item, items = []; + if(!dojo.isArray(value)){ + var obj = value, value = []; + for(var key in obj){ + value.push(obj[k]); + } + } + for(i = 0; i < value.length; i++){ + items.push([new dojox.dtl._Filter('var.' + arg).resolve(new dojox.dtl._Context({ 'var' : value[i]})), value[i]]); + } + items.sort(dojox.dtl.filter.lists._dictsort); + var output = []; + for(i = 0; item = items[i]; i++){ + output.push(item[1]); + } + return output; + }, + dictsortreversed: function(value, arg){ + // summary: Takes a list of dicts, returns that list sorted in reverse order by the property given in the argument. + if(!arg) return value; + + var dictsort = dojox.dtl.filter.lists.dictsort(value, arg); + return dictsort.reverse(); + }, + first: function(value){ + // summary: Returns the first item in a list + return (value.length) ? value[0] : ""; + }, + join: function(value, arg){ + // summary: Joins a list with a string, like Python's ``str.join(list)`` + // description: + // Django throws a compile error, but JS can't do arg checks + // so we're left with run time errors, which aren't wise for something + // as trivial here as an empty arg. + return value.join(arg || ","); + }, + length: function(value){ + // summary: Returns the length of the value - useful for lists + return (isNaN(value.length)) ? (value + "").length : value.length; + }, + length_is: function(value, arg){ + // summary: Returns a boolean of whether the value's length is the argument + return value.length == parseInt(arg); + }, + random: function(value){ + // summary: Returns a random item from the list + return value[Math.floor(Math.random() * value.length)]; + }, + slice: function(value, arg){ + // summary: Returns a slice of the list. + // description: + // Uses the same syntax as Python's list slicing; see + // http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice + // for an introduction. + // Also uses the optional third value to denote every X item. + arg = arg || ""; + var parts = arg.split(":"); + var bits = []; + for(var i = 0; i < parts.length; i++){ + if(!parts[i].length){ + bits.push(null); + }else{ + bits.push(parseInt(parts[i])); + } + } + + if(bits[0] === null){ + bits[0] = 0; + } + if(bits[0] < 0){ + bits[0] = value.length + bits[0]; + } + if(bits.length < 2 || bits[1] === null){ + bits[1] = value.length; + } + if(bits[1] < 0){ + bits[1] = value.length + bits[1]; + } + + return value.slice(bits[0], bits[1]); + }, + _unordered_list: function(value, tabs){ + var ddl = dojox.dtl.filter.lists; + var i, indent = ""; + for(i = 0; i < tabs; i++){ + indent += "\t"; + } + if(value[1] && value[1].length){ + var recurse = []; + for(i = 0; i < value[1].length; i++){ + recurse.push(ddl._unordered_list(value[1][i], tabs + 1)) + } + return indent + "
        3. " + value[0] + "\n" + indent + "
            \n" + recurse.join("\n") + "\n" + indent + "
          \n" + indent + "
        4. "; + }else{ + return indent + "
        5. " + value[0] + "
        6. "; + } + }, + unordered_list: function(value){ + // summary: + // Recursively takes a self-nested list and returns an HTML unordered list -- + // WITHOUT opening and closing
            tags. + // description: + // The list is assumed to be in the proper format. For example, if ``var`` contains + // ``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``, + // then ``{{ var|unordered_list }}`` would return:: + // + // |
          • States + // |
              + // |
            • Kansas + // |
                + // |
              • Lawrence
              • + // |
              • Topeka
              • + // |
              + // |
            • + // |
            • Illinois
            • + // |
            + // |
          • + return dojox.dtl.filter.lists._unordered_list(value, 1); + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/logic.js b/includes/js/dojox/dtl/filter/logic.js new file mode 100644 index 0000000..b69a1a8 --- /dev/null +++ b/includes/js/dojox/dtl/filter/logic.js @@ -0,0 +1,34 @@ +if(!dojo._hasResource["dojox.dtl.filter.logic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.logic"] = true; +dojo.provide("dojox.dtl.filter.logic"); + +dojo.mixin(dojox.dtl.filter.logic, { + default_: function(value, arg){ + // summary: If value is unavailable, use given default + return value || arg || ""; + }, + default_if_none: function(value, arg){ + // summary: If value is null, use given default + return (value === null) ? arg || "" : value || ""; + }, + divisibleby: function(value, arg){ + // summary: Returns true if the value is devisible by the argument" + return (parseInt(value) % parseInt(arg)) == 0; + }, + _yesno: /\s*,\s*/g, + yesno: function(value, arg){ + // summary: + // arg being a comma-delimited string, value of true/false/none + // chooses the appropriate item from the string + if(!arg) arg = 'yes,no,maybe'; + var parts = arg.split(dojox.dtl.filter.logic._yesno); + if(parts.length < 2){ + return value; + } + if(value) return parts[0]; + if((!value && value !== null) || parts.length < 3) return parts[1]; + return parts[2]; + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/misc.js b/includes/js/dojox/dtl/filter/misc.js new file mode 100644 index 0000000..0704d25 --- /dev/null +++ b/includes/js/dojox/dtl/filter/misc.js @@ -0,0 +1,59 @@ +if(!dojo._hasResource["dojox.dtl.filter.misc"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.misc"] = true; +dojo.provide("dojox.dtl.filter.misc"); + +dojo.mixin(dojox.dtl.filter.misc, { + filesizeformat: function(value){ + // summary: Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB, 102bytes, etc). + value = parseFloat(value); + if(value < 1024){ + return (value == 1) ? value + " byte" : value + " bytes"; + }else if(value < 1024 * 1024){ + return (value / 1024).toFixed(1) + " KB"; + }else if(value < 1024 * 1024 * 1024){ + return (value / 1024 / 1024).toFixed(1) + " MB"; + } + return (value / 1024 / 1024 / 1024).toFixed(1) + " GB"; + }, + pluralize: function(value, arg){ + // summary: + // Returns a plural suffix if the value is not 1, for '1 vote' vs. '2 votes' + // description: + // By default, 's' is used as a suffix; if an argument is provided, that string + // is used instead. If the provided argument contains a comma, the text before + // the comma is used for the singular case. + arg = arg || 's'; + if(arg.indexOf(",") == -1){ + arg = "," + arg; + } + var parts = arg.split(","); + if(parts.length > 2){ + return ""; + } + var singular = parts[0]; + var plural = parts[1]; + + if(parseInt(value) != 1){ + return plural; + } + return singular; + }, + _phone2numeric: { a: 2, b: 2, c: 2, d: 3, e: 3, f: 3, g: 4, h: 4, i: 4, j: 5, k: 5, l: 5, m: 6, n: 6, o: 6, p: 7, r: 7, s: 7, t: 8, u: 8, v: 8, w: 9, x: 9, y: 9 }, + phone2numeric: function(value){ + // summary: Takes a phone number and converts it in to its numerical equivalent + var dm = dojox.dtl.filter.misc; + value = value + ""; + var output = ""; + for(var i = 0; i < value.length; i++){ + var chr = value.charAt(i).toLowerCase(); + (dm._phone2numeric[chr]) ? output += dm._phone2numeric[chr] : output += value.charAt(i); + } + return output; + }, + pprint: function(value){ + // summary: A wrapper around toJson unless something better comes along + return dojo.toJson(value); + } +}); + +} diff --git a/includes/js/dojox/dtl/filter/strings.js b/includes/js/dojox/dtl/filter/strings.js new file mode 100644 index 0000000..1270574 --- /dev/null +++ b/includes/js/dojox/dtl/filter/strings.js @@ -0,0 +1,327 @@ +if(!dojo._hasResource["dojox.dtl.filter.strings"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.filter.strings"] = true; +dojo.provide("dojox.dtl.filter.strings"); + +dojo.require("dojox.dtl.filter.htmlstrings"); +dojo.require("dojox.string.sprintf"); +dojo.require("dojox.string.tokenize"); + +dojo.mixin(dojox.dtl.filter.strings, { + _urlquote: function(/*String*/ url, /*String?*/ safe){ + if(!safe){ + safe = "/"; + } + return dojox.string.tokenize(url, /([^\w-_.])/g, function(token){ + if(safe.indexOf(token) == -1){ + if(token == " "){ + return "+"; + }else{ + return "%" + token.charCodeAt(0).toString(16).toUpperCase(); + } + } + return token; + }).join(""); + }, + addslashes: function(value){ + // summary: Adds slashes - useful for passing strings to JavaScript, for example. + return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/'/g, "\\'"); + }, + capfirst: function(value){ + // summary: Capitalizes the first character of the value + value = "" + value; + return value.charAt(0).toUpperCase() + value.substring(1); + }, + center: function(value, arg){ + // summary: Centers the value in a field of a given width + arg = arg || value.length; + value = value + ""; + var diff = arg - value.length; + if(diff % 2){ + value = value + " "; + diff -= 1; + } + for(var i = 0; i < diff; i += 2){ + value = " " + value + " "; + } + return value; + }, + cut: function(value, arg){ + // summary: Removes all values of arg from the given string + arg = arg + "" || ""; + value = value + ""; + return value.replace(new RegExp(arg, "g"), ""); + }, + _fix_ampersands: /&(?!(\w+|#\d+);)/g, + fix_ampersands: function(value){ + // summary: Replaces ampersands with ``&`` entities + return value.replace(dojox.dtl.filter.strings._fix_ampersands, "&"); + }, + floatformat: function(value, arg){ + // summary: Format a number according to arg + // description: + // If called without an argument, displays a floating point + // number as 34.2 -- but only if there's a point to be displayed. + // With a positive numeric argument, it displays that many decimal places + // always. + // With a negative numeric argument, it will display that many decimal + // places -- but only if there's places to be displayed. + arg = parseInt(arg || -1); + value = parseFloat(value); + var m = value - value.toFixed(0); + if(!m && arg < 0){ + return value.toFixed(); + } + value = value.toFixed(Math.abs(arg)); + return (arg < 0) ? parseFloat(value) + "" : value; + }, + iriencode: function(value){ + return dojox.dtl.filter.strings._urlquote(value, "/#%[]=:;$&()+,!"); + }, + linenumbers: function(value){ + // summary: Displays text with line numbers + var df = dojox.dtl.filter; + var lines = value.split("\n"); + var output = []; + var width = (lines.length + "").length; + for(var i = 0, line; i < lines.length; i++){ + line = lines[i]; + output.push(df.strings.ljust(i + 1, width) + ". " + df.htmlstrings.escape(line)); + } + return output.join("\n"); + }, + ljust: function(value, arg){ + value = value + ""; + arg = parseInt(arg); + while(value.length < arg){ + value = value + " "; + } + return value; + }, + lower: function(value){ + // summary: Converts a string into all lowercase + return (value + "").toLowerCase(); + }, + make_list: function(value){ + // summary: + // Returns the value turned into a list. For an integer, it's a list of + // digits. For a string, it's a list of characters. + var output = []; + if(typeof value == "number"){ + value = value + ""; + } + if(value.charAt){ + for(var i = 0; i < value.length; i++){ + output.push(value.charAt(i)); + } + return output; + } + if(typeof value == "object"){ + for(var key in value){ + output.push(value[key]); + } + return output; + } + return []; + }, + rjust: function(value, arg){ + value = value + ""; + arg = parseInt(arg); + while(value.length < arg){ + value = " " + value; + } + return value; + }, + slugify: function(value){ + // summary: Converts to lowercase, removes + // non-alpha chars and converts spaces to hyphens + value = value.replace(/[^\w\s-]/g, "").toLowerCase(); + return value.replace(/[\-\s]+/g, "-"); + }, + _strings: {}, + stringformat: function(value, arg){ + // summary: + // Formats the variable according to the argument, a string formatting specifier. + // This specifier uses Python string formating syntax, with the exception that + // the leading "%" is dropped. + arg = "" + arg; + var strings = dojox.dtl.filter.strings._strings; + if(!strings[arg]){ + strings[arg] = new dojox.string.sprintf.Formatter("%" + arg); + } + return strings[arg].format(value); + }, + title: function(value){ + // summary: Converts a string into titlecase + var last, title = ""; + for(var i = 0, current; i < value.length; i++){ + current = value.charAt(i); + if(last == " " || last == "\n" || last == "\t" || !last){ + title += current.toUpperCase(); + }else{ + title += current.toLowerCase(); + } + last = current; + } + return title; + }, + _truncatewords: /[ \n\r\t]/, + truncatewords: function(value, arg){ + // summary: Truncates a string after a certain number of words + // arg: Integer + // Number of words to truncate after + arg = parseInt(arg); + if(!arg){ + return value; + } + + for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){ + current = value.charAt(i); + if(dojox.dtl.filter.strings._truncatewords.test(last)){ + if(!dojox.dtl.filter.strings._truncatewords.test(current)){ + ++count; + if(count == arg){ + return value.substring(0, j + 1); + } + } + }else if(!dojox.dtl.filter.strings._truncatewords.test(current)){ + j = i; + } + last = current; + } + return value; + }, + _truncate_words: /(&.*?;|<.*?>|(\w[\w\-]*))/g, + _truncate_tag: /<(\/)?([^ ]+?)(?: (\/)| .*?)?>/, + _truncate_singlets: { br: true, col: true, link: true, base: true, img: true, param: true, area: true, hr: true, input: true }, + truncatewords_html: function(value, arg){ + arg = parseInt(arg); + + if(arg <= 0){ + return ""; + } + + var strings = dojox.dtl.filter.strings; + var words = 0; + var open = []; + + var output = dojox.string.tokenize(value, strings._truncate_words, function(all, word){ + if(word){ + // It's an actual non-HTML word + ++words; + if(words < arg){ + return word; + }else if(words == arg){ + return word + " ..."; + } + } + // Check for tag + var tag = all.match(strings._truncate_tag); + if(!tag || words >= arg){ + // Don't worry about non tags or tags after our truncate point + return; + } + var closing = tag[1]; + var tagname = tag[2].toLowerCase(); + var selfclosing = tag[3]; + if(closing || strings._truncate_singlets[tagname]){ + }else if(closing){ + var i = dojo.indexOf(open, tagname); + if(i != -1){ + open = open.slice(i + 1); + } + }else{ + open.unshift(tagname); + } + return all; + }).join(""); + + output = output.replace(/\s+$/g, ""); + + for(var i = 0, tag; tag = open[i]; i++){ + output += ""; + } + + return output; + }, + upper: function(value){ + return value.toUpperCase(); + }, + urlencode: function(value){ + return dojox.dtl.filter.strings._urlquote(value); + }, + _urlize: /^((?:[(>]|<)*)(.*?)((?:[.,)>\n]|>)*)$/, + _urlize2: /^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$/, + urlize: function(value){ + return dojox.dtl.filter.strings.urlizetrunc(value); + }, + urlizetrunc: function(value, arg){ + arg = parseInt(arg); + return dojox.string.tokenize(value, /(\S+)/g, function(word){ + var matches = dojox.dtl.filter.strings._urlize.exec(word); + if(!matches){ + return word; + } + var lead = matches[1]; + var middle = matches[2]; + var trail = matches[3]; + + var startsWww = middle.indexOf("www.") == 0; + var hasAt = middle.indexOf("@") != -1; + var hasColon = middle.indexOf(":") != -1; + var startsHttp = middle.indexOf("http://") == 0; + var startsHttps = middle.indexOf("https://") == 0; + var firstAlpha = /[a-zA-Z0-9]/.test(middle.charAt(0)); + var last4 = middle.substring(middle.length - 4); + + var trimmed = middle; + if(arg > 3){ + trimmed = trimmed.substring(0, arg - 3) + "..."; + } + + if(startsWww || (!hasAt && !startsHttp && middle.length && firstAlpha && (last4 == ".org" || last4 == ".net" || last4 == ".com"))){ + return '' + trimmed + ''; + }else if(startsHttp || startsHttps){ + return '' + trimmed + ''; + }else if(hasAt && !startsWww && !hasColon && dojox.dtl.filter.strings._urlize2.test(middle)){ + return '' + middle + ''; + } + return word; + }).join(""); + }, + wordcount: function(value){ + return dojox.dtl.text.pySplit(value).length; + }, + wordwrap: function(value, arg){ + arg = parseInt(arg); + // summary: Wraps words at specified line length + var output = []; + var parts = value.split(/ /g); + if(parts.length){ + var word = parts.shift(); + output.push(word); + var pos = word.length - word.lastIndexOf("\n") - 1; + for(var i = 0; i < parts.length; i++){ + word = parts[i]; + if(word.indexOf("\n") != -1){ + var lines = word.split(/\n/g); + }else{ + var lines = [word]; + } + pos += lines[0].length + 1; + if(arg && pos > arg){ + output.push("\n"); + pos = lines[lines.length - 1].length; + }else{ + output.push(" "); + if(lines.length > 1){ + pos = lines[lines.length - 1].length; + } + } + output.push(word); + } + } + return output.join(""); + } +}); + +} diff --git a/includes/js/dojox/dtl/html.js b/includes/js/dojox/dtl/html.js new file mode 100644 index 0000000..c984157 --- /dev/null +++ b/includes/js/dojox/dtl/html.js @@ -0,0 +1,818 @@ +if(!dojo._hasResource["dojox.dtl.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.html"] = true; +dojo.provide("dojox.dtl.html"); + +dojo.require("dojox.dtl._base"); +dojo.require("dojox.dtl.Context"); + +(function(){ + var dd = dojox.dtl; + + var ddt = dd.text; + var ddh = dd.html = { + types: dojo.mixin({change: -11, attr: -12, custom: -13, elem: 1, text: 3}, ddt.types), + _attributes: {}, + _re4: /^function anonymous\(\)\s*{\s*(.*)\s*}$/, + getTemplate: function(text){ + if(typeof this._commentable == "undefined"){ + // Check to see if the browser can handle comments + this._commentable = false; + var div = document.createElement("div"); + div.innerHTML = ""; + if(div.childNodes.length && div.childNodes[0].nodeType == 8 && div.childNodes[0].data == "comment"){ + this._commentable = true; + } + } + + if(!this._commentable){ + // Strip comments + text = text.replace(//g, "$1"); + } + + var match; + var pairs = [ + [true, "select", "option"], + [dojo.isSafari, "tr", "th"], + [dojo.isSafari, "tr", "td"], + [dojo.isSafari, "thead", "tr", "th"], + [dojo.isSafari, "tbody", "tr", "td"] + ]; + // Some tags can't contain text. So we wrap the text in tags that they can have. + for(var i = 0, pair; pair = pairs[i]; i++){ + if(!pair[0]){ + continue; + } + if(text.indexOf("<" + pair[1]) != -1){ + var selectRe = new RegExp("<" + pair[1] + "[\\s\\S]*?>([\\s\\S]+?)", "ig"); + while(match = selectRe.exec(text)){ + // Do it like this to make sure we don't double-wrap + var found = false; + var tokens = dojox.string.tokenize(match[1], new RegExp("(<" + pair[2] + "[\\s\\S]*?>[\\s\\S]*?)", "ig"), function(child){ found = true; return {data: child}; }); + if(found){ + var replace = []; + for(var j = 0; j < tokens.length; j++) { + if(dojo.isObject(tokens[j])){ + replace.push(tokens[j].data); + }else{ + var close = pair[pair.length - 1]; + var k, replacement = ""; + for(k = 2; k < pair.length - 1; k++){ + replacement += "<" + pair[k] + ">"; + } + replacement += "<" + close + ' iscomment="true">' + dojo.trim(tokens[j]) + ""; + for(k = 2; k < pair.length - 1; k++){ + replacement += ""; + } + replace.push(replacement); + } + } + text = text.replace(match[1], replace.join("")); + } + } + } + } + + var re = /\b([a-zA-Z]+)=['"]/g; + while(match = re.exec(text)){ + this._attributes[match[1].toLowerCase()] = true; + } + var div = document.createElement("div"); + div.innerHTML = text; + var output = {nodes: []}; + while(div.childNodes.length){ + output.nodes.push(div.removeChild(div.childNodes[0])) + } + + return output; + }, + tokenize: function(/*Node*/ nodes){ + var tokens = []; + + for(var i = 0, node; node = nodes[i++];){ + if(node.nodeType != 1){ + this.__tokenize(node, tokens); + }else{ + this._tokenize(node, tokens); + } + } + + return tokens; + }, + _swallowed: [], + _tokenize: function(/*Node*/ node, /*Array*/ tokens){ + var types = this.types; + var first = false; + var swallowed = this._swallowed; + var i, j, tag, child; + + if(!tokens.first){ + // Try to efficiently associate tags that use an attribute to + // remove the node from DOM (eg dojoType) so that we can efficiently + // locate them later in the tokenizing. + first = tokens.first = true; + var tags = dd.register.getAttributeTags(); + for(i = 0; tag = tags[i]; i++){ + try{ + (tag[2])({ swallowNode: function(){ throw 1; }}, ""); + }catch(e){ + swallowed.push(tag); + } + } + } + + + for(i = 0; tag = swallowed[i]; i++){ + var text = node.getAttribute(tag[0]); + if(text){ + var swallowed = false; + var custom = (tag[2])({ swallowNode: function(){ swallowed = true; return node; }}, text); + if(swallowed){ + if(node.parentNode && node.parentNode.removeChild){ + node.parentNode.removeChild(node); + } + tokens.push([types.custom, custom]); + return; + } + } + } + + var children = []; + if(dojo.isIE && node.tagName == "SCRIPT"){ + children.push({ + nodeType: 3, + data: node.text + }); + node.text = ""; + }else{ + for(i = 0; child = node.childNodes[i]; i++){ + children.push(child); + } + } + + tokens.push([types.elem, node]); + + var change = false; + if(children.length){ + // Only do a change request if we need to + tokens.push([types.change, node]); + change = true; + } + + for(var key in this._attributes){ + var value = ""; + if(key == "class"){ + value = node.className || value; + }else if(key == "for"){ + value = node.htmlFor || value; + }else if(key == "value" && node.value == node.innerHTML){ + // Sometimes .value is set the same as the contents of the item (button) + continue; + }else if(node.getAttribute){ + value = node.getAttribute(key, 2) || value; + if(key == "href" || key == "src"){ + if(dojo.isIE){ + var hash = location.href.lastIndexOf(location.hash); + var href = location.href.substring(0, hash).split("/"); + href.pop(); + href = href.join("/") + "/"; + if(value.indexOf(href) == 0){ + value = value.replace(href, ""); + } + value = decodeURIComponent(value); + } + if(value.indexOf("{%") != -1 || value.indexOf("{{") != -1){ + node.setAttribute(key, ""); + } + } + } + if(typeof value == "function"){ + value = value.toString().replace(this._re4, "$1"); + } + + if(!change){ + // Only do a change request if we need to + tokens.push([types.change, node]); + change = true; + } + // We'll have to resolve attributes during parsing + tokens.push([types.attr, node, key, value]); + } + + for(i = 0, child; child = children[i]; i++){ + if(child.nodeType == 1 && child.getAttribute("iscomment")){ + child.parentNode.removeChild(child); + child = { + nodeType: 8, + data: child.innerHTML + }; + } + this.__tokenize(child, tokens); + } + + if(!first && node.parentNode && node.parentNode.tagName){ + if(change){ + tokens.push([types.change, node, true]); + } + tokens.push([types.change, node.parentNode]); + node.parentNode.removeChild(node); + }else{ + // If this node is parentless, it's a base node, so we have to "up" change to itself + // and note that it's a top-level to watch for errors + tokens.push([types.change, node, true, true]); + } + }, + __tokenize: function(child, tokens){ + var types = this.types; + var data = child.data; + switch(child.nodeType){ + case 1: + this._tokenize(child, tokens); + return; + case 3: + if(data.match(/[^\s\n]/) && (data.indexOf("{{") != -1 || data.indexOf("{%") != -1)){ + var texts = ddt.tokenize(data); + for(var j = 0, text; text = texts[j]; j++){ + if(typeof text == "string"){ + tokens.push([types.text, text]); + }else{ + tokens.push(text); + } + } + }else{ + tokens.push([child.nodeType, child]); + } + if(child.parentNode) child.parentNode.removeChild(child); + return; + case 8: + if(data.indexOf("{%") == 0){ + var text = dojo.trim(data.slice(2, -2)); + if(text.substr(0, 5) == "load "){ + var parts = dd.text.pySplit(dojo.trim(text)); + for(var i = 1, part; part = parts[i]; i++){ + dojo["require"](part); + } + } + tokens.push([types.tag, text]); + } + if(data.indexOf("{{") == 0){ + tokens.push([types.varr, dojo.trim(data.slice(2, -2))]); + } + if(child.parentNode) child.parentNode.removeChild(child); + return; + } + } + }; + + dd.HtmlTemplate = dojo.extend(function(/*String|DOMNode|dojo._Url*/ obj){ + // summary: Use this object for HTML templating + if(!obj.nodes){ + var node = dojo.byId(obj); + if(node){ + dojo.forEach(["class", "src", "href", "name", "value"], function(item){ + ddh._attributes[item] = true; + }); + obj = { + nodes: [node] + }; + }else{ + if(typeof obj == "object"){ + obj = ddt.getTemplateString(obj); + } + obj = ddh.getTemplate(obj); + } + } + + var tokens = ddh.tokenize(obj.nodes); + if(dd.tests){ + this.tokens = tokens.slice(0); + } + + var parser = new dd._HtmlParser(tokens); + this.nodelist = parser.parse(); + }, + { + _count: 0, + _re: /\bdojo:([a-zA-Z0-9_]+)\b/g, + setClass: function(str){ + this.getRootNode().className = str; + }, + getRootNode: function(){ + return this.rootNode; + }, + getBuffer: function(){ + return new dd.HtmlBuffer(); + }, + render: function(context, buffer){ + buffer = buffer || this.getBuffer(); + this.rootNode = null; + var output = this.nodelist.render(context || new dd.Context({}), buffer); + this.rootNode = buffer.getRootNode(); + for(var i = 0, node; node = buffer._cache[i]; i++){ + if(node._cache){ + node._cache.length = 0; + } + } + return output; + }, + unrender: function(context, buffer){ + return this.nodelist.unrender(context, buffer); + } + }); + + dd.HtmlBuffer = dojo.extend(function(/*Node*/ parent){ + // summary: Allows the manipulation of DOM + // description: + // Use this to append a child, change the parent, or + // change the attribute of the current node. + this._parent = parent; + this._cache = []; + }, + { + concat: function(/*DOMNode*/ node){ + var parent = this._parent; + if(node.parentNode && node.parentNode.tagName && parent && !parent._dirty){ + return this; + } + + if(node.nodeType == 1 && !this.rootNode){ + this.rootNode = node || true; + } + + if(!parent){ + if(node.nodeType == 3 && dojo.trim(node.data)){ + throw new Error("Text should not exist outside of the root node in template"); + } + return this; + } + if(this._closed && (node.nodeType != 3 || dojo.trim(node.data))){ + throw new Error("Content should not exist outside of the root node in template"); + } + if(parent._dirty){ + if(node._drawn && node.parentNode == parent){ + var caches = parent._cache; + if(caches){ + for(var i = 0, cache; cache = caches[i]; i++){ + this.onAddNode(cache); + parent.insertBefore(cache, node); + this.onAddNodeComplete(cache); + } + caches.length = 0; + } + } + parent._dirty = false; + } + if(!parent._cache){ + parent._cache = []; + this._cache.push(parent); + } + parent._dirty = true; + parent._cache.push(node); + return this; + }, + remove: function(obj){ + if(typeof obj == "string"){ + if(this._parent){ + this._parent.removeAttribute(obj); + } + }else{ + if(obj.nodeType == 1 && !this.getRootNode() && !this._removed){ + this._removed = true; + return this; + } + if(obj.parentNode){ + this.onRemoveNode(); + if(obj.parentNode){ + obj.parentNode.removeChild(obj); + } + } + } + return this; + }, + setAttribute: function(key, value){ + if(key == "class"){ + this._parent.className = value; + }else if(key == "for"){ + this._parent.htmlFor = value; + }else if(this._parent.setAttribute){ + this._parent.setAttribute(key, value); + } + return this; + }, + addEvent: function(context, type, fn, /*Array|Function*/ args){ + if(!context.getThis()){ throw new Error("You must use Context.setObject(instance)"); } + this.onAddEvent(this.getParent(), type, fn); + var resolved = fn; + if(dojo.isArray(args)){ + resolved = function(e){ + this[fn].apply(this, [e].concat(args)); + } + } + return dojo.connect(this.getParent(), type, context.getThis(), resolved); + }, + setParent: function(node, /*Boolean?*/ up, /*Boolean?*/ root){ + if(!this._parent) this._parent = this._first = node; + + if(up && root && node === this._first){ + this._closed = true; + } + + if(up){ + var parent = this._parent; + var script = ""; + var ie = dojo.isIE && parent.tagName == "SCRIPT"; + if(ie){ + parent.text = ""; + } + if(parent._dirty){ + var caches = parent._cache; + for(var i = 0, cache; cache = caches[i]; i++){ + if(cache !== parent){ + this.onAddNode(cache); + if(ie){ + script += cache.data; + }else{ + parent.appendChild(cache); + } + this.onAddNodeComplete(cache); + } + } + caches.length = 0; + parent._dirty = false; + } + if(ie){ + parent.text = script; + } + } + + this.onSetParent(node, up); + this._parent = node; + return this; + }, + getParent: function(){ + return this._parent; + }, + getRootNode: function(){ + return this.rootNode; + }, + onSetParent: function(node, up){ + // summary: Stub called when setParent is used. + }, + onAddNode: function(node){ + // summary: Stub called before new nodes are added + }, + onAddNodeComplete: function(node){ + // summary: Stub called after new nodes are added + }, + onRemoveNode: function(node){ + // summary: Stub called when nodes are removed + }, + onClone: function(/*DOMNode*/ from, /*DOMNode*/ to){ + // summary: Stub called when a node is duplicated + }, + onAddEvent: function(/*DOMNode*/ node, /*String*/ type, /*String*/ description){ + // summary: Stub to call when you're adding an event + } + }); + + dd._HtmlNode = dojo.extend(function(node){ + // summary: Places a node into DOM + this.contents = node; + }, + { + render: function(context, buffer){ + this._rendered = true; + return buffer.concat(this.contents); + }, + unrender: function(context, buffer){ + if(!this._rendered){ + return buffer; + } + this._rendered = false; + return buffer.remove(this.contents); + }, + clone: function(buffer){ + return new this.constructor(this.contents); + } + }); + + dd._HtmlNodeList = dojo.extend(function(/*Node[]*/ nodes){ + // summary: A list of any HTML-specific node object + // description: + // Any object that's used in the constructor or added + // through the push function much implement the + // render, unrender, and clone functions. + this.contents = nodes || []; + }, + { + push: function(node){ + this.contents.push(node); + }, + unshift: function(node){ + this.contents.unshift(node); + }, + render: function(context, buffer, /*Node*/ instance){ + buffer = buffer || dd.HtmlTemplate.prototype.getBuffer(); + + if(instance){ + var parent = buffer.getParent(); + } + for(var i = 0; i < this.contents.length; i++){ + buffer = this.contents[i].render(context, buffer); + if(!buffer) throw new Error("Template node render functions must return their buffer"); + } + if(parent){ + buffer.setParent(parent); + } + return buffer; + }, + dummyRender: function(context, buffer, asNode){ + // summary: A really expensive way of checking to see how a rendering will look. + // Used in the ifchanged tag + var div = document.createElement("div"); + + var parent = buffer.getParent(); + var old = parent._clone; + // Tell the clone system to attach itself to our new div + parent._clone = div; + var nodelist = this.clone(buffer, div); + if(old){ + // Restore state if there was a previous clone + parent._clone = old; + }else{ + // Remove if there was no clone + parent._clone = null; + } + + buffer = dd.HtmlTemplate.prototype.getBuffer(); + nodelist.unshift(new dd.ChangeNode(div)); + nodelist.push(new dd.ChangeNode(div, true)); + nodelist.render(context, buffer); + + if(asNode){ + return buffer.getRootNode(); + } + + var html = div.innerHTML; + return (dojo.isIE) ? html.replace(/\s*_(dirty|clone)="[^"]*"/g, "") : html; + }, + unrender: function(context, buffer){ + for(var i = 0; i < this.contents.length; i++){ + buffer = this.contents[i].unrender(context, buffer); + if(!buffer) throw new Error("Template node render functions must return their buffer"); + } + return buffer; + }, + clone: function(buffer){ + // summary: + // Used to create an identical copy of a NodeList, useful for things like the for tag. + var parent = buffer.getParent(); + var contents = this.contents; + var nodelist = new dd._HtmlNodeList(); + var cloned = []; + for(var i = 0; i < contents.length; i++){ + var clone = contents[i].clone(buffer); + if(clone instanceof dd.ChangeNode || clone instanceof dd._HtmlNode){ + var item = clone.contents._clone; + if(item){ + clone.contents = item; + }else if(parent != clone.contents && clone instanceof dd._HtmlNode){ + var node = clone.contents; + clone.contents = clone.contents.cloneNode(false); + buffer.onClone(node, clone.contents); + cloned.push(node); + node._clone = clone.contents; + } + } + nodelist.push(clone); + } + + for(var i = 0, clone; clone = cloned[i]; i++){ + clone._clone = null; + } + + return nodelist; + } + }); + + dd._HtmlVarNode = dojo.extend(function(str){ + // summary: A node to be processed as a variable + // description: + // Will render an object that supports the render function + // and the getRootNode function + this.contents = new dd._Filter(str); + this._lists = {}; + }, + { + render: function(context, buffer){ + this._rendered = true; + + var str = this.contents.resolve(context); + if(str && str.render && str.getRootNode){ + var root = this._curr = str.getRootNode(); + var lists = this._lists; + var list = lists[root]; + if(!list){ + list = lists[root] = new dd._HtmlNodeList(); + list.push(new dd.ChangeNode(buffer.getParent())); + list.push(new dd._HtmlNode(root)); + list.push(str); + list.push(new dd.ChangeNode(buffer.getParent())); + } + return list.render(context, buffer); + }else{ + if(!this._txt){ + this._txt = document.createTextNode(str); + } + this._txt.data = str; + return buffer.concat(this._txt); + } + }, + unrender: function(context, buffer){ + if(!this._rendered){ + return buffer; + } + this._rendered = false; + if(this._curr){ + return this._lists[this._curr].unrender(context, buffer); + }else if(this._txt){ + return buffer.remove(this._txt); + } + return buffer; + }, + clone: function(){ + return new this.constructor(this.contents.getExpression()); + } + }); + + dd.ChangeNode = dojo.extend(function(node, /*Boolean?*/ up, /*Bookean*/ root){ + // summary: Changes the parent during render/unrender + this.contents = node; + this.up = up; + this.root = root; + }, + { + render: function(context, buffer){ + return buffer.setParent(this.contents, this.up, this.root); + }, + unrender: function(context, buffer){ + if(!this.contents.parentNode){ + return buffer; + } + if(!buffer.getParent()){ + return buffer; + } + return buffer.setParent(this.contents); + }, + clone: function(){ + return new this.constructor(this.contents, this.up, this.root); + } + }); + + dd.AttributeNode = dojo.extend(function(key, value, nodelist){ + // summary: Works on attributes + this.key = key; + this.value = value; + this.nodelist = nodelist || (new dd.Template(value)).nodelist; + + this.contents = ""; + }, + { + render: function(context, buffer){ + var key = this.key; + var value = this.nodelist.dummyRender(context); + if(this._rendered){ + if(value != this.contents){ + this.contents = value; + return buffer.setAttribute(key, value); + } + }else{ + this._rendered = true; + this.contents = value; + return buffer.setAttribute(key, value); + } + return buffer; + }, + unrender: function(context, buffer){ + return buffer.remove(this.key); + }, + clone: function(buffer){ + return new this.constructor(this.key, this.value, this.nodelist.clone(buffer)); + } + }); + + dd._HtmlTextNode = dojo.extend(function(str){ + // summary: Adds a straight text node without any processing + this.contents = document.createTextNode(str); + }, + { + set: function(data){ + this.contents.data = data; + }, + render: function(context, buffer){ + return buffer.concat(this.contents); + }, + unrender: function(context, buffer){ + return buffer.remove(this.contents); + }, + clone: function(){ + return new this.constructor(this.contents.data); + } + }); + + dd._HtmlParser = dojo.extend(function(tokens){ + // summary: Turn a simple array into a set of objects + // description: + // This is also used by all tags to move through + // the list of nodes. + this.contents = tokens; + }, + { + i: 0, + parse: function(/*Array?*/ stop_at){ + var types = ddh.types; + var terminators = {}; + var tokens = this.contents; + if(!stop_at){ + stop_at = []; + } + for(var i = 0; i < stop_at.length; i++){ + terminators[stop_at[i]] = true; + } + var nodelist = new dd._HtmlNodeList(); + while(this.i < tokens.length){ + var token = tokens[this.i++]; + var type = token[0]; + var value = token[1]; + if(type == types.custom){ + nodelist.push(value); + }else if(type == types.change){ + var changeNode = new dd.ChangeNode(value, token[2], token[3]); + value[changeNode.attr] = changeNode; + nodelist.push(changeNode); + }else if(type == types.attr){ + var fn = ddt.getTag("attr:" + token[2], true); + if(fn && token[3]){ + nodelist.push(fn(null, token[2] + " " + token[3])); + }else if(dojo.isString(token[3]) && (token[3].indexOf("{%") != -1 || token[3].indexOf("{{") != -1)){ + nodelist.push(new dd.AttributeNode(token[2], token[3])); + } + }else if(type == types.elem){ + var fn = ddt.getTag("node:" + value.tagName.toLowerCase(), true); + if(fn){ + // TODO: We need to move this to tokenization so that it's before the + // node and the parser can be passed here instead of null + nodelist.push(fn(null, value, value.tagName.toLowerCase())); + } + nodelist.push(new dd._HtmlNode(value)); + }else if(type == types.varr){ + nodelist.push(new dd._HtmlVarNode(value)); + }else if(type == types.text){ + nodelist.push(new dd._HtmlTextNode(value.data || value)); + }else if(type == types.tag){ + if(terminators[value]){ + --this.i; + return nodelist; + } + var cmd = value.split(/\s+/g); + if(cmd.length){ + cmd = cmd[0]; + var fn = ddt.getTag(cmd); + if(typeof fn != "function"){ + throw new Error("Function not found for " + cmd); + } + var tpl = fn(this, value); + if(tpl){ + nodelist.push(tpl); + } + } + } + } + + if(stop_at.length){ + throw new Error("Could not find closing tag(s): " + stop_at.toString()); + } + + return nodelist; + }, + next: function(){ + // summary: Used by tags to discover what token was found + var token = this.contents[this.i++]; + return {type: token[0], text: token[1]}; + }, + skipPast: function(endtag){ + return dd.Parser.prototype.skipPast.call(this, endtag); + }, + getVarNodeConstructor: function(){ + return dd._HtmlVarNode; + }, + getTextNodeConstructor: function(){ + return dd._HtmlTextNode; + }, + getTemplate: function(/*String*/ loc){ + return new dd.HtmlTemplate(ddh.getTemplate(loc)); + } + }); + +})(); + +} diff --git a/includes/js/dojox/dtl/render/html.js b/includes/js/dojox/dtl/render/html.js new file mode 100644 index 0000000..943dfbe --- /dev/null +++ b/includes/js/dojox/dtl/render/html.js @@ -0,0 +1,76 @@ +if(!dojo._hasResource["dojox.dtl.render.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.render.html"] = true; +dojo.provide("dojox.dtl.render.html"); +dojo.require("dojox.dtl.Context"); + +dojox.dtl.render.html.sensitivity = { + // summary: + // Set conditions under which to buffer changes + // description: + // Necessary if you make a lot of changes to your template. + // What happens is that the entire node, from the attached DOM Node + // down gets swapped with a clone, and until the entire rendering + // is complete, we don't replace the clone again. In this way, renders are + // "batched". + // + // But, if we're only changing a small number of nodes, we might no want to buffer at all. + // The higher numbers mean that even small changes will result in buffering. + // Each higher level includes the lower levels. + NODE: 1, // If a node changes, implement buffering + ATTRIBUTE: 2, // If an attribute or node changes, implement buffering + TEXT: 3 // If any text at all changes, implement buffering +} +dojox.dtl.render.html.Render = function(/*DOMNode?*/ attachPoint, /*dojox.dtl.HtmlTemplate?*/ tpl){ + this._tpl = tpl; + this.domNode = attachPoint; + this._swap = dojo.hitch(this, function(){ + // summary: Swaps the node out the first time the DOM is changed + // description: Gets swapped back it at end of render + if(this.domNode === this._tpl.getRootNode()){ + var frag = this.domNode; + this.domNode = this.domNode.cloneNode(true); + frag.parentNode.replaceChild(this.domNode, frag); + } + }); +} +dojo.extend(dojox.dtl.render.html.Render, { + sensitivity: dojox.dtl.render.html.sensitivity, + setAttachPoint: function(/*Node*/ node){ + this.domNode = node; + }, + render: function(/*Object*/ context, /*dojox.dtl.HtmlTemplate?*/ tpl, /*dojox.dtl.HtmlBuffer?*/ buffer){ + if(!this.domNode){ + throw new Error("You cannot use the Render object without specifying where you want to render it"); + } + + tpl = tpl || this._tpl; + buffer = buffer || tpl.getBuffer(); + context = context || new dojox.dtl.Context(); + + if(context.getThis() && context.getThis().buffer == this.sensitivity.NODE){ + var onAddNode = dojo.connect(buffer, "onAddNode", this, "_swap"); + var onRemoveNode = dojo.connect(buffer, "onRemoveNode", this, "_swap"); + } + + if(this._tpl && this._tpl !== tpl){ + this._tpl.unrender(context, buffer); + } + this._tpl = tpl; + + var frag = tpl.render(context, buffer).getParent(); + if(!frag){ + throw new Error("Rendered template does not have a root node"); + } + + dojo.disconnect(onAddNode); + dojo.disconnect(onRemoveNode); + + if(this.domNode !== frag){ + this.domNode.parentNode.replaceChild(frag, this.domNode); + dojo._destroyElement(this.domNode); + this.domNode = frag; + } + } +}); + +} diff --git a/includes/js/dojox/dtl/tag/date.js b/includes/js/dojox/dtl/tag/date.js new file mode 100644 index 0000000..fba4089 --- /dev/null +++ b/includes/js/dojox/dtl/tag/date.js @@ -0,0 +1,29 @@ +if(!dojo._hasResource["dojox.dtl.tag.date"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.date"] = true; +dojo.provide("dojox.dtl.tag.date"); + +dojo.require("dojox.dtl._base"); +dojo.require("dojox.dtl.utils.date"); + +dojox.dtl.tag.date.NowNode = function(format, TextNode){ + this.format = new dojox.dtl.utils.date.DateFormat(format); + this.contents = new TextNode(""); +} +dojo.extend(dojox.dtl.tag.date.NowNode, { + render: function(context, buffer){ + this.contents.set(this.format.format(new Date())); + return this.contents.render(context, buffer); + } +}); + +dojox.dtl.tag.date.now = function(parser, text){ + // Split by either :" or :' + var parts = text.split((text.substring(0, 5) == "now '") ? "'" : '"'); + if(parts.length != 3){ + throw new Error("'now' statement takes one argument"); + } + var format = parts[1]; + return new dojox.dtl.tag.date.NowNode(format, parser.getTextNodeConstructor()); +} + +} diff --git a/includes/js/dojox/dtl/tag/loader.js b/includes/js/dojox/dtl/tag/loader.js new file mode 100644 index 0000000..36c81bc --- /dev/null +++ b/includes/js/dojox/dtl/tag/loader.js @@ -0,0 +1,277 @@ +if(!dojo._hasResource["dojox.dtl.tag.loader"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.loader"] = true; +dojo.provide("dojox.dtl.tag.loader"); + +dojo.require("dojox.dtl._base"); + +(function(){ + var dd = dojox.dtl; + var ddtl = dd.tag.loader; + + ddtl.BlockNode = dojo.extend(function(name, nodelist){ + this.name = name; + this.nodelist = nodelist; // Can be overridden + }, + { + render: function(context, buffer){ + var name = this.name; + var nodelist = this.nodelist; + if(buffer.blocks){ + var block = buffer.blocks[name]; + if(block){ + nodelist = block.nodelist; + block.used = true; + } + } + this.rendered = nodelist; + return nodelist.render(context, buffer, this); + }, + unrender: function(context, buffer){ + return this.rendered.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.name, this.nodelist.clone(buffer)); + }, + setOverride: function(nodelist){ + // summary: In a shared parent, we override, not overwrite + if(!this.override){ + this.override = nodelist; + } + }, + toString: function(){ return "dojox.dtl.tag.loader.BlockNode"; } + }); + + ddtl.ExtendsNode = dojo.extend(function(getTemplate, nodelist, shared, parent, key){ + this.getTemplate = getTemplate; + this.nodelist = nodelist; + this.shared = shared; + this.parent = parent; + this.key = key; + }, + { + parents: {}, + getParent: function(context){ + if(!this.parent){ + this.parent = context.get(this.key, false); + if(!this.parent){ + throw new Error("extends tag used a variable that did not resolve"); + } + if(typeof this.parent == "object"){ + if(this.parent.url){ + if(this.parent.shared){ + this.shared = true; + } + this.parent = this.parent.url.toString(); + }else{ + this.parent = this.parent.toString(); + } + } + if(this.parent && this.parent.indexOf("shared:") == 0){ + this.shared = true; + this.parent = this.parent.substring(7, parent.length); + } + } + var parent = this.parent; + if(!parent){ + throw new Error("Invalid template name in 'extends' tag."); + } + if(parent.render){ + return parent; + } + if(this.parents[parent]){ + return this.parents[parent]; + } + this.parent = this.getTemplate(dojox.dtl.text.getTemplateString(parent)); + if(this.shared){ + this.parents[parent] = this.parent; + } + return this.parent; + }, + render: function(context, buffer){ + var parent = this.getParent(context); + + buffer.blocks = buffer.blocks || {}; + + // The parent won't always be in the default parent's nodelist + for(var i = 0, node; node = this.nodelist.contents[i]; i++){ + if(node instanceof dojox.dtl.tag.loader.BlockNode){ + buffer.blocks[node.name] = { + shared: this.shared, + nodelist: node.nodelist, + used: false + } + } + } + + this.rendered = parent; + buffer = parent.nodelist.render(context, buffer, this); + + var rerender = false; + for(var name in buffer.blocks){ + var block = buffer.blocks[name]; + if(!block.used){ + rerender = true; + parent.nodelist[0].nodelist.append(block.nodelist); + } + } + + if(rerender){ + buffer = parent.nodelist.render(context, buffer, this); + } + + return buffer; + }, + unrender: function(context, buffer){ + return this.rendered.unrender(context, buffer, this); + }, + toString: function(){ return "dojox.dtl.block.ExtendsNode"; } + }); + + ddtl.IncludeNode = dojo.extend(function(path, constant, getTemplate, TextNode, parsed){ + this._path = path; + this.constant = constant; + this.path = (constant) ? path : new dd._Filter(path); + this.getTemplate = getTemplate; + this.TextNode = TextNode; + this.parsed = (arguments.length == 5) ? parsed : true; + }, + { + _cache: [{}, {}], + render: function(context, buffer){ + var location = ((this.constant) ? this.path : this.path.resolve(context)).toString(); + var parsed = Number(this.parsed); + var dirty = false; + if(location != this.last){ + dirty = true; + if(this.last){ + buffer = this.unrender(context, buffer); + } + this.last = location; + } + + var cache = this._cache[parsed]; + + if(parsed){ + if(!cache[location]){ + cache[location] = dd.text._resolveTemplateArg(location, true); + } + if(dirty){ + var template = this.getTemplate(cache[location]); + this.rendered = template.nodelist; + } + return this.rendered.render(context, buffer, this); + }else{ + if(this.TextNode == dd._TextNode){ + if(dirty){ + this.rendered = new this.TextNode(""); + this.rendered.set(dd.text._resolveTemplateArg(location, true)); + } + return this.rendered.render(context, buffer); + }else{ + if(!cache[location]){ + var nodelist = []; + var div = document.createElement("div"); + div.innerHTML = dd.text._resolveTemplateArg(location, true); + var children = div.childNodes; + while(children.length){ + var removed = div.removeChild(children[0]); + nodelist.push(removed); + } + cache[location] = nodelist; + } + if(dirty){ + this.nodelist = []; + var exists = true; + for(var i = 0, child; child = cache[location][i]; i++){ + this.nodelist.push(child.cloneNode(true)); + } + } + for(var i = 0, node; node = this.nodelist[i]; i++){ + buffer = buffer.concat(node); + } + } + } + return buffer; + }, + unrender: function(context, buffer){ + if(this.rendered){ + buffer = this.rendered.unrender(context, buffer); + } + if(this.nodelist){ + for(var i = 0, node; node = this.nodelist[i]; i++){ + buffer = buffer.remove(node); + } + } + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this._path, this.constant, this.getTemplate, this.TextNode, this.parsed); + } + }); + + dojo.mixin(ddtl, { + block: function(parser, text){ + var parts = text.split(" "); + var name = parts[1]; + + parser._blocks = parser._blocks || {}; + parser._blocks[name] = parser._blocks[name] || []; + parser._blocks[name].push(name); + + var nodelist = parser.parse(["endblock", "endblock " + name]); + parser.next(); + return new dojox.dtl.tag.loader.BlockNode(name, nodelist); + }, + extends_: function(parser, text){ + var parts = text.split(" "); + var shared = false; + var parent = null; + var key = null; + if(parts[1].charAt(0) == '"' || parts[1].charAt(0) == "'"){ + parent = parts[1].substring(1, parts[1].length - 1); + }else{ + key = parts[1]; + } + if(parent && parent.indexOf("shared:") == 0){ + shared = true; + parent = parent.substring(7, parent.length); + } + var nodelist = parser.parse(); + return new dojox.dtl.tag.loader.ExtendsNode(parser.getTemplate, nodelist, shared, parent, key); + }, + include: function(parser, token){ + var parts = dd.text.pySplit(token); + if(parts.length != 2){ + throw new Error(parts[0] + " tag takes one argument: the name of the template to be included"); + } + var path = parts[1]; + var constant = false; + if((path.charAt(0) == '"' || path.slice(-1) == "'") && path.charAt(0) == path.slice(-1)){ + path = path.slice(1, -1); + constant = true; + } + return new ddtl.IncludeNode(path, constant, parser.getTemplate, parser.getTextNodeConstructor()); + }, + ssi: function(parser, token){ + // We're going to treat things a little differently here. + // First of all, this tag is *not* portable, so I'm not + // concerned about it being a "drop in" replacement. + + // Instead, we'll just replicate the include tag, but with that + // optional "parsed" parameter. + var parts = dd.text.pySplit(token); + var parsed = false; + if(parts.length == 3){ + parsed = (parts.pop() == "parsed"); + if(!parsed){ + throw new Error("Second (optional) argument to ssi tag must be 'parsed'"); + } + } + var node = ddtl.include(parser, parts.join(" ")); + node.parsed = parsed; + return node; + } + }); +})(); + +} diff --git a/includes/js/dojox/dtl/tag/logic.js b/includes/js/dojox/dtl/tag/logic.js new file mode 100644 index 0000000..90909ce --- /dev/null +++ b/includes/js/dojox/dtl/tag/logic.js @@ -0,0 +1,272 @@ +if(!dojo._hasResource["dojox.dtl.tag.logic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.logic"] = true; +dojo.provide("dojox.dtl.tag.logic"); + +dojo.require("dojox.dtl._base"); + +(function(){ + var dd = dojox.dtl; + var ddt = dd.text; + var ddtl = dd.tag.logic; + + ddtl.IfNode = dojo.extend(function(bools, trues, falses, type){ + this.bools = bools; + this.trues = trues; + this.falses = falses; + this.type = type; + }, + { + render: function(context, buffer){ + var i, bool, ifnot, filter, value; + if(this.type == "or"){ + for(i = 0; bool = this.bools[i]; i++){ + ifnot = bool[0]; + filter = bool[1]; + value = filter.resolve(context); + if((value && !ifnot) || (ifnot && !value)){ + if(this.falses){ + buffer = this.falses.unrender(context, buffer); + } + return (this.trues) ? this.trues.render(context, buffer, this) : buffer; + } + } + if(this.trues){ + buffer = this.trues.unrender(context, buffer); + } + return (this.falses) ? this.falses.render(context, buffer, this) : buffer; + }else{ + for(i = 0; bool = this.bools[i]; i++){ + ifnot = bool[0]; + filter = bool[1]; + value = filter.resolve(context); + // If we ever encounter a false value + if(value == ifnot){ + if(this.trues){ + buffer = this.trues.unrender(context, buffer); + } + return (this.falses) ? this.falses.render(context, buffer, this) : buffer; + } + } + if(this.falses){ + buffer = this.falses.unrender(context, buffer); + } + return (this.trues) ? this.trues.render(context, buffer, this) : buffer; + } + return buffer; + }, + unrender: function(context, buffer){ + buffer = (this.trues) ? this.trues.unrender(context, buffer) : buffer; + buffer = (this.falses) ? this.falses.unrender(context, buffer) : buffer; + return buffer; + }, + clone: function(buffer){ + var trues = (this.trues) ? this.trues.clone(buffer) : null; + var falses = (this.falses) ? this.falses.clone(buffer) : null; + return new this.constructor(this.bools, trues, falses, this.type); + } + }); + + ddtl.IfEqualNode = dojo.extend(function(var1, var2, trues, falses, negate){ + this.var1 = new dd._Filter(var1); + this.var2 = new dd._Filter(var2); + this.trues = trues; + this.falses = falses; + this.negate = negate; + }, + { + render: function(context, buffer){ + var var1 = this.var1.resolve(context); + var var2 = this.var2.resolve(context); + if((this.negate && var1 != var2) || (!this.negate && var1 == var2)){ + if(this.falses){ + buffer = this.falses.unrender(context, buffer); + } + return (this.trues) ? this.trues.render(context, buffer, this) : buffer; + } + if(this.trues){ + buffer = this.trues.unrender(context, buffer); + } + return (this.falses) ? this.falses.render(context, buffer, this) : buffer; + }, + unrender: function(context, buffer){ + return ddtl.IfNode.prototype.unrender.call(this, context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.var1.getExpression(), this.var2.getExpression(), this.trues.clone(buffer), this.falses.clone(buffer), this.negate); + } + }); + + ddtl.ForNode = dojo.extend(function(assign, loop, reversed, nodelist){ + this.assign = assign; + this.loop = new dd._Filter(loop); + this.reversed = reversed; + this.nodelist = nodelist; + this.pool = []; + }, + { + render: function(context, buffer){ + var i, j, k; + var dirty = false; + var assign = this.assign; + + for(k = 0; k < assign.length; k++){ + if(typeof context[assign[k]] != "undefined"){ + dirty = true; + context.push(); + break; + } + } + + var items = this.loop.resolve(context) || []; + for(i = items.length; i < this.pool.length; i++){ + this.pool[i].unrender(context, buffer); + } + if(this.reversed){ + items = items.slice(0).reverse(); + } + + var isObject = dojo.isObject(items) && !dojo.isArrayLike(items); + var arred = []; + if(isObject){ + for(var key in items){ + arred.push(items[key]); + } + }else{ + arred = items; + } + + var forloop = context.forloop = { + parentloop: context.forloop || {} + }; + var j = 0; + for(i = 0; i < arred.length; i++){ + var item = arred[i]; + + forloop.counter0 = j; + forloop.counter = j + 1; + forloop.revcounter0 = arred.length - j - 1; + forloop.revcounter = arred.length - j; + forloop.first = !j; + forloop.last = (j == arred.length - 1); + + if(assign.length > 1 && dojo.isArrayLike(item)){ + if(!dirty){ + dirty = true; + context.push(); + } + var zipped = {}; + for(k = 0; k < item.length && k < assign.length; k++){ + zipped[assign[k]] = item[k]; + } + context.update(zipped); + }else{ + context[assign[0]] = item; + } + + if(j + 1 > this.pool.length){ + this.pool.push(this.nodelist.clone(buffer)); + } + buffer = this.pool[j].render(context, buffer, this); + ++j; + } + + delete context.forloop; + for(k = 0; k < assign.length; k++){ + delete context[assign[k]]; + } + if(dirty){ + context.pop(); + } + return buffer; + }, + unrender: function(context, buffer){ + for(var i = 0, pool; pool = this.pool[i]; i++){ + buffer = pool.unrender(context, buffer); + } + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this.assign, this.loop.getExpression(), this.reversed, this.nodelist.clone(buffer)); + } + }); + + dojo.mixin(ddtl, { + if_: function(parser, text){ + var i, part, type, bools = [], parts = ddt.pySplit(text); + parts.shift(); + text = parts.join(" "); + parts = text.split(" and "); + if(parts.length == 1){ + type = "or"; + parts = text.split(" or "); + }else{ + type = "and"; + for(i = 0; i < parts.length; i++){ + if(parts[i].indexOf(" or ") != -1){ + // Note, since we split by and, this is the only place we need to error check + throw new Error("'if' tags can't mix 'and' and 'or'"); + } + } + } + for(i = 0; part = parts[i]; i++){ + var not = false; + if(part.indexOf("not ") == 0){ + part = part.slice(4); + not = true; + } + bools.push([not, new dd._Filter(part)]); + } + var trues = parser.parse(["else", "endif"]); + var falses = false; + var token = parser.next(); + if(token.text == "else"){ + falses = parser.parse(["endif"]); + parser.next(); + } + return new ddtl.IfNode(bools, trues, falses, type); + }, + _ifequal: function(parser, text, negate){ + var parts = ddt.pySplit(text); + if(parts.length != 3){ + throw new Error(parts[0] + " takes two arguments"); + } + var end = 'end' + parts[0]; + var trues = parser.parse(["else", end]); + var falses = false; + var token = parser.next(); + if(token.text == "else"){ + falses = parser.parse([end]); + parser.next(); + } + return new ddtl.IfEqualNode(parts[1], parts[2], trues, falses, negate); + }, + ifequal: function(parser, text){ + return ddtl._ifequal(parser, text); + }, + ifnotequal: function(parser, text){ + return ddtl._ifequal(parser, text, true); + }, + for_: function(parser, text){ + var parts = ddt.pySplit(text); + if(parts.length < 4){ + throw new Error("'for' statements should have at least four words: " + text); + } + var reversed = parts[parts.length - 1] == "reversed"; + var index = (reversed) ? -3 : -2; + if(parts[parts.length + index] != "in"){ + throw new Error("'for' tag received an invalid argument: " + text); + } + var loopvars = parts.slice(1, index).join(" ").split(/ *, */); + for(var i = 0; i < loopvars.length; i++){ + if(!loopvars[i] || loopvars[i].indexOf(" ") != -1){ + throw new Error("'for' tag received an invalid argument: " + text); + } + } + var nodelist = parser.parse(["endfor"]); + parser.next(); + return new ddtl.ForNode(loopvars, parts[parts.length + index + 1], reversed, nodelist); + } + }); +})(); + +} diff --git a/includes/js/dojox/dtl/tag/loop.js b/includes/js/dojox/dtl/tag/loop.js new file mode 100644 index 0000000..3626c52 --- /dev/null +++ b/includes/js/dojox/dtl/tag/loop.js @@ -0,0 +1,196 @@ +if(!dojo._hasResource["dojox.dtl.tag.loop"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.loop"] = true; +dojo.provide("dojox.dtl.tag.loop"); + +dojo.require("dojox.dtl._base"); +dojo.require("dojox.string.tokenize"); + +(function(){ + var dd = dojox.dtl; + var ddtl = dd.tag.loop; + + ddtl.CycleNode = dojo.extend(function(cyclevars, name, TextNode, shared){ + this.cyclevars = cyclevars; + this.name = name; + this.TextNode = TextNode; + this.shared = shared || {counter: -1, map: {}}; + }, + { + render: function(context, buffer){ + if(context.forloop && !context.forloop.counter0){ + this.shared.counter = -1; + } + + ++this.shared.counter; + var value = this.cyclevars[this.shared.counter % this.cyclevars.length]; + + var map = this.shared.map; + if(!map[value]){ + map[value] = new dd._Filter(value); + } + value = map[value].resolve(context, buffer); + + if(this.name){ + context[this.name] = value; + } + if(!this.contents){ + this.contents = new this.TextNode(""); + } + this.contents.set(value); + return this.contents.render(context, buffer); + }, + unrender: function(context, buffer){ + return this.contents.unrender(context, buffer); + }, + clone: function(){ + return new this.constructor(this.cyclevars, this.name, this.TextNode, this.shared); + } + }); + + ddtl.IfChangedNode = dojo.extend(function(nodes, vars, shared){ + this.nodes = nodes; + this._vars = vars; + this.shared = shared || {last: null}; + this.vars = dojo.map(vars, function(item){ + return new dojox.dtl._Filter(item); + }); + }, { + render: function(context, buffer){ + if(context.forloop && context.forloop.first){ + this.shared.last = null; + } + + var change; + if(this.vars.length){ + change = dojo.toJson(dojo.map(this.vars, function(item){ + return item.resolve(context); + })); + }else{ + change = this.nodes.dummyRender(context, buffer); + } + + if(change != this.shared.last){ + var firstloop = (this.shared.last === null); + this.shared.last = change; + context.push(); + context.ifchanged = {firstloop: firstloop} + buffer = this.nodes.render(context, buffer); + context.pop(); + } + return buffer; + }, + unrender: function(context, buffer){ + this.nodes.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.nodes.clone(buffer), this._vars, this.shared); + } + }); + + ddtl.RegroupNode = dojo.extend(function(expression, key, alias){ + this._expression = expression; + this.expression = new dd._Filter(expression); + this.key = key; + this.alias = alias; + }, + { + _push: function(container, grouper, stack){ + if(stack.length){ + container.push({ grouper: grouper, list: stack }) + } + }, + render: function(context, buffer){ + context[this.alias] = []; + var list = this.expression.resolve(context); + if(list){ + var last = null; + var stack = []; + for(var i = 0; i < list.length; i++){ + var id = list[i][this.key]; + if(last !== id){ + this._push(context[this.alias], last, stack); + last = id; + stack = [list[i]]; + }else{ + stack.push(list[i]); + } + } + this._push(context[this.alias], last, stack); + } + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(context, buffer){ + return this; + } + }); + + dojo.mixin(ddtl, { + cycle: function(parser, text){ + // summary: Cycle among the given strings each time this tag is encountered + var args = text.split(" "); + + if(args.length < 2){ + throw new Error("'cycle' tag requires at least two arguments"); + } + + if(args[1].indexOf(",") != -1){ + var vars = args[1].split(","); + args = [args[0]]; + for(var i = 0; i < vars.length; i++){ + args.push('"' + vars[i] + '"'); + } + } + + if(args.length == 2){ + var name = args[args.length - 1]; + + if(!parser._namedCycleNodes){ + throw new Error("No named cycles in template: '" + name + "' is not defined"); + } + if(!parser._namedCycleNodes[name]){ + throw new Error("Named cycle '" + name + "' does not exist"); + } + + return parser._namedCycleNodes[name]; + } + + if(args.length > 4 && args[args.length - 2] == "as"){ + var name = args[args.length - 1]; + + var node = new ddtl.CycleNode(args.slice(1, args.length - 2), name, parser.getTextNodeConstructor()); + + if(!parser._namedCycleNodes){ + parser._namedCycleNodes = {}; + } + parser._namedCycleNodes[name] = node; + }else{ + node = new ddtl.CycleNode(args.slice(1), null, parser.getTextNodeConstructor()); + } + + return node; + }, + ifchanged: function(parser, text){ + var parts = dojox.dtl.text.pySplit(text); + var nodes = parser.parse(["endifchanged"]); + parser.next(); + return new ddtl.IfChangedNode(nodes, parts.slice(1)); + }, + regroup: function(parser, text){ + var tokens = dojox.string.tokenize(dojo.trim(text), /(\s+)/g, function(spaces){ + return spaces; + }); + if(tokens.length < 11 || tokens[tokens.length - 3] != "as" || tokens[tokens.length - 7] != "by"){ + throw new Error("Expected the format: regroup list by key as newList"); + } + var expression = tokens.slice(2, -8).join(""); + var key = tokens[tokens.length - 5]; + var alias = tokens[tokens.length - 1]; + return new ddtl.RegroupNode(expression, key, alias); + } + }); +})(); + +} diff --git a/includes/js/dojox/dtl/tag/misc.js b/includes/js/dojox/dtl/tag/misc.js new file mode 100644 index 0000000..31610d7 --- /dev/null +++ b/includes/js/dojox/dtl/tag/misc.js @@ -0,0 +1,291 @@ +if(!dojo._hasResource["dojox.dtl.tag.misc"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.misc"] = true; +dojo.provide("dojox.dtl.tag.misc"); +dojo.require("dojox.dtl._base"); + +(function(){ + var dd = dojox.dtl; + var ddtm = dd.tag.misc; + + ddtm.DebugNode = dojo.extend(function(TextNode){ + this._TextNode = TextNode; + }, + { + render: function(context, buffer){ + var keys = context.getKeys(); + var debug = ""; + for(var i = 0, key; key = keys[i]; i++){ + console.debug("DEBUG", key, ":", context[key]); + debug += key + ": " + dojo.toJson(context[key]) + "\n\n"; + } + return new this._TextNode(debug).render(context, buffer, this); + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this._TextNode); + }, + toString: function(){ return "ddtm.DebugNode"; } + }); + + ddtm.FilterNode = dojo.extend(function(varnode, nodelist){ + this._varnode = varnode; + this._nodelist = nodelist; + }, + { + render: function(context, buffer){ + // Doing this in HTML requires a different buffer with a fake root node + var output = this._nodelist.render(context, new dojox.string.Builder()); + context.update({ "var": output.toString() }); + var filtered = this._varnode.render(context, buffer); + context.pop(); + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this._expression, this._nodelist.clone(buffer)); + } + }); + + ddtm.FirstOfNode = dojo.extend(function(vars, TextNode){ + this._vars = vars; + this.vars = dojo.map(vars, function(item){ + return new dojox.dtl._Filter(item); + }); + this.contents = new TextNode(""); + }, + { + render: function(context, buffer){ + for(var i = 0, item; item = this.vars[i]; i++){ + var resolved = item.resolve(context); + if(typeof resolved != "undefined"){ + if(resolved === null){ + resolved = "null"; + } + this.contents.set(resolved); + return this.contents.render(context, buffer); + } + } + return this.contents.unrender(context, buffer); + }, + unrender: function(context, buffer){ + return this.contents.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this._vars, this.contents.constructor); + } + }); + + ddtm.SpacelessNode = dojo.extend(function(nodelist, TextNode){ + this.nodelist = nodelist; + this.TextNode = TextNode; + }, + { + render: function(context, buffer){ + if(buffer.onAddNodeComplete){ + // Unfortunately, we have to branch here + var watch = [ + dojo.connect(buffer, "onAddNodeComplete", this, "_watch"), + dojo.connect(buffer, "onSetParent", this, "_watchParent") + ]; + buffer = this.nodelist.render(context, buffer); + dojo.disconnect(watch[0]); + dojo.disconnect(watch[1]); + }else{ + if(!this.contents){ + this.contents = new this.TextNode(""); + } + var value = this.nodelist.dummyRender(context); + this.contents.set(value.replace(/>\s+<')); + buffer = this.contents.render(context, buffer); + } + return buffer; + }, + unrender: function(context, buffer){ + return this.nodelist.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.nodelist.clone(buffer)); + }, + _isEmpty: function(node){ + return (node.nodeType == 3 && !node.data.match(/[^\s\n]/)); + }, + _watch: function(node){ + if(this._isEmpty(node)){ + var remove = false; + if(node.parentNode.firstChild == node){ + node.parentNode.removeChild(node); + } + }else{ + var children = node.parentNode.childNodes; + if(node.nodeType == 1 && children.length > 2){ + for(var i = 2, child; child = children[i]; i++){ + if(children[i - 2].nodeType == 1 && this._isEmpty(children[i - 1])){ + node.parentNode.removeChild(children[i - 1]); + return; + } + } + } + } + }, + _watchParent: function(node){ + var children = node.childNodes; + if(children.length){ + while(node.childNodes.length){ + var last = node.childNodes[node.childNodes.length - 1]; + if(!this._isEmpty(last)){ + return; + } + node.removeChild(last); + } + } + } + }); + + ddtm.TemplateTagNode = dojo.extend(function(tag, TextNode){ + this.tag = tag; + this.contents = new TextNode(""); + }, + { + mapping: { + openblock: "{%", + closeblock: "%}", + openvariable: "{{", + closevariable: "}}", + openbrace: "{", + closebrace: "}", + opencomment: "{#", + closecomment: "#}" + }, + render: function(context, buffer){ + this.contents.set(this.mapping[this.tag]); + return this.contents.render(context, buffer); + }, + unrender: function(context, buffer){ + return this.contents.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.tag, this.contents.constructor); + } + }); + + ddtm.WidthRatioNode = dojo.extend(function(current, max, width, TextNode){ + this.current = new dd._Filter(current); + this.max = new dd._Filter(max); + this.width = width; + this.contents = new TextNode(""); + }, + { + render: function(context, buffer){ + var current = +this.current.resolve(context); + var max = +this.max.resolve(context); + if(typeof current != "number" || typeof max != "number" || !max){ + this.contents.set(""); + }else{ + this.contents.set("" + Math.round((current / max) * this.width)); + } + return this.contents.render(context, buffer); + }, + unrender: function(context, buffer){ + return this.contents.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.current.getExpression(), this.max.getExpression(), this.width, this.contents.constructor); + } + }); + + ddtm.WithNode = dojo.extend(function(target, alias, nodelist){ + this.target = new dd._Filter(target); + this.alias = alias; + this.nodelist = nodelist; + }, + { + render: function(context, buffer){ + var target = this.target.resolve(context); + context.push(); + context[this.alias] = target; + buffer = this.nodelist.render(context, buffer); + context.pop(); + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(buffer){ + return new this.constructor(this.target.getExpression(), this.alias, this.nodelist.clone(buffer)); + } + }); + + dojo.mixin(ddtm, { + comment: function(parser, text){ + // summary: Ignore everything between {% comment %} and {% endcomment %} + parser.skipPast("endcomment"); + return dd._noOpNode; + }, + debug: function(parser, text){ + // summary: Output the current context, maybe add more stuff later. + return new ddtm.DebugNode(parser.getTextNodeConstructor()); + }, + filter: function(parser, text){ + // summary: Filter the contents of the blog through variable filters. + var parts = text.split(" ", 2); + var varnode = new (parser.getVarNodeConstructor())("var|" + parts[1]); + var nodelist = parser.parse(["endfilter"]); + parser.next(); + return new ddtm.FilterNode(varnode, nodelist); + }, + firstof: function(parser, text){ + var parts = dojox.dtl.text.pySplit(text).slice(1); + if(!parts.length){ + throw new Error("'firstof' statement requires at least one argument"); + } + return new ddtm.FirstOfNode(parts, parser.getTextNodeConstructor()); + }, + spaceless: function(parser, text){ + var nodelist = parser.parse(["endspaceless"]); + parser.next(); + return new ddtm.SpacelessNode(nodelist, parser.getTextNodeConstructor()); + }, + templatetag: function(parser, text){ + var parts = dd.text.pySplit(text); + if(parts.length != 2){ + throw new Error("'templatetag' statement takes one argument"); + } + var tag = parts[1]; + var mapping = ddtm.TemplateTagNode.prototype.mapping; + if(!mapping[tag]){ + var keys = []; + for(var key in mapping){ + keys.push(key); + } + throw new Error("Invalid templatetag argument: '" + tag + "'. Must be one of: " + keys.join(", ")); + } + return new ddtm.TemplateTagNode(tag, parser.getTextNodeConstructor()); + }, + widthratio: function(parser, text){ + var parts = dd.text.pySplit(text); + if(parts.length != 4){ + throw new Error("widthratio takes three arguments"); + } + var width = +parts[3]; + if(typeof width != "number"){ + throw new Error("widthratio final argument must be an integer"); + } + return new ddtm.WidthRatioNode(parts[1], parts[2], width, parser.getTextNodeConstructor()); + }, + with_: function(parser, text){ + var parts = dd.text.pySplit(text); + if(parts.length != 4 || parts[2] != "as"){ + throw new Error("do_width expected format as 'with value as name'"); + } + var nodelist = parser.parse(["endwith"]); + parser.next(); + return new ddtm.WithNode(parts[1], parts[3], nodelist); + } + }); +})(); + +} diff --git a/includes/js/dojox/dtl/tests/context.js b/includes/js/dojox/dtl/tests/context.js new file mode 100644 index 0000000..a366098 --- /dev/null +++ b/includes/js/dojox/dtl/tests/context.js @@ -0,0 +1,79 @@ +if(!dojo._hasResource["dojox.dtl.tests.context"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.context"] = true; +dojo.provide("dojox.dtl.tests.context"); + +dojo.require("dojox.dtl"); +dojo.require("dojox.dtl.Context"); + +doh.register("dojox.dtl.context", + [ + function test_context_creation(t){ + var context = new dojox.dtl.Context({ foo: "foo", bar: "bar" }); + t.is("foo", context.foo); + t.is("bar", context.bar); + }, + function test_context_push(t){ + var context = new dojox.dtl.Context({ foo: "foo", bar: "bar" }); + context.push(); + for(var key in context._dicts[0]){ + t.t(key == "foo" || key == "bar"); + } + }, + function test_context_pop(t){ + var context = new dojox.dtl.Context({ foo: "foo", bar: "bar" }); + context.push(); + t.is("undefined", typeof context.foo); + t.is("undefined", typeof context.bar); + context.pop(); + t.is("foo", context.foo); + t.is("bar", context.bar); + }, + function test_context_overpop(t){ + var context = new dojox.dtl.Context(); + try{ + context.pop(); + t.t(false); + }catch(e){ + t.is("pop() called on empty Context", e.message); + } + }, + function test_context_filter(t){ + var context = new dojox.dtl.Context({ foo: "one", bar: "two", baz: "three" }); + var filtered = context.filter("foo", "bar"); + t.is(filtered.foo, "one"); + t.is(filtered.bar, "two"); + t.f(filtered.baz); + + filtered = context.filter({ bar: true, baz: true }); + t.f(filtered.foo); + t.is(filtered.bar, "two"); + t.is(filtered.baz, "three"); + + filtered = context.filter(new dojox.dtl.Context({ foo: true, baz: true })); + t.is(filtered.foo, "one"); + t.f(filtered.bar); + t.is(filtered.baz, "three"); + }, + function test_context_extend(t){ + var context = new dojox.dtl.Context({ foo: "one" }); + var extended = context.extend({ bar: "two", baz: "three" }); + t.is(extended.foo, "one"); + t.is(extended.bar, "two"); + t.is(extended.baz, "three"); + + extended = context.extend({ barr: "two", bazz: "three" }); + t.is(extended.foo, "one"); + t.f(extended.bar); + t.f(extended.baz); + t.is(extended.barr, "two"); + t.is(extended.bazz, "three"); + + t.f(context.bar) + t.f(context.baz); + t.f(context.barr); + t.f(context.bazz); + } + ] +); + +} diff --git a/includes/js/dojox/dtl/tests/demo_Templated_Jaxer.html b/includes/js/dojox/dtl/tests/demo_Templated_Jaxer.html new file mode 100644 index 0000000..29e5470 --- /dev/null +++ b/includes/js/dojox/dtl/tests/demo_Templated_Jaxer.html @@ -0,0 +1,87 @@ + + + Demo using dojox.dtl._Templated + + + + +

            Using Dojo's Django Template language on Jaxer

            +

            + Aptana's Jaxer is server side JavaScript (SSJS) server. With some modifications to + a web page, Dojo can be run on the server. With Dojo running on the server, you can + utilize the Dojo's Django Template library rendering engine to do templating within + Jaxer. The latest build of Dojo includes some patches to properly work with Jaxer, + so you need a build of Dojo later than 2/18/08 to work with Jaxer. Next, the + following modifications to your page are needed to run Jaxer: +

              +
            • + You must explicitly set the base url of the Dojo library. Jaxer does not provide + the ability for Dojo to auto-detect the base url as it can in other environments. + Therefore you must declare the base url with the djConfig global variable: +
              +	<script runat="server">
              +		djConfig = {baseUrl:"/dojo/", // use the base path of dojo here
              +					usePlainJson: true, parseOnLoad: true};
              +	</script>
              +							
              +
            • +
            • + Next, you must add the runat attribute with a value of "server" to all of the script + tags that you want executed on the server. Your script tags should look like: +
              +	<script runat="server" type="text/javascript" src="../../../dojo/dojo.js"></script>
              +							
              +
            • +
            • + Last, you must dojo.require("dojo.jaxer") with a script tag. This should immediately + follow the declaration of dojo.js: +
              +	<script runat="server" type="text/javascript" src="../../../dojo/dojo.js"></script>
              +	<script runat="server" type="text/javascript">dojo.require("dojo.jaxer");</script>
              +							
              +
            • +
            +

            +

            + Once this is done, Dojo should load in Jaxer, and you can utilize the library capabilities of + Dojo. In particular, you can now use DTL renderer as you would on + the browser. If you are running this in Jaxer, below should be a working demonstration of + a template that is rendered on the server. +

            +
            +

            + It is important to note that Jaxer is not capable of transferring the programmaticaly set + event handlers for widgets, it can only send the static HTML to the browser. This means + you can use DTL as a templating engine to create HTML on the server, but Dojo client side widgets + are still necessary if you want to use interactive widgets on the browser. +

            + + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/tests/html/buffer.js b/includes/js/dojox/dtl/tests/html/buffer.js new file mode 100644 index 0000000..3077d8c --- /dev/null +++ b/includes/js/dojox/dtl/tests/html/buffer.js @@ -0,0 +1,35 @@ +if(!dojo._hasResource["dojox.dtl.tests.html.buffer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.html.buffer"] = true; +dojo.provide("dojox.dtl.tests.html.buffer"); + +dojo.require("dojox.dtl.html"); +dojo.require("dojox.dtl.Context"); +dojo.require("dojox.dtl.tests.html.util"); + +doh.register("dojox.dtl.html.buffer", + [ + function test_insertion_order_text(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + first: false, + last: false + }); + + var template = new dd.HtmlTemplate("
            {% if first %}first{% endif %}middle{% if last %}last{% endif %}
            "); + t.is("
            middle
            ", dd.tests.html.util.render(template, context)); + + context.first = true; + t.is("
            firstmiddle
            ", dd.tests.html.util.render(template, context)); + + context.first = false; + context.last = true; + t.is("
            middlelast
            ", dd.tests.html.util.render(template, context)); + + context.first = true; + t.is("
            firstmiddlelast
            ", dd.tests.html.util.render(template, context)); + } + ] +); + +} diff --git a/includes/js/dojox/dtl/tests/html/tag.js b/includes/js/dojox/dtl/tests/html/tag.js new file mode 100644 index 0000000..c964913 --- /dev/null +++ b/includes/js/dojox/dtl/tests/html/tag.js @@ -0,0 +1,233 @@ +if(!dojo._hasResource["dojox.dtl.tests.html.tag"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.html.tag"] = true; +dojo.provide("dojox.dtl.tests.html.tag"); + +dojo.require("dojox.dtl.html"); +dojo.require("dojox.dtl.Context"); +dojo.require("dojox.dtl.tests.html.util"); + +doh.register("dojox.dtl.html.tag", + [ + function test_errors(t){ + var dd = dojox.dtl; + var template; + + // No root node after rendering + var found = false; + try { + template = new dd.HtmlTemplate('No div'); + dd.tests.html.util.render(template); + }catch(e){ + t.is("Text should not exist outside of the root node in template", e.message); + found = true; + } + t.t(found); + + var context = new dojox.dtl.Context({test: "Pocket"}); + found = false; + try { + template = new dd.HtmlTemplate('{{ test }}'); + dd.tests.html.util.render(template, context); + }catch(e){ + t.is("Text should not exist outside of the root node in template", e.message); + found = true; + } + t.t(found); + + template = new dd.HtmlTemplate('
            extra content'); + found = false; + try { + dd.tests.html.util.render(template); + }catch(e){ + t.is("Content should not exist outside of the root node in template", e.message); + found = true; + } + t.t(found); + + // More than one top-level node (except for blocks) + template = new dd.HtmlTemplate('
            '); + found = false; + try { + dd.tests.html.util.render(template); + }catch(e){ + t.is("Content should not exist outside of the root node in template", e.message); + found = true; + } + t.t(found); + + // Logic block rules out any root node + template = new dd.HtmlTemplate('{% if missing %}
            {% endif %}'); + found = false; + try { + dd.tests.html.util.render(template); + }catch(e){ + t.is("Rendered template does not have a root node", e.message); + found = true; + } + t.t(found); + }, + function test_structures(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + actions: ["ate", "picked"], + items: [ + { + name: "apple" + }, + { + name: "banana", + date: new Date(2007, 2, 16, 14, 30, 10) + }, + { + name: "orange", + date: new Date(2008, 0, 1, 12, 0, 0) + } + ] + }); + + var template = new dd.HtmlTemplate('
              I {% for action in actions %}{% if not forloop.first %}, {% endif %}{{action}}{% endfor %} the following:
                {% for item in items %}
              • {{ item.name }}{% if item.date %} at {{ item.date|date:"P" }}{% endif %}
              • {% endfor %}
            '); + t.is('
              I ate, picked the following:
              • apple
              • banana at 2:30 pm
              • orange at noon
            ', dd.tests.html.util.render(template, context)); + }, + function test_tag_extend(t){ + // Problems to look for: + // * Content outside of blocks + }, + function test_tag_for(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"] + }); + var template = new dd.HtmlTemplate('
              {% for item in items %}
            • {{ item }}
            • {% endfor %}
            '); + + t.is('
            • apple
            • banana
            • lemon
            ', dd.tests.html.util.render(template, context)); + + // The line break is there to make sure our regex works + template = new dd.HtmlTemplate('
            '); + + t.is('
            ', dd.tests.html.util.render(template, context)); + }, + function test_tag_if(t){ + var dd = dojox.dtl; + + var context = new dd.Context({key: true}); + var template = new dd.HtmlTemplate('{% if key %}
            has key
            {% else %}
            no key
            {% endif %}'); + t.is("
            has key
            ", dd.tests.html.util.render(template, context)); + context.key = false; + t.is("
            no key
            ", dd.tests.html.util.render(template, context)); + }, + function test_tag_ifchanged(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + year: 2008, + days: [ + new Date(2008, 0, 12), + new Date(2008, 0, 28), + new Date(2008, 1, 1), + new Date(2008, 1, 1), + new Date(2008, 1, 1) + ] + }); + + var template = new dd.HtmlTemplate("

            Archive for {{ year }}

            "+ +"{% for date in days %}"+ +'{% ifchanged %}

            Month:

            {{ date|date:"F" }}

            {% endifchanged %}'+ +'{{ date|date:\'j\' }}'+ +"{% endfor %}
            "); + + t.is('

            Archive for 2008

            '+ +'

            Month:

            January

            '+ +'12'+ +'28'+ +'

            Month:

            February

            '+ +'1'+ +'1'+ +'1
            ', dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate('
            {% for date in days %}'+ +'{% ifchanged date.date %} {{ date.date }} {% endifchanged %}'+ +'{% ifchanged date.hour date.date %}'+ +'{{ date.hour }}'+ +'{% endifchanged %}'+ +'{% endfor %}
            '); + t.is('
            2008-01-12 0 2008-01-28 0 2008-02-01 0
            ', dd.tests.html.util.render(template, context)); + }, + function test_tag_ifequal(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: [ + { name: "apple", color: "red" }, + { name: "banana", color: "yellow" }, + { name: "pear", color: "green" }, + { name: "kiwi", color: "brown" } + ], + edit_item: "banana" + }); + + var template = new dd.HtmlTemplate("
              {% for item in items %}
            • {{ item.name }}
            • {% endfor %}
            "); + t.is('
            • apple
            • banana
            • pear
            • kiwi
            ', dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate("
              {% for item in items %}
            • {{ item.name }}

              {{ item.color }}

            • {% endfor %}
            "); + t.is('
            • apple

              red

            • banana

              yellow

            • pear

              green

            • kiwi

              brown

            ', dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate("
              {% for item in items %}
            • {% ifequal item.name edit_item %}
              {% else %}{{ item.name }}

              {{ item.color }}

              {% endifequal %}
            • {% endfor %}
            "); + t.is('
            • apple

              red


            • pear

              green

            • kiwi

              brown

            ', dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate("
              {% for item in items %}
            • {% ifequal item.name edit_item %}

              {% else %}
              {{ item.name }}

              {{ item.color }}

              {% endifequal %}
            • {% endfor %}
            "); + t.is('
            • apple

              red


            • pear

              green

            • kiwi

              brown

            ', dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate("
              {% for item in items %}{% ifequal item.name edit_item %}

            • {% else %}
            • {{ item.name }}

              {{ item.color }}

            • {% endifequal %}{% endfor %}
            "); + t.is('
            • apple

              red


            • pear

              green

            • kiwi

              brown

            ', dd.tests.html.util.render(template, context)); + }, + function test_tag_include(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.HtmlTemplate("
            {% include hello %}
            "); + t.is("
            Hello, Bob
            ", dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate('
            {% include "../../dojox/dtl/tests/templates/hello.html" %}
            '); + t.is("
            Hello, Bob
            ", dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate('
            {% for person in people %}
            {% include hello %}
            {% endfor %}
            '); + t.is('
            Hello, Charles
            Hello, Ralph
            Hello, Julia
            ', dd.tests.html.util.render(template, context)); + }, + function test_tag_spaceless(t){ + var dd = dojox.dtl; + + var template = new dd.HtmlTemplate("{% spaceless %}
              \n
            • Hot
            • \n\n
            • Pocket
            • \n
            {% endspaceless %}"); + t.is("
            • Hot
            • Pocket
            ", dd.tests.html.util.render(template)); + }, + function test_tag_ssi(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.HtmlTemplate("
            {% ssi hello parsed %}
            "); + t.is("
            Hello, Bob
            ", dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate("
            {% ssi hello %}
            "); + t.is("
            Hello, {{ person }}
            ", dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate('
            {% ssi "../../dojox/dtl/tests/templates/hello.html" parsed %}
            '); + t.is("
            Hello, Bob
            ", dd.tests.html.util.render(template, context)); + + template = new dd.HtmlTemplate('
            {% for person in people %}{% ssi hello parsed %} {% endfor %}
            '); + t.is("
            Hello, Charles Hello, Ralph Hello, Julia
            ", dd.tests.html.util.render(template, context)); + } + ] +); + +} diff --git a/includes/js/dojox/dtl/tests/html/util.js b/includes/js/dojox/dtl/tests/html/util.js new file mode 100644 index 0000000..b4efe5a --- /dev/null +++ b/includes/js/dojox/dtl/tests/html/util.js @@ -0,0 +1,160 @@ +if(!dojo._hasResource["dojox.dtl.tests.html.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.html.util"] = true; +dojo.provide("dojox.dtl.tests.html.util"); + +dojo.require("dojox.dtl.html"); +dojo.require("dojox.dtl.render.html"); +dojo.require("dojox.string.Builder"); + +dojox.dtl.HtmlBuffer.prototype.onClone = function(from, to){ + var clones = this._clones = this._clones || []; + + for(var i = 0, group; group = clones[i]; i++){ + for(var j = 0, item; item = group[j]; j++){ + if(item === from){ + group.push(to); + return + }else if(item === to){ + group.push(from); + return; + } + } + } + + clones.push([from, to]); +} +dojox.dtl.HtmlBuffer.prototype.onAddEvent = function(node, type, description){ + var events = this._events = this._events || []; + + var found = false; + for(var i = 0, evt; evt = events[i]; i++){ + if(evt[0] === node){ + found = true; + evt[1] = type; + evt[2] = description; + } + } + + if(!found){ + events.push([node, type, description]); + } +} + +dojox.dtl.tests.html.util.render = function(/*HtmlTemplate*/ template, /*Context*/ context) { + try { + var div = document.createElement("div"); + dojo.style(div, "visibility", "hidden"); + var attach = document.createElement("div"); + div.appendChild(attach); + dojo.body().appendChild(div); + + var buffer = template.getBuffer(); + var canvas = new dojox.dtl.render.html.Render(attach, template); + canvas.render(context, template, buffer); + var clones = buffer._clones; + var events = buffer._events; + + var first = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString(); + + buffer = template.getBuffer(); + buffer._clones = clones; + buffer._events = events; + canvas.render(context, template, buffer); + + var second = dojox.dtl.tests.html.util.serialize(canvas.domNode, template.tokens, clones, events).toString(); + + doh.is("Compare re-render: " + first, "Compare re-render: " + second); + return first; + } + catch(e){ + throw e; + }finally{ + div.parentNode.removeChild(div); + } +} + +dojox.dtl.tests.html.util.serialize = function(node, tokens, clones, events, output) { + var types = dojox.dtl.html.types; + clones = clones || []; + events = events || []; + + if (node.nodeType == 3) { + output.append(node.nodeValue); + }else{ + var name = node.nodeName.toLowerCase(); + + if (!output) { + output = new dojox.string.Builder(); + } + output.append("<").append(name); + + var attributes = dojo.filter(tokens, function(token){ + if(token[0] == types.attr){ + for(var i = 0, group; group = clones[i]; i++){ + // group is any set of nodes that were originally the sam + var count = 0; + for(var j = 0, item; item = group[j]; j++){ + if(item === token[1] || item === node){ + if(count++){ + // This is entered when we have 2 hits within a clone group. + // The first would be the original node + // The second would be if our current node is a clone + // of the original + return true; + } + } + } + } + } + }); + + for(var i = 0, attribute; attribute = attributes[i]; i++){ + var value = ""; + if(attribute[2] == "class"){ + value = node.className || value; + }else if(attribute[2] == "for"){ + value = node.htmlFor || value; + }else if(node.getAttribute){ + value = node.getAttribute(attribute[2], 2) || value; + if(dojo.isIE && (attribute[2] == "href" || attribute[2] == "src")){ + if(dojo.isIE){ + var hash = location.href.lastIndexOf(location.hash); + var href = location.href.substring(0, hash).split("/"); + href.pop(); + href = href.join("/") + "/"; + if(value.indexOf(href) == 0){ + value = value.replace(href, ""); + } + value = decodeURIComponent(value); + } + } + } + if(value){ + output.append(" ").append(attribute[2]).append('="').append(value.replace(/"/g, '\\"')).append('"'); + } + } + + // Deal with events + if(events){ + for(var i = 0, evt; evt = events[i]; i++){ + if(evt[0] === node){ + output.append(" ").append(evt[1]).append('="').append(evt[2]).append('"'); + } + } + } + + if(!node.childNodes.length){ + output.append("/>"); + }else{ + output.append(">"); + dojo.forEach(node.childNodes, function(node){ + dojox.dtl.tests.html.util.serialize(node, tokens, clones, events, output); + }); + output.append(""); + } + + return output; + } +} + +} diff --git a/includes/js/dojox/dtl/tests/module.js b/includes/js/dojox/dtl/tests/module.js new file mode 100644 index 0000000..57dcafb --- /dev/null +++ b/includes/js/dojox/dtl/tests/module.js @@ -0,0 +1,15 @@ +if(!dojo._hasResource["dojox.dtl.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.module"] = true; +dojo.provide("dojox.dtl.tests.module"); + +try{ + dojo.require("dojox.dtl.tests.text.filter"); + dojo.require("dojox.dtl.tests.text.tag"); + dojo.require("dojox.dtl.tests.html.tag"); + dojo.require("dojox.dtl.tests.html.buffer"); + dojo.require("dojox.dtl.tests.context"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/dtl/tests/runTests.html b/includes/js/dojox/dtl/tests/runTests.html new file mode 100644 index 0000000..32338f6 --- /dev/null +++ b/includes/js/dojox/dtl/tests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox Djanto Template Language D.O.H. Unit Test Runner + + + Redirecting to D.O.H runner. + + \ No newline at end of file diff --git a/includes/js/dojox/dtl/tests/templates/hello.html b/includes/js/dojox/dtl/tests/templates/hello.html new file mode 100644 index 0000000..18e4c1a --- /dev/null +++ b/includes/js/dojox/dtl/tests/templates/hello.html @@ -0,0 +1 @@ +Hello, {{ person }} \ No newline at end of file diff --git a/includes/js/dojox/dtl/tests/templates/pocket.html b/includes/js/dojox/dtl/tests/templates/pocket.html new file mode 100644 index 0000000..f78c520 --- /dev/null +++ b/includes/js/dojox/dtl/tests/templates/pocket.html @@ -0,0 +1 @@ +{% block pocket %}Hot{% endblock %} Pocket \ No newline at end of file diff --git a/includes/js/dojox/dtl/tests/templates/pocket2.html b/includes/js/dojox/dtl/tests/templates/pocket2.html new file mode 100644 index 0000000..547f9a2 --- /dev/null +++ b/includes/js/dojox/dtl/tests/templates/pocket2.html @@ -0,0 +1 @@ +{% for item in items %}({% block pocket %}Hot{% endblock %}) {% endfor %}Pocket \ No newline at end of file diff --git a/includes/js/dojox/dtl/tests/text/filter.js b/includes/js/dojox/dtl/tests/text/filter.js new file mode 100644 index 0000000..d96f931 --- /dev/null +++ b/includes/js/dojox/dtl/tests/text/filter.js @@ -0,0 +1,740 @@ +if(!dojo._hasResource["dojox.dtl.tests.text.filter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.text.filter"] = true; +dojo.provide("dojox.dtl.tests.text.filter"); + +dojo.require("dojox.dtl"); +dojo.require("dojox.dtl.Context"); +dojo.require("dojox.dtl.utils.date"); +dojo.require("dojox.date.php"); +dojo.require("dojox.string.sprintf"); + +// If you update something here, update it in the HTML tests +doh.register("dojox.dtl.text.filter", + [ + function test_filter_add(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ four: 4 }); + tpl = new dd.Template('{{ four|add:"6" }}'); + t.is("10", tpl.render(context)); + context.four = "4"; + t.is("10", tpl.render(context)); + tpl = new dd.Template('{{ four|add:"six" }}'); + t.is("4", tpl.render(context)); + tpl = new dd.Template('{{ four|add:"6.6" }}'); + t.is("10", tpl.render(context)); + }, + function test_filter_addslashes(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ unslashed: "Test back slashes \\, double quotes \" and single quotes '" }) + var tpl = new dd.Template('{{ unslashed|addslashes }}'); + t.is("Test back slashes \\\\, double quotes \\\" and single quotes \\'", tpl.render(context)); + }, + function test_filter_capfirst(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ uncapped|capfirst }}'); + t.is("Cap", tpl.render(new dd.Context({ uncapped: "cap" }))); + }, + function test_filter_center(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + var tpl = new dd.Template('{{ narrow|center }}'); + context.narrow = "even"; + t.is("even", tpl.render(context)); + context.narrow = "odd"; + t.is("odd", tpl.render(context)); + tpl = new dd.Template('{{ narrow|center:"5" }}'); + context.narrow = "even"; + t.is("even ", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd ", tpl.render(context)); + tpl = new dd.Template('{{ narrow|center:"6" }}'); + context.narrow = "even"; + t.is(" even ", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd ", tpl.render(context)); + tpl = new dd.Template('{{ narrow|center:"12" }}'); + context.narrow = "even"; + t.is(" even ", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd ", tpl.render(context)); + }, + function test_filter_cut(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ uncut: "Apples and oranges" }); + var tpl = new dd.Template('{{ uncut|cut }}'); + t.is("Apples and oranges", tpl.render(context)); + tpl = new dd.Template('{{ uncut|cut:"A" }}'); + t.is("pples and oranges", tpl.render(context)); + tpl = new dd.Template('{{ uncut|cut:" " }}'); + t.is("Applesandoranges", tpl.render(context)); + tpl = new dd.Template('{{ uncut|cut:"e" }}'); + t.is("Appls and orangs", tpl.render(context)); + }, + function test_filter_date(t){ + var dd = dojox.dtl; + var context = new dd.Context({ now: new Date(2007, 0, 1), then: new Date(2007, 1, 1) }); + + var tpl = new dd.Template('{{ now|date }}'); + t.is(dojox.dtl.utils.date.format(context.now, "N j, Y"), tpl.render(context)); + + context.then = new Date(2007, 0, 1); + tpl = new dd.Template('{{ now|date:"d" }}'); + t.is("01", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"D" }}'); + t.is("Mon", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"j" }}'); + t.is("1", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"l" }}'); + t.is("Monday", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"N" }}'); + t.is("Jan.", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"S" }}'); + t.is("st", tpl.render(context)); + context.now.setDate(2); + t.is("nd", tpl.render(context)); + context.now.setDate(3); + t.is("rd", tpl.render(context)); + context.now.setDate(4); + t.is("th", tpl.render(context)); + context.now.setDate(5); + t.is("th", tpl.render(context)); + context.now.setDate(6); + t.is("th", tpl.render(context)); + context.now.setDate(7); + t.is("th", tpl.render(context)); + context.now.setDate(8); + t.is("th", tpl.render(context)); + context.now.setDate(9); + t.is("th", tpl.render(context)); + context.now.setDate(10); + t.is("th", tpl.render(context)); + context.now.setDate(11); + t.is("th", tpl.render(context)); + context.now.setDate(12); + t.is("th", tpl.render(context)); + context.now.setDate(13); + t.is("th", tpl.render(context)); + context.now.setDate(14); + t.is("th", tpl.render(context)); + context.now.setDate(15); + t.is("th", tpl.render(context)); + context.now.setDate(16); + t.is("th", tpl.render(context)); + context.now.setDate(17); + t.is("th", tpl.render(context)); + context.now.setDate(18); + t.is("th", tpl.render(context)); + context.now.setDate(19); + t.is("th", tpl.render(context)); + context.now.setDate(20); + t.is("th", tpl.render(context)); + context.now.setDate(21); + t.is("st", tpl.render(context)); + context.now.setDate(22); + t.is("nd", tpl.render(context)); + context.now.setDate(23); + t.is("rd", tpl.render(context)); + context.now.setDate(24); + t.is("th", tpl.render(context)); + context.now.setDate(25); + t.is("th", tpl.render(context)); + context.now.setDate(26); + t.is("th", tpl.render(context)); + context.now.setDate(27); + t.is("th", tpl.render(context)); + context.now.setDate(28); + t.is("th", tpl.render(context)); + context.now.setDate(29); + t.is("th", tpl.render(context)); + context.now.setDate(30); + t.is("th", tpl.render(context)); + context.now.setDate(31); + t.is("st", tpl.render(context)); + context.now.setDate(1); + + tpl = new dd.Template('{{ now|date:"w" }}'); + t.is("1", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"z" }}'); + t.is("0", tpl.render(context)); + + tpl = new dd.Template('{{ now|date:"W" }}'); + t.is("1", tpl.render(context)); + }, + function test_filter_default(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + tpl = new dd.Template('{{ empty|default }}'); + t.is("", tpl.render(context)); + tpl = new dd.Template('{{ empty|default:"full" }}'); + t.is("full", tpl.render(context)); + context.empty = "not empty"; + t.is("not empty", tpl.render(context)); + }, + function test_filter_default_if_none(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + tpl = new dd.Template('{{ empty|default_if_none }}'); + t.is("", tpl.render(context)); + tpl = new dd.Template('{{ empty|default_if_none:"full" }}'); + t.is("", tpl.render(context)); + context.empty = null; + t.is("full", tpl.render(context)); + context.empty = "not empty"; + t.is("not empty", tpl.render(context)); + }, + function test_filter_dictsort(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|dictsort|join:"|" }}'); + t.is("lemons|apples|grapes", tpl.render(context)); + tpl = new dd.Template('{{ fruit|dictsort:"name"|join:"|" }}'); + t.is("apples|grapes|lemons", tpl.render(context)); + }, + function test_filter_dictsort_reversed(t){ + var dd = dojox.dtl; + + context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|dictsortreversed:"name"|join:"|" }}'); + t.is("lemons|grapes|apples", tpl.render(context)); + }, + function test_filter_divisibleby(t){ + var dd = dojox.dtl; + + context = new dd.Context(); + tpl = new dd.Template('{{ 4|divisibleby:"2" }}'); + t.is("true", tpl.render(context)); + context = new dd.Context({ number: 4 }); + tpl = new dd.Template('{{ number|divisibleby:3 }}'); + t.is("false", tpl.render(context)); + }, + function test_filter_escape(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ unescaped: "Try & cover the \"major\" 'situations' at once" }); + tpl = new dd.Template('{{ unescaped|escape }}'); + t.is("Try & cover <all> the "major" 'situations' at once", tpl.render(context)); + }, + function test_filter_filesizeformat(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ 1|filesizeformat }}'); + t.is("1 byte", tpl.render()); + tpl = new dd.Template('{{ 512|filesizeformat }}'); + t.is("512 bytes", tpl.render()); + tpl = new dd.Template('{{ 1024|filesizeformat }}'); + t.is("1.0 KB", tpl.render()); + tpl = new dd.Template('{{ 2048|filesizeformat }}'); + t.is("2.0 KB", tpl.render()); + tpl = new dd.Template('{{ 1048576|filesizeformat }}'); + t.is("1.0 MB", tpl.render()); + tpl = new dd.Template('{{ 1073741824|filesizeformat }}'); + t.is("1.0 GB", tpl.render()); + }, + function test_filter_first(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|first }}'); + t.is("lemons", tpl.render(context)); + }, + function test_filter_fix_ampersands(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ "One & Two"|fix_ampersands }}'); + t.is("One & Two", tpl.render()); + }, + function test_filter_floatformat(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ num1: 34.23234, num2: 34.00000 }); + var tpl = new dd.Template('{{ num1|floatformat }}'); + t.is("34.2", tpl.render(context)); + tpl = new dd.Template('{{ num2|floatformat }}'); + t.is("34", tpl.render(context)); + tpl = new dd.Template('{{ num1|floatformat:3 }}'); + t.is("34.232", tpl.render(context)); + tpl = new dd.Template('{{ num2|floatformat:3 }}'); + t.is("34.000", tpl.render(context)); + tpl = new dd.Template('{{ num1|floatformat:-3 }}'); + t.is("34.2", tpl.render(context)); + tpl = new dd.Template('{{ num2|floatformat:-3 }}'); + t.is("34", tpl.render(context)); + }, + function test_filter_get_digit(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ pi: 314159265 }); + var tpl = new dd.Template('{{ pi|get_digit:1 }}'); + t.is("3", tpl.render(context)); + tpl = new dd.Template('{{ pi|get_digit:"2" }}'); + t.is("1", tpl.render(context)); + tpl = new dd.Template('{{ pi|get_digit:0 }}'); + t.is("314159265", tpl.render(context)); + tpl = new dd.Template('{{ "nada"|get_digit:1 }}'); + t.is("0", tpl.render(context)); + }, + function test_filter_iriencode(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ "http://homepage.com/~user"|urlencode|iriencode }}'); + t.is("http%3A//homepage.com/%7Euser", tpl.render()); + tpl = new dd.Template('{{ "pottedmeat@dojotoolkit.org"|iriencode }}'); + t.is("pottedmeat%40dojotoolkit.org", tpl.render()); + }, + function test_filter_join(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ items: ["foo", "bar", "baz" ]}); + var tpl = new dd.Template("{{ items|join }}"); + t.is("foo,bar,baz", tpl.render(context)); + + tpl = new dd.Template('{{ items|join:"mustard" }}'); + t.is("foomustardbarmustardbaz", tpl.render(context)); + }, + function test_filter_length(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|length }}'); + t.is("3", tpl.render(context)); + tpl = new dd.Template('{{ fruit|first|length }}'); + t.is("6", tpl.render(context)); + }, + function test_filter_length_is(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|length_is:"3" }}'); + t.is("true", tpl.render(context)); + tpl = new dd.Template('{{ fruit|length_is:"4" }}'); + t.is("false", tpl.render(context)); + }, + function test_filter_linebreaks(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ unbroken: "This is just\r\n\n\ra bunch\nof text\n\n\nand such" }); + tpl = new dd.Template('{{ unbroken|linebreaks }}'); + t.is("

            This is just

            \n\n

            a bunch
            of text

            \n\n

            and such

            ", tpl.render(context)); + }, + function test_filter_linebreaksbr(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ unbroken: "This is just\r\n\n\ra bunch\nof text\n\n\nand such" }); + tpl = new dd.Template('{{ unbroken|linebreaksbr }}'); + t.is("This is just

            a bunch
            of text


            and such", tpl.render(context)); + }, + function test_filter_linenumbers(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ lines: "One\nTwo\nThree\nFour\n" }); + var tpl = new dd.Template('{{ lines|linenumbers }}'); + t.is("1. One\n2. Two\n3. Three\n4. Four\n5. ", tpl.render(context)); + }, + function test_filter_ljust(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + var tpl = new dd.Template('{{ narrow|ljust }}'); + context.narrow = "even"; + t.is("even", tpl.render(context)); + context.narrow = "odd"; + t.is("odd", tpl.render(context)); + tpl = new dd.Template('{{ narrow|ljust:"5" }}'); + context.narrow = "even"; + t.is("even ", tpl.render(context)); + context.narrow = "odd"; + t.is("odd ", tpl.render(context)); + tpl = new dd.Template('{{ narrow|ljust:"6" }}'); + context.narrow = "even"; + t.is("even ", tpl.render(context)); + context.narrow = "odd"; + t.is("odd ", tpl.render(context)); + tpl = new dd.Template('{{ narrow|ljust:"12" }}'); + context.narrow = "even"; + t.is("even ", tpl.render(context)); + context.narrow = "odd"; + t.is("odd ", tpl.render(context)); + }, + function test_filter_lower(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ mixed: "MiXeD" }); + var tpl = new dd.Template('{{ mixed|lower }}'); + t.is("mixed", tpl.render(context)); + }, + function test_filter_make_list(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ word: "foo", number: 314159265, arr: ["first", "second"], obj: {first: "first", second: "second"} }); + var tpl = new dd.Template('{{ word|make_list|join:"|" }} {{ number|make_list|join:"|" }} {{ arr|make_list|join:"|" }} {{ obj|make_list|join:"|" }}'); + t.is("f|o|o 3|1|4|1|5|9|2|6|5 first|second first|second", tpl.render(context)); + }, + function test_filter_phone2numeric(t){ + var dd = dojox.dtl; + + tpl = new dd.Template('{{ "1-800-pottedmeat"|phone2numeric }}'); + t.is("1-800-7688336328", tpl.render()); + }, + function test_filter_pluralize(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ animals: ["bear", "cougar", "aardvark"] }); + var tpl = new dd.Template('{{ animals|length }} animal{{ animals|length|pluralize }}'); + t.is("3 animals", tpl.render(context)); + context.animals = ["bear"]; + t.is("1 animal", tpl.render(context)); + context = new dd.Context({ fairies: ["tinkerbell", "Andy Dick" ]}); + tpl = new dd.Template('{{ fairies|length }} fair{{ fairies|length|pluralize:"y,ies" }}'); + t.is("2 fairies", tpl.render(context)); + context.fairies.pop(); + t.is("1 fairy", tpl.render(context)); + }, + function test_filter_pprint(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ animals: ["bear", "cougar", "aardvark"] }); + tpl = new dd.Template("{{ animals|pprint }}"); + t.is('["bear","cougar","aardvark"]', tpl.render(context)); + }, + function test_filter_random(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|random }}'); + result = tpl.render(context); + t.t(result == "lemons" || result == "apples" || result == "grapes"); + var different = false; + for(var i = 0; i < 10; i++){ + // Check to see if it changes + if(result != tpl.render(context) && result == "lemons" || result == "apples" || result == "grapes"){ + different = true; + break; + } + } + t.t(different); + }, + function test_filter_removetags(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ tagged: "I'm gonna do something with the filter" }); + tpl = new dd.Template('{{ tagged|removetags:"script " }}'); + t.is("I'm gonna do something evil with the filter", tpl.render(context)); + }, + function test_filter_rjust(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + var tpl = new dd.Template('{{ narrow|rjust }}'); + context.narrow = "even"; + t.is("even", tpl.render(context)); + context.narrow = "odd"; + t.is("odd", tpl.render(context)); + tpl = new dd.Template('{{ narrow|rjust:"5" }}'); + context.narrow = "even"; + t.is(" even", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd", tpl.render(context)); + tpl = new dd.Template('{{ narrow|rjust:"6" }}'); + context.narrow = "even"; + t.is(" even", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd", tpl.render(context)); + tpl = new dd.Template('{{ narrow|rjust:"12" }}'); + context.narrow = "even"; + t.is(" even", tpl.render(context)); + context.narrow = "odd"; + t.is(" odd", tpl.render(context)); + }, + function test_filter_slice(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + fruit: [ + { name: "lemons", toString: function(){ return this.name; } }, + { name: "apples", toString: function(){ return this.name; } }, + { name: "grapes", toString: function(){ return this.name; } } + ] + }); + tpl = new dd.Template('{{ fruit|slice:":1"|join:"|" }}'); + t.is("lemons", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:"1"|join:"|" }}'); + t.is("apples|grapes", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:"1:3"|join:"|" }}'); + t.is("apples|grapes", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:""|join:"|" }}'); + t.is("lemons|apples|grapes", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:"-1"|join:"|" }}'); + t.is("grapes", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:":-1"|join:"|" }}'); + t.is("lemons|apples", tpl.render(context)); + tpl = new dd.Template('{{ fruit|slice:"-2:-1"|join:"|" }}'); + t.is("apples", tpl.render(context)); + }, + function test_filter_slugify(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ unslugged: "Apples and oranges()"}); + tpl = new dd.Template('{{ unslugged|slugify }}'); + t.is("apples-and-oranges", tpl.render(context)); + }, + function test_filter_stringformat(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ 42|stringformat:"7.3f" }}'); + t.is(" 42.000", tpl.render()); + }, + function test_filter_striptags(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ tagged: "I'm gonna do something with the filter" }); + tpl = new dd.Template('{{ tagged|striptags }}'); + t.is("I'm gonna do something evil with the filter", tpl.render(context)); + }, + function test_filter_time(t){ + var dd = dojox.dtl; + var context = new dd.Context({ now: new Date(2007, 0, 1) }); + + tpl = new dd.Template('{{ now|time }}'); + t.is(dojox.dtl.utils.date.format(context.now, "P"), tpl.render(context)); + }, + function test_filter_timesince(t){ + var dd = dojox.dtl; + var context = new dd.Context({ now: new Date(2007, 0, 1), then: new Date(2007, 1, 1) }); + + tpl = new dd.Template('{{ now|timesince:then }}'); + t.is("1 month", tpl.render(context)); + context.then = new Date(2007, 0, 5); + t.is("4 days", tpl.render(context)); + context.then = new Date(2007, 0, 17); + t.is("2 weeks", tpl.render(context)); + context.then = new Date(2008, 1, 1); + t.is("1 year", tpl.render(context)); + }, + function test_filter_timeuntil(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ now: new Date(2007, 0, 1), then: new Date(2007, 1, 1) }); + var tpl = new dd.Template('{{ now|timeuntil:then }}'); + t.is("1 month", tpl.render(context)); + context.then = new Date(2007, 0, 5); + t.is("4 days", tpl.render(context)); + context.then = new Date(2007, 0, 17); + t.is("2 weeks", tpl.render(context)); + context.then = new Date(2008, 1, 1); + t.is("1 year", tpl.render(context)); + }, + function test_filter_title(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ name: "potted meat" }); + var tpl = new dd.Template("{{ name|title }}"); + t.is("Potted Meat", tpl.render(context)); + + context.name = "What's going on?"; + t.is("What's Going On?", tpl.render(context)); + + context.name = "use\nline\nbREAKs\tand tabs"; + t.is("Use\nLine\nBreaks\tAnd Tabs", tpl.render(context)); + }, + function test_filter_truncatewords(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ word: "potted meat writes a lot of tests" }); + var tpl = new dd.Template("{{ word|truncatewords }}"); + t.is(context.word, tpl.render(context)); + + tpl = new dd.Template('{{ word|truncatewords:"1" }}'); + t.is("potted", tpl.render(context)); + + tpl = new dd.Template('{{ word|truncatewords:"2" }}'); + t.is("potted meat", tpl.render(context)); + + tpl = new dd.Template('{{ word|truncatewords:20" }}'); + t.is(context.word, tpl.render(context)); + + context.word = "potted \nmeat \nwrites a lot of tests"; + tpl = new dd.Template('{{ word|truncatewords:"3" }}'); + t.is("potted \nmeat \nwrites", tpl.render(context)); + }, + function test_filter_truncatewords_html(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + body: "Test a string that ends inside a tag with different args", + size: 2 + }) + var tpl = new dd.Template('{{ body|truncatewords_html:size }}'); + t.is("Test a ...", tpl.render(context)); + context.size = 4; + t.is("Test a string that ...", tpl.render(context)); + context.size = 6; + t.is("Test a string that ends inside ...", tpl.render(context)); + }, + function test_filter_unordered_list(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ states: ["States", [["Kansas", [["Lawrence", []], ["Topeka", []]]], ["Illinois", []]]] }); + tpl = new dd.Template('{{ states|unordered_list }}'); + t.is("\t
          • States\n\t
              \n\t\t
            • Kansas\n\t\t
                \n\t\t\t
              • Lawrence
              • \n\t\t\t
              • Topeka
              • \n\t\t
              \n\t\t
            • \n\t\t
            • Illinois
            • \n\t
            \n\t
          • ", tpl.render(context)); + }, + function test_filter_upper(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ mixed: "MiXeD" }); + var tpl = new dd.Template('{{ mixed|upper }}'); + t.is("MIXED", tpl.render(context)); + }, + function test_filter_urlencode(t){ + var dd = dojox.dtl; + + var tpl = new dd.Template('{{ "http://homepage.com/~user"|urlencode }}'); + t.is("http%3A//homepage.com/%7Euser", tpl.render()); + }, + function test_filter_urlize(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + body: "My favorite websites are www.televisionwithoutpity.com, http://daringfireball.net and you can email me at pottedmeat@sitepen.com" + }); + var tpl = new dd.Template("{{ body|urlize }}"); + t.is('My favorite websites are www.televisionwithoutpity.com http://daringfireball.net and you can email me at pottedmeat@sitepen.com', tpl.render(context)); + }, + function test_filter_urlizetrunc(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + body: "My favorite websites are www.televisionwithoutpity.com, http://daringfireball.net and you can email me at pottedmeat@sitepen.com" + }); + var tpl = new dd.Template("{{ body|urlizetrunc }}"); + t.is('My favorite websites are www.televisionwithoutpity.com http://daringfireball.net and you can email me at pottedmeat@sitepen.com', tpl.render(context)); + tpl = new dd.Template('{{ body|urlizetrunc:"2" }}'); + t.is('My favorite websites are www.televisionwithoutpity.com http://daringfireball.net and you can email me at pottedmeat@sitepen.com', tpl.render(context)); + tpl = new dd.Template('{{ body|urlizetrunc:"10" }}'); + t.is('My favorite websites are www.tel... http://... and you can email me at pottedmeat@sitepen.com', tpl.render(context)); + }, + function test_filter_wordcount(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + food: "Hot Pocket" + }); + var tpl = new dd.Template("{{ food|wordcount }}"); + t.is("2", tpl.render(context)); + context.food = ""; + t.is("0", tpl.render(context)); + context.food = "A nice barbecue, maybe a little grilled veggies, some cole slaw."; + t.is("11", tpl.render(context)); + }, + function test_filter_wordwrap(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + body: "shrimp gumbo, shrimp pie, shrimp scampi, shrimp stew, fried shrimp, baked shrimp, shrimp o grotten, grilled shrimp, shrimp on a stick, shrimp salad, shrimp pop overs, shrimp cake, shrimp legs, shrimp stuffed eggs, shrimp cre oll, shrimp soup, creamed shrimp on toast, shrimp crapes, shrimply good crescent rolls, shrimp pizza, scalloped shrimp, boiled shrimp, shrimp cocktail" + }); + var tpl = new dd.Template("{{ body|wordwrap }}"); + t.is(context.body, tpl.render(context)); + tpl = new dd.Template("{{ body|wordwrap:width }}"); + context.width = 10; + t.is("shrimp\ngumbo,\nshrimp\npie,\nshrimp\nscampi,\nshrimp\nstew,\nfried\nshrimp,\nbaked\nshrimp,\nshrimp o\ngrotten,\ngrilled\nshrimp,\nshrimp on\na stick,\nshrimp\nsalad,\nshrimp pop\novers,\nshrimp\ncake,\nshrimp\nlegs,\nshrimp\nstuffed\neggs,\nshrimp cre\noll,\nshrimp\nsoup,\ncreamed\nshrimp on\ntoast,\nshrimp\ncrapes,\nshrimply\ngood\ncrescent\nrolls,\nshrimp\npizza,\nscalloped\nshrimp,\nboiled\nshrimp,\nshrimp\ncocktail", tpl.render(context)); + tpl = new dd.Template('{{ body|wordwrap:"80" }}'); + t.is("shrimp gumbo, shrimp pie, shrimp scampi, shrimp stew, fried shrimp, baked\nshrimp, shrimp o grotten, grilled shrimp, shrimp on a stick, shrimp salad,\nshrimp pop overs, shrimp cake, shrimp legs, shrimp stuffed eggs, shrimp cre oll,\nshrimp soup, creamed shrimp on toast, shrimp crapes, shrimply good crescent\nrolls, shrimp pizza, scalloped shrimp, boiled shrimp, shrimp cocktail", tpl.render(context)); + }, + function test_filter_yesno(t){ + var dd = dojox.dtl; + + var context = new dd.Context(); + tpl = new dd.Template('{{ true|yesno }}'); + t.is("yes", tpl.render(context)); + context = new dd.Context({ test: "value" }); + tpl = new dd.Template('{{ test|yesno }}'); + t.is("yes", tpl.render(context)); + tpl = new dd.Template('{{ false|yesno }}'); + t.is("no", tpl.render(context)); + tpl = new dd.Template('{{ null|yesno }}'); + t.is("maybe", tpl.render(context)); + tpl = new dd.Template('{{ true|yesno:"bling,whack,soso" }}'); + t.is("bling", tpl.render(context)); + context = new dd.Context({ test: "value" }); + tpl = new dd.Template('{{ test|yesno:"bling,whack,soso" }}'); + t.is("bling", tpl.render(context)); + tpl = new dd.Template('{{ false|yesno:"bling,whack,soso" }}'); + t.is("whack", tpl.render(context)); + tpl = new dd.Template('{{ null|yesno:"bling,whack,soso" }}'); + t.is("soso", tpl.render(context)); + tpl = new dd.Template('{{ null|yesno:"bling,whack" }}'); + t.is("whack", tpl.render(context)); + }, + function test_filter_contrib_key(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + headers: ["action", "type"], + items: [ + { + action: "eat", + type: "apple", + }, + { + action: "mash", + type: "banana" + } + ] + }); + + var tpl = new dd.Template("{% load dojox.dtl.contrib.objects %}
              {% for item in items %}
              • {% for header in headers %}
              • {{ header }}: {{ item|key:header }}
              • {% endfor %}
            • {% endfor %}
            "); + t.is('
              • action: eat
              • type: apple
              • action: mash
              • type: banana
            ', tpl.render(context)); + } + ] +); + +} diff --git a/includes/js/dojox/dtl/tests/text/load.js b/includes/js/dojox/dtl/tests/text/load.js new file mode 100644 index 0000000..b4c7472 --- /dev/null +++ b/includes/js/dojox/dtl/tests/text/load.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.dtl.tests.text.load"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.text.load"] = true; +dojo.provide("dojox.dtl.tests.text.load"); +// Test for the {% load %} tag + +} diff --git a/includes/js/dojox/dtl/tests/text/tag.js b/includes/js/dojox/dtl/tests/text/tag.js new file mode 100644 index 0000000..7abbc43 --- /dev/null +++ b/includes/js/dojox/dtl/tests/text/tag.js @@ -0,0 +1,480 @@ +if(!dojo._hasResource["dojox.dtl.tests.text.tag"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.text.tag"] = true; +dojo.provide("dojox.dtl.tests.text.tag"); + +dojo.require("dojox.dtl"); +dojo.require("dojox.dtl.Context"); + +doh.register("dojox.dtl.text.tag", + [ + function test_tag_block_and_extends(t){ + var dd = dojox.dtl; + + // Simple (messy) string-based extension + var template = new dd.Template('{% extends "../../dojox/dtl/tests/templates/pocket.html" %}{% block pocket %}Simple{% endblock %}'); + t.is("Simple Pocket", template.render()); + + // Variable replacement + var context = new dd.Context({ + parent: "../../dojox/dtl/tests/templates/pocket.html" + }) + template = new dd.Template('{% extends parent %}{% block pocket %}Variabled{% endblock %}'); + t.is("Variabled Pocket", template.render(context)); + + // Nicer dojo.moduleUrl and variable based extension + context.parent = dojo.moduleUrl("dojox.dtl.tests.templates", "pocket.html"); + template = new dd.Template('{% extends parent %}{% block pocket %}Slightly More Advanced{% endblock %}'); + t.is("Slightly More Advanced Pocket", template.render(context)); + + // dojo.moduleUrl with support for more variables. + // This is important for HTML templates where the "shared" flag will be important. + context.parent = { + url: dojo.moduleUrl("dojox.dtl.tests.templates", "pocket.html") + } + template = new dd.Template('{% extends parent %}{% block pocket %}Super{% endblock %}'); + t.is("Super Pocket", template.render(context)); + }, + function test_tag_block(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + parent: dojo.moduleUrl("dojox.dtl.tests.templates", "pocket2.html"), + items: ["apple", "banana", "lemon" ] + }); + + var template = new dd.Template("{% extends parent %}{% block pocket %}My {{ item }}{% endblock %}"); + t.is("(My apple) (My banana) (My lemon) Pocket", template.render(context)); + }, + function test_tag_comment(t){ + var dd = dojox.dtl; + + var template = new dd.Template('Hot{% comment %}Make me disappear{% endcomment %} Pocket'); + t.is("Hot Pocket", template.render()); + + var found = false; + try{ + template = new dd.Template('Hot{% comment %}Make me disappear Pocket'); + }catch(e){ + t.is("Unclosed tag found when looking for endcomment", e.message); + found = true; + } + t.t(found); + }, + function test_tag_cycle(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"], + unplugged: "Torrey" + }); + var template = new dd.Template("{% for item in items %}{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + + // Test repeating the loop + context.items.push("guava", "mango", "pineapple"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket. ", template.render(context)); + + // Repeat the above tests for the old style + // ======================================== + context.items = context.items.slice(0, 3); + template = new dd.Template("{% for item in items %}{% cycle Hot,Diarrhea,Torrey,Extra %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + + // Test repeating the loop + context.items.push("guava", "mango", "pineapple"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket. ", template.render(context)); + + // Now test outside of the for loop + // ================================ + context = new dojox.dtl.Context({ unplugged: "Torrey" }); + template = new dd.Template("{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' as steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket."); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket.", template.render(context)); + + template = new dd.Template("{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' as steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket."); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket.", template.render(context)); +//t.t(false) + // Test for nested objects + context.items = { + list: ["apple", "banana", "lemon"] + }; + template = new dd.Template("{% for item in items.list %}{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + }, + function test_tag_debug(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"], + unplugged: "Torrey" + }); + var template = new dd.Template("{% debug %}"); + t.is('items: ["apple","banana","lemon"]\n\nunplugged: "Torrey"\n\n', template.render(context)); + }, + function test_tag_filter(t){ + var dd = dojox.dtl; + + var template = new dd.Template('{% filter lower|center:"15" %}Hot Pocket{% endfilter %}'); + t.is(" hot pocket ", template.render()); + }, + function test_tag_firstof(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + found: "unicorn" + }); + + var template = new dd.Template("{% firstof one two three four found %}"); + t.is("unicorn", template.render(context)); + + context.four = null; + t.is("null", template.render(context)); + + context.three = false; + t.is("false", template.render(context)); + }, + function test_tag_for(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"] + }); + var template = new dd.Template("{% for item in items %}
          • {{ item }}
          • {% endfor %}"); + t.is("
          • apple
          • banana
          • lemon
          • ", template.render(context)); + + template = new dd.Template("{% for item in items reversed %}
          • {{ item }}
          • {% endfor %}"); + t.is("
          • lemon
          • banana
          • apple
          • ", template.render(context)); + + context.items = { + apple: "Red Delicious", + banana: "Cavendish", + lemon: "Citrus" + }; + template = new dd.Template("{% for key, value in items.items %}
          • {{ value }} {{ key|title }}
          • {% endfor %}"); + t.is("
          • Red Delicious Apple
          • Cavendish Banana
          • Citrus Lemon
          • ", template.render(context)); + + // The same thing above, but using "zipped" sets + context.items = [ + ["apple", "Red Delicious", 1.99], + ["banana", "Cavendish", 0.49], + ["lemon", "Citrus", 0.29] + ]; + template = new dd.Template("{% for fruit, type, price in items %}
          • {{ type }} {{ fruit|title }} costs ${{ price}}
          • {% endfor %}"); + t.is("
          • Red Delicious Apple costs $1.99
          • Cavendish Banana costs $0.49
          • Citrus Lemon costs $0.29
          • ", template.render(context)); + + template = new dd.Template("{% for fruit, type, price in items reversed %}
          • {{ type }} {{ fruit|title }} costs ${{ price}}
          • {% endfor %}"); + t.is("
          • Citrus Lemon costs $0.29
          • Cavendish Banana costs $0.49
          • Red Delicious Apple costs $1.99
          • ", template.render(context)); + + // Now to create some errors + var found = false; + try { + template = new dd.Template("{% for item initems %}
          • {{ item }}
          • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' statements should have at least four words: for item initems", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% for item ni items %}
          • {{ item }}
          • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' tag received an invalid argument: for item ni items", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% for my item in items %}
          • {{ item }}
          • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' tag received an invalid argument: for my item in items", e.message); + } + t.t(found); + }, + function test_tag_if(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + jokes: { + hot_pockets: true, + unicycles: true, + bacon: true + } + }); + var template = new dd.Template("Comedian is {% if jokes.hot_pockets and jokes.unicycles and jokes.bacon %}funny{% else %}not funny{% endif %}"); + t.is("Comedian is funny", template.render(context)); + + context.jokes.unicycles = false; + t.is("Comedian is not funny", template.render(context)); + + context.comedians = { + hedberg: true, + gaffigan: true, + cook: true + }; + template = new dd.Template("Show will be {% if comedians.hedberg or comedians.gaffigan %}worth seeing{% else %}not worth seeing{% endif %}"); + t.is("Show will be worth seeing", template.render(context)); + + // NOTE: "and" is implied by nesting. eg {% if sunny %}{% if windy %}It's Sunny and Windy{% endif %}{% endif %} + // Not mixing ands and ors allows for MUCH faster rendering + template = new dd.Template("Show will {% if comedians.hedberg or comedians.gaffigan %}{% if comedians.cook %}not {% endif %}be worth seeing{% else %}not be worth seeing{% endif %}"); + t.is("Show will not be worth seeing", template.render(context)); + + context.comedians.cook = false; + t.is("Show will be worth seeing", template.render(context)); + + template = new dd.Template("Show will be {% if comedians.hedberg and comedians.gaffigan and not comedians.cook %}AWESOME{% else %}almost awesome{% endif %}"); + t.is("Show will be AWESOME", template.render(context)); + + context.comedians.cook = true; + t.is("Show will be almost awesome", template.render(context)); + + // Now we test for errors. + var found = false; + try { + template = new dd.Template("Show will be {% if comedians.hedberg or comedians.gaffigan and not comedians.cook %}worth seeing{% else %}not worth seeing{% endif %}"); + }catch(e){ + found = true; + t.is("'if' tags can't mix 'and' and 'or'", e.message); + } + t.t(found); + }, + function test_tag_ifchanged(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + year: 2008, + days: [ + new Date(2008, 0, 12), + new Date(2008, 0, 28), + new Date(2008, 1, 1), + new Date(2008, 1, 1), + new Date(2008, 1, 1) + ] + }); + + var template = new dd.Template("

            Archive for {{ year }}

            "+ +"{% for date in days %}"+ +'{% ifchanged %}

            {{ date|date:"F" }}

            {% endifchanged %}'+ +'{{ date|date:\'j\' }}'+ +"{% endfor %}"); + t.is('

            Archive for 2008

            '+ +'

            January

            '+ +'12'+ +'28'+ +'

            February

            '+ +'1'+ +'1'+ +'1', template.render(context)); + + template = new dd.Template('{% for date in days %}'+ +'{% ifchanged date.date %} {{ date.date }} {% endifchanged %}'+ +'{% ifchanged date.hour date.date %}'+ +'{{ date.hour }}'+ +'{% endifchanged %}'+ +'{% endfor %}'); + t.is(' 2008-01-12 0 2008-01-28 0 2008-02-01 0', template.render(context)); + }, + function test_tag_ifequal(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + user: { + id: 314 + }, + comment: { + user_id: 314 + } + }); + + var template = new dd.Template("{% ifequal user.id comment.user_id %}You posted this{% endifequal %}"); + t.is("You posted this", template.render(context)); + + context.user.id = 313; + t.is("", template.render(context)); + + // Errors + var found = false; + try { + template = new dd.Template("{% ifequal user.id %}You posted this{% endifequal %}"); + }catch(e){ + found = true; + t.is("ifequal takes two arguments", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% ifequal user.id comment.user_id %}You posted this{% endif %}"); + }catch(e){ + found = true; + t.is("No tag found for endif", e.message); + } + t.t(found); + }, + function test_tag_ifnotequal(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + favorite: "hedberg", + comedian: "cook" + }); + + var template = new dd.Template("{% ifnotequal favorite comedian %}Not your favorite{% else %}Your favorite{% endifnotequal %}"); + t.is("Not your favorite", template.render(context)); + + context.comedian = "hedberg"; + t.is("Your favorite", template.render(context)); + }, + function test_tag_include(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.Template("{% include hello %}"); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% include "../../dojox/dtl/tests/templates/hello.html" %}'); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% for person in people %}{% include hello %} {% endfor %}'); + t.is("Hello, Charles Hello, Ralph Hello, Julia ", template.render(context)); + }, + function test_tag_load(t){ + t.f(dojox.dtl.tests.text.load); + new dojox.dtl.Template("{% load dojox.dtl.tests.text.load %}"); + t.t(dojox.dtl.tests.text.load); + }, + function test_tag_now(t){ + var dd = dojox.dtl; + + var template = new dd.Template('It is {% now "jS F Y H:i" %}'); + t.t(template.render().match(/^It is \d{1,2}[a-z]{2} [A-Z][a-z]+ [0-9]{4,} \d{2}:\d{2}$/)); + + template = new dd.Template('It is the {% now "jS \\o\\f F" %}'); + t.t(template.render().match(/^It is the \d{1,2}[a-z]{2} of [A-Z][a-z]+$/)); + + template = new dd.Template("It is the {% now 'jS \\o\\f F' %}"); + t.t(template.render().match(/^It is the \d{1,2}[a-z]{2} of [A-Z][a-z]+$/)); + + var found = false; + try{ + template = new dd.Template("It is the {% now 'jS \\o\\f F %}"); + }catch(e){ + found = true; + t.is("'now' statement takes one argument", e.message); + } + t.t(found); + + found = false; + try{ + template = new dd.Template('It is the {% now "jS \\o\\f F %}'); + }catch(e){ + found = true; + t.is("'now' statement takes one argument", e.message); + } + t.t(found); + }, + function test_tag_regroup(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + people: [ + { firstName: "Bill", lastName: "Clinton", gender: "Male" }, + { firstName: "Margaret", lastName: "Thatcher", gender: "Female" }, + { firstName: "Path", lastName: "Smith", gender: "Unkown" }, + { firstName: "Condoleezza", lastName: "Rice", gender: "Female" }, + { firstName: "George", lastName: "Bush", gender: "Male" } + ] + }); + + var template = new dd.Template("{% regroup people|dictsort:'gender' by gender as grouped %}
              {% for group in grouped %}
            • {{ group.grouper }}
                {% for item in group.list %}
              • {{ item.firstName }} {{ item.lastName }}
              • {% endfor %}
            • {% endfor %}
            "); + t.t(template.render(context).match(new RegExp("^
            • Female
              • (Condoleezza Rice|Margaret Thatcher)
              • (Condoleezza Rice|Margaret Thatcher)
            • Male
              • (Bill Clinton|George Bush)
              • (Bill Clinton|George Bush)
            • Unkown
              • Path Smith
            $"))); + }, + function test_tag_spaceless(t){ + var dd = dojox.dtl; + + var template = new dd.Template("{% spaceless %}
              \n
            • Hot
            • \n\n
            • Pocket
            • \n
            {% endspaceless %}"); + t.is("
            • Hot
            • Pocket
            ", template.render()); + }, + function test_tag_ssi(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.Template("{% ssi hello parsed %}"); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template("{% ssi hello %}"); + t.is("Hello, {{ person }}", template.render(context)); + + template = new dd.Template('{% ssi "../../dojox/dtl/tests/templates/hello.html" parsed %}'); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% for person in people %}{% ssi hello parsed %} {% endfor %}'); + t.is("Hello, Charles Hello, Ralph Hello, Julia ", template.render(context)); + }, + function test_tag_templatetag(t){ + var dd = dojox.dtl; + + var template = new dd.Template("{% templatetag openblock %}"); + t.is("{%", template.render()); + template = new dd.Template("{% templatetag closeblock %}"); + t.is("%}", template.render()); + template = new dd.Template("{% templatetag openvariable %}"); + t.is("{{", template.render()); + template = new dd.Template("{% templatetag closevariable %}"); + t.is("}}", template.render()); + template = new dd.Template("{% templatetag openbrace %}"); + t.is("{", template.render()); + template = new dd.Template("{% templatetag closebrace %}"); + t.is("}", template.render()); + template = new dd.Template("{% templatetag opencomment %}"); + t.is("{#", template.render()); + template = new dd.Template("{% templatetag closecomment %}"); + t.is("#}", template.render()); + }, + function test_tag_widthratio(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + this_value: 175, + max_value: 200 + }); + + var template = new dd.Template(''); + t.is('', template.render(context)); + }, + function test_tag_with(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + person: { + someSqlMethod: function(){ + return 4815162342; + } + } + }); + + var template = new dd.Template('{% with person.someSqlMethod as total %}{{ total }} object{{ total|pluralize }}{% endwith %}') + t.is("4815162342 objects", template.render(context)); + } + ] +); + +} diff --git a/includes/js/dojox/dtl/utils/date.js b/includes/js/dojox/dtl/utils/date.js new file mode 100644 index 0000000..65f8cb5 --- /dev/null +++ b/includes/js/dojox/dtl/utils/date.js @@ -0,0 +1,72 @@ +if(!dojo._hasResource["dojox.dtl.utils.date"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.utils.date"] = true; +dojo.provide("dojox.dtl.utils.date"); + +dojo.require("dojox.date.php"); + +dojox.dtl.utils.date.DateFormat = function(/*String*/ format){ + dojox.date.php.DateFormat.call(this, format); +} +dojo.extend(dojox.dtl.utils.date.DateFormat, dojox.date.php.DateFormat.prototype, { + f: function(){ + // summary: + // Time, in 12-hour hours and minutes, with minutes left off if they're zero. + // description: + // Examples: '1', '1:30', '2:05', '2' + // Proprietary extension. + return (!this.date.getMinutes()) ? this.g() : this.g() + ":" + this.i(); + }, + N: function(){ + // summary: Month abbreviation in Associated Press style. Proprietary extension. + return dojox.dtl.utils.date._months_ap[this.date.getMonth()]; + }, + P: function(){ + // summary: + // Time, in 12-hour hours, minutes and 'a.m.'/'p.m.', with minutes left off + // if they're zero and the strings 'midnight' and 'noon' if appropriate. + // description: + // Examples: '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.' + // Proprietary extension. + if(!this.date.getMinutes() && !this.date.getHours()) return 'midnight'; + if(!this.date.getMinutes() && this.date.getHours() == 12) return 'noon'; + return this.f() + " " + this.a(); + } +}); + +dojo.mixin(dojox.dtl.utils.date, { + format: function(/*Date*/ date, /*String*/ format){ + var df = new dojox.dtl.utils.date.DateFormat(format); + return df.format(date); + }, + timesince: function(d, now){ + // summary: + // Takes two datetime objects and returns the time between then and now + // as a nicely formatted string, e.g "10 minutes" + // description: + // Adapted from http://blog.natbat.co.uk/archive/2003/Jun/14/time_since + if(!(d instanceof Date)){ + d = new Date(d.year, d.month, d.day); + } + if(!now){ + now = new Date(); + } + + var delta = Math.abs(now.getTime() - d.getTime()); + for(var i = 0, chunk; chunk = dojox.dtl.utils.date._chunks[i]; i++){ + var count = Math.floor(delta / chunk[0]); + if(count) break; + } + return count + " " + chunk[1](count); + }, + _chunks: [ + [60 * 60 * 24 * 365 * 1000, function(n){ return (n == 1) ? 'year' : 'years'; }], + [60 * 60 * 24 * 30 * 1000, function(n){ return (n == 1) ? 'month' : 'months'; }], + [60 * 60 * 24 * 7 * 1000, function(n){ return (n == 1) ? 'week' : 'weeks'; }], + [60 * 60 * 24 * 1000, function(n){ return (n == 1) ? 'day' : 'days'; }], + [60 * 60 * 1000, function(n){ return (n == 1) ? 'hour' : 'hours'; }], + [60 * 1000, function(n){ return (n == 1) ? 'minute' : 'minutes'; }] + ], + _months_ap: ["Jan.", "Feb.", "March", "April", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."] +}); + +} diff --git a/includes/js/dojox/encoding/LICENSE b/includes/js/dojox/encoding/LICENSE new file mode 100644 index 0000000..032211b --- /dev/null +++ b/includes/js/dojox/encoding/LICENSE @@ -0,0 +1,9 @@ +License Disclaimer: + +All contents of this directory are Copyright (c) the Dojo Foundation, with the +following exceptions: +------------------------------------------------------------------------------- + +MD5.js, SHA1.js: + * Copyright 1998-2005, Paul Johnstone + Distributed under the terms of the BSD License diff --git a/includes/js/dojox/encoding/README b/includes/js/dojox/encoding/README new file mode 100644 index 0000000..8826008 --- /dev/null +++ b/includes/js/dojox/encoding/README @@ -0,0 +1,35 @@ +------------------------------------------------------------------------------- +DojoX Encoding +------------------------------------------------------------------------------- +Version 0.1.0 +Release date: 7/30/2007 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Eugene Lazutkin + Tom Trenka +------------------------------------------------------------------------------- +Project description + +DojoX Encoding provides a set of routines for common encoding algorithms. +------------------------------------------------------------------------------- +Dependencies: + +Encoding only depends on the Dojo Core. +------------------------------------------------------------------------------- +Documentation + +See the API documentation for details. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/encoding/* + +Install into the following directory structure: +/dojox/encoding/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/encoding/_base.js b/includes/js/dojox/encoding/_base.js new file mode 100644 index 0000000..420ab91 --- /dev/null +++ b/includes/js/dojox/encoding/_base.js @@ -0,0 +1,7 @@ +if(!dojo._hasResource["dojox.encoding._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding._base"] = true; +dojo.provide("dojox.encoding._base"); + + + +} diff --git a/includes/js/dojox/encoding/ascii85.js b/includes/js/dojox/encoding/ascii85.js new file mode 100644 index 0000000..c54bb72 --- /dev/null +++ b/includes/js/dojox/encoding/ascii85.js @@ -0,0 +1,63 @@ +if(!dojo._hasResource["dojox.encoding.ascii85"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.ascii85"] = true; +dojo.provide("dojox.encoding.ascii85"); + +(function(){ + var c = function(input, length, result){ + var i, j, n, b = [0, 0, 0, 0, 0]; + for(i = 0; i < length; i += 4){ + n = ((input[i] * 256 + input[i+1]) * 256 + input[i+2]) * 256 + input[i+3]; + if(!n){ + result.push("z"); + }else{ + for(j = 0; j < 5; b[j++] = n % 85 + 33, n = Math.floor(n / 85)); + } + result.push(String.fromCharCode(b[4], b[3], b[2], b[1], b[0])); + } + }; + + dojox.encoding.ascii85.encode = function(input){ + // summary: encodes input data in ascii85 string + // input: Array: an array of numbers (0-255) to encode + var result = [], reminder = input.length % 4, length = input.length - reminder; + c(input, length, result); + if(reminder){ + var t = input.slice(length); + while(t.length < 4){ t.push(0); } + c(t, 4, result); + var x = result.pop(); + if(x == "z"){ x = "!!!!!"; } + result.push(x.substr(0, reminder + 1)); + } + return result.join(""); // String + }; + + dojox.encoding.ascii85.decode = function(input){ + // summary: decodes the input string back to array of numbers + // input: String: the input string to decode + var n = input.length, r = [], b = [0, 0, 0, 0, 0], i, j, t, x, y, d; + for(i = 0; i < n; ++i){ + if(input.charAt(i) == "z"){ + r.push(0, 0, 0, 0); + continue; + } + for(j = 0; j < 5; ++j){ b[j] = input.charCodeAt(i + j) - 33; } + d = n - i; + if(d < 5){ + for(j = d; j < 4; b[++j] = 0); + b[d] = 85; + } + t = (((b[0] * 85 + b[1]) * 85 + b[2]) * 85 + b[3]) * 85 + b[4]; + x = t & 255; + t >>>= 8; + y = t & 255; + t >>>= 8; + r.push(t >>> 8, t & 255, y, x); + for(j = d; j < 5; ++j, r.pop()); + i += 4; + } + return r; + }; +})(); + +} diff --git a/includes/js/dojox/encoding/base64.js b/includes/js/dojox/encoding/base64.js new file mode 100644 index 0000000..916e119 --- /dev/null +++ b/includes/js/dojox/encoding/base64.js @@ -0,0 +1,66 @@ +if(!dojo._hasResource["dojox.encoding.base64"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.base64"] = true; +dojo.provide("dojox.encoding.base64"); + +(function(){ + var p="="; + var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var dxe=dojox.encoding; + + dxe.base64.encode=function(/* byte[] */ba){ + // summary + // Encode an array of bytes as a base64-encoded string + var s=[], l=ba.length; + var rm=l%3; + var x=l-rm; + for (var i=0; i>>18)&0x3f)); + s.push(tab.charAt((t>>>12)&0x3f)); + s.push(tab.charAt((t>>>6)&0x3f)); + s.push(tab.charAt(t&0x3f)); + } + // deal with trailers, based on patch from Peter Wood. + switch(rm){ + case 2:{ + var t=ba[i++]<<16|ba[i++]<<8; + s.push(tab.charAt((t>>>18)&0x3f)); + s.push(tab.charAt((t>>>12)&0x3f)); + s.push(tab.charAt((t>>>6)&0x3f)); + s.push(p); + break; + } + case 1:{ + var t=ba[i++]<<16; + s.push(tab.charAt((t>>>18)&0x3f)); + s.push(tab.charAt((t>>>12)&0x3f)); + s.push(p); + s.push(p); + break; + } + } + return s.join(""); // string + }; + + dxe.base64.decode=function(/* string */str){ + // summary + // Convert a base64-encoded string to an array of bytes + var s=str.split(""), out=[]; + var l=s.length; + while(s[--l]==p){ } // strip off trailing padding + for (var i=0; i>>16)&0xff); + out.push((t>>>8)&0xff); + out.push(t&0xff); + } + // strip off any null bytes + while(out[out.length-1]==0){ out.pop(); } + return out; // byte[] + }; +})(); + +} diff --git a/includes/js/dojox/encoding/bits.js b/includes/js/dojox/encoding/bits.js new file mode 100644 index 0000000..8beb167 --- /dev/null +++ b/includes/js/dojox/encoding/bits.js @@ -0,0 +1,68 @@ +if(!dojo._hasResource["dojox.encoding.bits"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.bits"] = true; +dojo.provide("dojox.encoding.bits"); + +dojox.encoding.bits.OutputStream = function(){ + this.reset(); +}; + +dojo.extend(dojox.encoding.bits.OutputStream, { + reset: function(){ + this.buffer = []; + this.accumulator = 0; + this.available = 8; + }, + putBits: function(value, width){ + while(width){ + var w = Math.min(width, this.available); + var v = (w <= width ? value >>> (width - w) : value) << (this.available - w); + this.accumulator |= v & (255 >>> (8 - this.available)); + this.available -= w; + if(!this.available){ + this.buffer.push(this.accumulator); + this.accumulator = 0; + this.available = 8; + } + width -= w; + } + }, + getWidth: function(){ + return this.buffer.length * 8 + (8 - this.available); + }, + getBuffer: function(){ + var b = this.buffer; + if(this.available < 8){ b.push(this.accumulator & (255 << this.available)); } + this.reset(); + return b; + } +}); + +dojox.encoding.bits.InputStream = function(buffer, width){ + this.buffer = buffer; + this.width = width; + this.bbyte = this.bit = 0; +}; + +dojo.extend(dojox.encoding.bits.InputStream, { + getBits: function(width){ + var r = 0; + while(width){ + var w = Math.min(width, 8 - this.bit); + var v = this.buffer[this.bbyte] >>> (8 - this.bit - w); + r <<= w; + r |= v & ~(~0 << w); + this.bit += w; + if(this.bit == 8){ + ++this.bbyte; + this.bit = 0; + } + width -= w; + } + return r; + }, + getWidth: function(){ + return this.width - this.bbyte * 8 - this.bit; + } +}); + +} diff --git a/includes/js/dojox/encoding/compression/lzw.js b/includes/js/dojox/encoding/compression/lzw.js new file mode 100644 index 0000000..5e0cca7 --- /dev/null +++ b/includes/js/dojox/encoding/compression/lzw.js @@ -0,0 +1,91 @@ +if(!dojo._hasResource["dojox.encoding.compression.lzw"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.compression.lzw"] = true; +dojo.provide("dojox.encoding.compression.lzw"); +dojo.require("dojox.encoding.bits"); + +(function(){ + var _bits = function(x){ + var w = 1; + for(var v = 2; x >= v; v <<= 1, ++w); + return w; + }; + + dojox.encoding.compression.lzw.Encoder = function(n){ + this.size = n; + this.init(); + }; + + dojo.extend(dojox.encoding.compression.lzw.Encoder, { + init: function(){ + this.dict = {}; + for(var i = 0; i < this.size; ++i){ + this.dict[String.fromCharCode(i)] = i; + } + this.width = _bits(this.code = this.size); + this.p = ""; + }, + encode: function(value, stream){ + var c = String.fromCharCode(value), p = this.p + c, r = 0; + // if already in the dictionary + if(p in this.dict){ + this.p = p; + return r; + } + stream.putBits(this.dict[this.p], this.width); + // if we need to increase the code length + if((this.code & (this.code + 1)) == 0){ + stream.putBits(this.code++, r = this.width++); + } + // add new string + this.dict[p] = this.code++; + this.p = c; + return r + this.width; + }, + flush: function(stream){ + if(this.p.length == 0){ + return 0; + } + stream.putBits(this.dict[this.p], this.width); + this.p = ""; + return this.width; + } + }); + + dojox.encoding.compression.lzw.Decoder = function(n){ + this.size = n; + this.init(); + }; + + dojo.extend(dojox.encoding.compression.lzw.Decoder, { + init: function(){ + this.codes = new Array(this.size); + for(var i = 0; i < this.size; ++i){ + this.codes[i] = String.fromCharCode(i); + } + this.width = _bits(this.size); + this.p = -1; + }, + decode: function(stream){ + var c = stream.getBits(this.width), v; + if(c < this.codes.length){ + v = this.codes[c]; + if(this.p >= 0){ + this.codes.push(this.codes[this.p] + v.substr(0, 1)); + } + }else{ + if((c & (c + 1)) == 0){ + this.codes.push(""); + ++this.width; + return ""; + } + var x = this.codes[this.p]; + v = x + x.substr(0, 1); + this.codes.push(v); + } + this.p = c; + return v; + } + }); +})(); + +} diff --git a/includes/js/dojox/encoding/compression/splay.js b/includes/js/dojox/encoding/compression/splay.js new file mode 100644 index 0000000..5902380 --- /dev/null +++ b/includes/js/dojox/encoding/compression/splay.js @@ -0,0 +1,64 @@ +if(!dojo._hasResource["dojox.encoding.compression.splay"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.compression.splay"] = true; +dojo.provide("dojox.encoding.compression.splay"); +dojo.require("dojox.encoding.bits"); + +dojox.encoding.compression.Splay = function(n){ + this.up = new Array(2 * n + 1); + this.left = new Array(n); + this.right = new Array(n); + this.reset(); +}; + +dojo.extend(dojox.encoding.compression.Splay, { + reset: function(){ + for(var i = 1; i < this.up.length; this.up[i] = Math.floor((i - 1) / 2), ++i); + for(var i = 0; i < this.left.length; this.left[i] = 2 * i + 1, this.right[i] = 2 * i + 2, ++i); + }, + splay: function(i){ + var a = i + this.left.length; + do{ + var c = this.up[a]; + if(c){ // root + // rotated pair + var d = this.up[c]; + // swap descendants + var b = this.left[d]; + if(c == b){ + b = this.right[d]; + this.right[d] = a; + } else { + this.left[d] = a; + } + this[a == this.left[c] ? "left" : "right"][c] = b; + this.up[a] = d; + this.up[b] = c; + a = d; + }else{ + a = c; + } + }while(a); // root + }, + encode: function(value, stream){ + var s = [], a = value + this.left.length; + do{ + s.push(this.right[this.up[a]] == a); + a = this.up[a]; + }while(a); // root + this.splay(value); + var l = s.length; + while(s.length){ stream.putBits(s.pop() ? 1 : 0, 1); } + return l; + }, + decode: function(stream){ + var a = 0; // root; + do{ + a = this[stream.getBits(1) ? "right" : "left"][a]; + }while(a < this.left.length); + a -= this.left.length; + this.splay(a); + return a; + } +}); + +} diff --git a/includes/js/dojox/encoding/crypto/Blowfish.js b/includes/js/dojox/encoding/crypto/Blowfish.js new file mode 100644 index 0000000..94f58ca --- /dev/null +++ b/includes/js/dojox/encoding/crypto/Blowfish.js @@ -0,0 +1,481 @@ +if(!dojo._hasResource["dojox.encoding.crypto.Blowfish"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.crypto.Blowfish"] = true; +dojo.provide("dojox.encoding.crypto.Blowfish"); + +dojo.require("dojox.encoding.base64"); +dojo.require("dojox.encoding.crypto._base"); + +/* Blowfish + * Created based on the C# implementation by Marcus Hahn (http://www.hotpixel.net/) + * Unsigned math based on Paul Johnstone and Peter Wood patches. + * 2005-12-08 + */ +dojox.encoding.crypto.Blowfish = new function(){ + // summary + // Object for doing Blowfish encryption/decryption. + var POW2=Math.pow(2,2); + var POW3=Math.pow(2,3); + var POW4=Math.pow(2,4); + var POW8=Math.pow(2,8); + var POW16=Math.pow(2,16); + var POW24=Math.pow(2,24); + var iv=null; // CBC mode initialization vector + var boxes={ + p:[ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + ], + s0:[ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ], + s1:[ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ], + s2:[ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ], + s3:[ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ] + } +//////////////////////////////////////////////////////////////////////////// +// fixes based on patch submitted by Peter Wood (#5791) + function add(x,y){ + return (((x>>0x10)+(y>>0x10)+(((x&0xffff)+(y&0xffff))>>0x10))<<0x10)|(((x&0xffff)+(y&0xffff))&0xffff); + } + function xor(x,y){ + return (((x>>0x10)^(y>>0x10))<<0x10)|(((x&0xffff)^(y&0xffff))&0xffff); + } + + function $(v, box){ + var d=box.s3[v&0xff]; v>>=8; + var c=box.s2[v&0xff]; v>>=8; + var b=box.s1[v&0xff]; v>>=8; + var a=box.s0[v&0xff]; + + var r = (((a>>0x10)+(b>>0x10)+(((a&0xffff)+(b&0xffff))>>0x10))<<0x10)|(((a&0xffff)+(b&0xffff))&0xffff); + r = (((r>>0x10)^(c>>0x10))<<0x10)|(((r&0xffff)^(c&0xffff))&0xffff); + return (((r>>0x10)+(d>>0x10)+(((r&0xffff)+(d&0xffff))>>0x10))<<0x10)|(((r&0xffff)+(d&0xffff))&0xffff); + } +//////////////////////////////////////////////////////////////////////////// + function eb(o, box){ + // TODO: see if this can't be made more efficient + var l=o.left; + var r=o.right; + l=xor(l,box.p[0]); + r=xor(r,xor($(l,box),box.p[1])); + l=xor(l,xor($(r,box),box.p[2])); + r=xor(r,xor($(l,box),box.p[3])); + l=xor(l,xor($(r,box),box.p[4])); + r=xor(r,xor($(l,box),box.p[5])); + l=xor(l,xor($(r,box),box.p[6])); + r=xor(r,xor($(l,box),box.p[7])); + l=xor(l,xor($(r,box),box.p[8])); + r=xor(r,xor($(l,box),box.p[9])); + l=xor(l,xor($(r,box),box.p[10])); + r=xor(r,xor($(l,box),box.p[11])); + l=xor(l,xor($(r,box),box.p[12])); + r=xor(r,xor($(l,box),box.p[13])); + l=xor(l,xor($(r,box),box.p[14])); + r=xor(r,xor($(l,box),box.p[15])); + l=xor(l,xor($(r,box),box.p[16])); + o.right=l; + o.left=xor(r,box.p[17]); + } + + function db(o, box){ + var l=o.left; + var r=o.right; + l=xor(l,box.p[17]); + r=xor(r,xor($(l,box),box.p[16])); + l=xor(l,xor($(r,box),box.p[15])); + r=xor(r,xor($(l,box),box.p[14])); + l=xor(l,xor($(r,box),box.p[13])); + r=xor(r,xor($(l,box),box.p[12])); + l=xor(l,xor($(r,box),box.p[11])); + r=xor(r,xor($(l,box),box.p[10])); + l=xor(l,xor($(r,box),box.p[9])); + r=xor(r,xor($(l,box),box.p[8])); + l=xor(l,xor($(r,box),box.p[7])); + r=xor(r,xor($(l,box),box.p[6])); + l=xor(l,xor($(r,box),box.p[5])); + r=xor(r,xor($(l,box),box.p[4])); + l=xor(l,xor($(r,box),box.p[3])); + r=xor(r,xor($(l,box),box.p[2])); + l=xor(l,xor($(r,box),box.p[1])); + o.right=l; + o.left=xor(r,box.p[0]); + } + + // Note that we aren't caching contexts here; it might take a little longer + // but we should be more secure this way. + function init(key){ + var k=key; + if(dojo.isString(k)){ + k = dojo.map(k.split(""), function(item){ + return item.charCodeAt(0) & 0xff; + }); + } + + // init the boxes + var pos=0, data=0, res={ left:0, right:0 }, i, j; + var box = { + p: dojo.map(boxes.p.slice(0), function(item){ + var l=k.length, j; + for(j=0; j<4; j++){ data=(data*POW8)|k[pos++ % l]; } + return (((item>>0x10)^(data>>0x10))<<0x10)|(((item&0xffff)^(data&0xffff))&0xffff); + }), + s0:boxes.s0.slice(0), + s1:boxes.s1.slice(0), + s2:boxes.s2.slice(0), + s3:boxes.s3.slice(0) + }; + + // encrypt p and the s boxes + for(i=0, l=box.p.length; i> 3, pos=0, o={}, isCBC=(mode==dojox.encoding.crypto.cipherModes.CBC); + var vector={left:iv.left||null, right:iv.right||null}; + for(var i=0; i>0x10)^(vector.left>>0x10))<<0x10)|(((o.left&0xffff)^(vector.left&0xffff))&0xffff); + o.right=(((o.right>>0x10)^(vector.right>>0x10))<<0x10)|(((o.right&0xffff)^(vector.right&0xffff))&0xffff); + } + + eb(o, bx); // encrypt the block + + if(isCBC){ + vector.left=o.left; + vector.right=o.right; + } + + cipher.push((o.left>>24)&0xff); + cipher.push((o.left>>16)&0xff); + cipher.push((o.left>>8)&0xff); + cipher.push(o.left&0xff); + cipher.push((o.right>>24)&0xff); + cipher.push((o.right>>16)&0xff); + cipher.push((o.right>>8)&0xff); + cipher.push(o.right&0xff); + pos+=8; + } + + switch(out){ + case dojox.encoding.crypto.outputTypes.Hex:{ + return dojo.map(cipher, function(item){ + return item.toString(16); + }).join(""); // string + } + case dojox.encoding.crypto.outputTypes.String:{ + return cipher.join(""); // string + } + case dojox.encoding.crypto.outputTypes.Raw:{ + return cipher; // array + } + default:{ + return dojox.encoding.base64.encode(cipher); // string + } + } + }; + + this.decrypt = function(/* string */ciphertext, /* string */key, /* object? */ao){ + // summary + // decrypts ciphertext using key; allows specification of how ciphertext is encoded via ao. + var ip=dojox.encoding.crypto.outputTypes.Base64; + var mode=dojox.encoding.crypto.cipherModes.EBC; + if (ao){ + if (ao.outputType) ip=ao.outputType; + if (ao.cipherMode) mode=ao.cipherMode; + } + var bx = init(key); + var pt=[]; + + var c=null; + switch(ip){ + case dojox.encoding.crypto.outputTypes.Hex:{ + c = []; + for(var i=0, l=ciphertext.length-1; i> 3, pos=0, o={}, isCBC=(mode==dojox.encoding.crypto.cipherModes.CBC); + var vector={left:iv.left||null, right:iv.right||null}; + for(var i=0; i>0x10)^(vector.left>>0x10))<<0x10)|(((o.left&0xffff)^(vector.left&0xffff))&0xffff); + o.right=(((o.right>>0x10)^(vector.right>>0x10))<<0x10)|(((o.right&0xffff)^(vector.right&0xffff))&0xffff); + vector.left=left; + vector.right=right; + } + + pt.push((o.left>>24)&0xff); + pt.push((o.left>>16)&0xff); + pt.push((o.left>>8)&0xff); + pt.push(o.left&0xff); + pt.push((o.right>>24)&0xff); + pt.push((o.right>>16)&0xff); + pt.push((o.right>>8)&0xff); + pt.push(o.right&0xff); + pos+=8; + } + + // check for padding, and remove. + if(pt[pt.length-1]==pt[pt.length-2]||pt[pt.length-1]==0x01){ + var n=pt[pt.length-1]; + pt.splice(pt.length-n, n); + } + + // convert to string + return dojo.map(pt, function(item){ + return String.fromCharCode(item); + }).join(""); // string + }; + + this.setIV("0000000000000000", dojox.encoding.crypto.outputTypes.Hex); +}(); + +} diff --git a/includes/js/dojox/encoding/crypto/_base.js b/includes/js/dojox/encoding/crypto/_base.js new file mode 100644 index 0000000..174d073 --- /dev/null +++ b/includes/js/dojox/encoding/crypto/_base.js @@ -0,0 +1,19 @@ +if(!dojo._hasResource["dojox.encoding.crypto._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.crypto._base"] = true; +dojo.provide("dojox.encoding.crypto._base"); + +(function(){ + var c=dojox.encoding.crypto; + c.cipherModes={ + // summary + // Enumeration for various cipher modes. + ECB:0, CBC:1, PCBC:2, CFB:3, OFB:4, CTR:5 + }; + c.outputTypes={ + // summary + // Enumeration for input and output encodings. + Base64:0, Hex:1, String:2, Raw:3 + }; +})(); + +} diff --git a/includes/js/dojox/encoding/digests/MD5.js b/includes/js/dojox/encoding/digests/MD5.js new file mode 100644 index 0000000..eb72d59 --- /dev/null +++ b/includes/js/dojox/encoding/digests/MD5.js @@ -0,0 +1,177 @@ +if(!dojo._hasResource["dojox.encoding.digests.MD5"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.digests.MD5"] = true; +dojo.provide("dojox.encoding.digests.MD5"); + +dojo.require("dojox.encoding.digests._base"); + +/* A port of Paul Johnstone's MD5 implementation + * http://pajhome.org.uk/crypt/md5/index.html + * + * Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * + * Dojo port by Tom Trenka + */ +(function(){ + var dxd=dojox.encoding.digests; + var chrsz=8; + + // MD5 rounds functions + function R(n,c){ return (n<>>(32-c)); } + function C(q,a,b,x,s,t){ return dxd.addWords(R(dxd.addWords(dxd.addWords(a, q), dxd.addWords(x, t)), s), b); } + function FF(a,b,c,d,x,s,t){ return C((b&c)|((~b)&d),a,b,x,s,t); } + function GG(a,b,c,d,x,s,t){ return C((b&d)|(c&(~d)),a,b,x,s,t); } + function HH(a,b,c,d,x,s,t){ return C(b^c^d,a,b,x,s,t); } + function II(a,b,c,d,x,s,t){ return C(c^(b|(~d)),a,b,x,s,t); } + + // the core MD5 rounds method + function core(x,len){ + x[len>>5]|=0x80<<((len)%32); + x[(((len+64)>>>9)<<4)+14]=len; + var a= 1732584193; + var b=-271733879; + var c=-1732584194; + var d= 271733878; + for(var i=0; i16){ + wa=core(wa, key.length*chrsz); + } + var l=[], r=[]; + for(var i=0; i<16; i++){ + l[i]=wa[i]^0x36363636; + r[i]=wa[i]^0x5c5c5c5c; + } + var h=core(l.concat(dxd.stringToWord(data)), 512+data.length*chrsz); + return core(r.concat(h), 640); + } + + // public function + dxd.MD5=function(/* string */data, /* dojox.encoding.digests.outputTypes? */outputType){ + // summary + // computes the digest of data, and returns the result according to type outputType + var out=outputType || dxd.outputTypes.Base64; + var wa=core(dxd.stringToWord(data), data.length*chrsz); + switch(out){ + case dxd.outputTypes.Raw:{ + return wa; // word[] + } + case dxd.outputTypes.Hex:{ + return dxd.wordToHex(wa); // string + } + case dxd.outputTypes.String:{ + return dxd.wordToString(wa); // string + } + default:{ + return dxd.wordToBase64(wa); // string + } + } + }; + + // make this private, for later use with a generic HMAC calculator. + dxd.MD5._hmac=function(/* string */data, /* string */key, /* dojox.encoding.digests.outputTypes? */outputType){ + // summary + // computes the digest of data, and returns the result according to type outputType + var out=outputType || dxd.outputTypes.Base64; + var wa=hmac(data, key); + switch(out){ + case dxd.outputTypes.Raw:{ + return wa; // word[] + } + case dxd.outputTypes.Hex:{ + return dxd.wordToHex(wa); // string + } + case dxd.outputTypes.String:{ + return dxd.wordToString(wa); // string + } + default:{ + return dxd.wordToBase64(wa); // string + } + } + }; +})(); + +} diff --git a/includes/js/dojox/encoding/digests/_base.js b/includes/js/dojox/encoding/digests/_base.js new file mode 100644 index 0000000..3ebae22 --- /dev/null +++ b/includes/js/dojox/encoding/digests/_base.js @@ -0,0 +1,78 @@ +if(!dojo._hasResource["dojox.encoding.digests._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.digests._base"] = true; +dojo.provide("dojox.encoding.digests._base"); + +(function(){ + //TODO: see if it makes sense to meld this into one with the + // crypto base enums + var d=dojox.encoding.digests; + d.outputTypes={ + // summary + // Enumeration for input and output encodings. + Base64:0, Hex:1, String:2, Raw:3 + }; + + // word-based addition + d.addWords=function(/* word */a, /* word */b){ + // summary + // add a pair of words together with rollover + var l=(a&0xFFFF)+(b&0xFFFF); + var m=(a>>16)+(b>>16)+(l>>16); + return (m<<16)|(l&0xFFFF); // word + }; + + // word-based conversion method, for efficiency sake; + // most digests operate on words, and this should be faster + // than the encoding version (which works on bytes). + var chrsz=8; + var mask=(1<>5]|=(s.charCodeAt(i/chrsz)&mask)<<(i%32); + } + return wa; // word[] + }; + + d.wordToString=function(/* word[] */wa){ + // summary + // convert an array of words to a string + var s=[]; + for(var i=0, l=wa.length*32; i>5]>>>(i%32))&mask)); + } + return s.join(""); // string + } + + d.wordToHex=function(/* word[] */wa){ + // summary + // convert an array of words to a hex tab + var h="0123456789abcdef", s=[]; + for(var i=0, l=wa.length*4; i>2]>>((i%4)*8+4))&0xF)+h.charAt((wa[i>>2]>>((i%4)*8))&0xF)); + } + return s.join(""); // string + } + d.wordToBase64=function(/* word[] */wa){ + // summary + // convert an array of words to base64 encoding, should be more efficient + // than using dojox.encoding.base64 + var p="=", tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s=[]; + for(var i=0, l=wa.length*4; i>2]>>8*(i%4))&0xFF)<<16)|(((wa[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((wa[i+2>>2]>>8*((i+2)%4))&0xFF); + for(var j=0; j<4; j++){ + if(i*8+j*6>wa.length*32){ + s.push(p); + } else { + s.push(tab.charAt((t>>6*(3-j))&0x3F)); + } + } + } + return s.join(""); // string + }; +})(); + +} diff --git a/includes/js/dojox/encoding/easy64.js b/includes/js/dojox/encoding/easy64.js new file mode 100644 index 0000000..824ff3e --- /dev/null +++ b/includes/js/dojox/encoding/easy64.js @@ -0,0 +1,50 @@ +if(!dojo._hasResource["dojox.encoding.easy64"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.easy64"] = true; +dojo.provide("dojox.encoding.easy64"); + +(function(){ + var c = function(input, length, result){ + for(var i = 0; i < length; i += 3){ + result.push( + String.fromCharCode((input[i] >>> 2) + 33), + String.fromCharCode(((input[i] & 3) << 4) + (input[i + 1] >>> 4) + 33), + String.fromCharCode(((input[i + 1] & 15) << 2) + (input[i + 2] >>> 6) + 33), + String.fromCharCode((input[i + 2] & 63) + 33) + ); + } + }; + + dojox.encoding.easy64.encode = function(input){ + // summary: encodes input data in easy64 string + // input: Array: an array of numbers (0-255) to encode + var result = [], reminder = input.length % 3, length = input.length - reminder; + c(input, length, result); + if(reminder){ + var t = input.slice(length); + while(t.length < 3){ t.push(0); } + c(t, 3, result); + for(var i = 3; i > reminder; result.pop(), --i); + } + return result.join(""); // String + }; + + dojox.encoding.easy64.decode = function(input){ + // summary: decodes the input string back to array of numbers + // input: String: the input string to decode + var n = input.length, r = [], b = [0, 0, 0, 0], i, j, d; + for(i = 0; i < n; i += 4){ + for(j = 0; j < 4; ++j){ b[j] = input.charCodeAt(i + j) - 33; } + d = n - i; + for(j = d; j < 4; b[++j] = 0); + r.push( + (b[0] << 2) + (b[1] >>> 4), + ((b[1] & 15) << 4) + (b[2] >>> 2), + ((b[2] & 3) << 6) + b[3] + ); + for(j = d; j < 4; ++j, r.pop()); + } + return r; + }; +})(); + +} diff --git a/includes/js/dojox/encoding/tests/ascii85.js b/includes/js/dojox/encoding/tests/ascii85.js new file mode 100644 index 0000000..d93329c --- /dev/null +++ b/includes/js/dojox/encoding/tests/ascii85.js @@ -0,0 +1,35 @@ +if(!dojo._hasResource["dojox.encoding.tests.ascii85"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.ascii85"] = true; +dojo.provide("dojox.encoding.tests.ascii85"); +dojo.require("dojox.encoding.ascii85"); + +(function(){ + var msg1 = "The rain in Spain falls mainly on the plain."; + var msg2 = "The rain in Spain falls mainly on the plain.1"; + var msg3 = "The rain in Spain falls mainly on the plain.ab"; + var msg4 = "The rain in Spain falls mainly on the plain.!@#"; + var dca = dojox.encoding.ascii85; + + var s2b = function(s){ + var b = []; + for(var i = 0; i < s.length; ++i){ + b.push(s.charCodeAt(i)); + } + return b; + }; + + var b2s = function(b){ + var s = []; + dojo.forEach(b, function(c){ s.push(String.fromCharCode(c)); }); + return s.join(""); + }; + + tests.register("dojox.encoding.tests.ascii85", [ + function testMsg1(t){ t.assertEqual(msg1, b2s(dca.decode(dca.encode(s2b(msg1))))); }, + function testMsg2(t){ t.assertEqual(msg2, b2s(dca.decode(dca.encode(s2b(msg2))))); }, + function testMsg3(t){ t.assertEqual(msg3, b2s(dca.decode(dca.encode(s2b(msg3))))); }, + function testMsg4(t){ t.assertEqual(msg4, b2s(dca.decode(dca.encode(s2b(msg4))))); } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/bits.js b/includes/js/dojox/encoding/tests/bits.js new file mode 100644 index 0000000..dc7ae66 --- /dev/null +++ b/includes/js/dojox/encoding/tests/bits.js @@ -0,0 +1,74 @@ +if(!dojo._hasResource["dojox.encoding.tests.bits"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.bits"] = true; +dojo.provide("dojox.encoding.tests.bits"); +dojo.require("dojox.encoding.bits"); + +(function(){ + var msg1 = "The rain in Spain falls mainly on the plain."; + var msg2 = "The rain in Spain falls mainly on the plain.1"; + var msg3 = "The rain in Spain falls mainly on the plain.ab"; + var msg4 = "The rain in Spain falls mainly on the plain.!@#"; + var dcb = dojox.encoding.bits; + + var s2b = function(s){ + var b = []; + for(var i = 0; i < s.length; ++i){ + b.push(s.charCodeAt(i)); + } + return b; + }; + + var b2s = function(b){ + var s = []; + dojo.forEach(b, function(c){ s.push(String.fromCharCode(c)); }); + return s.join(""); + }; + + var testOut = function(msg){ + var a = new dojox.encoding.bits.OutputStream(); + for(var i = 0; i < msg.length; ++i){ + var v = msg.charCodeAt(i); + var j = Math.floor(Math.random() * 7) + 1; + a.putBits(v >>> (8 - j), j); + a.putBits(v, 8 - j); + } + return b2s(a.getBuffer()); + }; + + var testIn = function(msg){ + var a = new dojox.encoding.bits.InputStream(s2b(msg), msg.length * 8); + var r = []; + for(var i = 0; i < msg.length; ++i){ + var j = Math.floor(Math.random() * 7) + 1; + r.push((a.getBits(j) << (8 - j)) | a.getBits(8 - j)); + } + return b2s(r); + }; + + var test = function(msg){ + var a = new dojox.encoding.bits.InputStream(s2b(msg), msg.length * 8); + var o = new dojox.encoding.bits.OutputStream(); + while(a.getWidth() > 0){ + var w = Math.min(a.getWidth(), 3); + o.putBits(a.getBits(w), w); + } + return b2s(o.getBuffer()); + }; + + tests.register("dojox.encoding.tests.bits", [ + function testBitsOut1(t){ t.assertEqual(msg1, testOut(msg1)); }, + function testBitsOut2(t){ t.assertEqual(msg2, testOut(msg2)); }, + function testBitsOut3(t){ t.assertEqual(msg3, testOut(msg3)); }, + function testBitsOut4(t){ t.assertEqual(msg4, testOut(msg4)); }, + function testBitsIn1(t){ t.assertEqual(msg1, testIn(msg1)); }, + function testBitsIn2(t){ t.assertEqual(msg2, testIn(msg2)); }, + function testBitsIn3(t){ t.assertEqual(msg3, testIn(msg3)); }, + function testBitsIn4(t){ t.assertEqual(msg4, testIn(msg4)); }, + function testBits1(t){ t.assertEqual(msg1, test(msg1)); }, + function testBits2(t){ t.assertEqual(msg2, test(msg2)); }, + function testBits3(t){ t.assertEqual(msg3, test(msg3)); }, + function testBits4(t){ t.assertEqual(msg4, test(msg4)); } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/compression/_base.js b/includes/js/dojox/encoding/tests/compression/_base.js new file mode 100644 index 0000000..ec9d560 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/_base.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression._base"] = true; +dojo.provide("dojox.encoding.tests.compression._base"); + +try{ + dojo.require("dojox.encoding.tests.compression.splay"); + dojo.require("dojox.encoding.tests.compression.lzw"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/encoding/tests/compression/colors.js b/includes/js/dojox/encoding/tests/compression/colors.js new file mode 100644 index 0000000..caedbb1 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/colors.js @@ -0,0 +1,156 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression.colors"] = true; +dojo.provide("dojox.encoding.tests.compression.colors"); + +// all CSS3 colors +dojox.encoding.tests.compression.colors = { +aliceblue: [240,248,255], +antiquewhite: [250,235,215], +aqua: [0,255,255], +aquamarine: [127,255,212], +azure: [240,255,255], +beige: [245,245,220], +bisque: [255,228,196], +black: [0,0,0], +blanchedalmond: [255,235,205], +blue: [0,0,255], +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], +fuchsia: [255,0,255], +gainsboro: [220,220,220], +ghostwhite: [248,248,255], +gold: [255,215,0], +goldenrod: [218,165,32], +gray: [128,128,128], +green: [0,128,0], +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], +lime: [0,255,0], +limegreen: [50,205,50], +linen: [250,240,230], +magenta: [255,0,255], +maroon: [128,0,0], +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], +navy: [0,0,128], +oldlace: [253,245,230], +olive: [128,128,0], +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], +purple: [128,0,128], +red: [255,0,0], +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], +silver: [192,192,192], +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], +teal: [0,128,128], +thistle: [216,191,216], +tomato: [255,99,71], +turquoise: [64,224,208], +violet: [238,130,238], +wheat: [245,222,179], +white: [255,255,255], +whitesmoke: [245,245,245], +yellow: [255,255,0], +yellowgreen: [154,205,50] +}; + +} diff --git a/includes/js/dojox/encoding/tests/compression/colors2.html b/includes/js/dojox/encoding/tests/compression/colors2.html new file mode 100644 index 0000000..24bb9fe --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/colors2.html @@ -0,0 +1,104 @@ + + + Compress colors + + + + + + +

            Compress colors

            +

            +
            No status yet.
            + + diff --git a/includes/js/dojox/encoding/tests/compression/colors2.js b/includes/js/dojox/encoding/tests/compression/colors2.js new file mode 100644 index 0000000..52f9186 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/colors2.js @@ -0,0 +1,64 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression.colors2"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression.colors2"] = true; +dojo.provide("dojox.encoding.tests.compression.colors2"); + +// all CSS3 colors +dojox.encoding.tests.compression.colors2 = {}; + +(function(){ + var n = "!mi-='%@Md%8;F\"=E5(:$@nHf!(;HYAOL),#XJKa#UHDMYQ0@q6C8='JBa#m1`YRS;3_\\P=@.(bN\\!)0d:Nar*Fo]]G`\\[X7Cb@r#pc;D3!k*8^\"bS8DAYbu'J5[`7Fh5S1e8`@1^N\"n8R:+ZQt]Ab.S>NP-jkO\"N$oQpbVbYtZl1&rSs%_;'!e8\"ij:*R!%9&P.+o0%cF&0F<\"eWn+rm!a<(02!d\\-J\\O@`K![IaPrqh6H4S!U7CU!\"5jICR2\\X?!FilaO:$aE\"G1NIfMJ<.)1d;?OH9VU%LiGhi9=d?$EjW!BM0)1mGfg@\"os1\\E*A>+>YdjUK:P>T'7tj.UQ?<89]$:\\Li]GF*H8o*Z,o]Q_E]tq?C^%'^cfU9B9sH-^t.-R;J6P9!buNg*%$9#>Y'*n;MPc7=>*]sb&NmgKSZcd2nWt6I@SX7agi3!0)M'T3O@@/>W+I:H9?@A7tjT8':(9PG\\m@_T8Ws\\\".VLCkg7IYKZ7M3.XQqX$4V`bEQF?<#jJ>#4Z#6:ZeYffa.W#0CW3@s2*ESkiD6hN#EAhXBm5F%&U_=k*tFq@rYS/!:$=M9epZ<`=HN:X\"!CRI(`>iqTRe(S@A\"&0!Dib&)1p9P)$NZb^e+i_UHHq\\_8AYC+oiIMLj_TW=u'3Nn?c=#_6Z^s/;EY/3Z(cZ\"CaOq6g>>I+;'H>Nh`>\"-3NDnX+!(g67=pRcf38l7XNQ:_FJ,l2V)C@@A;H1dN#\\$n75qg6-:\".KQkn!?a7e\"J7C0p3Pn`]hKrG_4WG*5qo\\tH,20o2QOZljnj_lZ&C6!.u8Qu:_L$8$4.[V@`&A0J,fQL"; + var c = "nG*%[ldl.:s*t'unGiO]p\"]T._uKc;s6Io0!<7p,ih\\+ShRJ>JStLT5!7GR&s*mjUQ0nVHgtWT+!<<'!!/gi8Mn\"KLWMuisA,rU.WP,cVMZAZ8CG5^H!1>UdMZs7$&&[*;i\\9)sSDs7#O?N99:!s7#]/quHcnc)oX\\n:6&Is8VrldaQ[oORA4Ze'n?*_>g0S+L8#&cMDa@RV#^Na!8;DCmc^[I^5QAOBh4WT.i9#OiJH#TL]T8+>C#Ot='Dd6\"oV>kIMc]rOm\\!H0^qda@cKf4Kc#A2pE.F&MqYC3lIn#$sd^4r5J:Q:ef`,GO5iC#WK'r>>= 8; y = t & 255; t >>>= 8; + r.push(t >>> 8, t & 255, y, x); + } + return r; + }; + var B = function(f){ this.f = f; this.y = this.t = 0; }; + B.prototype.g = function(b){ + var r = 0; + while(b){ + var w = Math.min(b, 8 - this.t), v = this.f[this.y] >>> (8 - this.t - w); + r <<= w; r |= v & ~(~0 << w); + if((this.t += w) == 8){ ++this.y; this.t = 0; } + b -= w; + } + return r; + }; + var D = function(n, w){ + this.c = new Array(n); this.w = w; this.p = -1; + for(var i = 0; i < n; ++i){ this.c[i] = [i + 97]; } + }; + D.prototype.d = function(s){ + var c = s.g(this.w), v; + if(c < this.c.length){ + v = this.c[c]; + if(this.p >= 0){ + this.c.push(this.c[this.p].concat(v[0])); + } + }else{ + this.c.push([]); + ++this.w; + return []; + } + this.p = c; + return v; + }; + var i = new B(a(n)), d = new D(27, 5), t = []; + while(t.length < 1455){ + var v = d.d(i); + dojo.forEach(v, function(x){ t.push(x); }); + } + var n2 = dojo.map(t, function(x){ return String.fromCharCode(x); }).join("").split("{"); + i = a(c); + for(var j = 0, k = 0; j < n2.length; ++j){ + dojox.encoding.tests.compression.colors2[n2[j]] = [i[k++], i[k++], i[k++]]; + } + +})(); + +} diff --git a/includes/js/dojox/encoding/tests/compression/colors3.html b/includes/js/dojox/encoding/tests/compression/colors3.html new file mode 100644 index 0000000..482c75d --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/colors3.html @@ -0,0 +1,104 @@ + + + Compress colors + + + + + + +

            Compress colors

            +

            +
            No status yet.
            + + diff --git a/includes/js/dojox/encoding/tests/compression/colors3.js b/includes/js/dojox/encoding/tests/compression/colors3.js new file mode 100644 index 0000000..f0a1587 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/colors3.js @@ -0,0 +1,53 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression.colors3"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression.colors3"] = true; +dojo.provide("dojox.encoding.tests.compression.colors3"); + +// all CSS3 colors +dojox.encoding.tests.compression.colors3 = {}; + +(function(){ + var n = "!N!C@\",5%;!.4)1D7()4E!K!FS-!2).Q:52E`!B\"!;!)*+I!M!#&'E+9%(#!T9Q=.\"TE5F'6%$B91H/)DCQW=^&G#QY>:\"!!?*#D.57Z.]5**+0]/!G!!,X=/%2O'%1U&#W9%%86_BQU3#!N.!DA-%F>X'#9;6\"%+EK)X#A+A;+-+\"G\"T$76:L1;)'+?ENA1%L+C\\O+U+\"Q!+#,E+.E1H-[VA#\"5%O\\X)BS:%V2&2#,3I0NWE%F7?L8U!U\\\\B3C_GZ?P3N]A3\\]$)%TUK$E9EL6ZA`T%IFY$Q?/3;=Q)$QE#AQ\\11$&M!'$$XK!T?2%C7QU\"110A#/#:'U=C!7,\"=*!+BQ)%AG[)W&#CFBG\"A!/1E!5/$AU\"A/$J:*E+LQ77;%M6H/XD,H1'!)#U=&K1\"&R02U'$H5*[%Y+$3;/1'#\"-XQV8C(/GABVQQW+RS5U3QE!V<6[=YS@!0=1!:Z=93M$7W\":3;!Z0!GJM'\"QGAJ*=3(C&5I=0,6AP6H4+=:M:B)CO-D?]<,2^H-`7SEB(B5N5%Z9P!8BM`FK@D!9*!ZQ]]/D1SF[%RG.D+HO(8QI.BK.RS*/C#/GJOTUU/WSTX19$R[$T#'P&L\"]V03\\_Y5_UH!?/!;\"J>YHO%8S_`2]/H`T_'%?B4?AX!.:^X!Z9E0A!!S\"5M\"A:2^?AA2R*9;!.!!&1!!E:AN)7'16,AM\"+\"Y'D0.'*Q=.%!S)!'*S)@5*$7D*9H@#U710\"MUG4,)Z'!F-%15E\"\"J!#+$A0':>#G?1%8G#29I31U:2H\"I:3AK4C&C;ZY\"J[C]HG6!3&*4K!!AP9:IA#T2\"'A%-+9]WWJ*MU3I\"MWY\")$79\"*]QZ@:[ZZ#^43G=Q;!P)E%QN3RZQ4!Y.KP\"J_8\\B/3RD#S6+YB]*&!3M6A+#2Q'9M-&DI!!"; + var c = "]0D`_OP8!0``@``5]0``^@8=`_4%!!!!`_P.!!$`CCPCJ3IKXLC(8Z[A@`]!UGE?`X^1:*8N``D=X\"1]!0``!!#,!)O,O)9,K;GJ!'1!K;GJP<>LCQ#,67MP`YQ!G4,-CQ!![::[D\\S03$W,,U^0,U^0!-\\2F!$4`R34!,``;7FJ;7FJ(J$`MC)C``LQ)IMC`Q$`X.T=_0D``^=!WK5AA)#!!)!!L@]PA)#!]0`Q`WGUT6R=3Q##```Q]/;-ZO<[``$V@0Q!``L.L>DG])#!Y0``_PL3U^04E/[1U^04`\\<\"`[\"[),+KB]\\[>YC:>YC:M-4?```A!0]!-MUS_P$G`Q$`A!!!:MWK!!$.OF84EX$<0,.R?WDO!0K;3.(-RR7&'2FQ^@`[`_4B`_3V`^[N!!#!`@8GA)!!;YYD`[5!`U5!WH$7\\OCKG0O9L_\\OWX#4`_`6`^KZT95``]$,X;$>M/$GA!#!`Q!!P)_017HBCU54_I\"S^+2A,IN8``8OI&)NQ-$!B]\\L;FL.=)#1=)#1``L[!0^`2I+UUL3-!)#!W,`9`W.(1/$1\\I,O^>[T````^@8V``]!GMUS!!!!"; + var B = function(f){ var t = this; t.f = f; t.y = t.t = 0; t.x = f.charCodeAt(0) - 33; }; + B.prototype.g = function(b){ + var r = 0, t = this; + while(b){ + var w = Math.min(b, 6 - t.t), v = t.x >>> (6 - t.t - w); + r <<= w; r |= v & ~(~0 << w); + if((t.t += w) == 6){ t.x = t.f.charCodeAt(++t.y) - 33; t.t = 0; } + b -= w; + } + return r; + }; + var D = function(n, w){ + this.c = new Array(n); this.w = w; this.p = -1; + for(var i = 0; i < n; ++i){ this.c[i] = [i + 97]; } + }; + D.prototype.d = function(s){ + var c = s.g(this.w), t = this, v; + if(c < t.c.length){ + v = t.c[c]; + if(t.p >= 0){ + t.c.push(t.c[t.p].concat(v[0])); + } + }else{ + t.c.push([]); + ++t.w; + return []; + } + t.p = c; + return v; + }; + var i = new B(n), d = new D(27, 5), t = []; + while(t.length < 1455){ + var v = d.d(i); + dojo.forEach(v, function(x){ t.push(x); }); + } + var n2 = dojo.map(t, function(x){ return String.fromCharCode(x); }).join("").split("{"); + i = new B(c); + for(var j = 0; j < n2.length; ++j){ + dojox.encoding.tests.compression.colors3[n2[j]] = [i.g(8), i.g(8), i.g(8)]; + } +})(); + +} diff --git a/includes/js/dojox/encoding/tests/compression/lzw.js b/includes/js/dojox/encoding/tests/compression/lzw.js new file mode 100644 index 0000000..7956a0e --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/lzw.js @@ -0,0 +1,54 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression.lzw"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression.lzw"] = true; +dojo.provide("dojox.encoding.tests.compression.lzw"); +dojo.require("dojox.encoding.compression.lzw"); +dojo.require("dojox.encoding.bits"); + +(function(){ + var msg1 = "The rain in Spain falls mainly on the plain."; + var msg2 = "The rain in Spain falls mainly on the plain.1"; + var msg3 = "The rain in Spain falls mainly on the plain.ab"; + var msg4 = "The rain in Spain falls mainly on the plain.!@#"; + var dc = dojox.encoding.compression, dcb = dojox.encoding.bits, dcl = dc.lzw; + + var s2b = function(s){ + var b = []; + for(var i = 0; i < s.length; ++i){ + b.push(s.charCodeAt(i)); + } + return b; + }; + + var b2s = function(b){ + var s = []; + dojo.forEach(b, function(c){ s.push(String.fromCharCode(c)); }); + return s.join(""); + }; + + var encode = function(msg){ + var x = new dcb.OutputStream(), encoder = new dcl.Encoder(128); + dojo.forEach(s2b(msg), function(v){ encoder.encode(v, x); }); + encoder.flush(x); + console.debug("bits =", x.getWidth()); + return x.getBuffer(); + }; + + var decode = function(n, buf){ + var x = new dcb.InputStream(buf, buf.length * 8), decoder = new dcl.Decoder(128), t = [], w = 0; + while(w < n){ + var v = decoder.decode(x); + t.push(v); + w += v.length; + } + return t.join(""); + }; + + tests.register("dojox.encoding.tests.compression.lzw", [ + function testLzwMsg1(t){ t.assertEqual(msg1, decode(msg1.length, encode(msg1))); }, + function testLzwMsg2(t){ t.assertEqual(msg2, decode(msg2.length, encode(msg2))); }, + function testLzwMsg3(t){ t.assertEqual(msg3, decode(msg3.length, encode(msg3))); }, + function testLzwMsg4(t){ t.assertEqual(msg4, decode(msg4.length, encode(msg4))); } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/compression/runTests.html b/includes/js/dojox/encoding/tests/compression/runTests.html new file mode 100644 index 0000000..4a24eef --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/runTests.html @@ -0,0 +1,9 @@ + + + DojoX Compression Unit Test Runner + + + +

            Redirecting to D.O.H runner.

            + + diff --git a/includes/js/dojox/encoding/tests/compression/splay.js b/includes/js/dojox/encoding/tests/compression/splay.js new file mode 100644 index 0000000..44d157c --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/splay.js @@ -0,0 +1,49 @@ +if(!dojo._hasResource["dojox.encoding.tests.compression.splay"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.compression.splay"] = true; +dojo.provide("dojox.encoding.tests.compression.splay"); +dojo.require("dojox.encoding.compression.splay"); +dojo.require("dojox.encoding.bits"); + +(function(){ + var msg1 = "The rain in Spain falls mainly on the plain."; + var msg2 = "The rain in Spain falls mainly on the plain.1"; + var msg3 = "The rain in Spain falls mainly on the plain.ab"; + var msg4 = "The rain in Spain falls mainly on the plain.!@#"; + var dc = dojox.encoding.compression, dcb = dojox.encoding.bits; + + var s2b = function(s){ + var b = []; + for(var i = 0; i < s.length; ++i){ + b.push(s.charCodeAt(i)); + } + return b; + }; + + var b2s = function(b){ + var s = []; + dojo.forEach(b, function(c){ s.push(String.fromCharCode(c)); }); + return s.join(""); + }; + + var encode = function(msg){ + var x = new dcb.OutputStream(), encoder = new dc.Splay(256); + dojo.forEach(s2b(msg), function(v){ encoder.encode(v, x); }); + console.debug("bits =", x.getWidth()); + return x.getBuffer(); + }; + + var decode = function(n, buf){ + var x = new dcb.InputStream(buf, buf.length * 8), decoder = new dc.Splay(256), t = []; + for(var i = 0; i < n; ++i){ t.push(decoder.decode(x)); } + return b2s(t); + }; + + tests.register("dojox.encoding.tests.compression.splay", [ + function testSplayMsg1(t){ t.assertEqual(msg1, decode(msg1.length, encode(msg1))); }, + function testSplayMsg2(t){ t.assertEqual(msg2, decode(msg2.length, encode(msg2))); }, + function testSplayMsg3(t){ t.assertEqual(msg3, decode(msg3.length, encode(msg3))); }, + function testSplayMsg4(t){ t.assertEqual(msg4, decode(msg4.length, encode(msg4))); } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/compression/test.html b/includes/js/dojox/encoding/tests/compression/test.html new file mode 100644 index 0000000..8f07c59 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/test.html @@ -0,0 +1,61 @@ + + + Test colors + + + + + + + +

            Test colors

            +

            +
            No status yet.
            + + diff --git a/includes/js/dojox/encoding/tests/compression/vq.html b/includes/js/dojox/encoding/tests/compression/vq.html new file mode 100644 index 0000000..7805bd4 --- /dev/null +++ b/includes/js/dojox/encoding/tests/compression/vq.html @@ -0,0 +1,185 @@ + + + Compress colors using VQ + + + + + + +

            Compress colors using VQ

            +

            Select desirable number of clusters:  

            +
            No status yet.
            +
            No results yet.
            + + diff --git a/includes/js/dojox/encoding/tests/crypto/Blowfish.js b/includes/js/dojox/encoding/tests/crypto/Blowfish.js new file mode 100644 index 0000000..3f5ac54 --- /dev/null +++ b/includes/js/dojox/encoding/tests/crypto/Blowfish.js @@ -0,0 +1,35 @@ +if(!dojo._hasResource["dojox.encoding.tests.crypto.Blowfish"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.crypto.Blowfish"] = true; +dojo.provide("dojox.encoding.tests.crypto.Blowfish"); +dojo.require("dojox.encoding.crypto.Blowfish"); + +(function(){ + var message="The rain in Spain falls mainly on the plain."; + var key="foobar"; + var base64Encrypted="WI5J5BPPVBuiTniVcl7KlIyNMmCosmKTU6a/ueyQuoUXyC5dERzwwdzfFsiU4vBw"; + var dxc=dojox.encoding.crypto; + + tests.register("dojox.encoding.crypto.tests.Blowfish", [ + function testEncrypt(t){ + var dt=new Date(); + t.assertEqual(base64Encrypted, dxc.Blowfish.encrypt(message, key)); + doh.debug("testEncrypt: ", new Date()-dt, "ms."); + }, + function testDecrypt(t){ + var dt=new Date(); + t.assertEqual(message, dxc.Blowfish.decrypt(base64Encrypted, key)); + doh.debug("testDecrypt: ", new Date()-dt, "ms."); + }, + function testShortMessage(t){ + var msg="pass"; + var pwd="foobar"; + var dt=new Date(); + var enc=dxc.Blowfish.encrypt(msg, pwd); + var dec=dxc.Blowfish.decrypt(enc, pwd); + t.assertEqual(dec, msg); + doh.debug("testShortMessage: ", new Date()-dt, "ms."); + } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/crypto/_base.js b/includes/js/dojox/encoding/tests/crypto/_base.js new file mode 100644 index 0000000..24dc044 --- /dev/null +++ b/includes/js/dojox/encoding/tests/crypto/_base.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.encoding.tests.crypto._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.crypto._base"] = true; +dojo.provide("dojox.encoding.tests.crypto._base"); +dojo.require("dojox.encoding.crypto.Blowfish"); + +try{ + dojo.require("dojox.encoding.tests.crypto.Blowfish"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/encoding/tests/crypto/runTests.html b/includes/js/dojox/encoding/tests/crypto/runTests.html new file mode 100644 index 0000000..31e54ed --- /dev/null +++ b/includes/js/dojox/encoding/tests/crypto/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox.wire Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/encoding/tests/digests/MD5.js b/includes/js/dojox/encoding/tests/digests/MD5.js new file mode 100644 index 0000000..8bfcfeb --- /dev/null +++ b/includes/js/dojox/encoding/tests/digests/MD5.js @@ -0,0 +1,26 @@ +if(!dojo._hasResource["dojox.encoding.tests.digests.MD5"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.digests.MD5"] = true; +dojo.provide("dojox.encoding.tests.digests.MD5"); +dojo.require("dojox.encoding.digests.MD5"); + +(function(){ + var message="The rain in Spain falls mainly on the plain."; + var base64="OUhxbVZ1Mtmu4zx9LzS5cA=="; + var hex="3948716d567532d9aee33c7d2f34b970"; + var s="9HqmVu2\xD9\xAE\xE3<}/4\xB9p"; + var ded=dojox.encoding.digests; + + tests.register("dojox.encoding.tests.digests.MD5", [ + function testBase64Compute(t){ + t.assertEqual(base64, ded.MD5(message)); + }, + function testHexCompute(t){ + t.assertEqual(hex, ded.MD5(message, ded.outputTypes.Hex)); + }, + function testStringCompute(t){ + t.assertEqual(s, ded.MD5(message, ded.outputTypes.String)); + } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/digests/_base.js b/includes/js/dojox/encoding/tests/digests/_base.js new file mode 100644 index 0000000..a2bc2fd --- /dev/null +++ b/includes/js/dojox/encoding/tests/digests/_base.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.encoding.tests.digests._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.digests._base"] = true; +dojo.provide("dojox.encoding.tests.digests._base"); +dojo.require("dojox.encoding.digests._base"); + +try{ + dojo.require("dojox.encoding.tests.digests.MD5"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/encoding/tests/digests/runTests.html b/includes/js/dojox/encoding/tests/digests/runTests.html new file mode 100644 index 0000000..6c41e6e --- /dev/null +++ b/includes/js/dojox/encoding/tests/digests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox.wire Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/encoding/tests/easy64.js b/includes/js/dojox/encoding/tests/easy64.js new file mode 100644 index 0000000..93876b1 --- /dev/null +++ b/includes/js/dojox/encoding/tests/easy64.js @@ -0,0 +1,35 @@ +if(!dojo._hasResource["dojox.encoding.tests.easy64"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.easy64"] = true; +dojo.provide("dojox.encoding.tests.easy64"); +dojo.require("dojox.encoding.easy64"); + +(function(){ + var msg1 = "The rain in Spain falls mainly on the plain."; + var msg2 = "The rain in Spain falls mainly on the plain.1"; + var msg3 = "The rain in Spain falls mainly on the plain.ab"; + var msg4 = "The rain in Spain falls mainly on the plain.!@#"; + var dce = dojox.encoding.easy64; + + var s2b = function(s){ + var b = []; + for(var i = 0; i < s.length; ++i){ + b.push(s.charCodeAt(i)); + } + return b; + }; + + var b2s = function(b){ + var s = []; + dojo.forEach(b, function(c){ s.push(String.fromCharCode(c)); }); + return s.join(""); + }; + + tests.register("dojox.encoding.tests.easy64", [ + function testEasyMsg1(t){ t.assertEqual(msg1, b2s(dce.decode(dce.encode(s2b(msg1))))); }, + function testEasyMsg2(t){ t.assertEqual(msg2, b2s(dce.decode(dce.encode(s2b(msg2))))); }, + function testEasyMsg3(t){ t.assertEqual(msg3, b2s(dce.decode(dce.encode(s2b(msg3))))); }, + function testEasyMsg4(t){ t.assertEqual(msg4, b2s(dce.decode(dce.encode(s2b(msg4))))); } + ]); +})(); + +} diff --git a/includes/js/dojox/encoding/tests/encoding.js b/includes/js/dojox/encoding/tests/encoding.js new file mode 100644 index 0000000..9d492cd --- /dev/null +++ b/includes/js/dojox/encoding/tests/encoding.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojox.encoding.tests.encoding"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.encoding.tests.encoding"] = true; +dojo.provide("dojox.encoding.tests.encoding"); + +try{ + dojo.require("dojox.encoding.tests.ascii85"); + dojo.require("dojox.encoding.tests.easy64"); + dojo.require("dojox.encoding.tests.bits"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/encoding/tests/runTests.html b/includes/js/dojox/encoding/tests/runTests.html new file mode 100644 index 0000000..b79c2d9 --- /dev/null +++ b/includes/js/dojox/encoding/tests/runTests.html @@ -0,0 +1,9 @@ + + + DojoX Compression Unit Test Runner + + + +

            Redirecting to D.O.H runner.

            + + diff --git a/includes/js/dojox/flash.js b/includes/js/dojox/flash.js new file mode 100644 index 0000000..75e2752 --- /dev/null +++ b/includes/js/dojox/flash.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.flash"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.flash"] = true; +dojo.provide("dojox.flash"); +dojo.require("dojox.flash._base"); + +} diff --git a/includes/js/dojox/flash/DojoExternalInterface.as b/includes/js/dojox/flash/DojoExternalInterface.as new file mode 100644 index 0000000..d857968 --- /dev/null +++ b/includes/js/dojox/flash/DojoExternalInterface.as @@ -0,0 +1,168 @@ +/** + A wrapper around Flash 8's ExternalInterface; this is needed + because ExternalInterface has a number of serialization bugs that we + need to correct for. + + @author Brad Neuberg +*/ + +import flash.external.ExternalInterface; + +class DojoExternalInterface{ + public static var available:Boolean; + public static var dojoPath = ""; + + public static function initialize(){ + //trace("DojoExternalInterface.initialize"); + + // extract the dojo base path + DojoExternalInterface.dojoPath = DojoExternalInterface.getDojoPath(); + + // see if we need to do an express install + var install:ExpressInstall = new ExpressInstall(); + if(install.needsUpdate){ + install.init(); + } + + // set whether communication is available + DojoExternalInterface.available = ExternalInterface.available; + } + + /** Called when we are finished adding methods through addCallback. */ + public static function done(){ + //trace("done"); + DojoExternalInterface.call("dojox.flash.loaded"); + } + + public static function addCallback(methodName:String, instance:Object, + method:Function):Boolean{ + //trace("addCallback"); + ExternalInterface.addCallback(methodName, instance, function(){ + instance = (instance) ? instance : null; + var params = []; + if(arguments && arguments.length){ + for(var i = 0; i < arguments.length; i++){ + params[i] = DojoExternalInterface.decodeData(arguments[i]); + } + } + + var results = method.apply(instance, params); + results = DojoExternalInterface.encodeData(results); + + return results; + }); + + // tell JavaScript about DojoExternalInterface new method so we can create a proxy + ExternalInterface.call("dojox.flash.comm._addExternalInterfaceCallback", + methodName); + + return true; + } + + public static function call(methodName:String):Void{ + // we might have any number of optional arguments, so we have to + // pass them in dynamically; strip out the results callback + var parameters = new Array(); + for(var i = 0; i < arguments.length; i++){ + parameters.push(arguments[i]); + } + + // FIXME: Should we be encoding or decoding the data to get + // around Flash's serialization bugs? + + var results = ExternalInterface.call.apply(ExternalInterface, parameters); + + return results; + } + + /** + Called by Flash to indicate to JavaScript that we are ready to have + our Flash functions called. Calling loaded() + will fire the dojox.flash.loaded() event, so that JavaScript can know that + Flash has finished loading and adding its callbacks, and can begin to + interact with the Flash file. + */ + public static function loaded(){ + DojoExternalInterface.call("dojox.flash.loaded"); + } + + /** + Utility trace implementation that prints out to console.debug. + */ + public static function trace(msg){ + DojoExternalInterface.call("console.debug", "FLASH: " + msg); + } + + private static function decodeData(data):String{ + if(!data || typeof data != "string"){ + return data; + } + + // we have to use custom encodings for certain characters when passing + // them over; for example, passing a backslash over as //// from JavaScript + // to Flash doesn't work + data = replaceStr(data, "&custom_backslash;", "\\"); + + data = replaceStr(data, "\\\'", "\'"); + data = replaceStr(data, "\\\"", "\""); + + return data; + } + + private static function encodeData(data):String{ + if(!data || typeof data != "string"){ + return data; + } + + // certain XMLish characters break Flash's wire serialization for + // ExternalInterface; encode these into a custom encoding, rather than + // the standard entity encoding, because otherwise we won't be able to + // differentiate between our own encoding and any entity characters + // that are being used in the string itself + data = replaceStr(data, '<', '&custom_lt;'); + data = replaceStr(data, '>', '&custom_gt;'); + + // needed for IE + data = replaceStr(data, '\\', '&custom_backslash;'); + + // encode control characters and JavaScript delimiters + data = replaceStr(data, "\n", "\\n"); + data = replaceStr(data, "\r", "\\r"); + data = replaceStr(data, "\f", "\\f"); + data = replaceStr(data, "'", "\\'"); + data = replaceStr(data, '"', '\"'); + + return data; + } + + /** + Flash ActionScript has no String.replace method or support for + Regular Expressions! We roll our own very simple one. + */ + public static function replaceStr(inputStr:String, replaceThis:String, + withThis:String):String{ + var splitStr = inputStr.split(replaceThis); + if(!splitStr){ + return inputStr; + } + + inputStr = splitStr.join(withThis); + return inputStr; + } + + private static function getDojoPath(){ + var url = _root._url; + var start = url.indexOf("baseUrl=") + "baseUrl=".length; + var path = url.substring(start); + var end = path.indexOf("&"); + if(end != -1){ + path = path.substring(0, end); + } + + // some browsers append a junk string at the end: '%20'%20quality= + if(path.indexOf("'%20'%20quality=") != -1){ + path = path.substring(0, path.indexOf("'%20'%20quality=")); + } + return path; + } +} diff --git a/includes/js/dojox/flash/ExpressInstall.as b/includes/js/dojox/flash/ExpressInstall.as new file mode 100644 index 0000000..1801171 --- /dev/null +++ b/includes/js/dojox/flash/ExpressInstall.as @@ -0,0 +1,71 @@ +/** + * Based on the expressinstall.as class created by Geoff Stearns as part + * of the FlashObject library. + * + * Use this file to invoke the Macromedia Flash Player Express Install functionality + * This file is intended for use with the FlashObject embed script. You can download FlashObject + * and this file at the following URL: http://blog.deconcept.com/flashobject/ + * + * Usage: + * var ExpressInstall = new ExpressInstall(); + * + * // test to see if install is needed: + * if (ExpressInstall.needsUpdate) { // returns true if update is needed + * ExpressInstall.init(); // starts the update + * } + * + * NOTE: Your Flash movie must be at least 214px by 137px in order to use ExpressInstall. + * + */ + +class ExpressInstall{ + public var needsUpdate:Boolean; + private var updater:MovieClip; + private var hold:MovieClip; + + public function ExpressInstall(){ + // does the user need to update? + this.needsUpdate = (_root.MMplayerType == undefined) ? false : true; + } + + public function init():Void{ + this.loadUpdater(); + } + + public function loadUpdater():Void{ + System.security.allowDomain("fpdownload.macromedia.com"); + + // hope that nothing is at a depth of 10000000, you can change this depth if needed, but you want + // it to be on top of your content if you have any stuff on the first frame + this.updater = _root.createEmptyMovieClip("expressInstallHolder", 10000000); + + // register the callback so we know if they cancel or there is an error + var _self = this; + this.updater.installStatus = _self.onInstallStatus; + this.hold = this.updater.createEmptyMovieClip("hold", 1); + + // can't use movieClipLoader because it has to work in 6.0.65 + this.updater.onEnterFrame = function():Void { + if(typeof this.hold.startUpdate == 'function'){ + _self.initUpdater(); + this.onEnterFrame = null; + } + } + + var cacheBuster:Number = Math.random(); + + this.hold.loadMovie("http://fpdownload.macromedia.com/pub/flashplayer/" + +"update/current/swf/autoUpdater.swf?"+ cacheBuster); + } + + private function initUpdater():Void{ + this.hold.redirectURL = _root.MMredirectURL; + this.hold.MMplayerType = _root.MMplayerType; + this.hold.MMdoctitle = _root.MMdoctitle; + this.hold.startUpdate(); + } + + public function onInstallStatus(msg):Void{ + getURL("javascript:dojox.flash.install._onInstallStatus('"+msg+"')"); + } +} diff --git a/includes/js/dojox/flash/README b/includes/js/dojox/flash/README new file mode 100644 index 0000000..e01f3be --- /dev/null +++ b/includes/js/dojox/flash/README @@ -0,0 +1,31 @@ +------------------------------------------------------------------------------- +dojox.flash +------------------------------------------------------------------------------- +Version 0.4 +Release date: MM/DD/YYYY +------------------------------------------------------------------------------- +Project state: experimental (currently broken) +------------------------------------------------------------------------------- +Project authors + Brad Neuberg (BradNeuberg@dojotoolkit.org) + Alex Russell (alex@dojotoolkit.org, only handled minor porting issues) +------------------------------------------------------------------------------- +Project description + +Infrastructure for high-performance Flash/JS communication +------------------------------------------------------------------------------- +Dependencies: + +MTASC for creating builds +------------------------------------------------------------------------------- +Documentation + +TODOC +------------------------------------------------------------------------------- +Installation instructions + +Not intended as a stand-alone module. +------------------------------------------------------------------------------- +Additional Notes + +TODOC diff --git a/includes/js/dojox/flash/_base.js b/includes/js/dojox/flash/_base.js new file mode 100644 index 0000000..5a372dd --- /dev/null +++ b/includes/js/dojox/flash/_base.js @@ -0,0 +1,762 @@ +if(!dojo._hasResource["dojox.flash._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.flash._base"] = true; +dojo.provide("dojox.flash._base"); + +// for dijit.getViewport(), needed by dojox.flash.Embed.center() +dojo.require("dijit._base.place"); + +dojox.flash = function(){ + // summary: + // The goal of dojox.flash is to make it easy to extend Flash's capabilities + // into an Ajax/DHTML environment. + // + // dojox.flash provides an easy object for interacting with the Flash plugin. + // This object provides methods to determine the current version of the Flash + // plugin (dojox.flash.info); write out the necessary markup to + // dynamically insert a Flash object into the page (dojox.flash.Embed; and + // do dynamic installation and upgrading of the current Flash plugin in + // use (dojox.flash.Install). If you want to call methods on the Flash object + // embedded into the page it is your responsibility to use Flash's ExternalInterface + // API and get a reference to the Flash object yourself. + // + // To use dojox.flash, you must first wait until Flash is finished loading + // and initializing before you attempt communication or interaction. + // To know when Flash is finished use dojo.connect: + // + // dojo.connect(dojox.flash, "loaded", myInstance, "myCallback"); + // + // Then, while the page is still loading provide the file name: + // + // dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf")); + // + // If no SWF files are specified, then Flash is not initialized. + // + // Your Flash must use Flash's ExternalInterface to expose Flash methods and + // to call JavaScript. + // + // setSwf can take an optional 'visible' attribute to control whether + // the Flash object is visible or not on the page; the default is visible: + // + // dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf"), + // false); + // + // Once finished, you can query Flash version information: + // + // dojox.flash.info.version + // + // Or can communicate with Flash methods that were exposed: + // + // var f = dojox.flash.get(); + // var results = f.sayHello("Some Message"); + // + // Your Flash files should use DojoExternalInterface.as to register methods; + // this file wraps Flash's normal ExternalInterface but correct various + // serialization bugs that ExternalInterface has. + // + // Note that dojox.flash is not meant to be a generic Flash embedding + // mechanism; it is as generic as necessary to make Dojo Storage's + // Flash Storage Provider as clean and modular as possible. If you want + // a generic Flash embed mechanism see SWFObject + // (http://blog.deconcept.com/swfobject/). + // + // Notes: + // Note that dojox.flash can currently only work with one Flash object + // on the page; it does not yet support multiple Flash objects on + // the same page. + // + // Your code can detect whether the Flash player is installing or having + // its version revved in two ways. First, if dojox.flash detects that + // Flash installation needs to occur, it sets dojox.flash.info.installing + // to true. Second, you can detect if installation is necessary with the + // following callback: + // + // dojo.connect(dojox.flash, "installing", myInstance, "myCallback"); + // + // You can use this callback to delay further actions that might need Flash; + // when installation is finished the full page will be refreshed and the + // user will be placed back on your page with Flash installed. + // + // ------------------- + // Todo/Known Issues + // ------------------- + // * On Internet Explorer, after doing a basic install, the page is + // not refreshed or does not detect that Flash is now available. The way + // to fix this is to create a custom small Flash file that is pointed to + // during installation; when it is finished loading, it does a callback + // that says that Flash installation is complete on IE, and we can proceed + // to initialize the dojox.flash subsystem. + // * Things aren't super tested for sending complex objects to Flash + // methods, since Dojo Storage only needs strings + // + // Author- Brad Neuberg, http://codinginparadise.org +} + +dojox.flash = { + ready: false, + url: null, + + _visible: true, + _loadedListeners: new Array(), + _installingListeners: new Array(), + + setSwf: function(/* String */ url, /* boolean? */ visible){ + // summary: Sets the SWF files and versions we are using. + // url: String + // The URL to this Flash file. + // visible: boolean? + // Whether the Flash file is visible or not. If it is not visible we hide it off the + // screen. This defaults to true (i.e. the Flash file is visible). + this.url = url; + + if(typeof visible != "undefined"){ + this._visible = visible; + } + + // initialize ourselves + this._initialize(); + }, + + addLoadedListener: function(/* Function */ listener){ + // summary: + // Adds a listener to know when Flash is finished loading. + // Useful if you don't want a dependency on dojo.event. + // listener: Function + // A function that will be called when Flash is done loading. + + this._loadedListeners.push(listener); + }, + + addInstallingListener: function(/* Function */ listener){ + // summary: + // Adds a listener to know if Flash is being installed. + // Useful if you don't want a dependency on dojo.event. + // listener: Function + // A function that will be called if Flash is being + // installed + + this._installingListeners.push(listener); + }, + + loaded: function(){ + // summary: Called back when the Flash subsystem is finished loading. + // description: + // A callback when the Flash subsystem is finished loading and can be + // worked with. To be notified when Flash is finished loading, add a + // loaded listener: + // + // dojox.flash.addLoadedListener(loadedListener); + + dojox.flash.ready = true; + if(dojox.flash._loadedListeners.length > 0){ + for(var i = 0;i < dojox.flash._loadedListeners.length; i++){ + dojox.flash._loadedListeners[i].call(null); + } + } + }, + + installing: function(){ + // summary: Called if Flash is being installed. + // description: + // A callback to know if Flash is currently being installed or + // having its version revved. To be notified if Flash is installing, connect + // your callback to this method using the following: + // + // dojo.event.connect(dojox.flash, "installing", myInstance, "myCallback"); + + if(dojox.flash._installingListeners.length > 0){ + for(var i = 0; i < dojox.flash._installingListeners.length; i++){ + dojox.flash._installingListeners[i].call(null); + } + } + }, + + // Initializes dojox.flash. + _initialize: function(){ + //console.debug("dojox.flash._initialize"); + // see if we need to rev or install Flash on this platform + var installer = new dojox.flash.Install(); + dojox.flash.installer = installer; + + if(installer.needed() == true){ + installer.install(); + }else{ + // write the flash object into the page + dojox.flash.obj = new dojox.flash.Embed(this._visible); + dojox.flash.obj.write(); + + // setup the communicator + dojox.flash.comm = new dojox.flash.Communicator(); + } + } +}; + + +dojox.flash.Info = function(){ + // summary: A class that helps us determine whether Flash is available. + // description: + // A class that helps us determine whether Flash is available, + // it's major and minor versions, and what Flash version features should + // be used for Flash/JavaScript communication. Parts of this code + // are adapted from the automatic Flash plugin detection code autogenerated + // by the Macromedia Flash 8 authoring environment. + // + // An instance of this class can be accessed on dojox.flash.info after + // the page is finished loading. + // + // This constructor must be called before the page is finished loading. + + // Visual basic helper required to detect Flash Player ActiveX control + // version information on Internet Explorer + if(dojo.isIE){ + document.write([ + ' + + + + + +

            Test Dojox Flash

            + +

            For detailed test output see Firebug console (if Firefox). + This test should be run on Firefox, Internet Explorer, and Safari + to confirm that Dojox Flash is working correctly.

            + + \ No newline at end of file diff --git a/includes/js/dojox/flash/tests/test_flash.js b/includes/js/dojox/flash/tests/test_flash.js new file mode 100644 index 0000000..1b26eb2 --- /dev/null +++ b/includes/js/dojox/flash/tests/test_flash.js @@ -0,0 +1,155 @@ +// TODO: FIXME: Refactor this to use D.O.H. instead of its own assertions + +dojo.require("dojox.flash"); + +var flashLoaded = false; +var pageLoaded = false; +var testXML = testBook = null; + +function flashReady(){ + console.debug("flashReady"); + flashLoaded = true; + + if(isReady()){ + run(); + } +} + +function pageReady(){ + console.debug("pageReady"); + pageLoaded = true; + + loadResources(); + + if(isReady()){ + run(); + } +} + +function isReady(){ + return testXML && testBook && pageLoaded && flashLoaded; +} + +function loadResources(){ + console.debug("Trying to load resources"); + + var d = dojo.xhrGet({ + url: "../../storage/tests/resources/testXML.xml", + handleAs: "text" + }); + + d.addCallback(function(results){ + console.debug("testXML loaded"); + testXML = results; + if(isReady()){ + run(); + } + }); + + d.addErrback(function(error){ + console.debug("Unable to load testXML.xml: " + error); + }); + + d = dojo.xhrGet({ + url: "../../storage/tests/resources/testBook.txt", + handleAs: "text" + }); + + d.addCallback(function(results){ + console.debug("testBook loaded"); + testBook = results; + if(isReady()){ + run(); + } + }); + + d.addErrback(function(error){ + console.debug("Unable to load testXML.xml: " + error); + }); +} + +function run(){ + console.debug("run"); + try{ + var correct, actual; + + console.debug("Setting simple message..."); + correct = "hello world"; + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting simple message did not work"); + + console.debug("Setting message with evil characters..."); + // our correct and actual values get tricky when we have double back + // slashes; do a trick so that they can be compared easier + var doubleSlash = "\\"; + doubleSlash = doubleSlash.charAt(0); + correct = "hello world\n\n\nasdfasdf!@#$@#%^[]{}&" + doubleSlash + + "
            $%^&%^&*^&()<><><>,./;\0\r\f\'][`~=\"+-]MORE!\n\rLESS"; + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting message with evil characters did not work"); + + console.debug("Setting testXML..."); + correct = testXML; + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting testXML did not work"); + + console.debug("Setting testBook(~300K)..."); + correct = testBook; + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting testBook did not work"); + + console.debug("Setting testBook 3 times (~900K)..."); + correct = testBook + testBook + testBook; + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting testBook X 3 did not work"); + + console.debug("Setting JSON..."); + var obj = {type: "car", color: "red", model: "Ford", year: "2008", + features: ["A/C", "automatic", "4-wheel drive"]}; + correct = dojo.toJson(obj, true); + dojox.flash.comm.setMessage(correct); + actual = dojox.flash.comm.getMessage(); + assert(correct, actual, "Setting/getting JSON did not work"); + + console.debug("Calling method that takes multiple values..."); + actual = dojox.flash.comm.multipleValues("key", "value", "namespace"); + assert("namespacekeyvalue", actual, "Setting/getting multiple values did not work"); + + var allPassed = document.createElement("p"); + allPassed.style.backgroundColor = "green"; + allPassed.style.color = "white"; + allPassed.style.fontSize = "24pt"; + allPassed.appendChild(document.createTextNode("All tests passed")); + var body = document.getElementsByTagName("body")[0]; + body.appendChild(allPassed); + }catch(e){ + console.debug(e.message || e); + } +} + +function assert(correct, actual, msg){ + //alert("correct="+correct+",\n\nactual="+actual); + if(correct != actual){ + var failed = document.createElement("p"); + failed.style.backgroundColor = "red"; + failed.style.color = "white"; + failed.style.fontSize = "24pt"; + failed.appendChild(document.createTextNode("Test failed: " + msg)); + var body = document.getElementsByTagName("body")[0]; + body.appendChild(failed); + + throw new Error("ASSERTION FAILED: " + msg); + }else{ + console.debug("Assertion passed"); + } +} + +console.debug("adding listeners..."); +dojox.flash.addLoadedListener(flashReady); +dojox.flash.setSwf("TestFlash.swf", true); +dojo.connect(dojo, "loaded", pageReady); diff --git a/includes/js/dojox/form/CheckedMultiSelect.js b/includes/js/dojox/form/CheckedMultiSelect.js new file mode 100644 index 0000000..eb80c72 --- /dev/null +++ b/includes/js/dojox/form/CheckedMultiSelect.js @@ -0,0 +1,223 @@ +if(!dojo._hasResource["dojox.form.CheckedMultiSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.form.CheckedMultiSelect"] = true; +dojo.provide("dojox.form.CheckedMultiSelect"); + +dojo.require("dijit.form.MultiSelect"); +dojo.require("dijit.form.CheckBox"); + +dojo.declare("dojox.form._CheckedMultiSelectItem", + [dijit._Widget, dijit._Templated], + { + // summary: + // The individual items for a CheckedMultiSelect + + widgetsInTemplate: true, + templateString:"
            ${option.innerHTML}
            \n", + + baseClass: "dojoxMultiSelectItem", + + // option: Element + // The option that is associated with this item + option: null, + parent: null, + + // disabled: boolean + // Whether or not this widget is disabled + disabled: false, + + _changeBox: function(){ + // summary: + // Called to force the select to match the state of the check box + // (only on click of the checkbox) + this.option.selected = this.checkBox.getValue() && true; + + // fire the parent's change + this.parent._onChange(); + + // refocus the parent + this.parent.focus(); + }, + + _labelClick: function(){ + // summary: + // Called when the label portion is clicked + dojo.stopEvent(e); + if(this.disabled){ + return; + } + var cb = this.checkBox; + cb.setValue(!cb.getValue()); + this._changeBox(); + }, + + _onMouse: function(e){ + // summary: + // Sets the hover state depending on mouse state (passes through + // to the check box) + this.checkBox._onMouse(e); + }, + + _onClick: function(e){ + // summary: + // Sets the click state (passes through to the check box) + this.checkBox._onClick(e); + }, + + _updateBox: function(){ + // summary: + // Called to force the box to match the state of the select + this.checkBox.setValue(this.option.selected); + }, + + setAttribute: function(attr, value){ + // summary: + // Disables (or enables) all the children as well + this.inherited(arguments); + switch(attr){ + case "disabled": + this.checkBox.setAttribute(attr, value); + break; + default: + break; + } + } +}); + +dojo.declare("dojox.form.CheckedMultiSelect", dijit.form.MultiSelect, { + // summary: + // Extends the core dijit MultiSelect to provide a "checkbox" selector + + templateString: "", + templateString:"
            . + + baseClass: "dojoxDropDownSelect", + + /*===== + dojox.form.__SelectOption = function(){ + // value: String + // The value of the option. Setting to empty (or missing) will + // place a separator at that location + // label: String + // The label for our option. It can contain html tags. + this.value = value; + this.label = label; + } + =====*/ + + // options: dojox.form.__SelectOption[] + // our set of options + options: null, + + // emptyLabel: string + // What to display in an "empty" dropdown + emptyLabel: "", + + // _isPopulated: boolean + // Whether or not we have been populated + _isPopulated: false, + + _addMenuItem: function(/* dojox.form.__SelectOption */ option){ + // summary: + // For the given option, add a menu item to our dropdown + // If the option doesn't have a value, then a separator is added + // in that place. + var menu = this.dropDown; + + if(!option.value){ + // We are a separator (no label set for it) + menu.addChild(new dijit.MenuSeparator()); + }else{ + // Just a regular menu option + var click = dojo.hitch(this, "setAttribute","value",option); + var mi = new dijit.MenuItem({ + id: this.id + "_item_" + option.value, + label: option.label, + onClick: click + }); + menu.addChild(mi); + + } + }, + + _resetButtonState: function(){ + // summary: + // Resets the menu and the length attribute of the button - and + // ensures that the label is appropriately set. + var len = this.options.length; + + // reset the menu to make it "populatable on the next click + var dropDown = this.dropDown; + dojo.forEach(dropDown.getChildren(), function(child){ + child.destroyRecursive(); + }); + this._isPopulated = false; + + // Set our length attribute and our value + this.setAttribute("readOnly", (len === 1)); + this.setAttribute("disabled", (len === 0)); + this.setAttribute("value", this.value); + }, + + _updateSelectedState: function(){ + // summary: + // Sets the "selected" class on the item for styling purposes + var val = this.value; + if(val){ + var testId = this.id + "_item_" + val; + dojo.forEach(this.dropDown.getChildren(), function(child){ + dojo[child.id === testId ? "addClass" : "removeClass"](child.domNode, + this.baseClass + "SelectedOption"); + }, this); + } + }, + + addOption: function(/* dojox.form.__SelectOption or string, optional */ value, /* string? */ label){ + // summary: + // Adds an option to the end of the select. If value is empty or + // missing, a separator is created instead. + + this.options.push(value.value ? value : { value:value, label:label }); + }, + + removeOption: function(/* string, dojox.form.__SelectOption or number */ valueOrIdx){ + // summary: + // Removes the given option + this.options = dojo.filter(this.options, function(node, idx){ + return !((typeof valueOrIdx === "number" && idx === valueOrIdx) || + (typeof valueOrIdx === "string" && node.value === valueOrIdx) || + (valueOrIdx.value && node.value === valueOrIdx.value)); + }); + }, + + setOptionLabel: function(/*string*/ value, /*string*/ label){ + dojo.forEach(this.options, function(node){ + if(node.value === value){ + node.label = label; + } + }); + }, + + destroy: function(){ + // summary: + // Clear out an outstanding hack handle + if(this._labelHackHandle){ + clearTimeout(this._labelHackHandle); + } + this.inherited(arguments); + }, + + setLabel: function(/* string */ content){ + // summary: + // Wraps our label in a div - that way, our rich text can work + // correctly. + + content = '
            ' + + content + + '
            '; + // Because FF2 has a problem with layout, we need to delay this + // call for it. + if(this._labelHackHandle){ + clearTimeout(this._labelHackHandle); + } + if(dojo.isFF === 2){ + this._labelHackHandle = setTimeout(dojo.hitch(this, function(){ + this._labelHackHandle = null; + dijit.form.DropDownButton.prototype.setLabel.call(this, content); + }), 0); + }else{ + this.inherited(arguments); + } + }, + + setAttribute: function(/*string*/ attr, /* anything */ value){ + // summary: sometime we get called to set our value - we need to + // make sure and route those requests through _setValue() + // instead. + if(attr === "value"){ + // If a string is passed, then we set our value from looking it up. + if(typeof value === "string"){ + value = dojo.filter(this.options, function(node){ + return node.value === value; + })[0]; + } + + // If we don't have a value, try to show the first item + if(!value){ + value = this.options[0] || { value: "", label: "" }; + } + this.value = value.value; + if(this._started){ + this.setLabel(value.label || this.emptyLabel || " "); + } + this._handleOnChange(value.value); + value = this.value; + }else{ + this.inherited(arguments); + } + }, + + _fillContent: function(){ + // summary: + // Loads our options and sets up our dropdown correctly. We + // don't want any content, so we don't call any inherit chain + // function. + var opts = this.options; + if(!opts){ + opts = this.options = this.srcNodeRef ? dojo.query(">", + this.srcNodeRef).map(function(node){ + if(node.getAttribute("type") === "separator"){ + return { value: "", label: "" }; + } + return { value: node.getAttribute("value"), + label: String(node.innerHTML) }; + }, this) : []; + } + + // Set the value to be the first, or the selected index + if(opts.length && !this.value){ + var si = this.srcNodeRef.selectedIndex; + this.value = opts[si != -1 ? si : 0].value; + } + + // Create the dropDown widget + this.dropDown = new dijit.Menu(); + }, + + postCreate: function(){ + // summary: sets up our event handling that we need for functioning + // as a select + + this.inherited(arguments); + + // Make our event connections for updating state + var fx = function(){ + dojo[this._opened ? "addClass" : "removeClass"](this.focusNode, + this.baseClass + "ButtonOpened"); + }; + this.connect(this, "_openDropDown", fx); + this.connect(this, "_closeDropDown", fx); + this.connect(this, "onChange", "_updateSelectedState"); + this.connect(this, "addOption", "_resetButtonState"); + this.connect(this, "removeOption", "_resetButtonState"); + this.connect(this, "setOptionLabel", "_resetButtonState"); + }, + + startup: function(){ + // summary: + // FF2 has layout problems if the reset call isn't done on a + // slight delay + this.inherited(arguments); + if(dojo.isFF === 2){ + setTimeout(dojo.hitch(this, this._resetButtonState), 0); + }else{ + this._resetButtonState(); + } + }, + + _populate: function(/* function */ callback){ + // summary: + // populates the menu (and does the callback, if passed) + + var dropDown = this.dropDown; + + // Add each menu item + dojo.forEach(this.options, this._addMenuItem, this); + + // Update states + this._updateSelectedState(); + dojo.addClass(this.dropDown.domNode, this.baseClass + "Menu"); + this._isPopulated = true; + if(callback){ callback.call(this); } + }, + + _toggleDropDown: function(){ + // summary: Overrides DropDownButton's toggle function to make sure + // that the values are correctly populated. + var dropDown = this.dropDown; + if(dropDown && !dropDown.isShowingNow && !this._isPopulated){ + this._populate(dojox.form.DropDownSelect.superclass._toggleDropDown); + }else{ + this.inherited(arguments); + } + } +}); + +} diff --git a/includes/js/dojox/form/PasswordValidator.js b/includes/js/dojox/form/PasswordValidator.js new file mode 100644 index 0000000..e147ddf --- /dev/null +++ b/includes/js/dojox/form/PasswordValidator.js @@ -0,0 +1,280 @@ +if(!dojo._hasResource["dojox.form.PasswordValidator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.form.PasswordValidator"] = true; +dojo.provide("dojox.form.PasswordValidator"); + +dojo.require("dijit.form._FormWidget"); +dojo.require("dijit.form.ValidationTextBox"); + +dojo.requireLocalization("dojox.form", "PasswordValidator", null, "ROOT"); + +dojo.declare("dojox.form._ChildTextBox", dijit.form.ValidationTextBox, { + // summary: + // A class that is shared between all our children - extends + // ValidationTextBox and provides some shared functionality + // + // containerWidget: widget + // Our parent (the PasswordValidator) + containerWidget: null, + + // type: string + // Don't override this - we are all "password" types + type: "password", + + reset: function(){ + // summary: + // Force-set to empty string (we don't save passwords EVER)...and + // since _OldPWBox overrides setValue to check for empty string, + // call our parent class directly (not this.inherited()) + dijit.form.ValidationTextBox.prototype.setValue.call(this, "", true); + this._hasBeenBlurred = false; + } +}); + + + +dojo.declare("dojox.form._OldPWBox", dojox.form._ChildTextBox, { + // summary: + // A class representing our "old password" box. + // + // _isPWValid: boolean + // Whether or not the password is valid + _isPWValid: false, + + setValue: function(/* anything */ newVal, /* boolean? */ priority){ + // summary: + // Updates _isPWValid if this isn't our initial update by calling + // our PasswordValidator's pwCheck function + if(newVal === ""){ + newVal = dojox.form._OldPWBox.superclass.getValue.call(this); + } + if(priority !== null){ + // Priority is passed in as null, explicitly when this is an + // update (not initially set). We want to check our password now. + this._isPWValid = this.containerWidget.pwCheck(newVal); + } + this.inherited("setValue", arguments); + }, + + isValid: function(/* boolean */ isFocused){ + // Take into account the isPWValid setting + return this.inherited("isValid", arguments) && this._isPWValid; + }, + + _update: function(/* event */ e){ + // Only call validate() if we've been blurred or else we get popups + // too early. + if(this._hasBeenBlurred){ this.validate(true); } + this._onMouse(e); + }, + + getValue: function(){ + // summary: + // Only returns a value if our container widget is valid. This + // is to prevent exposure of "oldPW" too early. + if(this.containerWidget.isValid()){ + return this.inherited("getValue", arguments); + }else{ + return ""; + } + } +}); + + +dojo.declare("dojox.form._NewPWBox", dojox.form._ChildTextBox, { + // summary: + // A class representing our new password textbox + + // required: boolean + // Whether or not this widget is required (default: true) + required: true, + + onChange: function(){ + // summary: + // Validates our verify box - to make sure that a change to me is + // reflected there + this.containerWidget._inputWidgets[2].validate(false); + this.inherited(arguments); + } +}); + +dojo.declare("dojox.form._VerifyPWBox", dojox.form._ChildTextBox, { + // summary: + // A class representing our verify textbox + + isValid: function(isFocused){ + // summary: + // Validates that we match the "real" password + return this.inherited("isValid", arguments) && + (this.getValue() == this.containerWidget._inputWidgets[1].getValue()); + } +}); + +dojo.declare("dojox.form.PasswordValidator", dijit.form._FormValueWidget, { + // summary: + // A password validation widget that simplifies the "old/new/verify" + // style of requesting passwords. You will probably want to override + // this class and implement your own pwCheck function. + // + // required: boolean + // Whether or not it is required for form submission + required: true, + + // inputWidgets: TextBox[] + // An array of text boxes that are our components + _inputWidgets: null, + + // oldName: string? + // The name to send our old password as (when form is posted) + oldName: "", + + templateString:"
            \n\t\n
            \n", + + _hasBeenBlurred: false, + + isValid: function(/* boolean */ isFocused){ + // summary: we are valid if ALL our children are valid + return dojo.every(this._inputWidgets, function(i){ + if(i && i._setStateClass){ i._setStateClass(); } + return (!i || i.isValid()); + }); + }, + + validate: function(/* boolean */ isFocused){ + // summary: Validating this widget validates all our children + return dojo.every(dojo.map(this._inputWidgets, function(i){ + if(i && i.validate){ + i._hasBeenBlurred = (i._hasBeenBlurred || this._hasBeenBlurred); + return i.validate(); + } + return true; + }, this), "return item;"); + }, + + reset: function(){ + // summary: Resetting this widget resets all our children + this._hasBeenBlurred = false; + dojo.forEach(this._inputWidgets, function(i){ + if(i && i.reset){ i.reset(); } + }, this); + }, + + _createSubWidgets: function(){ + // summary: + // Turns the inputs inside this widget into "real" validation + // widgets - and sets up the needed connections. + var widgets = this._inputWidgets, + msg = dojo.i18n.getLocalization("dojox.form", "PasswordValidator", + this.lang); + dojo.forEach(widgets, function(i, idx){ + if(i){ + var p = {containerWidget: this}, c; + if(idx === 0){ + p.name = this.oldName; + p.invalidMessage = msg.badPasswordMessage; + c = dojox.form._OldPWBox; + }else if(idx === 1){ + p.required = this.required; + c = dojox.form._NewPWBox; + }else if(idx === 2){ + p.invalidMessage = msg.nomatchMessage; + c = dojox.form._VerifyPWBox; + } + widgets[idx] = new c(p, i); + } + }, this); + }, + + pwCheck: function(/* string */ password){ + // summary: + // Overridable function for validation of the old password box. + // + // This function is called and passed the old password. Return + // true if it's OK to continue, and false if it is not. + // + // IMPORTANT SECURITY NOTE: Do NOT EVER EVER EVER check this in + // HTML or JavaScript!!! + // + // You will probably want to override this function to callback + // to a server to verify the password (the callback will need to + // be syncronous) - and it's probably a good idea to validate + // it again on form submission before actually doing + // anything destructive - that's why the "oldName" value + // is available. + // + // And don't just fetch the password from the server + // either :) Send the test password (probably hashed, for + // security) and return from the server a status instead. + // + // Again - DON'T BE INSECURE!!! Security is left as an exercise + // for the reader :) + return false; + }, + + postCreate: function(){ + // summary: + // Sets up the correct widgets. You *MUST* specify one child + // text box (a simple HTML element) with pwType="new" + // *and* one child text box with pwType="verify". You *MAY* + // specify a third child text box with pwType="old" in order to + // prompt the user to enter in their old password before the + // widget returns that it is valid. + + this.inherited(arguments); + + // Turn my inputs into the correct stuff.... + var widgets = this._inputWidgets = []; + dojo.forEach(["old","new","verify"], function(i){ + widgets.push(dojo.query("input[pwType=" + i + "]", + this.containerNode)[0]); + }, this); + if (!widgets[1] || !widgets[2]){ + throw new Error("Need at least pwType=\"new\" and pwType=\"verify\""); + } + if (this.oldName && !widgets[0]){ + throw new Error("Need to specify pwType=\"old\" if using oldName"); + } + this._createSubWidgets(); + }, + + setAttribute: function(/* string */ attr, /* anything */ value){ + this.inherited(arguments); + + // Disabling (or enabling) the container disables (or enables) all + // the subwidgets as well - same for requiring + switch(attr){ + case "disabled": + case "required": + dojo.forEach(this._inputWidgets, function(i){ + if(i && i.setAttribute){ i.setAttribute(attr, value);} + }); + break; + default: + break; + } + }, + + getValue: function(){ + // summary: overridden to return an empty string if we aren't valid. + if (this.isValid()){ + return this._inputWidgets[1].getValue(); + }else{ + return ""; + } + }, + + focus: function(){ + // summary: + // places focus on the first invalid input widget - if all + // input widgets are valid, the first widget is focused. + var f = false; + dojo.forEach(this._inputWidgets, function(i){ + if(i && !i.isValid() && !f){ + i.focus(); + f = true; + } + }); + if(!f){ this._inputWidgets[1].focus(); } + } +}); + +} diff --git a/includes/js/dojox/form/README b/includes/js/dojox/form/README new file mode 100644 index 0000000..3fc4f7c --- /dev/null +++ b/includes/js/dojox/form/README @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------- +dojox.form Collection +------------------------------------------------------------------------------- +Version 1.0 +Release date: 02/26/2008 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Nathan Toone (nathan) + +------------------------------------------------------------------------------- +Project description + + This is a collection of additional widgets that can be used in forms. +------------------------------------------------------------------------------- +Dependencies: + + Depends on dojo core and dijit +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + + Install into /dojox/form +------------------------------------------------------------------------------- +Additional Notes (Brief widget list): + + * CheckedMultiSelect - an extension to dijit.form.MultiSelect which + uses check boxes instead of ctrl-click + + * PasswordValidator - a widget which simplifies the common "old/new/verify" + mechanism of specifying passwords + + * DropDownSelect - an extension to dijit.form.DropDownButton which is + meant to mirror the html
            \ No newline at end of file diff --git a/includes/js/dojox/form/resources/DropDownSelect.css b/includes/js/dojox/form/resources/DropDownSelect.css new file mode 100644 index 0000000..cbd1971 --- /dev/null +++ b/includes/js/dojox/form/resources/DropDownSelect.css @@ -0,0 +1,137 @@ + +.dojoxDropDownSelect { + margin: 0.2em; +} +.dijit_a11y .dojoxDropDownSelectDisabled .dijitButtonNode { + border-style: dotted !important; + border-color: #999 !important; + color:#999 !important; +} +.dojoxDropDownSelect .dijitButtonNode { + padding: 0px; +} +.dijitButtonNode .dojoxDropDownSelectLabel * +{ + vertical-align: baseline; +} +.dojoxDropDownSelectSelectedOption * { + font-weight: bold; +} +.dojoxDropDownSelectDisabled .dijitArrowButtonInner, +.dojoxDropDownSelectReadOnly .dijitArrowButtonInner { + display: none; +} +.dojoxDropDownSelectMenu .dijitMenuItemIcon { + width: 1px; +} +.tundra .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.tundra .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} +.tundra .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.tundra .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} +.tundra .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/tundra/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/tundra/images/validationInputBg.gif') repeat-x top left; + border:1px solid #b3b3b3; + line-height: normal; +} +.tundra .dojoxDropDownSelectDisabled .dijitButtonNode { + + border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5; + + background:#e4e4e4 url("../../../dijit/themes/tundra/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; +} +.dj_ie .tundra .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); +} +.tundra .dojoxDropDownSelectHover .dijitButtonNode, +.tundra .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + + + border-color:#a5beda; + border-bottom-color:#5c7590; + border-right-color:#5c7590; + color:#000; + background:#fcfdff url("../../../dijit/themes/tundra/images/buttonHover.png") repeat-x bottom; +} +.tundra .dojoxDropDownSelectActive .dijitButtonNode { + + border-color:#366dba; + background: #ededed url("../../../dijit/themes/tundra/images/buttonActive.png") bottom repeat-x; +} +.soria .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.soria .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} +.soria .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/soria/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/soria/images/validationInputBg.gif') repeat-x top left; + border:1px solid #8ba0bd; + line-height: normal; +} +.soria .dojoxDropDownSelectDisabled .dijitButtonNode { + + border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd; + + background:#c3d3e5 url("../../../dijit/themes/soria/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; +} +.dj_ie .soria .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); +} +.soria .dojoxDropDownSelectHover .dijitButtonNode, +.soria .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + + + color:#000; + background:#acc5e2 url("../../../dijit/themes/soria/images/buttonHover.png") repeat-x top left; +} +.soria .dojoxDropDownSelectActive .dijitButtonNode { + + border-color:#657c9c; + background: #91b4e5 url("../../../dijit/themes/soria/images/buttonActive.png") top left repeat-x; +} +.nihilo .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.nihilo .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} +.nihilo .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/nihilo/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/nihilo/images/validationInputBg.gif') repeat-x top left; + border:1px solid #d3d3d3; + line-height: normal; +} +.nihilo .dojoxDropDownSelectDisabled .dijitButtonNode { + + border-color: #dedede; + + background:#fafafa url("../../../dijit/themes/nihilo/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; +} +.dj_ie .nihilo .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); +} +.nihilo .dojoxDropDownSelectHover .dijitButtonNode, +.nihilo .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + + + color:#000; + background:#fcfcfc url("../../../dijit/themes/nihilo/images/buttonHover.png") repeat-x top left; +} +.nihilo .dojoxDropDownSelectActive .dijitButtonNode { + + border-color:#dedede; + background: #f5f5f5 url("../../../dijit/themes/nihilo/images/buttonActive.png") top left repeat-x; +} diff --git a/includes/js/dojox/form/resources/DropDownSelect.css.commented.css b/includes/js/dojox/form/resources/DropDownSelect.css.commented.css new file mode 100644 index 0000000..a0a0636 --- /dev/null +++ b/includes/js/dojox/form/resources/DropDownSelect.css.commented.css @@ -0,0 +1,209 @@ +/* +**---------------------------------------------------------------------------- +** DropDownSelect +**---------------------------------------------------------------------------- +*/ +/* Mirror dijitDropDownButton a bit */ +.dojoxDropDownSelect { + margin: 0.2em; +} +.dijit_a11y .dojoxDropDownSelectDisabled .dijitButtonNode { + border-style: dotted !important; + border-color: #999 !important; + color:#999 !important; +} + +/* And remove the padding - so it looks a "bit" more like a text box */ +.dojoxDropDownSelect .dijitButtonNode { + padding: 0px; +} + +/* Fix the baseline of our label (for multi-size font elements) */ +.dijitButtonNode .dojoxDropDownSelectLabel * +{ + vertical-align: baseline; +} + +/* Styling for the currently-selected option (rich text can mess this up) */ +.dojoxDropDownSelectSelectedOption * { + font-weight: bold; +} + +/* And remove the arrow when we are read-only or disabled (1 or 0 options) */ +.dojoxDropDownSelectDisabled .dijitArrowButtonInner, +.dojoxDropDownSelectReadOnly .dijitArrowButtonInner { + display: none; +} + +/* And hide (at least, mostly) the menuItemIcon column */ +.dojoxDropDownSelectMenu .dijitMenuItemIcon { + width: 1px; +} + +/* +**---------------------------------------------------------------------------- +** Common stylings +**---------------------------------------------------------------------------- +*/ +/* Cursor States */ +.tundra .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.tundra .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} + + +/* +**---------------------------------------------------------------------------- +** Tundra stylings +**---------------------------------------------------------------------------- +*/ +/* Cursor States */ +.tundra .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.tundra .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} + +/* Make unselected "look" more like a text box and less like a button */ +.tundra .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/tundra/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/tundra/images/validationInputBg.gif') repeat-x top left; + border:1px solid #b3b3b3; + line-height: normal; +} + +/* Mirror DropDownButton */ +.tundra .dojoxDropDownSelectDisabled .dijitButtonNode { + /* disabled state - inner */ + border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5; + /*color:#b4b4b4;*/ + background:#e4e4e4 url("../../../dijit/themes/tundra/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; /* Safari, Opera and Mozilla */ +} + +.dj_ie .tundra .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); /* IE */ +} + +.tundra .dojoxDropDownSelectHover .dijitButtonNode, +.tundra .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + /* hover and opened 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("../../../dijit/themes/tundra/images/buttonHover.png") repeat-x bottom; +} + +.tundra .dojoxDropDownSelectActive .dijitButtonNode { + /* 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("../../../dijit/themes/tundra/images/buttonActive.png") bottom repeat-x; +} + + +/* +**---------------------------------------------------------------------------- +** Soria stylings +**---------------------------------------------------------------------------- +*/ +/* Cursor States */ +.soria .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.soria .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} + +/* Make unselected "look" more like a text box and less like a button */ +.soria .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/soria/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/soria/images/validationInputBg.gif') repeat-x top left; + border:1px solid #8ba0bd; + line-height: normal; +} + +/* Mirror DropDownButton */ +.soria .dojoxDropDownSelectDisabled .dijitButtonNode { + /* disabled state - inner */ + border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd; + /*color:#b4b4b4;*/ + background:#c3d3e5 url("../../../dijit/themes/soria/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; /* Safari, Opera and Mozilla */ +} + +.dj_ie .soria .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); /* IE */ +} + +.soria .dojoxDropDownSelectHover .dijitButtonNode, +.soria .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + /* 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("../../../dijit/themes/soria/images/buttonHover.png") repeat-x top left; +} + +.soria .dojoxDropDownSelectActive .dijitButtonNode { + /* 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("../../../dijit/themes/soria/images/buttonActive.png") top left repeat-x; +} + +/* +**---------------------------------------------------------------------------- +** Nihilo stylings +**---------------------------------------------------------------------------- +*/ +/* Cursor States */ +.nihilo .dojoxDropDownSelectDisabled * { + cursor: not-allowed !important; +} +.nihilo .dojoxDropDownSelectReadOnly * { + cursor: default !important; +} + +/* Make unselected "look" more like a text box and less like a button */ +.nihilo .dojoxDropDownSelect .dijitButtonNode { + background:#fff url("../../../dijit/themes/nihilo/images/validationInputBg.png") repeat-x top left; + #background:#fff url('../../../dijit/themes/nihilo/images/validationInputBg.gif') repeat-x top left; + border:1px solid #d3d3d3; + line-height: normal; +} + +/* Mirror DropDownButton */ +.nihilo .dojoxDropDownSelectDisabled .dijitButtonNode { + /* disabled state - inner */ + border-color: #dedede; + /*color:#b4b4b4;*/ + background:#fafafa url("../../../dijit/themes/nihilo/images/buttonDisabled.png") top repeat-x; + opacity: 0.60; /* Safari, Opera and Mozilla */ +} + +.dj_ie .nihilo .dojoxDropDownSelectDisabled .dijitButtonNode * { + filter: gray() alpha(opacity=50); /* IE */ +} + +.nihilo .dojoxDropDownSelectHover .dijitButtonNode, +.nihilo .dojoxDropDownSelect .dojoxDropDownSelectButtonOpened { + /* 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("../../../dijit/themes/nihilo/images/buttonHover.png") repeat-x top left; +} + +.nihilo .dojoxDropDownSelectActive .dijitButtonNode { + /* 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("../../../dijit/themes/nihilo/images/buttonActive.png") top left repeat-x; +} diff --git a/includes/js/dojox/form/resources/PasswordValidator.html b/includes/js/dojox/form/resources/PasswordValidator.html new file mode 100644 index 0000000..80a55ae --- /dev/null +++ b/includes/js/dojox/form/resources/PasswordValidator.html @@ -0,0 +1,3 @@ +
            + +
            \ No newline at end of file diff --git a/includes/js/dojox/form/resources/_CheckedMultiSelectItem.html b/includes/js/dojox/form/resources/_CheckedMultiSelectItem.html new file mode 100644 index 0000000..d9ec863 --- /dev/null +++ b/includes/js/dojox/form/resources/_CheckedMultiSelectItem.html @@ -0,0 +1,4 @@ +
            ${option.innerHTML}
            diff --git a/includes/js/dojox/form/tests/test_CheckedMultiSelect.html b/includes/js/dojox/form/tests/test_CheckedMultiSelect.html new file mode 100644 index 0000000..b8729d2 --- /dev/null +++ b/includes/js/dojox/form/tests/test_CheckedMultiSelect.html @@ -0,0 +1,91 @@ + + + + + + + +

            Test: dojox.form.CheckedMultiSelect

            +

            Automated test

            +
            + +
            + +
            + +
            + + + +
            + + diff --git a/includes/js/dojox/form/tests/test_DropDownSelect.html b/includes/js/dojox/form/tests/test_DropDownSelect.html new file mode 100644 index 0000000..4487e54 --- /dev/null +++ b/includes/js/dojox/form/tests/test_DropDownSelect.html @@ -0,0 +1,128 @@ + + + + + + + + +

            Test: dojox.form.DropDownSelect

            +

            Automated test

            +
            +

            Setting Defaults

            + + + +
            +

            Rich Text (Need to use divs and spans - since browsers hack selects to pieces)

            +
            + Alabama + Alaska + Arizona + Arkansas + California + New
              Mexico
            +
            +
            + Copy + Move + No Copy + No Move +
            +
            +

            Empty

            + +
            +

            Single Item

            + +
            + + + + +
            + + diff --git a/includes/js/dojox/form/tests/test_PasswordValidator.html b/includes/js/dojox/form/tests/test_PasswordValidator.html new file mode 100644 index 0000000..e3b1e63 --- /dev/null +++ b/includes/js/dojox/form/tests/test_PasswordValidator.html @@ -0,0 +1,216 @@ + + + + + + + + +

            Test: dojox.form.PasswordValidator

            +

            Automated test

            +

            No old password

            +
            +
            +
            +
            +
            +
            +
            +

            Old password (hard-coded to "oldpw2") - not passed to getValues

            +
            +
            + +
            +
            +
            +
            +
            +
            +

            Old password (hard-coded to "oldpw3") - passed to getValues

            +
            +
            + +
            +
            +
            +
            +
            +
            +

            In Table, Old password (hard-coded to "oldpw4") - not passed to getValues

            +
            +
            + + + + + + + + + + + + + + +
            +
            +
            +
            +

            In Table, Old password (hard-coded to "oldpw5") - passed to getValues

            +
            +
            + + + + + + + + + + + + + + +
            +
            +
            +
            +

            No old password, not required

            +
            +
            +
            +
            +
            +
            +
            + + + + diff --git a/includes/js/dojox/fx.js b/includes/js/dojox/fx.js new file mode 100644 index 0000000..635a570 --- /dev/null +++ b/includes/js/dojox/fx.js @@ -0,0 +1,7 @@ +if(!dojo._hasResource["dojox.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx"] = true; +dojo.provide("dojox.fx"); + +dojo.require("dojox.fx._base"); + +} diff --git a/includes/js/dojox/fx/README b/includes/js/dojox/fx/README new file mode 100644 index 0000000..7eb06a8 --- /dev/null +++ b/includes/js/dojox/fx/README @@ -0,0 +1,77 @@ +------------------------------------------------------------------------------- +dojox.fx +------------------------------------------------------------------------------- +Version 1.0.0 +Release date: 10/31/2007 +------------------------------------------------------------------------------- +Project state: +prototype / experimental +------------------------------------------------------------------------------- +Credits + Peter Higgins (dante) + Jonathan Bond-Caron (jbondc@gmail.com) + Shane O'Sullivan (shaneosullivan1@gmail.com) + Bryan Forbes (bforbes) + +------------------------------------------------------------------------------- +Project description + + dojox.fx provides a class of animation effects to use, and + other animation and Effects additions to dojo base. + +------------------------------------------------------------------------------- +Dependencies: + + dojox.fx requires dojo (core) and the dojo.fx package + dojox.fx.easing requires only dojo core. + dojox.fx.scroll requires dojox.fx._core and dojo.fx + +------------------------------------------------------------------------------- +Documentation + + existing API surface: + + dojox.fx._base: + - dojox.fx.crossFade - crossfade two nodes easily + - dojox.fx.sizeTo - size a node about it's center to a new width/height + - dojox.fx.slideBy - slide a node by a t,l offset + - dojox.fx.highlight - animates the background color of a node, and returns + it to the color it was. + + (all use standard _Animation properties, like duration, easing, node, etc) + + dojox.fx._core: + - dojox.fx._Line - a 2-d _Line implementation, backwards compatible with + dojo._Line ... you might could safely do something akin to + dojo._Line.prototype = dojox.fx._Line.prototype; + and enable this for all dojo _Animations? + + dojox.fx.style: - experimental CSS animation via class definitions + - dojox.fx.addClass - animate the effects of applying a class to a node + - dojox.fx.removeClass - " " " " removing a class from a node + - dojox.fx.toggleClass - wrapper for addClass/removeClass + + dojox.fx.easing: - a collection of easing functions to use + this is a "stand alone" class, and can be used via: + dojo.require("dojox.fx.easing"); + to use in an _Animation easing: property + ported/decoded by Bryan Forbes from Robert Penner's Flash easing + functions, contributed under CLA. + + dojox.fx.ext-dojo.NodeList - extensions to dojo.NodeList-fx wrapping the + relevant dojox.fx animations into dojo.NodeList + + dojox.fx.Shadow - Class to add drop shadows to a node + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/dojo/dojox/trunk/fx.js +http://svn.dojotoolkit.org/dojo/dojox/trunk/fx/* + +Install into the following directory structure: +/dojox/fx/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/fx/Shadow.js b/includes/js/dojox/fx/Shadow.js new file mode 100644 index 0000000..7ed4c55 --- /dev/null +++ b/includes/js/dojox/fx/Shadow.js @@ -0,0 +1,151 @@ +if(!dojo._hasResource["dojox.fx.Shadow"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx.Shadow"] = true; +dojo.provide("dojox.fx.Shadow"); +dojo.experimental("dojox.fx.Shadow"); + +dojo.require("dijit._Widget"); +dojo.require("dojo.NodeList-fx"); + +dojo.declare("dojox.fx.Shadow", + dijit._Widget,{ + // summary: Adds a drop-shadow to a node. + // + // example: + // | // add drop shadows to all nodes with class="hasShadow" + // | dojo.query(".hasShadow").forEach(function(n){ + // | var foo = new dojox.fx.Shadow({ node: n }); + // | foo.startup(); + // | }); + // + // shadowPng: String + // Base location for drop-shadow images + shadowPng: dojo.moduleUrl("dojox.fx", "resources/shadow"), + + // shadowThickness: Integer + // How wide (in px) to make the shadow + shadowThickness: 7, + + // shadowOffset: Integer + // How deep to make the shadow appear to be + shadowOffset: 3, + + // opacity: Float + // Overall opacity of the shadow + opacity: 0.75, + + // animate: Boolean + // A toggle to disable animated transitions + animate: false, + + // node: DomNode + // The node we will be applying this shadow to + node: null, + + startup: function(){ + // summary: Initializes the shadow. + + this.inherited(arguments); + this.node.style.position = "relative"; + // make all the pieces of the shadow, and position/size them as much + // as possible (but a lot of the coordinates are set in sizeShadow + this.pieces={}; + var x1 = -1 * this.shadowThickness; + var y0 = this.shadowOffset; + var y1 = this.shadowOffset + this.shadowThickness; + this._makePiece("tl", "top", y0, "left", x1); + this._makePiece("l", "top", y1, "left", x1, "scale"); + this._makePiece("tr", "top", y0, "left", 0); + this._makePiece("r", "top", y1, "left", 0, "scale"); + this._makePiece("bl", "top", 0, "left", x1); + this._makePiece("b", "top", 0, "left", 0, "crop"); + this._makePiece("br", "top", 0, "left", 0); + + this.nodeList = dojo.query(".shadowPiece",this.node); + + this.setOpacity(this.opacity); + this.resize(); + }, + + _makePiece: function(name, vertAttach, vertCoord, horzAttach, horzCoord, sizing){ + // summary: append a shadow pieces to the node, and position it + var img; + var url = this.shadowPng + name.toUpperCase() + ".png"; + if((dojo.isIE)&&(dojo.isIE<7)){ + img=document.createElement("div"); + img.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"'"+ + (sizing?", sizingMethod='"+sizing+"'":"") + ")"; + }else{ + img=document.createElement("img"); + img.src=url; + } + + img.style.position="absolute"; + img.style[vertAttach]=vertCoord+"px"; + img.style[horzAttach]=horzCoord+"px"; + img.style.width=this.shadowThickness+"px"; + img.style.height=this.shadowThickness+"px"; + dojo.addClass(img,"shadowPiece"); + this.pieces[name]=img; + this.node.appendChild(img); + + }, + + setOpacity: function(/* Float */n,/* Object? */animArgs){ + // summary: set the opacity of the underlay + // note: does not work in IE? FIXME. + if(dojo.isIE){ return; } + if(!animArgs){ animArgs = {}; } + if(this.animate){ + var _anims = []; + this.nodeList.forEach(function(node){ + _anims.push(dojo._fade(dojo.mixin(animArgs,{ node: node, end: n }))); + }); + dojo.fx.combine(_anims).play(); + }else{ + this.nodeList.style("opacity",n); + } + + }, + + setDisabled: function(/* Boolean */disabled){ + // summary: enable / disable the shadow + if(disabled){ + if(this.disabled){ return; } + if(this.animate){ this.nodeList.fadeOut().play(); + }else{ this.nodeList.style("visibility","hidden"); } + this.disabled = true; + }else{ + if(!this.disabled){ return; } + if(this.animate){ this.nodeList.fadeIn().play(); + }else{ this.nodeList.style("visibility","visible"); } + this.disabled = false; + } + }, + + resize: function(/* dojox.fx._arg.ShadowResizeArgs */args){ + // summary: Resizes the shadow based on width and height. + var x; var y; + if(args){ x = args.x; y = args.y; + }else{ + var co = dojo._getBorderBox(this.node); + x = co.w; y = co.h; + } + var sideHeight = y - (this.shadowOffset+this.shadowThickness); + if (sideHeight < 0) { sideHeight = 0; } + if (y < 1) { y = 1; } + if (x < 1) { x = 1; } + with(this.pieces){ + l.style.height = sideHeight+"px"; + r.style.height = sideHeight+"px"; + b.style.width = x+"px"; + bl.style.top = y+"px"; + b.style.top = y+"px"; + br.style.top = y+"px"; + tr.style.left = x+"px"; + r.style.left = x+"px"; + br.style.left = x+"px"; + } + } +}); + +} diff --git a/includes/js/dojox/fx/_arg.js b/includes/js/dojox/fx/_arg.js new file mode 100644 index 0000000..b90f0d9 --- /dev/null +++ b/includes/js/dojox/fx/_arg.js @@ -0,0 +1,27 @@ +if(!dojo._hasResource["dojox.fx._arg"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx._arg"] = true; +dojo.provide("dojox.fx._arg"); + +dojox.fx._arg.StyleArgs = function(/*Object*/ args){ + // summary: + // The node and CSS class to use for style manipulations. + // node: DOMNode + // The node to manipulate + // cssClass: String + // The class to use during the manipulation + this.node = args.node; + this.cssClass = args.cssClass; +} + +dojox.fx._arg.ShadowResizeArgs = function(/*Object*/ args){ + // summary: + // The odd way to document object parameters. + // x: Integer + // the width to set + // y: Integer + // the height to set + this.x = args.x; + this.y = args.y; +} + +} diff --git a/includes/js/dojox/fx/_base.js b/includes/js/dojox/fx/_base.js new file mode 100644 index 0000000..61d23a7 --- /dev/null +++ b/includes/js/dojox/fx/_base.js @@ -0,0 +1,240 @@ +if(!dojo._hasResource["dojox.fx._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx._base"] = true; +dojo.provide("dojox.fx._base"); +// summary: add-on Animations to dojo.fx + +dojo.require("dojo.fx"); + +dojox.fx.sizeTo = function(/* Object */args){ + // summary: Create an animation that will size a node + // description: + // Returns an animation that will size "node" + // defined in args Object about it's center to + // a width and height defined by (args.width, args.height), + // supporting an optional method: chain||combine mixin + // (defaults to chain). + // + // - works best on absolutely or relatively positioned elements? + // + // example: + // | // size #myNode to 400px x 200px over 1 second + // | dojo.fx.sizeTo({ node:'myNode', + // | duration: 1000, + // | width: 400, + // | height: 200, + // | method: "chain" + // | }).play(); + // + var node = (args.node = dojo.byId(args.node)); + + var method = args.method || "chain"; + if(!args.duration){ args.duration = 500; } // default duration needed + if (method=="chain"){ args.duration = Math.floor(args.duration/2); } + + var top, newTop, left, newLeft, width, height = 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); + width = parseInt(cs.width); + height = parseInt(cs.height); + + newLeft = left - Math.floor((args.width - width)/2); + newTop = top - Math.floor((args.height - height)/2); + + 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 anim1 = dojo.animateProperty(dojo.mixin({ + properties: { + height: { start: height, end: args.height || 0, unit:"px" }, + top: { start: top, end: newTop } + } + }, args)); + var anim2 = dojo.animateProperty(dojo.mixin({ + properties: { + width: { start: width, end: args.width || 0, unit:"px" }, + left: { start: left, end: newLeft } + } + }, args)); + + var anim = dojo.fx[((args.method == "combine") ? "combine" : "chain")]([anim1,anim2]); + dojo.connect(anim, "beforeBegin", anim, init); + return anim; // dojo._Animation +}; + +dojox.fx.slideBy = function(/* Object */args){ + // summary: Returns an animation to slide a node by a defined offset. + // + // description: + // Returns an animation that will slide a node (args.node) from it's + // current position to it's current posision plus the numbers defined + // in args.top and args.left. standard dojo.fx mixin's apply. + // + // example: + // | // slide domNode 50px down, and 22px left + // | dojox.fx.slideBy({ + // | node: domNode, duration:400, + // | top: 50, left: -22 + // | }).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: { + // FIXME: is there a way to update the _Line after creation? + // null start values allow chaining to work, animateProperty will + // determine them for us (except in ie6? -- ugh) + top: { /* start: top, */ end: top+(args.top||0) }, + left: { /* start: left,*/ end: left+(args.left||0) } + } + }, args)); + dojo.connect(_anim,"beforeBegin",_anim,init); + return _anim; // dojo._Animation +}; + +dojox.fx.crossFade = function(/* Object */args){ + // summary: Returns an animation cross fading two element simultaneously + // + // args: + // args.nodes: Array - two element array of domNodes, or id's + // + // all other standard animation args mixins apply. args.node ignored. + // + if(dojo.isArray(args.nodes)){ + // simple check for which node is visible, maybe too simple? + var node1 = args.nodes[0] = dojo.byId(args.nodes[0]); + var op1 = dojo.style(node1,"opacity"); + var node2 = args.nodes[1] = dojo.byId(args.nodes[1]); + var op2 = dojo.style(node2, "opacity"); + + var _anim = dojo.fx.combine([ + dojo[((op1==0)?"fadeIn":"fadeOut")](dojo.mixin({ + node: node1 + },args)), + dojo[((op1==0)?"fadeOut":"fadeIn")](dojo.mixin({ + node: node2 + },args)) + ]); + return _anim; // dojo._Animation + }else{ + // improper syntax in args, needs Array + return false; // Boolean + } +}; + +dojox.fx.highlight = function(/*Object*/ args){ + // summary: Highlight a node + // description: + // Returns an animation that sets the node background to args.color + // then gradually fades back the original node background color + // + // example: + // dojox.fx.highlight({ node:"foo" }).play(); + + var node = (args.node = dojo.byId(args.node)); + + args.duration = args.duration || 400; + // Assign default color light yellow + var startColor = args.color || '#ffff99'; + var endColor = dojo.style(node, "backgroundColor"); + var wasTransparent = (endColor == "transparent" || endColor == "rgba(0, 0, 0, 0)"); + + var anim = dojo.animateProperty(dojo.mixin({ + properties: { + backgroundColor: { start: startColor, end: endColor } + } + }, args)); + + dojo.connect(anim, "onEnd", anim, function(){ + if(wasTransparent){ + node.style.backgroundColor = "transparent"; + } + }); + + return anim; // dojo._Animation +}; + + +dojox.fx.wipeTo = function(/*Object*/ args){ + // summary: Animate a node wiping to a specific width or height + // + // description: + // Returns an animation that will expand the + // node defined in 'args' object from it's current to + // the height or width value given by the args object. + // + // default to height:, so leave height null and specify width: + // to wipeTo a width. note: this may be deprecated by a + // + // Note that the final value should not include + // units and should be an integer. Thus a valid args object + // would look something like this: + // + // dojox.fx.wipeTo({node: "nodeId", height: 200}).play(); + // + // Node must have no margin/border/padding, so put another + // node inside your target node for additional styling. + + args.node = dojo.byId(args.node); + var node = args.node, s = node.style; + + var dir = (args.width ? "width" : "height"); + var endVal = args[dir]; + + var props = {}; + props[dir] = { + // 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[dir] = "1px"; + s.display=""; + s.visibility=""; + return 1; + }else{ + var now = dojo.style(node,dir); + return Math.max(now, 1); + } + }, + end: endVal, + unit: "px" + }; + + var anim = dojo.animateProperty(dojo.mixin({ properties: props },args)); + return anim; // dojo._Animation +} + +} diff --git a/includes/js/dojox/fx/_core.js b/includes/js/dojox/fx/_core.js new file mode 100644 index 0000000..54698ad --- /dev/null +++ b/includes/js/dojox/fx/_core.js @@ -0,0 +1,60 @@ +if(!dojo._hasResource["dojox.fx._core"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx._core"] = true; +dojo.provide("dojox.fx._core"); + +dojox.fx._Line = function(start, end){ + // summary: a custom _Line to accomodate multi-dimensional values + // + // description: + // a normal dojo._Line is the curve, and does Line(start,end) + // for propertyAnimation. as we make more complicatied animations, we realize + // some properties can have 2, or 4 values relevant (x,y) or (t,l,r,b) for example + // + // this function provides support for those Lines, and is ported directly from 0.4 + // this is a lot of extra code for something so seldom used, so we'll put it here as + // and optional core addition. you can create a new line, and use it during onAnimate + // as you see fit. + // + // start: Integer|Array + // An Integer (or an Array of integers) to use as a starting point + // end: Integer|Array + // An Integer (or an Array of integers) to use as an ending point + // + // example: see dojox.fx.smoothScroll + // + // example: + // | // this is 10 .. 100 and 50 .. 500 + // | var curve = new dojox.fx._Line([10,50],[100,500]); + // | // dojo._Animation.onAnimate is called at every step of the animation + // | // to define current values. this _Line returns an array + // | // at each step. arguments[0] and [1] in this example. + // + this.start = start; + this.end = end; + if(dojo.isArray(start)){ + // multi-dimensional branch + var diff = []; + dojo.forEach(this.start, function(s,i){ + diff[i] = this.end[i] - s; + }, this); + + this.getValue = function(/*float*/ n){ + var res = []; + dojo.forEach(this.start, function(s, i){ + res[i] = (diff[i] * n) + s; + }, this); + return res; // Array + } + }else{ + // single value branch, document here for both branches: + var diff = end - start; + this.getValue = function(/*float*/ n){ + // summary: Returns the point on the line, or an array of points + // n: a floating point number greater than 0 and less than 1 + // returns: Mixed + return (diff * n) + this.start; // Decimal + } + } +}; + +} diff --git a/includes/js/dojox/fx/easing.js b/includes/js/dojox/fx/easing.js new file mode 100644 index 0000000..444a8e9 --- /dev/null +++ b/includes/js/dojox/fx/easing.js @@ -0,0 +1,223 @@ +if(!dojo._hasResource["dojox.fx.easing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx.easing"] = true; +dojo.provide("dojox.fx.easing"); +/* + dojox.fx.easing is in this little file so you don't need dojox.fx to utilize this. + dojox.fx has a lot of fun animations, but this module is optimized for size ... + +*/ +dojox.fx.easing = { + // summary: Collection of easing functions to use beyond the default dojo._defaultEasing + // + // description: + // Easing functions are used to manipulate the iteration through + // an _Animation's _Line. _Line being the properties of an Animation, + // and the easing function progresses through that Line determing + // how quickly (or slowly) it should go. Or more accurately: modify + // the value of the _Line based on the percentage of animation completed. + // + // example: + // | dojo.require("dojox.fx.easing"); + // | var anim = dojo.fadeOut({ + // | node: 'node', + // | duration: 2000, + // | easing: dojox.fx.easing.quadIn + // | }).play(); + // + + linear: function(/* Decimal? */n){ + // summary: A linear easing function + return n; + }, + + quadIn: function(/* Decimal? */n){ + return Math.pow(n, 2); + }, + + quadOut: function(/* Decimal? */n){ + return n * (n-2) * -1; + }, + + quadInOut: function(/* Decimal? */n){ + n=n*2; + if(n<1){ return Math.pow(n, 2) / 2; } + return -1 * ((--n)*(n-2) - 1) / 2; + }, + + cubicIn: function(/* Decimal? */n){ + return Math.pow(n, 3); + }, + + cubicOut: function(/* Decimal? */n){ + return Math.pow(n-1, 3) + 1; + }, + + cubicInOut: function(/* Decimal? */n){ + n=n*2; + if(n<1){ return Math.pow(n, 3) / 2; } + n-=2; + return (Math.pow(n, 3) + 2) / 2; + }, + + quartIn: function(/* Decimal? */n){ + return Math.pow(n, 4); + }, + + quartOut: function(/* Decimal? */n){ + return -1 * (Math.pow(n-1, 4) - 1); + }, + + quartInOut: function(/* Decimal? */n){ + n=n*2; + if(n<1){ return Math.pow(n, 4) / 2; } + n-=2; + return -1/2 * (Math.pow(n, 4) - 2); + }, + + quintIn: function(/* Decimal? */n){ + return Math.pow(n, 5); + }, + + quintOut: function(/* Decimal? */n){ + return Math.pow(n-1, 5) + 1; + }, + + quintInOut: function(/* Decimal? */n){ + n=n*2; + if(n<1){ return Math.pow(n, 5) / 2; }; + n-=2; + return (Math.pow(n, 5) + 2) / 2; + }, + + sineIn: function(/* Decimal? */n){ + return -1 * Math.cos(n * (Math.PI/2)) + 1; + }, + + sineOut: function(/* Decimal? */n){ + return Math.sin(n * (Math.PI/2)); + }, + + sineInOut: function(/* Decimal? */n){ + return -1 * (Math.cos(Math.PI*n) - 1) / 2; + }, + + expoIn: function(/* Decimal? */n){ + return (n==0) ? 0 : Math.pow(2, 10 * (n - 1)); + }, + + expoOut: function(/* Decimal? */n){ + return (n==1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1); + }, + + expoInOut: function(/* Decimal? */n){ + if(n==0){ return 0; } + if(n==1){ return 1; } + n = n*2; + if(n<1){ return Math.pow(2, 10 * (n-1)) / 2; } + --n; + return (-1 * Math.pow(2, -10 * n) + 2) / 2; + }, + + circIn: function(/* Decimal? */n){ + return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); + }, + + circOut: function(/* Decimal? */n){ + n = n-1; + return Math.sqrt(1 - Math.pow(n, 2)); + }, + + circInOut: function(/* Decimal? */n){ + n = n*2; + if(n<1){ return -1/2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); } + n-=2; + return 1/2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1); + }, + + backIn: function(/* Decimal? */n){ + var s = 1.70158; + return Math.pow(n, 2) * ((s+1)*n - s); + }, + + backOut: function(/* Decimal? */n){ + // summary: an easing function that pops past the range briefly, and + // slowly comes back. + n = n - 1; + var s = 1.70158; + return Math.pow(n, 2) * ((s + 1) * n + s) + 1; + }, + + backInOut: function(/* Decimal? */n){ + var s = 1.70158 * 1.525; + n = n*2; + if(n < 1){ return (Math.pow(n, 2)*((s+1)*n - s))/2; } + n-=2; + return (Math.pow(n, 2)*((s+1)*n + s) + 2)/2; + }, + + elasticIn: function(/* Decimal? */n){ + if(n==0){ return 0; } + if(n==1){ return 1; } + var p = .3; + var s = p/4; + n = n - 1; + return -1 * Math.pow(2,10*n) * Math.sin((n-s)*(2*Math.PI)/p); + }, + + elasticOut: function(/* Decimal? */n){ + // summary: An easing function that elasticly snaps around the target value, near the end of the Animation + if(n==0) return 0; + if(n==1) return 1; + var p = .3; + var s = p/4; + return Math.pow(2,-10*n) * Math.sin((n-s)*(2*Math.PI)/p) + 1; + }, + + elasticInOut: function(/* Decimal? */n){ + // summary: An easing function that elasticly snaps around the value, near the beginning and end of the Animation + if(n==0) return 0; + n = n*2; + if(n==2) return 1; + var p = .3*1.5; + var s = p/4; + if(n<1){ + n-=1; + return -.5*(Math.pow(2,10*n) * Math.sin((n-s)*(2*Math.PI)/p)); + } + n-=1; + return .5*(Math.pow(2,-10*n) * Math.sin((n-s)*(2*Math.PI)/p)) + 1; + }, + + bounceIn: function(/* Decimal? */n){ + // summary: An easing function that "bounces" near the beginning of an Animation + return (1 - dojox.fx.easing.bounceOut(1-n)); // Decimal + }, + + bounceOut: function(/* Decimal? */n){ + // summary: An easing function that "bounces" near the end of an Animation + var s=7.5625; + var p=2.75; + var l; + if(n < (1 / p)){ + l = s*Math.pow(n, 2); + }else if(n < (2 / p)){ + n -= (1.5 / p); + l = s * Math.pow(n, 2) + .75; + }else if(n < (2.5 / p)){ + n -= (2.25 / p); + l = s * Math.pow(n, 2) + .9375; + }else{ + n -= (2.625 / p); + l = s * Math.pow(n, 2) + .984375; + } + return l; + }, + + bounceInOut: function(/* Decimal? */n){ + // summary: An easing function that "bounces" at the beginning and end of the Animation + if(n<0.5){ return dojox.fx.easing.bounceIn(n*2) / 2; } + return (dojox.fx.easing.bounceOut(n*2-1) / 2) + 0.5; // Decimal + } +}; + +} diff --git a/includes/js/dojox/fx/ext-dojo/NodeList.js b/includes/js/dojox/fx/ext-dojo/NodeList.js new file mode 100644 index 0000000..486b5fe --- /dev/null +++ b/includes/js/dojox/fx/ext-dojo/NodeList.js @@ -0,0 +1,66 @@ +if(!dojo._hasResource["dojox.fx.ext-dojo.NodeList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx.ext-dojo.NodeList"] = true; +dojo.provide("dojox.fx.ext-dojo.NodeList"); +dojo.experimental("dojox.fx.ext-dojo.NodeList"); +// summary: Core extensions to dojo.NodeList providing addtional fx to dojo.NodeList-fx +// description: +// A Package to extend dojo base NodeList with fx provided by the dojox.fx project. +// These are experimental animations, in an experimental + +dojo.require("dojo.NodeList-fx"); +dojo.require("dojox.fx"); + +dojo.extend(dojo.NodeList, { + + sizeTo: function(args){ + // summary: + // size all elements of this NodeList. Returns an instance of dojo._Animation + // example: + // | // size all divs with class "blah" + // | dojo.query("div.blah").sizeTo({ + // | width:50, + // | height:50 + // | }).play(); + return this._anim(dojox.fx, "sizeTo", args); // dojo._Animation + }, + + slideBy: function(args){ + // summary: + // slide all elements of this NodeList. Returns an instance of dojo._Animation + // + // example: + // | // slide all tables with class "blah" 10 px + // | dojo.query("table.blah").slideBy({ top:10, left:10 }).play(); + return this._anim(dojox.fx, "slideBy", args); // dojo._Animation + }, + + highlight: function(args){ + // summary: + // highlight all elements of the node list. + // Returns an instance of dojo._Animation + // example: + // | // highlight all links with class "foo" + // | dojo.query("a.foo").hightlight().play(); + return this._anim(dojox.fx, "highlight", args); // dojo._Animation + }, + + fadeTo: function(args){ + // summary: + // fade all elements of the node list to a specified opacity + // example: + // | // fade all elements with class "bar" to to 50% opacity + // | dojo.query(".bar").fadeTo({ end: 0.5 }).play(); + return this._anim(dojo,"_fade",args); + }, + + wipeTo: function(args){ + // summary: + // Wipe all elements of the NodeList to a specified width: or height: + // example: + // | dojo.query(".box").wipeTo({ width: 300px }).play(); + return this._anim(dojox.fx, "wipeTo", args); + } + +}); + +} diff --git a/includes/js/dojox/fx/resources/shadowB.png b/includes/js/dojox/fx/resources/shadowB.png new file mode 100644 index 0000000000000000000000000000000000000000..0da8a2ad4783f171d1f36c0b58b3a85594dd3bc7 GIT binary patch literal 470 zcmV;{0V)28P)u*sYyhTw=2-vc@swm#|9LCdIZ`@Y}40Dx**$MJUY z+5i9ma7J_yJO04T?f-h9_@UK9EzTlwdw_nm4@F+jhHK}Ws5$!=}6<+!#FO#lE(*dAZs+5iB{ z@u#1yEt_m=(>Icf@cVXNUlv-RZxhuf+kDx4u)s420Ci!K*~C}r)UM_K&u;R&Ezopt+uFI$Z$7Kk^GS_ttO&jz&&bALYnpUA U#q`uNplcaCUHx3vIVCg!0E^;nRR910 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/resources/shadowBR.png b/includes/js/dojox/fx/resources/shadowBR.png new file mode 100644 index 0000000000000000000000000000000000000000..ee704df903cf22e2989b4c620f830ba7d592fca9 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmUfZd~z?Faq)=OI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iXb_d_{tA)KS_9#|1ioc^WJa4gTe~DWM4f;q7Qb literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/resources/shadowL.png b/includes/js/dojox/fx/resources/shadowL.png new file mode 100644 index 0000000000000000000000000000000000000000..67ebc2e597293a85b51801780855c770cf4eca59 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!3HEBGrV^OQY`6?zK#qG*KS<#k1zuAB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%sd>6MhE&{2^6~HxNJ~w9`v3p` s{RYg;%^DqPDJd);cQ%+vJ2WsdY+l5*isNQfDNqN4r>mdKI;Vst02(ALZvX%Q literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/resources/shadowR.png b/includes/js/dojox/fx/resources/shadowR.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0c99d9fbdbc542630943a2bfa78cc508d99124 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!3HEBGrV^OQY`6?zK#qG*KS<#k1zuAB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%se8IOhE&{2^6~W4OixJo!FEJm uQd08%pWol#^G^8N*4p}1*+WL*0K=Ab+z$8UZ#n?AFnGH9xvX;z7|Kf~=2a{qL7}*#$nzL`3IayN{sEfhV)z4*}Q$iB}dqFJr literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/resources/shadowTL.png b/includes/js/dojox/fx/resources/shadowTL.png new file mode 100644 index 0000000000000000000000000000000000000000..388742ae9099877c2724618926f9640b9f0e3c69 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmUfZd~z?Faq)=OI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iz7z)^n7w-7IuX2`JnAgS^Q-Z9|2fyoz%3ds!(Y|Tv z6up*&Z?)=-R!W~bP0l+XkKx_)ym literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/scroll.js b/includes/js/dojox/fx/scroll.js new file mode 100644 index 0000000..34111a2 --- /dev/null +++ b/includes/js/dojox/fx/scroll.js @@ -0,0 +1,40 @@ +if(!dojo._hasResource["dojox.fx.scroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx.scroll"] = true; +dojo.provide("dojox.fx.scroll"); +dojo.experimental("dojox.fx.scroll"); + +dojo.require("dojox.fx._core"); + +dojox.fx.smoothScroll = function(/* Object */args){ + // summary: Returns an animation that will smooth-scroll to a node (specified in etup()) + // description: This implementation support either horizental or vertical scroll, as well as + // both. In addition, element in iframe can be scrolled to correctly. + // offset: {x: int, y: int} this will be added to the target position + // duration: Duration of the animation in milliseconds. + // win: a node or window object to scroll + + if(!args.target){ args.target = dojo.coords(args.node,true); } + + var isWindow = dojo[(dojo.isIE ? "isObject" : "isFunction")](args["win"].scrollTo); + + var _anim = (isWindow) ? + (function(val){ + args.win.scrollTo(val[0],val[1]); + }) : + (function(val){ + args.win.scrollLeft = val[0]; + args.win.scrollTop = val[1]; + }); + + var anim = new dojo._Animation(dojo.mixin({ + beforeBegin: function(){ + if(this.curve){ delete this.curve; } + var current = isWindow ? dojo._docScroll() : {x: args.win.scrollLeft, y: args.win.scrollTop}; + anim.curve = new dojox.fx._Line([current.x,current.y],[args.target.x,args.target.y]); + }, + onAnimate: _anim + },args)); + return anim; // dojo._Animation +}; + +} diff --git a/includes/js/dojox/fx/style.js b/includes/js/dojox/fx/style.js new file mode 100644 index 0000000..895de9a --- /dev/null +++ b/includes/js/dojox/fx/style.js @@ -0,0 +1,219 @@ +if(!dojo._hasResource["dojox.fx.style"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.fx.style"] = true; +dojo.provide("dojox.fx.style"); +dojo.experimental("dojox.fx.style"); +// +// summary: dojox.fx CSS Class _Animations: +// +// description: a set of functions to animate properties based on +// normalized CSS class definitions. +// +// provides: addClass, removeClass, and toggleClass +// +dojo.require("dojox.fx._base"); + +// FIXME: should the call signatures match dojo.addClass/removeClass/toggleClass and extend +// by having a third (or fourth) param to mix in additional _Animation args for advanced +// usage (delay: curve: repeat: easing: etc ... ) + +dojox.fx.addClass = function(/*dojox.fx._arg.StyleArgs*/ args){ + // summary: Animate the effects of adding a class to a node + // description: + // Creates an animation that will animate + // the properties of a node to the properties + // defined in a standard CSS .class definition. + // (calculating the differences itself) + // + // example: + // | + // | .bar { line-height: 12px; } + // | .foo { line-height: 40px; } + // |
            + // | Multi
            line
            text + // |
            + // | + // | // animate to line-height:40px + // | dojo.fx.addClass({ node:"test", cssClass:"foo" }).play(); + // + var node = (args.node = dojo.byId(args.node)); + + var pushClass = (function(n){ + // summary: onEnd we want to add the class to the node + // (as dojo.addClass naturally would) in case our + // class parsing misses anything the browser would + // otherwise interpret. this may cause some flicker, + // and will only apply the class so children can inherit + // after the animation is done (potentially more flicker) + return function(){ + dojo.addClass(n, args.cssClass); + n.style.cssText = _beforeStyle; + } + })(node); + + // _getCalculatedStleChanges is the core of our style/class animations + var mixedProperties = dojox.fx._getCalculatedStyleChanges(args,true); + var _beforeStyle = node.style.cssText; + var _anim = dojo.animateProperty(dojo.mixin({ + properties: mixedProperties + },args)); + dojo.connect(_anim,"onEnd",_anim,pushClass); + return _anim; // dojo._Animation +}; + +dojox.fx.removeClass = function(/*dojox.fx._arg.StyleArgs*/ args){ + // summary: Animate the effects of removing a class from a node + // description: + // Creates an animation that will animate the properties of a + // node (args.node) to the properties calculated after removing + // a standard CSS className from a that node. + // + // calls dojo.removeClass(args.cssClass) onEnd of animation + // + // standard dojo._Animation object rules apply. + // + // example: + // | // animate the removal of "foo" from a node with id="bar" + // | dojox.fx.removeClass({ + // | node: "bar", + // | cssClass: "foo" + // | }).play(); + + var node = (args.node = dojo.byId(args.node)); + + var pullClass = (function(n){ + // summary: onEnd we want to remove the class from the node + // (as dojo.removeClass naturally would) in case our class + // parsing misses anything the browser would otherwise + // interpret. this may cause some flicker, and will only + // apply the class so children can inherit after the + // animation is done (potentially more flicker) + // + return function(){ + dojo.removeClass(n, args.cssClass); + n.style.cssText = _beforeStyle; + } + })(node); + + var mixedProperties = dojox.fx._getCalculatedStyleChanges(args,false); + var _beforeStyle = node.style.cssText; + var _anim = dojo.animateProperty(dojo.mixin({ + properties: mixedProperties + },args)); + dojo.connect(_anim,"onEnd",_anim,pullClass); + return _anim; // dojo._Animation +}; + +dojox.fx.toggleClass = function(/*DomNode|String*/node, /*String*/cssClass, /*Boolean?*/condition){ + // summary: + // Animate the effects of Toggling a class on a Node + // + // description: + // creates an animation that will animate the effect of + // toggling a class on or off of a node. + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // node: + // The domNode (or string of the id) to toggle + // cssClass: + // String of the classname to add to the node + // condition: + // If passed, true means to add the class, false means to remove. + // + // example: + // | // add the class "sampleClass" to a node id="theNode" + // | dojox.fx.toggleClass("theNode","sampleClass",true).play(); + // example: + // | // toggle the class "sampleClass" on the node id="theNode" + // | dojox.fx.toggleClass("theNode","sampleClass").play(); + + if(typeof condition == "undefined"){ + condition = !dojo.hasClass(node, cssClass); + } + return dojox.fx[(condition ? "addClass" : "removeClass")]({ node: node, cssClass:cssClass }); // dojo._Animation + // TODO: support 4th param animMixin to allow passing of easing and duration and other _Animtion options +}; + +dojox.fx._allowedProperties = [ + // summary: Our pseudo map of properties we will check for. + // description: + // it should be much more intuitive. a way to normalize and + // "predict" intent, or even something more clever ... + // open to suggestions. + + // no-brainers: + "width", + "height", + // only if position = absolute || relative? + "left", "top", // "right", "bottom", + // these need to be filtered through dojo.colors? + // "background", // normalize to: + /* "backgroundImage", */ + // "backgroundPosition", // FIXME: to be effective, this needs "#px #px"? + "backgroundColor", + + "color", + + // "border", + "borderBottomColor", "borderBottomWidth", + "borderTopColor","borderTopWidth", + "borderLeftColor","borderLeftWidth", + "borderRightColor","borderRightWidth", + + // "padding", // normalize to: + "paddingLeft", "paddingRight", "paddingTop", "paddingBottom", + // "margin", // normalize to: + "marginLeft", "marginTop", "marginRight", "marginBottom", + + // unit import/delicate?: + "lineHeight", + "letterSpacing", + "fontSize" +]; + +dojox.fx._getStyleSnapshot = function(/* Object */cache){ + // summary: + // uses a dojo.getComputedStyle(node) cache reference and + // iterates through the 'documented/supported animate-able' + // properties. + // + // returns: Array + // an array of raw, calculcated values (no keys), to be normalized/compared + // elsewhere + return dojo.map(dojox.fx._allowedProperties,function(style){ + return cache[style]; // String + }); // Array +}; + +dojox.fx._getCalculatedStyleChanges = function(/*dojox.fx._arg.StyleArgs*/ args, /*Boolean*/addClass){ + // summary: calclate the difference in style properties between two states + // description: + // calculate and normalize(?) the differences between two states + // of a node (args.node) by quickly adding or removing a class, and + // iterateing over the results of dojox.fx._getStyleSnapshot() + // + // addClass: + // true to calculate what adding a class would do, + // false to calculate what removing the class would do + + var node = (args.node = dojo.byId(args.node)); + var cs = dojo.getComputedStyle(node); + + // take our snapShots + var _before = dojox.fx._getStyleSnapshot(cs); + dojo[(addClass ? "addClass" : "removeClass")](node,args.cssClass); + var _after = dojox.fx._getStyleSnapshot(cs); + dojo[(addClass ? "removeClass" : "addClass")](node,args.cssClass); + + var calculated = {}; + var i = 0; + dojo.forEach(dojox.fx._allowedProperties,function(prop){ + if(_before[i] != _after[i]){ + // FIXME: the static unit: px is not good, either. need to parse unit from computed style? + calculated[prop] = { end: parseInt(_after[i]) /* start: parseInt(_before[i]), unit: 'px' */ }; + } + i++; + }); + return calculated; +}; + +} diff --git a/includes/js/dojox/fx/tests/_animation.css b/includes/js/dojox/fx/tests/_animation.css new file mode 100644 index 0000000..efab455 --- /dev/null +++ b/includes/js/dojox/fx/tests/_animation.css @@ -0,0 +1,97 @@ +.testBox { + border:1px solid #333; + width:75px; + height:75px; +} +.absolutely { position:absolute; + top:0; left:0; +} +.floating { + float:left; +} +.wide { + width:200px; +} +.tall { + height:200px; +} +.tiny { + width:3px; + height:3px; +} +.black { + color:#fff; + background-color:#000; +} +.white { + color:#666; + background-color:#fff; +} +.green { + color:#000; + background-color:#eef; +} +.red { + color:#fff; + background-color:#ffe; +} +.blue { + color:#000; + background-color:#fef !important; +} +.baseFont { + line-height:14px; + font:12px Arial,sans-serif; + letter-spacing:0.1em; +} +.spacedVertical { + line-height:42px; +} +.spacedHorizontal { + letter-spacing:0.42em; +} +.fontSizeTest { + font:20px Arial,sans-serif; +} +.bigMargin { + margin:30px; +} +.noMargin { + margin:0; +} +.mediumMargin { + margin:15px; +} +.bigMarginLeft { + margin-left:150px; +} +.padded { + padding:3px; +} +.noPadding { + padding:0; +} +.topPadding { + padding-top:50px; +} +.bigPadding { + padding:30px; +} +.offsetSome { + top:50px; + left:75px; +} +.topLeft { + top:0; + left:0; +} +.bottomRight { + bottom:0; + right:0; +} +.bothAxis { + top:10px; + left:10px; + right:10px; + bottom:10px; +} diff --git a/includes/js/dojox/fx/tests/_animation.css.commented.css b/includes/js/dojox/fx/tests/_animation.css.commented.css new file mode 100644 index 0000000..ba01d03 --- /dev/null +++ b/includes/js/dojox/fx/tests/_animation.css.commented.css @@ -0,0 +1,113 @@ +.testBox { + border:1px solid #333; + width:75px; + height:75px; +} +.absolutely { position:absolute; + top:0; left:0; +} +.floating { + float:left; +} +.wide { + width:200px; +} +.tall { + height:200px; +} +.tiny { + width:3px; + height:3px; +} + + +.black { + color:#fff; + background-color:#000; +} + +.white { + color:#666; + background-color:#fff; +} + +.green { + color:#000; + background-color:#eef; +} +.red { + color:#fff; + background-color:#ffe; +} +.blue { + color:#000; + background-color:#fef !important; +} + +/* font sizes */ +.baseFont { + line-height:14px; + font:12px Arial,sans-serif; + letter-spacing:0.1em; +} + +.spacedVertical { + line-height:42px; +} +.spacedHorizontal { + letter-spacing:0.42em; +} +.fontSizeTest { + font:20px Arial,sans-serif; +} + +/* margins */ +.bigMargin { + margin:30px; +} +.noMargin { + margin:0; +} +.mediumMargin { + margin:15px; +} +.bigMarginLeft { + margin-left:150px; +} + +/* padding */ +.padded { + padding:3px; +} +.noPadding { + padding:0; +} +.topPadding { + padding-top:50px; +} +.bigPadding { + padding:30px; +} + +/* positioning */ + +.offsetSome { + top:50px; + left:75px; +} + +.topLeft { + top:0; + left:0; +} +.bottomRight { + bottom:0; + right:0; +} + +.bothAxis { + top:10px; + left:10px; + right:10px; + bottom:10px; +} diff --git a/includes/js/dojox/fx/tests/example_Line.html b/includes/js/dojox/fx/tests/example_Line.html new file mode 100644 index 0000000..4177e96 --- /dev/null +++ b/includes/js/dojox/fx/tests/example_Line.html @@ -0,0 +1,80 @@ + + + + using a dojo._Line and dojo._Animation + + + + + + +

            an "animateProperty" for dojox.gfx

            +
            + + + diff --git a/includes/js/dojox/fx/tests/example_backgroundPosition.html b/includes/js/dojox/fx/tests/example_backgroundPosition.html new file mode 100644 index 0000000..5011213 --- /dev/null +++ b/includes/js/dojox/fx/tests/example_backgroundPosition.html @@ -0,0 +1,59 @@ + + + + Animated background position example | The Dojo Toolkit + + + + + + + +

            dojo._Animation test:

            + +

            +

            Test
            +

            + + + diff --git a/includes/js/dojox/fx/tests/example_dojoAnimations.html b/includes/js/dojox/fx/tests/example_dojoAnimations.html new file mode 100644 index 0000000..2365ea1 --- /dev/null +++ b/includes/js/dojox/fx/tests/example_dojoAnimations.html @@ -0,0 +1,442 @@ + + + + + skeleton page | The Dojo Toolkit + + + + + + + + + +
            + +

            Dojo FX: base animations

            + + + + + + + +
            +
            +
             
            +
            +
            + + +

            Animate CSS Properties:

            + + + + + + + +
            +
            +

            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. +

            +
            +
            + +

            dojo.fx - Core animations

            + + + + + + + +
            +
            +
            +
            +
            + +

            dojo.query FX

            + + + + + + + + + + + +
            +
              +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            +
            +

            (FisheyeLite makes this easy. be creative:)

            +
              +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            • even row
            • +
            • odd row
            • +
            • with id
            • +
            • odd row
            • +
            +

            +
            +
            + +
            + + diff --git a/includes/js/dojox/fx/tests/example_easingChart2D.html b/includes/js/dojox/fx/tests/example_easingChart2D.html new file mode 100644 index 0000000..fd0d171 --- /dev/null +++ b/includes/js/dojox/fx/tests/example_easingChart2D.html @@ -0,0 +1,147 @@ + + + + visualising dojo._Animation.easing via dojox.charting + + + + + + + + + + + + + +

            dojox.fx.easing

            + +

            this chart shows time (x axis) vs. position (y axis) for a movement from 0px to 30px modified by easing functions

            + + + +
            +
            +
            + + + diff --git a/includes/js/dojox/fx/tests/images/averycutedog.jpg b/includes/js/dojox/fx/tests/images/averycutedog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..335855e2e2754fa569b68768945d93843faa1133 GIT binary patch literal 40879 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/tests/images/dot.png b/includes/js/dojox/fx/tests/images/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..1287a731343307f4a66077eb5a527ebd058e7d5c GIT binary patch literal 4064 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 Hu0mjfZm_Fy literal 0 HcmV?d00001 diff --git a/includes/js/dojox/fx/tests/test_Nodelist-fx.html b/includes/js/dojox/fx/tests/test_Nodelist-fx.html new file mode 100644 index 0000000..75c7a94 --- /dev/null +++ b/includes/js/dojox/fx/tests/test_Nodelist-fx.html @@ -0,0 +1,282 @@ + + + + dojo.NodeList-fx and dojox.fx.ext-dojo.Nodelist | fx add-ons to dojo.query() + + + + + + + +

            NodeList and dojo.query "magic"

            + +
            +

            stuff going on:

            +
              +
            • watch the startup cycle
            • +
            • click col 6
            • +
            • click top right box
            • +
            • hover to highlight() node
            • +
            +
            + +
            +

            custom query:

            +
            +

            + dojo.query(""); +
            (dojo:)
            + +
            + + +
            + + +
            + + +
            + + + (x: 0, y:0)
            + +
            (dojox:)
            + + +
            + + +
            + + +
            + + +
            + +

            + + + + +
            +
            + +
            +
            1
            +
            2
            +
            3
            +
            4
            +
            5
            +
            6
            +
            7
            + +
            2
            +
            +
            +
            +
            +
            +
            + +
            3
            +
            +
            +
            +
            +
            +
            + +
            4
            +
            +
            +
            +
            +
            +
            + +
            + +
            + HTML AFTER +
            + +

            classes available to play with:

            + +
            +		.testBox
            +		.noIdHere
            +		each row: .rowOne .rowTwo .rowThree .rowFour
            +		each col: .iOne .iTwo .. iSeven
            +		#randomNode, #node9, #node7, #aNode, #node1, #node2, #node4, #node6
            +	
            + +

            the dojo.query() isn't limited to the testDiv, it parses the body. try: dojo.query("fieldset") and slideBy animation

            + + + diff --git a/includes/js/dojox/fx/tests/test_Shadow.html b/includes/js/dojox/fx/tests/test_Shadow.html new file mode 100644 index 0000000..fd21fd2 --- /dev/null +++ b/includes/js/dojox/fx/tests/test_Shadow.html @@ -0,0 +1,93 @@ + + + + dojox.fx.Shadow - Drop Shadows for DomNodes | The Dojo Toolkit + + + + + + + + +

            dojox.fx.Shadow tests

            + +
            +

            with margin:

            +

            Lorem

            + +

            with padding:

            +

            Lorem

            + +

            no padding:

            +

            Lorem

            + +

            position:absolute

            +

            Lorem

            + +
            +
            + + +

            + + + + diff --git a/includes/js/dojox/fx/tests/test_animateClass.html b/includes/js/dojox/fx/tests/test_animateClass.html new file mode 100644 index 0000000..c963ca1 --- /dev/null +++ b/includes/js/dojox/fx/tests/test_animateClass.html @@ -0,0 +1,222 @@ + + + + dojox.fx.style - animatated CSS functions | The Dojo Toolkit + + + + + + + + +

            dojox.fx.style tests

            + +

            + dojox.fx.style provides a few methods to animate the changes that would occur + when adding or removing a class from a domNode. +

            +
              +
            • dojox.fx.addClass(/* Object */)args); // Returns dojo._Animation
            • +
            • dojox.fx.removeClass(/* Object */args); // Returns dojo._Animation
            • +
            • dojox.fx.toggleClass(/* DomNode */node, /* String */cssClass,/* Boolean */force)
            • +
            + + + + + + + +

            testing sizes

            + + + + + + + +
            +
            +
            +
            +
            + +
            + +

            testing position

            +

            This is a div position:relative with a position:absolute div inside. testing various t/l/b/r combos. + normal css inheritance rules apply, so setting .foo .bar if .foo was defined last in the css text, .bar + will take precedent. the below position test shows the results of this: +

            + + + + + +
            +
            +
            + + + + + +

            Some properties + cannot be modified (fontFace, and so on), so to ensure the results at the end + of the animation are applied correctly and fully, the class name is set on the node + via dojo.add/removeClass(). +

            + + + + diff --git a/includes/js/dojox/fx/tests/test_crossFade.html b/includes/js/dojox/fx/tests/test_crossFade.html new file mode 100644 index 0000000..330a34a --- /dev/null +++ b/includes/js/dojox/fx/tests/test_crossFade.html @@ -0,0 +1,145 @@ + + + + dojox.fx - animation sets to use! + + + + + + + +

            dojox.fx.crossFade test

            + + +

            a simple demonstration of two nodes fading simultaneously

            +
            + +
            + +
            box2
            +
            +
            +
            + +

            two nodes with position:relative in a container with position:absolute, crossfading together.

            + +
            +
            + +
            box two
            +
            +
            +
            + +

            simple looping crossfade

            + +
            +
            +
            box one
            + +
            +
            +
            + + + +

            that's all, folks...

            + + + diff --git a/includes/js/dojox/fx/tests/test_easing.html b/includes/js/dojox/fx/tests/test_easing.html new file mode 100644 index 0000000..fa7bf41 --- /dev/null +++ b/includes/js/dojox/fx/tests/test_easing.html @@ -0,0 +1,142 @@ + + + + dojox.fx.easing functions: + + + + + + + +

            dojox.fx.easing function tests:

            + + (click block to play animation, or
            here to do all three) + +
            dojox.fx.easing.easeIn
            +

            +
            dojox.fx.easing.easeOut
            +

            +
            dojox.fx.easing.linear
            +

            +
            dojo default easing
            + +

            + dojox.fx.easing is stand-alone, and does not require the dojox.fx base files. to see a chart + of these functions see example_easingChart2D.html +

            + +
            bounce
            + + + diff --git a/includes/js/dojox/fx/tests/test_highlight.html b/includes/js/dojox/fx/tests/test_highlight.html new file mode 100644 index 0000000..1d5947e --- /dev/null +++ b/includes/js/dojox/fx/tests/test_highlight.html @@ -0,0 +1,45 @@ + + + + dojox.fx.highlight + + + + + + +

            dojox.fx.highlight tests

            + +
            +

            This is the default highlight

            +
            + +
            +

            BRING ATTENTION HERE!

            +
            + +
            +

            Highlight me

            +
            + + test #1 (default) +
            + test #2 (default - play twice) +
            + test #3 +
            + test #4 +
            + highlight via dojo.query + + + diff --git a/includes/js/dojox/fx/tests/test_scroll.html b/includes/js/dojox/fx/tests/test_scroll.html new file mode 100644 index 0000000..a3ec9ed --- /dev/null +++ b/includes/js/dojox/fx/tests/test_scroll.html @@ -0,0 +1,98 @@ + + + + dojox.fx.scroll + + + + + + + + +

            dojox.fx.scroll tests

            + +

            YOU FOUND ME!

            +

            neat.

            +
            + +

            dojox.fx.scroll provides:

            +
              +
            • dojox.fx.smoothScroll()
            • +
            +

            + which will create and return a dojo._Animation to scroll + a window to a desired offset. (or a node that has overflow:auto/hidden, if you pass the domNode as the win: argument) +

            + + +

            getScroll

            +

            + Scroll top: 0
            + Scroll left: 0 +

            + + + +
            + +
            + +
            + +

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            + + +

            getElementsByClass

            + +

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            + +

            ContainsAny

            + +

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            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 vitaerisus.

            + + + diff --git a/includes/js/dojox/fx/tests/test_sizeTo.html b/includes/js/dojox/fx/tests/test_sizeTo.html new file mode 100644 index 0000000..0c21e9b --- /dev/null +++ b/includes/js/dojox/fx/tests/test_sizeTo.html @@ -0,0 +1,142 @@ + + + + dojox.fx.sizeTo | experimental fx add-ons for the Dojo Toolkit + + + + + + + +

            dojox.fx.sizeTo test

            + +

            quick sizeTo API overview:

            + +
            +        dojox.fx.sizeTo({
            +                // basic requirements:
            +                node: "aDomNodeId", // or a domNode reference        
            +                width: 200, // measured in px
            +                height: 200, // measured in px
            +                method: "chain" // is default, or "combine"               
            +        });
            +        
            +

            + little test blocks (works in FF/win/mac + ie6) dojo.query() test +

            + +
            +
            + mouse down / mouse up +
            +
            + hover / exit +
            + +
            + all of em' +
            +
            +
            + + (click the box labeled "all of em'" again to reset all nodes) + + HTML AFTER +
            + + + diff --git a/includes/js/dojox/fx/tests/test_slideBy.html b/includes/js/dojox/fx/tests/test_slideBy.html new file mode 100644 index 0000000..a1a1960 --- /dev/null +++ b/includes/js/dojox/fx/tests/test_slideBy.html @@ -0,0 +1,75 @@ + + + + dojox.fx - animation sets to use! + + + + + + + +

            dojox.fx.slideBy test

            + + top: 50, left:50 + top:-50, left:50 + top:-50, left:-50 + top:50, left:-50 + dojo.query() + chainTest + +
            + lorem. ipsum. +
            + +
            + +
            +
            a
            b
            c
            +
            + + + HTML AFTER +
            + + + + + diff --git a/includes/js/dojox/fx/tests/test_wipeTo.html b/includes/js/dojox/fx/tests/test_wipeTo.html new file mode 100644 index 0000000..539453b --- /dev/null +++ b/includes/js/dojox/fx/tests/test_wipeTo.html @@ -0,0 +1,109 @@ + + + + dojox.fx.wipeTo | experimental fx add-ons for the Dojo Toolkit + + + + + + + +

            dojox.fx.wipeTo test

            + +

            quick sizeTo API overview:

            + +
            +        dojox.fx.wipeTo({
            +                // basic requirements:
            +                node: "aDomNodeId", // or a domNode reference        
            +                width: 200 // measured in px
            +                // height: 200 // measured in px (only one at a time, see sizeTo)         
            +        });
            +        
            + +

            Some test boxes: (id="box1,box2,box3" etc ...)

            + + + + + + + +
            + I am some small text +
            + +
            + I am some small text +
            + +
            + I am some small text +
            + + +
            + +
            + + + diff --git a/includes/js/dojox/gfx.js b/includes/js/dojox/gfx.js new file mode 100644 index 0000000..85cbc52 --- /dev/null +++ b/includes/js/dojox/gfx.js @@ -0,0 +1,40 @@ +if(!dojo._hasResource["dojox.gfx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx"] = true; +dojo.provide("dojox.gfx"); + +dojo.require("dojox.gfx.matrix"); +dojo.require("dojox.gfx._base"); + +(function(){ + var renderers = (typeof dojo.config["gfxRenderer"] == "string" ? + dojo.config["gfxRenderer"] : "svg,vml,silverlight,canvas").split(","); + for(var i = 0; i < renderers.length; ++i){ + switch(renderers[i]){ + case "svg": + //TODO: need more comprehensive test for SVG + if(!dojo.isIE && (navigator.userAgent.indexOf("iPhone") < 0) && (navigator.userAgent.indexOf("iPod") < 0)){ dojox.gfx.renderer = "svg"; } + break; + case "vml": + if(dojo.isIE != 0){ dojox.gfx.renderer = "vml"; } + break; + case "silverlight": + //TODO: need more comprehensive test for Silverlight + if(window.Silverlight){ dojox.gfx.renderer = "silverlight"; } + break; + case "canvas": + //TODO: need more comprehensive test for Canvas + if(dojo.isIE == 0){ dojox.gfx.renderer = "canvas"; } + break; + } + if(dojox.gfx.renderer){ break; } + } + console.log("gfx renderer = " + dojox.gfx.renderer); +})(); + +// include a renderer conditionally +dojo.requireIf(dojox.gfx.renderer == "svg", "dojox.gfx.svg"); +dojo.requireIf(dojox.gfx.renderer == "vml", "dojox.gfx.vml"); +dojo.requireIf(dojox.gfx.renderer == "silverlight", "dojox.gfx.silverlight"); +dojo.requireIf(dojox.gfx.renderer == "canvas", "dojox.gfx.canvas"); + +} diff --git a/includes/js/dojox/gfx/Moveable.js b/includes/js/dojox/gfx/Moveable.js new file mode 100644 index 0000000..2717043 --- /dev/null +++ b/includes/js/dojox/gfx/Moveable.js @@ -0,0 +1,101 @@ +if(!dojo._hasResource["dojox.gfx.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.Moveable"] = true; +dojo.provide("dojox.gfx.Moveable"); + +dojo.require("dojox.gfx.Mover"); + +dojo.declare("dojox.gfx.Moveable", null, { + constructor: function(shape, params){ + // summary: an object, which makes a shape moveable + // shape: dojox.gfx.Shape: a shape object to be moved + // params: Object: an optional object with additional parameters; + // following parameters are recognized: + // delay: Number: delay move by this number of pixels + // mover: Object: a constructor of custom Mover + this.shape = shape; + this.delay = (params && params.delay > 0) ? params.delay : 0; + this.mover = (params && params.mover) ? params.mover : dojox.gfx.Mover; + this.events = [ + this.shape.connect("onmousedown", this, "onMouseDown"), + // cancel text selection and text dragging + //dojo.connect(this.handle, "ondragstart", dojo, "stopEvent"), + //dojo.connect(this.handle, "onselectstart", dojo, "stopEvent") + ]; + }, + + // methods + destroy: function(){ + // summary: stops watching for possible move, deletes all references, so the object can be garbage-collected + dojo.forEach(this.events, this.shape.disconnect, this.shape); + this.events = this.shape = null; + }, + + // mouse event processors + onMouseDown: function(e){ + // summary: event processor for onmousedown, creates a Mover for the shape + // e: Event: mouse event + if(this.delay){ + this.events.push(this.shape.connect("onmousemove", this, "onMouseMove")); + this.events.push(this.shape.connect("onmouseup", this, "onMouseUp")); + this._lastX = e.clientX; + this._lastY = e.clientY; + }else{ + new this.mover(this.shape, 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.clientX - this._lastX) > this.delay || Math.abs(e.clientY - this._lastY) > this.delay){ + this.onMouseUp(e); + new this.mover(this.shape, e, this); + } + dojo.stopEvent(e); + }, + onMouseUp: function(e){ + // summary: event processor for onmouseup, used only for delayed delayed drags + // e: Event: mouse event + this.shape.disconnect(this.events.pop()); + this.shape.disconnect(this.events.pop()); + }, + + // local events + onMoveStart: function(/* dojox.gfx.Mover */ mover){ + // summary: called before every move operation + dojo.publish("/gfx/move/start", [mover]); + dojo.addClass(dojo.body(), "dojoMove"); + }, + onMoveStop: function(/* dojox.gfx.Mover */ mover){ + // summary: called after every move operation + dojo.publish("/gfx/move/stop", [mover]); + dojo.removeClass(dojo.body(), "dojoMove"); + }, + onFirstMove: function(/* dojox.gfx.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(/* dojox.gfx.Mover */ mover, /* Object */ shift){ + // summary: called during every move notification, + // should actually move the node, can be overwritten. + this.onMoving(mover, shift); + this.shape.applyLeftTransform(shift); + this.onMoved(mover, shift); + }, + onMoving: function(/* dojox.gfx.Mover */ mover, /* Object */ shift){ + // summary: called before every incremental move, + // can be overwritten. + + // default implementation does nothing + }, + onMoved: function(/* dojox.gfx.Mover */ mover, /* Object */ shift){ + // summary: called after every incremental move, + // can be overwritten. + + // default implementation does nothing + } +}); + +} diff --git a/includes/js/dojox/gfx/Mover.js b/includes/js/dojox/gfx/Mover.js new file mode 100644 index 0000000..6a5d456 --- /dev/null +++ b/includes/js/dojox/gfx/Mover.js @@ -0,0 +1,62 @@ +if(!dojo._hasResource["dojox.gfx.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.Mover"] = true; +dojo.provide("dojox.gfx.Mover"); + +dojo.declare("dojox.gfx.Mover", null, { + constructor: function(shape, e, host){ + // summary: an object, which makes a shape follow the mouse, + // used as a default mover, and as a base class for custom movers + // shape: dojox.gfx.Shape: a shape object to be moved + // e: Event: a mouse event, which started the move; + // only clientX and clientY properties are used + // host: Object?: object which implements the functionality of the move, + // and defines proper events (onMoveStart and onMoveStop) + this.shape = shape; + this.lastX = e.clientX + this.lastY = e.clientY; + var h = this.host = host, d = document, + firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove"); + this.events = [ + dojo.connect(d, "onmousemove", this, "onMouseMove"), + dojo.connect(d, "onmouseup", this, "destroy"), + // 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 + var x = e.clientX; + var y = e.clientY; + this.host.onMove(this, {dx: x - this.lastX, dy: y - this.lastY}); + this.lastX = x; + this.lastY = y; + dojo.stopEvent(e); + }, + // utilities + onFirstMove: function(){ + // summary: it is meant to be called only once + 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.shape = null; + } +}); + +} diff --git a/includes/js/dojox/gfx/README b/includes/js/dojox/gfx/README new file mode 100644 index 0000000..c318ddb --- /dev/null +++ b/includes/js/dojox/gfx/README @@ -0,0 +1,102 @@ +------------------------------------------------------------------------------- +dojox.gfx +------------------------------------------------------------------------------- +Version 1.100 +Release date: 08/01/2006 +------------------------------------------------------------------------------- +Project state: +beta +HTMLCanvas renderer: experimental +------------------------------------------------------------------------------- +Credits + Eugene Lazutkin (eugene.lazutkin@gmail.com) + Kun Xi (bookstack@gmail.com) + Chris Mitchell (ccmitchellusa@gmail.com) HTML Canvas +------------------------------------------------------------------------------- +Project description + +Implementation of simple portable 2D graphics library. +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core +------------------------------------------------------------------------------- +Documentation + +Currently it can be found here: http://docs.google.com/Doc?id=d764479_1hnb2tn + +HTMLCanvas Renderer Status + +To use canvas rendering, insert 'canvas' at the beginning of the gfxRenderers list in your +djConfig, for example: + +canvas currently will only render on non-IE browsers (see dojox/gfx.js for where the renderer is loaded); +although it should be possible to use an IE canvas implementation (like Google's); however, it will be very slow. + +The following tests can be made to work with HTML Canvas with minor testcase modification: +dojox/gfx/tests + test_gfx.html-Bugs #1 + test_arc.html + test_bezier.html + test_pattern.html + test_gradient.html + test_linearGradient.html + test_image1.html - Limitation #3 + test_transform.html - Bug #1 + test_poly.html - Bug #1 +dojox/gfx/demos + butterfly.html - Bug #1 + lion.html - Bug #1 + tiger.html - Bug #1 + circles.html - No event processing yet :( + creator.html +dojox/chart + test_pie2d.html - Dojo Charts on iPhone anyone? :) + test_chart2d.html - + + // To make charts work, the following line needs to be added to the end of the + // Chart2D.js render() method (prior to return) + if(this.surface.render){this.surface.render()}; + +Known Limitations: +1) event handling- plan is to capture all events at canvas, perform intersect/hit + tests (not implemented) against scene graph, then propogate event to top-most + intersected shape. HtmlCanvas shape need intersectsStroke and intersectsBounds, + and intersects (region). +2) SVG and VML are "live" scene graphs; eg. any state change to objects in the + scene automatically get rendered in next engine render pass. For canvas, it's + procedural, and current implementation requires application to call surface.render() + whenever scene needs to be updated. Plan is to do dirty region checking based + on bounding boxes (currently not properly computed), and track dirty areas anytime + state changes (invalidate) separate from render phase. + Add the following call where changes to the scene graph are complete and you want to + render: + + if (surface.render){surface.render();} + +4) Text/Text Paths - Text shape is implemented using DIV overlays. Many text styles are not + applied, and outline/fills are not possible. This is due to limitations in Canvas spec. + Firefox 3.0 has proprietary text functions that we could test for and use once FF3 is out. + No luck on Safari. +3) No Image skewing - Limitation of Canvas + +Known Bugs: +1) Matrix xformations (applied from root to shape leaf nodes) not quite right--but very close. + Canvas does not have a built in transformation function that allows skewing. Need to + track skew matrix with Shape, and perform other trans/rot/scale transformations without + using canvas transform functions. + + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/gfx.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/gfx/* + +Install into the following directory structure: +/dojox/gfx/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/gfx/_base.js b/includes/js/dojox/gfx/_base.js new file mode 100644 index 0000000..3b118c2 --- /dev/null +++ b/includes/js/dojox/gfx/_base.js @@ -0,0 +1,288 @@ +if(!dojo._hasResource["dojox.gfx._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx._base"] = true; +dojo.provide("dojox.gfx._base"); + +(function(){ + var g = dojox.gfx, b = g._base; + + // candidates for dojox.style (work on VML and SVG nodes) + g._hasClass = function(/*DomNode*/node, /*String*/classStr){ + // summary: + // Returns whether or not the specified classes are a portion of the + // class list currently applied to the node. + // return (new RegExp('(^|\\s+)'+classStr+'(\\s+|$)')).test(node.className) // Boolean + return ((" "+node.getAttribute("className")+" ").indexOf(" "+classStr+" ") >= 0); // Boolean + } + g._addClass = function(/*DomNode*/node, /*String*/classStr){ + // summary: + // Adds the specified classes to the end of the class list on the + // passed node. + var cls = node.getAttribute("className"); + if((" "+cls+" ").indexOf(" "+classStr+" ") < 0){ + node.setAttribute("className", cls + (cls ? ' ' : '') + classStr); + } + } + g._removeClass = function(/*DomNode*/node, /*String*/classStr){ + // summary: Removes classes from node. + node.setAttribute("className", node.getAttribute("className").replace(new RegExp('(^|\\s+)'+classStr+'(\\s+|$)'), "$1$2")); + } + + + // candidate for dojox.html.metrics (dynamic font resize handler is not implemented here) + + // derived from Morris John's emResized measurer + b._getFontMeasurements = function(){ + // summary + // Returns an object that has pixel equivilents of standard font size values. + var heights = { + '1em':0, '1ex':0, '100%':0, '12pt':0, '16px':0, 'xx-small':0, 'x-small':0, + 'small':0, 'medium':0, 'large':0, 'x-large':0, 'xx-large':0 + }; + + if(dojo.isIE){ + // we do a font-size fix if and only if one isn't applied already. + // NOTE: If someone set the fontSize on the HTML Element, this will kill it. + dojo.doc.documentElement.style.fontSize="100%"; + } + + // set up the measuring node. + var div=dojo.doc.createElement("div"); + div.style.position="absolute"; + div.style.left="-100px"; + div.style.top="0"; + div.style.width="30px"; + div.style.height="1000em"; + div.style.border="0"; + div.style.margin="0"; + div.style.padding="0"; + div.style.outline="0"; + div.style.lineHeight="1"; + div.style.overflow="hidden"; + dojo.body().appendChild(div); + + // do the measurements. + for(var p in heights){ + div.style.fontSize = p; + heights[p] = Math.round(div.offsetHeight * 12/16) * 16/12 / 1000; + } + + dojo.body().removeChild(div); + div = null; + return heights; // object + }; + + var fontMeasurements = null; + + b._getCachedFontMeasurements = function(recalculate){ + if(recalculate || !fontMeasurements){ + fontMeasurements = b._getFontMeasurements(); + } + return fontMeasurements; + }; + + // candidate for dojox.html.metrics + + var measuringNode = null, empty = {}; + b._getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){ + var m; + if(!measuringNode){ + m = measuringNode = dojo.doc.createElement("div"); + m.style.position = "absolute"; + m.style.left = "-10000px"; + m.style.top = "0"; + dojo.body().appendChild(m); + }else{ + m = measuringNode; + } + // reset styles + m.className = ""; + m.style.border = "0"; + m.style.margin = "0"; + m.style.padding = "0"; + m.style.outline = "0"; + // set new style + if(arguments.length > 1 && style){ + for(var i in style){ + if(i in empty){ continue; } + m.style[i] = style[i]; + } + } + // set classes + if(arguments.length > 2 && className){ + m.className = className; + } + // take a measure + m.innerHTML = text; + return dojo.marginBox(m); + }; + + // candidate for dojo.dom + + var uniqueId = 0; + b._getUniqueId = function(){ + // summary: returns a unique string for use with any DOM element + var id; + do{ + id = dojo._scopeName + "Unique" + (++uniqueId); + }while(dojo.byId(id)); + return id; + }; +})(); + +dojo.mixin(dojox.gfx, { + // summary: defines constants, prototypes, and utility functions + + // default shapes, which are used to fill in missing parameters + defaultPath: {type: "path", path: ""}, + defaultPolyline: {type: "polyline", points: []}, + defaultRect: {type: "rect", x: 0, y: 0, width: 100, height: 100, r: 0}, + defaultEllipse: {type: "ellipse", cx: 0, cy: 0, rx: 200, ry: 100}, + defaultCircle: {type: "circle", cx: 0, cy: 0, r: 100}, + defaultLine: {type: "line", x1: 0, y1: 0, x2: 100, y2: 100}, + defaultImage: {type: "image", x: 0, y: 0, width: 0, height: 0, src: ""}, + defaultText: {type: "text", x: 0, y: 0, text: "", + align: "start", decoration: "none", rotated: false, kerning: true }, + defaultTextPath: {type: "textpath", text: "", + align: "start", decoration: "none", rotated: false, kerning: true }, + + // default geometric attributes + defaultStroke: {type: "stroke", color: "black", style: "solid", width: 1, cap: "butt", join: 4}, + defaultLinearGradient: {type: "linear", x1: 0, y1: 0, x2: 100, y2: 100, + colors: [{offset: 0, color: "black"}, {offset: 1, color: "white"}]}, + defaultRadialGradient: {type: "radial", cx: 0, cy: 0, r: 100, + colors: [{offset: 0, color: "black"}, {offset: 1, color: "white"}]}, + defaultPattern: {type: "pattern", x: 0, y: 0, width: 0, height: 0, src: ""}, + defaultFont: {type: "font", style: "normal", variant: "normal", weight: "normal", + size: "10pt", family: "serif"}, + + normalizeColor: function(/*Color*/ color){ + // summary: converts any legal color representation to normalized dojo.Color object + return (color instanceof dojo.Color) ? color : new dojo.Color(color); // dojo.Color + }, + normalizeParameters: function(existed, update){ + // summary: updates an existing object with properties from an "update" object + // existed: Object: the "target" object to be updated + // update: Object: the "update" object, whose properties will be used to update the existed object + if(update){ + var empty = {}; + for(var x in existed){ + if(x in update && !(x in empty)){ + existed[x] = update[x]; + } + } + } + return existed; // Object + }, + makeParameters: function(defaults, update){ + // summary: copies the original object, and all copied properties from the "update" object + // defaults: Object: the object to be cloned before updating + // update: Object: the object, which properties are to be cloned during updating + if(!update) return dojo.clone(defaults); + var result = {}; + for(var i in defaults){ + if(!(i in result)){ + result[i] = dojo.clone((i in update) ? update[i] : defaults[i]); + } + } + return result; // Object + }, + formatNumber: function(x, addSpace){ + // summary: converts a number to a string using a fixed notation + // x: Number: number to be converted + // addSpace: Boolean?: if it is true, add a space before a positive number + var val = x.toString(); + if(val.indexOf("e") >= 0){ + val = x.toFixed(4); + }else{ + var point = val.indexOf("."); + if(point >= 0 && val.length - point > 5){ + val = x.toFixed(4); + } + } + if(x < 0){ + return val; // String + } + return addSpace ? " " + val : val; // String + }, + // font operations + makeFontString: function(font){ + // summary: converts a font object to a CSS font string + // font: Object: font object (see dojox.gfx.defaultFont) + return font.style + " " + font.variant + " " + font.weight + " " + font.size + " " + font.family; // Object + }, + splitFontString: function(str){ + // summary: converts a CSS font string to a font object + // str: String: a CSS font string + var font = dojo.clone(dojox.gfx.defaultFont); + var t = str.split(/\s+/); + do{ + if(t.length < 5){ break; } + font.style = t[0]; + font.varian = t[1]; + font.weight = t[2]; + var i = t[3].indexOf("/"); + font.size = i < 0 ? t[3] : t[3].substring(0, i); + var j = 4; + if(i < 0){ + if(t[4] == "/"){ + j = 6; + break; + } + if(t[4].substr(0, 1) == "/"){ + j = 5; + break; + } + } + if(j + 3 > t.length){ break; } + font.size = t[j]; + font.family = t[j + 1]; + }while(false); + return font; // Object + }, + // length operations + cm_in_pt: 72 / 2.54, // Number: centimeters per inch + mm_in_pt: 7.2 / 2.54, // Number: millimeters per inch + px_in_pt: function(){ + // summary: returns a number of pixels per point + return dojox.gfx._base._getCachedFontMeasurements()["12pt"] / 12; // Number + }, + pt2px: function(len){ + // summary: converts points to pixels + // len: Number: a value in points + return len * dojox.gfx.px_in_pt(); // Number + }, + px2pt: function(len){ + // summary: converts pixels to points + // len: Number: a value in pixels + return len / dojox.gfx.px_in_pt(); // Number + }, + normalizedLength: function(len) { + // summary: converts any length value to pixels + // len: String: a length, e.g., "12pc" + if(len.length == 0) return 0; + if(len.length > 2){ + var px_in_pt = dojox.gfx.px_in_pt(); + var val = parseFloat(len); + switch(len.slice(-2)){ + case "px": return val; + case "pt": return val * px_in_pt; + case "in": return val * 72 * px_in_pt; + case "pc": return val * 12 * px_in_pt; + case "mm": return val / dojox.gfx.mm_in_pt * px_in_pt; + case "cm": return val / dojox.gfx.cm_in_pt * px_in_pt; + } + } + return parseFloat(len); // Number + }, + + // a constant used to split a SVG/VML path into primitive components + pathVmlRegExp: /([A-Za-z]+)|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g, + pathSvgRegExp: /([A-Za-z])|(\d+(\.\d+)?)|(\.\d+)|(-\d+(\.\d+)?)|(-\.\d+)/g, + + equalSources: function(a, b){ + // summary: compares event sources, returns true if they are equal + return a && b && a == b; + } +}); + +} diff --git a/includes/js/dojox/gfx/arc.js b/includes/js/dojox/gfx/arc.js new file mode 100644 index 0000000..4a0eade --- /dev/null +++ b/includes/js/dojox/gfx/arc.js @@ -0,0 +1,122 @@ +if(!dojo._hasResource["dojox.gfx.arc"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.arc"] = true; +dojo.provide("dojox.gfx.arc"); + +dojo.require("dojox.gfx.matrix"); + +(function(){ + var m = dojox.gfx.matrix, + unitArcAsBezier = function(alpha){ + // summary: return a start point, 1st and 2nd control points, and an end point of + // a an arc, which is reflected on the x axis + // alpha: Number: angle in radians, the arc will be 2 * angle size + var cosa = Math.cos(alpha), sina = Math.sin(alpha), + p2 = {x: cosa + (4 / 3) * (1 - cosa), y: sina - (4 / 3) * cosa * (1 - cosa) / sina}; + return { // Object + s: {x: cosa, y: -sina}, + c1: {x: p2.x, y: -p2.y}, + c2: p2, + e: {x: cosa, y: sina} + }; + }, + twoPI = 2 * Math.PI, pi4 = Math.PI / 4, pi8 = Math.PI / 8, + pi48 = pi4 + pi8, curvePI4 = unitArcAsBezier(pi8); + + dojo.mixin(dojox.gfx.arc, { + unitArcAsBezier: unitArcAsBezier, + curvePI4: curvePI4, + arcAsBezier: function(last, rx, ry, xRotg, large, sweep, x, y){ + // summary: calculates an arc as a series of Bezier curves + // given the last point and a standard set of SVG arc parameters, + // it returns an array of arrays of parameters to form a series of + // absolute Bezier curves. + // last: Object: a point-like object as a start of the arc + // rx: Number: a horizontal radius for the virtual ellipse + // ry: Number: a vertical radius for the virtual ellipse + // xRotg: Number: a rotation of an x axis of the virtual ellipse in degrees + // large: Boolean: which part of the ellipse will be used (the larger arc if true) + // sweep: Boolean: direction of the arc (CW if true) + // x: Number: the x coordinate of the end point of the arc + // y: Number: the y coordinate of the end point of the arc + + // calculate parameters + large = Boolean(large); + sweep = Boolean(sweep); + var xRot = m._degToRad(xRotg), + rx2 = rx * rx, ry2 = ry * ry, + pa = m.multiplyPoint( + m.rotate(-xRot), + {x: (last.x - x) / 2, y: (last.y - y) / 2} + ), + pax2 = pa.x * pa.x, pay2 = pa.y * pa.y, + c1 = Math.sqrt((rx2 * ry2 - rx2 * pay2 - ry2 * pax2) / (rx2 * pay2 + ry2 * pax2)); + if(isNaN(c1)){ c1 = 0; } + var ca = { + x: c1 * rx * pa.y / ry, + y: -c1 * ry * pa.x / rx + }; + if(large == sweep){ + ca = {x: -ca.x, y: -ca.y}; + } + // the center + var c = m.multiplyPoint( + [ + m.translate( + (last.x + x) / 2, + (last.y + y) / 2 + ), + m.rotate(xRot) + ], + ca + ); + // calculate the elliptic transformation + var elliptic_transform = m.normalize([ + m.translate(c.x, c.y), + m.rotate(xRot), + m.scale(rx, ry) + ]); + // start, end, and size of our arc + var inversed = m.invert(elliptic_transform), + sp = m.multiplyPoint(inversed, last), + ep = m.multiplyPoint(inversed, x, y), + startAngle = Math.atan2(sp.y, sp.x), + endAngle = Math.atan2(ep.y, ep.x), + theta = startAngle - endAngle; // size of our arc in radians + if(sweep){ theta = -theta; } + if(theta < 0){ + theta += twoPI; + }else if(theta > twoPI){ + theta -= twoPI; + } + + // draw curve chunks + var alpha = pi8, curve = curvePI4, step = sweep ? alpha : -alpha, + result = []; + for(var angle = theta; angle > 0; angle -= pi4){ + if(angle < pi48){ + alpha = angle / 2; + curve = unitArcAsBezier(alpha); + step = sweep ? alpha : -alpha; + angle = 0; // stop the loop + } + var c1, c2, e, + M = m.normalize([elliptic_transform, m.rotate(startAngle + step)]); + if(sweep){ + c1 = m.multiplyPoint(M, curve.c1); + c2 = m.multiplyPoint(M, curve.c2); + e = m.multiplyPoint(M, curve.e ); + }else{ + c1 = m.multiplyPoint(M, curve.c2); + c2 = m.multiplyPoint(M, curve.c1); + e = m.multiplyPoint(M, curve.s ); + } + // draw the curve + result.push([c1.x, c1.y, c2.x, c2.y, e.x, e.y]); + startAngle += 2 * step; + } + return result; // Object + } + }); +})(); + +} diff --git a/includes/js/dojox/gfx/attach.js b/includes/js/dojox/gfx/attach.js new file mode 100644 index 0000000..901f66f --- /dev/null +++ b/includes/js/dojox/gfx/attach.js @@ -0,0 +1,7 @@ +dojo.require("dojox.gfx"); + +// include an attacher conditionally +dojo.requireIf(dojox.gfx.renderer == "svg", "dojox.gfx.svg_attach"); +dojo.requireIf(dojox.gfx.renderer == "vml", "dojox.gfx.vml_attach"); +dojo.requireIf(dojox.gfx.renderer == "silverlight", "dojox.gfx.silverlight_attach"); +dojo.requireIf(dojox.gfx.renderer == "canvas", "dojox.gfx.canvas_attach"); diff --git a/includes/js/dojox/gfx/canvas.js b/includes/js/dojox/gfx/canvas.js new file mode 100644 index 0000000..6872b2f --- /dev/null +++ b/includes/js/dojox/gfx/canvas.js @@ -0,0 +1,687 @@ +if(!dojo._hasResource["dojox.gfx.canvas"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.canvas"] = true; +dojo.provide("dojox.gfx.canvas"); + +dojo.require("dojox.gfx._base"); +dojo.require("dojox.gfx.shape"); +dojo.require("dojox.gfx.path"); +dojo.require("dojox.gfx.arc"); +dojo.require("dojox.gfx.decompose"); + +dojo.experimental("dojox.gfx.canvas"); + +(function(){ + var g = dojox.gfx, gs = g.shape, ga = g.arc, + m = g.matrix, mp = m.multiplyPoint, pi = Math.PI, twoPI = 2 * pi, halfPI = pi /2; + + dojo.extend(g.Shape, { + _render: function(/* Object */ ctx){ + // summary: render the shape + ctx.save(); + this._renderTransform(ctx); + this._renderShape(ctx); + this._renderFill(ctx, true); + this._renderStroke(ctx, true); + ctx.restore(); + }, + _renderTransform: function(/* Object */ ctx){ + if("canvasTransform" in this){ + var t = this.canvasTransform; + ctx.translate(t.dx, t.dy); + ctx.rotate(t.angle2); + ctx.scale(t.sx, t.sy); + ctx.rotate(t.angle1); + // The future implementation when vendors catch up with the spec: + // var t = this.matrix; + // ctx.transform(t.xx, t.yx, t.xy, t.yy, t.dx, t.dy); + } + }, + _renderShape: function(/* Object */ ctx){ + // nothing + }, + _renderFill: function(/* Object */ ctx, /* Boolean */ apply){ + if("canvasFill" in this){ + if("canvasFillImage" in this){ + this.canvasFill = ctx.createPattern(this.canvasFillImage, "repeat"); + delete this.canvasFillImage; + } + ctx.fillStyle = this.canvasFill; + if(apply){ ctx.fill(); } + }else{ + ctx.fillStyle = "rgba(0,0,0,0.0)"; + } + }, + _renderStroke: function(/* Object */ ctx, /* Boolean */ apply){ + var s = this.strokeStyle; + if(s){ + ctx.strokeStyle = s.color.toString(); + ctx.lineWidth = s.width; + ctx.lineCap = s.cap; + if(typeof s.join == "number"){ + ctx.lineJoin = "miter"; + ctx.miterLimit = s.join; + }else{ + ctx.lineJoin = s.join; + } + if(apply){ ctx.stroke(); } + }else if(!apply){ + ctx.strokeStyle = "rgba(0,0,0,0.0)"; + } + }, + + // events are not implemented + getEventSource: function(){ return null; }, + connect: function(){}, + disconnect: function(){} + }); + + var modifyMethod = function(shape, method, extra){ + var old = shape.prototype[method]; + shape.prototype[method] = extra ? + function(){ + this.surface.makeDirty(); + old.apply(this, arguments); + extra.call(this); + return this; + } : + function(){ + this.surface.makeDirty(); + return old.apply(this, arguments); + }; + }; + + modifyMethod(g.Shape, "setTransform", + function(){ + // prepare Canvas-specific structures + if(this.matrix){ + this.canvasTransform = g.decompose(this.matrix); + }else{ + delete this.canvasTransform; + } + }); + + modifyMethod(g.Shape, "setFill", + function(){ + // prepare Canvas-specific structures + var fs = this.fillStyle, f; + if(fs){ + if(typeof(fs) == "object" && "type" in fs){ + var ctx = this.surface.rawNode.getContext("2d"); + switch(fs.type){ + case "linear": + case "radial": + f = fs.type == "linear" ? + ctx.createLinearGradient(fs.x1, fs.y1, fs.x2, fs.y2) : + ctx.createRadialGradient(fs.cx, fs.cy, 0, fs.cx, fs.cy, fs.r); + dojo.forEach(fs.colors, function(step){ + f.addColorStop(step.offset, g.normalizeColor(step.color).toString()); + }); + break; + case "pattern": + var img = new Image(fs.width, fs.height); + this.surface.downloadImage(img, fs.src); + this.canvasFillImage = img; + } + }else{ + // Set fill color using CSS RGBA func style + f = fs.toString(); + } + this.canvasFill = f; + }else{ + delete this.canvasFill; + } + }); + + modifyMethod(g.Shape, "setStroke"); + modifyMethod(g.Shape, "setShape"); + + dojo.declare("dojox.gfx.Group", g.Shape, { + // summary: a group shape (Canvas), which can be used + // to logically group shapes (e.g, to propagate matricies) + constructor: function(){ + gs.Container._init.call(this); + }, + _render: function(/* Object */ ctx){ + // summary: render the group + ctx.save(); + this._renderTransform(ctx); + this._renderFill(ctx); + this._renderStroke(ctx); + for(var i = 0; i < this.children.length; ++i){ + this.children[i]._render(ctx); + } + ctx.restore(); + } + }); + + dojo.declare("dojox.gfx.Rect", gs.Rect, { + // summary: a rectangle shape (Canvas) + _renderShape: function(/* Object */ ctx){ + var s = this.shape, r = Math.min(s.r, s.height / 2, s.width / 2), + xl = s.x, xr = xl + s.width, yt = s.y, yb = yt + s.height, + xl2 = xl + r, xr2 = xr - r, yt2 = yt + r, yb2 = yb - r; + ctx.beginPath(); + ctx.moveTo(xl2, yt); + if(r){ + ctx.arc(xr2, yt2, r, -halfPI, 0, false); + ctx.arc(xr2, yb2, r, 0, halfPI, false); + ctx.arc(xl2, yb2, r, halfPI, pi, false); + ctx.arc(xl2, yt2, r, pi, halfPI, false); + }else{ + ctx.lineTo(xr2, yt); + ctx.lineTo(xr, yb2); + ctx.lineTo(xl2, yb); + ctx.lineTo(xl, yt2); + } + ctx.closePath(); + } + }); + + var bezierCircle = []; + (function(){ + var u = ga.curvePI4; + bezierCircle.push(u.s, u.c1, u.c2, u.e); + for(var a = 45; a < 360; a += 45){ + var r = m.rotateg(a); + bezierCircle.push(mp(r, u.c1), mp(r, u.c2), mp(r, u.e)); + } + })(); + + dojo.declare("dojox.gfx.Ellipse", gs.Ellipse, { + // summary: an ellipse shape (Canvas) + setShape: function(){ + g.Ellipse.superclass.setShape.apply(this, arguments); + // prepare Canvas-specific structures + var s = this.shape, t, c1, c2, r = [], + M = m.normalize([m.translate(s.cx, s.cy), m.scale(s.rx, s.ry)]); + t = mp(M, bezierCircle[0]); + r.push([t.x, t.y]); + for(var i = 1; i < bezierCircle.length; i += 3){ + c1 = mp(M, bezierCircle[i]); + c2 = mp(M, bezierCircle[i + 1]); + t = mp(M, bezierCircle[i + 2]); + r.push([c1.x, c1.y, c2.x, c2.y, t.x, t.y]); + } + this.canvasEllipse = r; + return this; + }, + _renderShape: function(/* Object */ ctx){ + var r = this.canvasEllipse; + ctx.beginPath(); + ctx.moveTo.apply(ctx, r[0]); + for(var i = 1; i < r.length; ++i){ + ctx.bezierCurveTo.apply(ctx, r[i]); + } + ctx.closePath(); + } + }); + + dojo.declare("dojox.gfx.Circle", gs.Circle, { + // summary: a circle shape (Canvas) + _renderShape: function(/* Object */ ctx){ + var s = this.shape; + ctx.beginPath(); + ctx.arc(s.cx, s.cy, s.r, 0, twoPI, 1); + } + }); + + dojo.declare("dojox.gfx.Line", gs.Line, { + // summary: a line shape (Canvas) + _renderShape: function(/* Object */ ctx){ + var s = this.shape; + ctx.beginPath(); + ctx.moveTo(s.x1, s.y1); + ctx.lineTo(s.x2, s.y2); + } + }); + + dojo.declare("dojox.gfx.Polyline", gs.Polyline, { + // summary: a polyline/polygon shape (Canvas) + setShape: function(){ + g.Polyline.superclass.setShape.apply(this, arguments); + // dojo.inherited("setShape", arguments); + // prepare Canvas-specific structures + var p = this.shape.points, f = p[0], r = [], c, i; + if(p.length){ + if(typeof f == "number"){ + r.push(f, p[1]); + i = 2; + }else{ + r.push(f.x, f.y); + i = 1; + } + for(; i < p.length; ++i){ + c = p[i]; + if(typeof c == "number"){ + r.push(c, p[++i]); + }else{ + r.push(c.x, c.y); + } + } + } + this.canvasPolyline = r; + return this; + }, + _renderShape: function(/* Object */ ctx){ + // console.debug("Polyline::_renderShape"); + var p = this.canvasPolyline; + if(p.length){ + ctx.beginPath(); + ctx.moveTo(p[0], p[1]); + for(var i = 2; i < p.length; i += 2){ + ctx.lineTo(p[i], p[i + 1]); + } + } + } + }); + + dojo.declare("dojox.gfx.Image", gs.Image, { + // summary: an image shape (Canvas) + setShape: function(){ + g.Image.superclass.setShape.apply(this, arguments); + // prepare Canvas-specific structures + var img = new Image(); + this.surface.downloadImage(img, this.shape.src); + this.canvasImage = img; + return this; + }, + _renderShape: function(/* Object */ ctx){ + var s = this.shape; + ctx.drawImage(this.canvasImage, s.x, s.y, s.width, s.height); + } + }); + + dojo.declare("dojox.gfx.Text", gs.Text, { + // summary: a text shape (Canvas) + _renderShape: function(/* Object */ ctx){ + var s = this.shape; + // nothing for the moment + } + }); + modifyMethod(g.Text, "setFont"); + + var pathRenderers = { + M: "_moveToA", m: "_moveToR", + L: "_lineToA", l: "_lineToR", + H: "_hLineToA", h: "_hLineToR", + V: "_vLineToA", v: "_vLineToR", + C: "_curveToA", c: "_curveToR", + S: "_smoothCurveToA", s: "_smoothCurveToR", + Q: "_qCurveToA", q: "_qCurveToR", + T: "_qSmoothCurveToA", t: "_qSmoothCurveToR", + A: "_arcTo", a: "_arcTo", + Z: "_closePath", z: "_closePath" + }; + + dojo.declare("dojox.gfx.Path", g.path.Path, { + // summary: a path shape (Canvas) + constructor: function(){ + this.last = {}; + this.lastControl = {}; + }, + setShape: function(){ + this.canvasPath = []; + return g.Path.superclass.setShape.apply(this, arguments); + }, + _updateWithSegment: function(segment){ + var last = dojo.clone(this.last); + this[pathRenderers[segment.action]](this.canvasPath, segment.action, segment.args); + this.last = last; + g.Path.superclass._updateWithSegment.apply(this, arguments); + }, + _renderShape: function(/* Object */ ctx){ + var r = this.canvasPath; + ctx.beginPath(); + for(var i = 0; i < r.length; i += 2){ + ctx[r[i]].apply(ctx, r[i + 1]); + } + }, + _moveToA: function(result, action, args){ + result.push("moveTo", [args[0], args[1]]); + for(var i = 2; i < args.length; i += 2){ + result.push("lineTo", [args[i], args[i + 1]]); + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + this.lastControl = {}; + }, + _moveToR: function(result, action, args){ + if("x" in this.last){ + result.push("moveTo", [this.last.x += args[0], this.last.y += args[1]]); + }else{ + result.push("moveTo", [this.last.x = args[0], this.last.y = args[1]]); + } + for(var i = 2; i < args.length; i += 2){ + result.push("lineTo", [this.last.x += args[i], this.last.y += args[i + 1]]); + } + this.lastControl = {}; + }, + _lineToA: function(result, action, args){ + for(var i = 0; i < args.length; i += 2){ + result.push("lineTo", [args[i], args[i + 1]]); + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + this.lastControl = {}; + }, + _lineToR: function(result, action, args){ + for(var i = 0; i < args.length; i += 2){ + result.push("lineTo", [this.last.x += args[i], this.last.y += args[i + 1]]); + } + this.lastControl = {}; + }, + _hLineToA: function(result, action, args){ + for(var i = 0; i < args.length; ++i){ + result.push("lineTo", [args[i], this.last.y]); + } + this.last.x = args[args.length - 1]; + this.lastControl = {}; + }, + _hLineToR: function(result, action, args){ + for(var i = 0; i < args.length; ++i){ + result.push("lineTo", [this.last.x += args[i], this.last.y]); + } + this.lastControl = {}; + }, + _vLineToA: function(result, action, args){ + for(var i = 0; i < args.length; ++i){ + result.push("lineTo", [this.last.x, args[i]]); + } + this.last.y = args[args.length - 1]; + this.lastControl = {}; + }, + _vLineToR: function(result, action, args){ + for(var i = 0; i < args.length; ++i){ + result.push("lineTo", [this.last.x, this.last.y += args[i]]); + } + this.lastControl = {}; + }, + _curveToA: function(result, action, args){ + for(var i = 0; i < args.length; i += 6){ + result.push("bezierCurveTo", args.slice(i, i + 6)); + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + this.lastControl.x = args[args.length - 4]; + this.lastControl.y = args[args.length - 3]; + this.lastControl.type = "C"; + }, + _curveToR: function(result, action, args){ + for(var i = 0; i < args.length; i += 6){ + result.push("bezierCurveTo", [ + this.last.x + args[i], + this.last.y + args[i + 1], + this.lastControl.x = this.last.x + args[i + 2], + this.lastControl.y = this.last.y + args[i + 3], + this.last.x + args[i + 4], + this.last.y + args[i + 5] + ]); + this.last.x += args[i + 4]; + this.last.y += args[i + 5]; + } + this.lastControl.type = "C"; + }, + _smoothCurveToA: function(result, action, args){ + for(var i = 0; i < args.length; i += 4){ + var valid = this.lastControl.type == "C"; + result.push("bezierCurveTo", [ + valid ? 2 * this.last.x - this.lastControl.x : this.last.x, + valid ? 2 * this.last.y - this.lastControl.y : this.last.y, + args[i], + args[i + 1], + args[i + 2], + args[i + 3] + ]); + this.lastControl.x = args[i]; + this.lastControl.y = args[i + 1]; + this.lastControl.type = "C"; + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + }, + _smoothCurveToR: function(result, action, args){ + for(var i = 0; i < args.length; i += 4){ + var valid = this.lastControl.type == "C"; + result.push("bezierCurveTo", [ + valid ? 2 * this.last.x - this.lastControl.x : this.last.x, + valid ? 2 * this.last.y - this.lastControl.y : this.last.y, + this.last.x + args[i], + this.last.y + args[i + 1], + this.last.x + args[i + 2], + this.last.y + args[i + 3] + ]); + this.lastControl.x = this.last.x + args[i]; + this.lastControl.y = this.last.y + args[i + 1]; + this.lastControl.type = "C"; + this.last.x += args[i + 2]; + this.last.y += args[i + 3]; + } + }, + _qCurveToA: function(result, action, args){ + for(var i = 0; i < args.length; i += 4){ + result.push("quadraticCurveTo", args.slice(i, i + 4)); + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + this.lastControl.x = args[args.length - 4]; + this.lastControl.y = args[args.length - 3]; + this.lastControl.type = "Q"; + }, + _qCurveToR: function(result, action, args){ + for(var i = 0; i < args.length; i += 4){ + result.push("quadraticCurveTo", [ + this.lastControl.x = this.last.x + args[i], + this.lastControl.y = this.last.y + args[i + 1], + this.last.x + args[i + 2], + this.last.y + args[i + 3] + ]); + this.last.x += args[i + 2]; + this.last.y += args[i + 3]; + } + this.lastControl.type = "Q"; + }, + _qSmoothCurveToA: function(result, action, args){ + for(var i = 0; i < args.length; i += 2){ + var valid = this.lastControl.type == "Q"; + result.push("quadraticCurveTo", [ + this.lastControl.x = valid ? 2 * this.last.x - this.lastControl.x : this.last.x, + this.lastControl.y = valid ? 2 * this.last.y - this.lastControl.y : this.last.y, + args[i], + args[i + 1] + ]); + this.lastControl.type = "Q"; + } + this.last.x = args[args.length - 2]; + this.last.y = args[args.length - 1]; + }, + _qSmoothCurveToR: function(result, action, args){ + for(var i = 0; i < args.length; i += 2){ + var valid = this.lastControl.type == "Q"; + result.push("quadraticCurveTo", [ + this.lastControl.x = valid ? 2 * this.last.x - this.lastControl.x : this.last.x, + this.lastControl.y = valid ? 2 * this.last.y - this.lastControl.y : this.last.y, + this.last.x + args[i], + this.last.y + args[i + 1] + ]); + this.lastControl.type = "Q"; + this.last.x += args[i]; + this.last.y += args[i + 1]; + } + }, + _arcTo: function(result, action, args){ + var relative = action == "a"; + for(var i = 0; i < args.length; i += 7){ + var x1 = args[i + 5], y1 = args[i + 6]; + if(relative){ + x1 += this.last.x; + y1 += this.last.y; + } + var arcs = ga.arcAsBezier( + this.last, args[i], args[i + 1], args[i + 2], + args[i + 3] ? 1 : 0, args[i + 4] ? 1 : 0, + x1, y1 + ); + dojo.forEach(arcs, function(p){ + result.push("bezierCurveTo", p); + }); + this.last.x = x1; + this.last.y = y1; + } + this.lastControl = {}; + }, + _closePath: function(result, action, args){ + result.push("closePath", []); + this.lastControl = {}; + } + }); + dojo.forEach(["moveTo", "lineTo", "hLineTo", "vLineTo", "curveTo", + "smoothCurveTo", "qCurveTo", "qSmoothCurveTo", "arcTo", "closePath"], + function(method){ modifyMethod(g.Path, method); } + ); + + dojo.declare("dojox.gfx.TextPath", g.path.TextPath, { + // summary: a text shape (Canvas) + _renderShape: function(/* Object */ ctx){ + var s = this.shape; + // nothing for the moment + } + }); + + dojo.declare("dojox.gfx.Surface", gs.Surface, { + // summary: a surface object to be used for drawings (Canvas) + constructor: function(){ + gs.Container._init.call(this); + this.pendingImageCount = 0; + this.makeDirty(); + }, + setDimensions: function(width, height){ + // summary: sets the width and height of the rawNode + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + this.width = g.normalizedLength(width); // in pixels + this.height = g.normalizedLength(height); // in pixels + if(!this.rawNode) return this; + this.rawNode.width = width; + this.rawNode.height = height; + this.makeDirty(); + return this; // self + }, + getDimensions: function(){ + // summary: returns an object with properties "width" and "height" + return this.rawNode ? {width: this.rawNode.width, height: this.rawNode.height} : null; // Object + }, + _render: function(){ + // summary: render the all shapes + if(this.pendingImageCount){ return; } + var ctx = this.rawNode.getContext("2d"); + ctx.save(); + ctx.clearRect(0, 0, this.rawNode.width, this.rawNode.height); + for(var i = 0; i < this.children.length; ++i){ + this.children[i]._render(ctx); + } + ctx.restore(); + if("pendingRender" in this){ + clearTimeout(this.pendingRender); + delete this.pendingRender; + } + }, + makeDirty: function(){ + // summary: internal method, which is called when we may need to redraw + if(!this.pendingImagesCount && !("pendingRender" in this)){ + this.pendingRender = setTimeout(dojo.hitch(this, this._render), 0); + } + }, + downloadImage: function(img, url){ + // summary: + // internal method, which starts an image download and renders, when it is ready + // img: Image: + // the image object + // url: String: + // the url of the image + var handler = dojo.hitch(this, this.onImageLoad); + if(!this.pendingImageCount++ && "pendingRender" in this){ + clearTimeout(this.pendingRender); + delete this.pendingRender; + } + img.onload = handler; + img.onerror = handler; + img.onabort = handler; + img.src = url; + }, + onImageLoad: function(){ + if(!--this.pendingImageCount){ this._render(); } + }, + + // events are not implemented + getEventSource: function(){ return null; }, + connect: function(){}, + disconnect: function(){} + }); + + g.createSurface = function(parentNode, width, height){ + // summary: creates a surface (Canvas) + // parentNode: Node: a parent node + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + + if(!width){ width = "100%"; } + if(!height){ height = "100%"; } + var s = new g.Surface(), + p = dojo.byId(parentNode), + c = p.ownerDocument.createElement("canvas"); + c.width = width; + c.height = height; + p.appendChild(c); + s.rawNode = c; + s.surface = s; + return s; // dojox.gfx.Surface + }; + + // Extenders + + var C = gs.Container, Container = { + add: function(shape){ + this.surface.makeDirty(); + return C.add.apply(this, arguments); + }, + remove: function(shape, silently){ + this.surface.makeDirty(); + return C.remove.apply(this, arguments); + }, + clear: function(){ + this.surface.makeDirty(); + return C.clear.apply(this, arguments); + }, + _moveChildToFront: function(shape){ + this.surface.makeDirty(); + return C._moveChildToFront.apply(this, arguments); + }, + _moveChildToBack: function(shape){ + this.surface.makeDirty(); + return C._moveChildToBack.apply(this, arguments); + } + }; + + dojo.mixin(gs.Creator, { + // summary: Canvas shape creators + createObject: function(shapeType, rawShape) { + // summary: creates an instance of the passed shapeType class + // shapeType: Function: a class constructor to create an instance of + // rawShape: Object: properties to be passed in to the classes "setShape" method + // overrideSize: Boolean: set the size explicitly, if true + var shape = new shapeType(); + shape.surface = this.surface; + shape.setShape(rawShape); + this.add(shape); + return shape; // dojox.gfx.Shape + } + }); + + dojo.extend(g.Group, Container); + dojo.extend(g.Group, gs.Creator); + + dojo.extend(g.Surface, Container); + dojo.extend(g.Surface, gs.Creator); +})(); + +} diff --git a/includes/js/dojox/gfx/canvas_attach.js b/includes/js/dojox/gfx/canvas_attach.js new file mode 100644 index 0000000..82ccd13 --- /dev/null +++ b/includes/js/dojox/gfx/canvas_attach.js @@ -0,0 +1,8 @@ +dojo.require("dojox.gfx.canvas"); + +dojo.experimental("dojox.gfx.canvas_attach"); + +// not implemented +dojox.gfx.attachNode = function(){ + return null; // for now +}; diff --git a/includes/js/dojox/gfx/decompose.js b/includes/js/dojox/gfx/decompose.js new file mode 100644 index 0000000..4e34ee6 --- /dev/null +++ b/includes/js/dojox/gfx/decompose.js @@ -0,0 +1,139 @@ +if(!dojo._hasResource["dojox.gfx.decompose"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.decompose"] = true; +dojo.provide("dojox.gfx.decompose"); + +dojo.require("dojox.gfx.matrix"); + +(function(){ + var m = dojox.gfx.matrix; + + var eq = function(/* Number */ a, /* Number */ b){ + // summary: compare two FP numbers for equality + return Math.abs(a - b) <= 1e-6 * (Math.abs(a) + Math.abs(b)); // Boolean + }; + + var calcFromValues = function(/* Number */ r1, /* Number */ m1, /* Number */ r2, /* Number */ m2){ + // summary: uses two close FP ration and their original magnitudes to approximate the result + if(!isFinite(r1)){ + return r2; // Number + }else if(!isFinite(r2)){ + return r1; // Number + } + m1 = Math.abs(m1), m2 = Math.abs(m2); + return (m1 * r1 + m2 * r2) / (m1 + m2); // Number + }; + + var transpose = function(/* dojox.gfx.matrix.Matrix2D */ matrix){ + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object + var M = new m.Matrix2D(matrix); + return dojo.mixin(M, {dx: 0, dy: 0, xy: M.yx, yx: M.xy}); // dojox.gfx.matrix.Matrix2D + }; + + var scaleSign = function(/* dojox.gfx.matrix.Matrix2D */ matrix){ + return (matrix.xx * matrix.yy < 0 || matrix.xy * matrix.yx > 0) ? -1 : 1; // Number + }; + + var eigenvalueDecomposition = function(/* dojox.gfx.matrix.Matrix2D */ matrix){ + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object + var M = m.normalize(matrix), + b = -M.xx - M.yy, + c = M.xx * M.yy - M.xy * M.yx, + d = Math.sqrt(b * b - 4 * c), + l1 = -(b + (b < 0 ? -d : d)) / 2, + l2 = c / l1, + vx1 = M.xy / (l1 - M.xx), vy1 = 1, + vx2 = M.xy / (l2 - M.xx), vy2 = 1; + if(eq(l1, l2)){ + vx1 = 1, vy1 = 0, vx2 = 0, vy2 = 1; + } + if(!isFinite(vx1)){ + vx1 = 1, vy1 = (l1 - M.xx) / M.xy; + if(!isFinite(vy1)){ + vx1 = (l1 - M.yy) / M.yx, vy1 = 1; + if(!isFinite(vx1)){ + vx1 = 1, vy1 = M.yx / (l1 - M.yy); + } + } + } + if(!isFinite(vx2)){ + vx2 = 1, vy2 = (l2 - M.xx) / M.xy; + if(!isFinite(vy2)){ + vx2 = (l2 - M.yy) / M.yx, vy2 = 1; + if(!isFinite(vx2)){ + vx2 = 1, vy2 = M.yx / (l2 - M.yy); + } + } + } + var d1 = Math.sqrt(vx1 * vx1 + vy1 * vy1), + d2 = Math.sqrt(vx2 * vx2 + vy2 * vy2); + if(!isFinite(vx1 /= d1)){ vx1 = 0; } + if(!isFinite(vy1 /= d1)){ vy1 = 0; } + if(!isFinite(vx2 /= d2)){ vx2 = 0; } + if(!isFinite(vy2 /= d2)){ vy2 = 0; } + return { // Object + value1: l1, + value2: l2, + vector1: {x: vx1, y: vy1}, + vector2: {x: vx2, y: vy2} + }; + }; + + var decomposeSR = function(/* dojox.gfx.matrix.Matrix2D */ M, /* Object */ result){ + // summary: decomposes a matrix into [scale, rotate]; no checks are done. + var sign = scaleSign(M), + a = result.angle1 = (Math.atan2(M.yx, M.yy) + Math.atan2(-sign * M.xy, sign * M.xx)) / 2, + cos = Math.cos(a), sin = Math.sin(a); + result.sx = calcFromValues(M.xx / cos, cos, -M.xy / sin, sin); + result.sy = calcFromValues(M.yy / cos, cos, M.yx / sin, sin); + return result; // Object + }; + + var decomposeRS = function(/* dojox.gfx.matrix.Matrix2D */ M, /* Object */ result){ + // summary: decomposes a matrix into [rotate, scale]; no checks are done + var sign = scaleSign(M), + a = result.angle2 = (Math.atan2(sign * M.yx, sign * M.xx) + Math.atan2(-M.xy, M.yy)) / 2, + cos = Math.cos(a), sin = Math.sin(a); + result.sx = calcFromValues(M.xx / cos, cos, M.yx / sin, sin); + result.sy = calcFromValues(M.yy / cos, cos, -M.xy / sin, sin); + return result; // Object + }; + + dojox.gfx.decompose = function(matrix){ + // summary: decompose a 2D matrix into translation, scaling, and rotation components + // description: this function decompose a matrix into four logical components: + // translation, rotation, scaling, and one more rotation using SVD. + // The components should be applied in following order: + // | [translate, rotate(angle2), scale, rotate(angle1)] + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object + var M = m.normalize(matrix), + result = {dx: M.dx, dy: M.dy, sx: 1, sy: 1, angle1: 0, angle2: 0}; + // detect case: [scale] + if(eq(M.xy, 0) && eq(M.yx, 0)){ + return dojo.mixin(result, {sx: M.xx, sy: M.yy}); // Object + } + // detect case: [scale, rotate] + if(eq(M.xx * M.yx, -M.xy * M.yy)){ + return decomposeSR(M, result); // Object + } + // detect case: [rotate, scale] + if(eq(M.xx * M.xy, -M.yx * M.yy)){ + return decomposeRS(M, result); // Object + } + // do SVD + var MT = transpose(M), + u = eigenvalueDecomposition([M, MT]), + v = eigenvalueDecomposition([MT, M]), + U = new m.Matrix2D({xx: u.vector1.x, xy: u.vector2.x, yx: u.vector1.y, yy: u.vector2.y}), + VT = new m.Matrix2D({xx: v.vector1.x, xy: v.vector1.y, yx: v.vector2.x, yy: v.vector2.y}), + S = new m.Matrix2D([m.invert(U), M, m.invert(VT)]); + decomposeSR(VT, result); + S.xx *= result.sx; + S.yy *= result.sy; + decomposeRS(U, result); + S.xx *= result.sx; + S.yy *= result.sy; + return dojo.mixin(result, {sx: S.xx, sy: S.yy}); // Object + }; +})(); + +} diff --git a/includes/js/dojox/gfx/demos/beautify.html b/includes/js/dojox/gfx/demos/beautify.html new file mode 100644 index 0000000..d1f02f5 --- /dev/null +++ b/includes/js/dojox/gfx/demos/beautify.html @@ -0,0 +1,48 @@ + + +Beautify JSON + + + + + + +

            Beautify JSON

            +

            Paste valid JSON in this textarea and receive a pretty-printed version of it. Use Firefox, if you want to be able to read comma-ended sequences (Python style). + Additionally it knows how to remove extra spaces from path elements.

            +

            +

            +     Process "path" elements +     Pretty-print JSON

            +

            This program is a companion for inspector.html.

            + + diff --git a/includes/js/dojox/gfx/demos/butterfly.html b/includes/js/dojox/gfx/demos/butterfly.html new file mode 100644 index 0000000..2b9f188 --- /dev/null +++ b/includes/js/dojox/gfx/demos/butterfly.html @@ -0,0 +1,88 @@ + + +dojox.gfx: Butterfly + + + + + + + + +

            dojox.gfx: Butterfly

            +

            This example was directly converted from SVG file.

            +

            This is a slightly modified version of a sample that shipped with JASC's WebDraw (www.jasc.com). Generated by Jasc WebDraw PR4(tm) on 06/07/01 12:18:39.

            + + + + + +
            Rotation (0)
            +
            +
            +
            +
            +
            +
            Scaling (1.000)
            +
            +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/gfx/demos/career_test.html b/includes/js/dojox/gfx/demos/career_test.html new file mode 100644 index 0000000..3958395 --- /dev/null +++ b/includes/js/dojox/gfx/demos/career_test.html @@ -0,0 +1,467 @@ + + +dojox.gfx: Career Aptitude Test + + + + + + + + + + + + + +

            dojox.gfx: Career Aptitude Test

            +

            Warning: Canvas renderer doesn't implement event handling.

            + +
            +

            Thank you for your interest in "I can't believe it's manure" Eateries™ +and for submitting your resume for our review. While this is an automated response, +please be assured that every resume is reviewed by us, and forwarded to the hiring +managers if the skills fit our needs.

            +

            In order order to evaluate your skills we ask you to take a career aptitude test. +You will have an exciting chance to operate one of our state-of-the-art workstations +remotely. Don't forget: +

            +
              +
            1. Fish out a live speciment of dung-42 from the container.
            2. +
            3. Freeze it until you see an orange glow to kill the elements and make it less green.
            4. +
            5. Broil it until you see the orange glow again, and drop it on the table below.
            6. +
            7. You have to process all items without wasting resources and in minimal time.
            8. +
            +

            Warnings: don't overfreeze, don't overheat, don't drop the speciment, don't change the sequence, +don't touch the speciment in heating and freezing chambers until it is's ready.

            +

            Use your head and your mouse!

            +

            Please select the desired position:

            + + + + + + + + + + + + + +
            Workstation Supervisor 
            Shift Director 
            Vice President #49653 
            +
            + + + + + + + diff --git a/includes/js/dojox/gfx/demos/circles.html b/includes/js/dojox/gfx/demos/circles.html new file mode 100644 index 0000000..ce4d0cd --- /dev/null +++ b/includes/js/dojox/gfx/demos/circles.html @@ -0,0 +1,90 @@ + + +dojox.gfx: 100 draggable circles + + + + + + + + + + +

            dojox.gfx: 100 draggable circles

            +

            Warning: Canvas renderer doesn't implement event handling.

            +
            + + diff --git a/includes/js/dojox/gfx/demos/clock.html b/includes/js/dojox/gfx/demos/clock.html new file mode 100644 index 0000000..8d4d8c1 --- /dev/null +++ b/includes/js/dojox/gfx/demos/clock.html @@ -0,0 +1,253 @@ + + +dojox.gfx: interactive analog clock + + + + + + + + +

            dojox.gfx: interactive analog clock

            +

            Grab hands and set your own time.

            +

            Warning: Canvas renderer doesn't implement event handling.

            +
            +

            Current time: .

            +

            + + diff --git a/includes/js/dojox/gfx/demos/clockWidget.html b/includes/js/dojox/gfx/demos/clockWidget.html new file mode 100644 index 0000000..409523c --- /dev/null +++ b/includes/js/dojox/gfx/demos/clockWidget.html @@ -0,0 +1,332 @@ + + +dojox.gfx: interactive analog clock + + + + + + + + +

            dojox.gfx: interactive analog clock

            +

            Grab hands and set your own time.

            +

            Warning: Canvas renderer doesn't implement event handling.

            + + + +
            + +
            +
            +
            +
            + +
            + + + + + + diff --git a/includes/js/dojox/gfx/demos/clock_black.html b/includes/js/dojox/gfx/demos/clock_black.html new file mode 100644 index 0000000..4c72770 --- /dev/null +++ b/includes/js/dojox/gfx/demos/clock_black.html @@ -0,0 +1,253 @@ + + +dojox.gfx: interactive analog clock + + + + + + + + +

            dojox.gfx: interactive analog clock

            +

            Grab hands and set your own time.

            +

            Warning: Canvas renderer doesn't implement event handling.

            +
            +

            Current time: .

            +

            + + diff --git a/includes/js/dojox/gfx/demos/creator.html b/includes/js/dojox/gfx/demos/creator.html new file mode 100644 index 0000000..48ddf5b --- /dev/null +++ b/includes/js/dojox/gfx/demos/creator.html @@ -0,0 +1,123 @@ + + +Create DojoX GFX JSON + + + + + + + +

            Create DojoX GFX JSON

            +

            This is a helper file, which serves as a template to generate static pictures.

            + + + + +
            +
            +
            +
            +

            +

            +     

            + + diff --git a/includes/js/dojox/gfx/demos/data/Lars.json b/includes/js/dojox/gfx/demos/data/Lars.json new file mode 100644 index 0000000..320feb0 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/Lars.json @@ -0,0 +1,1823 @@ +[ + { + "name": "torso", + "children": [ + { + "name": "leftArm", + "shape": { + "type": "path", + "path": "M156.007,292.674c2.737,1.779,5.563,3.322,8.752,3.947c7.098,1.39,19.25-5.666,23.136-11.699 c1.572-2.441,8.077-21.031,11.177-14.271c1.224,2.67-1.59,4-1.399,6.462c3.108-1.425,5.48-5.242,8.918-2.182 c0.672,4.019-4.472,4.343-3.918,7.669c1.376,0.218,5.394-1.595,6.285-0.535c1.707,2.027-2.933,3.561-4.072,4.018 c-1.852,0.741-4.294,1.233-5.988,2.369c-2.636,1.768-4.766,5.143-7.034,7.4c-11.657,11.604-26.183,10.553-40.646,5.515 c-4.713-1.642-17.399-4.472-18.655-9.427c-1.647-6.502,5.523-7.999,10.184-6.74C147.658,286.528,151.725,289.891,156.007,292.674z" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "leftArmThumb", + "shape": { + "type": "path", + "path": "M188.257,284.902c-1.932-1.391-3.314-4.206-3.506-6.494c-0.149-1.786,0.59-6.522,3.199-3.95c0.792,0.78,0.083,2.155,0.558,2.943 c0.885,1.47,1.071,0.493,2.748,1.002c1.406,0.426,3.827,2.05,4.251,3.499" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "rightArm", + "shape": { + "type": "path", + "path": "M57.05,283.306c-5.502,5.354-13.185,8.541-18.249,14.221c-4.303,4.827-7.721,11.575-11.138,17.112 c-6.752,10.939-10.794,26.076-19.912,35.185c-3.869,3.866-7.637,5.721-7.251,12.032c0.932,0.372,1.548,0.589,2.418,0.683 c0.605-2.746,2.569-4.199,5.362-3.799c-0.14,3.365-3.512,5.941-3.228,9.235c0.364,4.223,3.983,5.968,7.181,2.662 c2.61-2.699,0.192-7.848,3.338-10.179c5.535-4.103,2.889,2.998,4.13,5.514c5.19,10.519,8.634-1.859,7.35-7.996 c-2.336-11.159-3.003-15.126,3.267-24.416c6.358-9.419,12.194-18.708,19.399-27.588c1.116-1.375,2.08-2.728,3.333-4" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "shirt", + "children": [ + { + "name": "tShirt", + "shape": { + "type": "path", + "path": "M96.509,268.264 c-2.301,0.323-4.69,0.205-6.945,0.72c-2.234,0.509-4.5,0.8-6.749,1.249c-4.369,0.872-8.206,3.265-12.3,5.024 c-3.259,1.401-6.644,2.571-9.763,4.26c-1.923,1.041-3.688,2.616-5.487,3.97c-1.543,1.16-3.495,2.11-4.854,3.562 c-2.205,2.354,0.896,7.408,1.854,9.873c0.92,2.368,2.149,4.82,2.749,7.29c0.228,0.937,0.235,2.058,0.875,2.873 c0.644,0.821,0.64,0.735,1.822,0.048c1.513-0.878,2.873-1.993,4.329-2.993c2.431-1.67,5.462-2.848,7.434-5.111 c-3.335,1.652-5.335,4.679-6.931,8.012c-1.398,2.92-4.482,35.854-5.389,38.947c-0.195,0.003-0.775,0.003-0.749,0.013 c20.561,0,41.123-0.07,61.684,0c2.1,0.007,3.607-0.497,5.529-1.252c0.715-0.281,2.257-0.356,2.807-0.745 c1.412-0.998-0.094-3.916-0.646-5.302c-1.425-3.579-2.111-37.767-4.726-40.543c1.842,0.057,4.127,1.311,5.937,1.95 c1.351,0.478,2.633,1.092,3.956,1.66c1.39,0.597,3.667,1.927,5.168,1.858c0.296-1.873,1.045-3.286,1.839-5.02 c0.943-2.061,1.155-4.214,1.528-6.415c0.351-2.07,0.898-3.787,1.939-5.635c0.531-0.942,1.356-1.73,1.693-2.768 c-0.443-0.402-1.043-0.907-1.603-1.125c-0.56-0.219-1.292-0.111-1.908-0.33c-1.237-0.438-2.44-1.089-3.669-1.576 c-3.773-1.499-7.519-2.983-11.319-4.466c-3.575-1.396-6.977-3.239-10.784-3.872c-1.735-0.289-3.467-0.529-5.073-0.906" + }, + "fill": "#4459A5", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "name": "shirtNeck", + "shape": { + "type": "path", + "path": "M99.759,268.889 c-0.984,0.152-1.746-0.549-2.75-0.5c-1.369,0.066-1.649,0.872-2.153,2c-1.037,2.325-2.442,4.974,0.064,6.946 c2.53,1.991,6.964,1.717,9.829,0.803c1.616-0.516,3.045-1.24,3.825-2.867c0.508-1.061,0.935-2.771,0.149-3.598 c-0.231-0.243-0.562-0.376-0.84-0.534" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "name": "shirtLogo", + "children": [ + { + "children": [ + { + "shape": { + "type": "path", + "path": "M104.864,296.92c-0.151-0.003,7.101,0.41,7.052,0.404c0.132,0.028-0.172,0.633-0.021,0.632 c-0.226,0.028-7.244-0.454-7.28-0.464C104.657,297.518,104.776,296.904,104.864,296.92z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M90.071,295.919c-0.199,0.004,6.792,0.43,6.79,0.446c0.153,0.005-0.031,0.663,0.012,0.665 c0.272,0.015-6.79-0.471-6.875-0.459C89.881,296.56,89.796,295.899,90.071,295.919z" + }, + "stroke": { + } + } + ] + }, + { + "shape": { + "type": "path", + "path": "M84.407,306.476c0.2-0.159,0.322-1.04,0.254,0.057 c-0.542-0.356-2.02,2.083-4.215,2.001c-1.887-1.706-4.559-3.384-4.302-7.092c0.652-2.599,3.082-4.084,5.213-3.942 c1.889,0.377,2.899,0.716,4,1.318c-0.497,0.957-0.175,0.866-0.459,0.703c0.456-2.398,0.598-5.75,0.312-7.855 c0.594-0.554,0.714,0.125,1.249,0.941c0.502-0.727,0.509-1.425,0.875-0.571c-0.207,1.328-0.809,7.186-0.711,10.174 c-0.126,2.797-0.375,4.354-0.051,4.985c-0.718,0.613-0.667,1.006-0.981,1.381c-0.72-1.33-1.056-0.132-1.339-0.157 C84.632,308.442,84.493,305.791,84.407,306.476z M81.186,307.176c2.403,0.206,3.734-2.164,3.841-4.222 c0.269-2.72-0.896-5.104-3.198-5.04c-1.972,0.437-3.46,2.188-3.331,4.638C78.171,306.265,79.847,306.961,81.186,307.176z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M93.321,297.766c2.592,0.148,5.688,2.315,5.696,5.627 c-0.611,4.576-3.69,5.316-6.158,5.581c-2.68-0.76-5.708-1.872-5.413-6.472C88.086,299.394,90.653,297.875,93.321,297.766z M92.939,307.46c2.531,0.735,3.706-1.297,3.666-3.935c0.114-2.219-0.641-4.584-3.389-4.896c-2.29-0.552-3.366,2.188-3.661,4.688 C89.339,305.264,89.934,307.95,92.939,307.46z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M99.688,303.916c0.03-1.511,0.055-4.731,0.022-4.646 c0.481-1.355,0.658-0.556,1.034-1.297c0.263,1.473,0.653,0.326,1.186,0.066c-0.386,2.517-0.513,3.347-0.574,4.949 c-0.068-0.47-0.128,2.28-0.238,2.188c-0.055,1.935-0.036,2.201-0.047,4.219c-0.079,0.914-0.28,2.412-1.126,3.831 c-0.61,1.212-1.73,1.146-3.24,1.651c0.073-0.945-0.065-1.242-0.096-1.822c0.098,0.138,0.213,0.604,0.225,0.398 c1.892,0.228,2.209-1.896,2.362-3.366c0.042,0.304,0.512-6.933,0.415-7.061C99.73,302.636,99.75,303.178,99.688,303.916z M100.978,295.564c0.717,0.14,1.11,0.61,1.099,1.156c0.052,0.552-0.595,0.993-1.286,1.015c-0.541-0.074-1.025-0.548-1.022-1.054 C99.813,296.084,100.292,295.643,100.978,295.564z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M108.115,298.791c3.028-0.067,5.283,1.359,5.256,5.757 c-0.264,3.479-3.366,4.63-5.883,5.12c-2.429-0.034-5.619-2.241-5.16-5.811C102.322,300.085,105.715,298.845,108.115,298.791z M107.351,309.232c2.675-0.132,3.839-2.333,3.841-4.497c0.246-2.344-0.263-4.833-2.923-5.396 c-2.844,0.299-3.974,1.917-4.053,4.48C104.136,306.655,104.854,308.372,107.351,309.232z" + }, + "stroke": { + } + } + ] + } + ] + } + ] + }, + { + "name": "heads", + "children": [ + { + "name": "head1", + "children": [ + { + "name": "leftEart", + "children": [ + { + "shape": { + "type": "path", + "path": "M201.557,195.474 c7.734-4.547,16.591-5.012,18.405,4.443c2.43,12.659-3.317,13.328-14.598,13.328" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M211.711,203.09 c0.523,0.004,0.946-0.208,1.27-0.635" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M211.076,197.377 c3.062,3.013,5.489,5.624,4.443,10.155" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "bgHairTop", + "shape": { + "type": "path", + "path": "M54.384,199.306c-5.253-4.402-7.511-11.061-15.779-10.632c3.449-1.277,7.116-2.397,10.911-2.666 c-2.873-1.397-5.865-2.575-8.231-4.718c3.986-1.119,11.47-1.817,14.864,0.75c-5.183-2.758-8.397-7.816-13.062-10.598 c6.014-0.643,12.377,0.978,18.022,2.265c-2.547-4.486-6.682-10.83-10.523-14.297c5.033,1.052,10.647,4.518,15.062,7.177 c-1.614-4.176-5.634-8.406-7.859-12.513c10.312-1.125,12.522,4.919,19.7,9.932c-0.412-0.127-1.114-0.113-1.527,0.015 c0.875-7.261,3.058-12.8,8.258-18.566c6.771-7.507,17.812-9.131,24.095-15.381c-4.699,1.821-4.518,23.765-4.875,28.955" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "bgHairLeft", + "shape": { + "type": "path", + "path": "M92.384,243.972c-6.334,7.929-12.601,12.241-22.465,15.362c3.65-1.263,7.735-5.86,7.695-9.928 c-2.208,0.218-4.49,0.605-6.498,1.097c1.244-1.097,2.087-3.239,3.198-4.396c-5.77,0.001-12.131,1.133-18.396,1.23 c5.013-2.809,10.665-3.25,12.398-9.246c-3.59,0.313-7.233,1.606-11.033,1.097c1.731-2.022,3.953-3.995,5.049-6.447 c-3.781,0.056-6.665,3.098-10.547,2.465c0.962-2.863,3.187-5.208,4.531-7.766c-5.59-0.273-11.658,2.45-17.732,2.564 c5.494-2.857,8.967-7.819,12.3-12.718c5.233-7.693,10.625-9.96,20.349-9.981c11.059-0.024,15.558,6.714,20.984,16 c2.786,4.767,7.249,14.375,0.832,18" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "bgHair", + "shape": { + "type": "path", + "path": "M142.384,255.306c2.984,6.076,3.567,11.856,10.531,14.6c-0.134-3.114-0.094-6.664,1.619-9.033 c1.605,1.968,3.122,4.211,5.048,5.698c-0.29-1.769,0.412-4.024,0.233-5.828c3.445,0.26,4.979,3.965,8.468,4.479 c0.066-2.78,0.427-5.151,0.868-7.813c2.687,0.2,4.768,1.565,7.132,2.997c0.452-4.921-0.409-10.579-0.667-15.666 c-5.795-0.756-12.291,2.827-17.899,3.899c-4.414,0.844-14.136,0.524-15.333,6" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "neck", + "shape": { + "type": "path", + "path": "M106.989,254.499c-2.932,6.063-4.613,11.997-8.947,17.137c7.288,10.195,16.311-10.9,15.183-17.026 c-1.926-1.138-3.928-1.589-6.236-1.38" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "headShape", + "shape": { + "type": "path", + "path": "M210.941,207.665c-0.843,3.985-2.081,7.982-3.769,11.783c-3.374,7.604-8.543,14.427-16.052,18.899 c-2.94,2.13-5.983,4.167-9.109,6.085c-25.013,15.342-55.353,23.08-82.254,10.57c-3.433-1.557-6.785-3.431-10.053-5.66 c-1.821-1.184-3.592-2.46-5.308-3.832c-1.715-1.373-3.375-2.842-4.972-4.412c-2.352-2.148-4.576-4.425-6.631-6.814 c-6.168-7.169-10.823-15.358-12.87-24.185c-0.649-3.284-0.84-6.634-0.5-9.975c4.48-13.743,14.22-24.364,26.109-32.149 c2.973-1.946,6.079-3.715,9.271-5.309c30.581-15.027,69.581-10.027,95.851,12.209c2.564,2.254,4.988,4.651,7.244,7.178 c4.513,5.054,8.354,10.626,11.312,16.64C210.178,201.505,210.798,204.496,210.941,207.665z" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "rightEar", + "children": [ + { + "shape": { + "type": "path", + "path": "M64.857,195.606 c-6.59-7.181-15.047-10.664-19.467,3.676c-1.235,4.007-1.87,14.468,1.29,17.786c4.223,4.435,13.591,0.529,19.055-0.015" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M52.407,196.743 c-1.702,3.613-1.257,7.505-1.27,11.424" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M51.772,209.437 c-3.39-4.661,0.922-5.769,5.078-6.347" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "fgHair", + "shape": { + "type": "path", + "path": "M90.384,154.639c8.453-11.353,15.678-13.458,28.581-15.915c-1.382,3.376-3.89,7.352-5.179,11.16 c5.01-1.816,9.571-6.545,15.218-8.413c11.355-3.755,23.852-1.903,35.671-2.213c-3.004,3.712-4.912,7.88-2.026,11.447 c5.856-2.212,13.37-6.871,19.635-6.646c0.263,4.561-0.024,9.278,0.201,13.841c3.509-1.201,6.015-3.04,8.277-5.148 s3.761-4.049,4.942-5.2c1.063,2.408,2.134,5.334,2.24,8.494c-0.182,3.462-0.866,6.794-2.66,9.291 c3.663,0.65,6.098-2.021,8.35-4.479c-0.655,4.349-3.164,8.604-3.851,13.013c2.178-0.072,4.382,0.216,6.367-0.48 c-1.389,3.093-3.069,7.287-6.616,8.414c-4.475,1.423-4.354-0.992-7.315-4.332c-4.892-5.518-9.774-6.791-15.872-9.464 c-6.585-2.887-10.983-6.47-17.963-8.219c-8.994-2.255-19.864-3.867-28.093-5.196c2.466,1.967,1.138,5.594,0.659,8.625 c-2.729-0.645-4.41-3.813-6.301-5.158c0.953,3.195,0.983,6.953-2.134,8.491c-6.145-5.226-9.199-9.721-17.527-11.647 c1,1.83,1.728,4.208,1.396,6.402c-0.751,4.971-0.289,3.134-3.836,2.466c-5.192-0.977-9.953-3.677-15.815-4.496 c3.292,2.002,5.469,5.017,7.418,8.21c-2.651,0.404-6.238,0.257-8.382,1.671c2.456,0.38,3.44,2.166,3.197,4.714 c-7.45,0.386-13.623,0.731-19.915,5.434" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + } + ] + }, + { + "name": "eyes", + "children": [ + { + "name": "eyes1", + "children": [ + { + "shape": { + "type": "path", + "path": "M123.163,176.668 c-5.066,1.17-9.01,7.888-13.666,10.335c-4.238,2.227-8.648,6.636-7.009,12.332c1.971,6.848,12.042,3.991,16.261,1.165 c5.282-3.539,9.59-8.517,12.006-14.524c1.523-3.787,2.568-7.272-1.509-9.391c-2.905-1.51-8.174-1.386-11.417-0.583" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M182.545,179.865 c-3.533,0.169-4.854-1.166-8.408-0.001c-3,0.983-6.24,1.936-8.852,3.743c-3.938,2.725-7.46,5.555-4.73,13.592 c1.973,5.811,8.791,7.571,14.656,6.667c5.537-0.854,9.078-4.977,11.408-10.007c3.666-7.918,0.943-11.639-6.742-13.659" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "shape": { + "type": "path", + "path": "M108.829,183.668c-1.308-1.03-4.557,0.011-5.6-1.733 c-1.056-1.765,1.735-5.409,2.984-6.192c5.684-3.562,15.946-0.39,19.95-6.742" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M163.877,167.198c2.369,1.282,6.539,0.307,9.408,0.815 c3.449,0.612,7.066,2.657,10.592,2.851" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M127.496,192.002c-4.917-2.12-9.188-1.708-8.608,4.942 c3.132,1.734,5.428-2.82,7.275-4.942" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M174.852,203.143c-0.293,0.12-0.307,0.577-0.943,0.282 c-1.605-3.188-0.404-6.507,2.676-8.192c2.15-1.176,5.67-1.759,7.471,0.359c0.199,0.234,0.412,0.521,0.514,0.813 c0.229,0.649-0.285,0.95-0.285,0.95s-3.988,6.009-3.285,1.934c0.438,1.743-5.537,5.743-2.287,1.653 c-1.955,2.583-2.525,1.977-3.859,2.868" + }, + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "eyes2", + "children": [ + { + "shape": { + "type": "path", + "path": "M98.668,186.108c0.668-8.915,15.545-13.749,22.667-15" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M169.667,178.108 c5.307,3.436,16.928,5.632,19.668,12.333" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M105.334,197.775c8.085-4.283,17.059-2.8,25-6.333" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M164.001,198.775c4.656-0.417,9.664,1.805,14.334,2.017 c3.951,0.18,5.773,0.189,9,2.316" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M124.001,188.108c3.039-0.258,4.594,2.571,5.301,4.983 c-1.096,1.242-2.065,2.646-2.968,4.017" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M168.335,194.108c-1.77,2.293-4.869,3.271-6.299,5.91 c1.377,0.991,3.02,2.122,3.965,3.424" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + }, + { + "name": "beard", + "children": [ + { + "shape": { + "type": "path", + "path": "M96.05,213.639 c-0.366,0.21-0.783,0.389-1.167,0.5" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M102.55,211.972 c0.314-0.01,0.554-0.198,0.667-0.5" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M105.717,208.805 c0.164-0.109,0.336-0.224,0.5-0.333" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M111.05,207.972 c-0.651-1.81,0.859-2.262,2.333-1.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M117.717,209.805 c1.738,0,3.653,0.369,5.333,0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M132.717,214.472 c0.104-0.21,0.162-0.435,0.167-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M139.551,216.972 c0.215-0.175,0.465-0.426,0.666-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M144.551,213.305 c0.277-0.056,0.556-0.111,0.833-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M147.884,216.639 c0.195,0.045,0.369-0.013,0.5-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M148.384,214.139 c0.112-0.168,0.222-0.332,0.333-0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M98.217,219.305c1.697-1.772,4.233-2.109,5.967-4.046c1.519-1.696,3.812-3.001,4.2-5.454" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M152.717,216.139 c0.611,0,1.223,0,1.834,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M160.384,217.472 c0.333,0,0.667,0,1,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M163.217,215.972 c0.321-0.042,0.658-0.175,0.834-0.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M164.217,218.805 c0.167,0,0.333,0,0.5,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M168.384,217.972 c0.056-0.056,0.111-0.111,0.167-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M169.884,225.805 c0.491-0.397,0.882-0.926,1.167-1.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M172.717,221.972 c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M171.717,229.805 c0.334,0.075,0.659,0.025,0.834-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M190.051,227.805 c0.163-0.242,0.398-0.423,0.666-0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M197.384,221.472 c0.258-0.007,0.485-0.125,0.667-0.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M199.384,214.972 c-0.04-0.333,0.075-0.609,0.333-0.833" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M117.884,257.305 c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M142.717,252.472 c0.358,0.069,0.71,0.016,1-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M137.884,256.472 c0.277,0,0.556,0,0.833,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M160.884,252.972 c0.366-0.138,0.765-0.402,1-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M171.384,250.139 c0.235-0.263,0.475-0.561,0.667-0.834" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M89.384,243.972 c0.537,0.378,1.329,0.876,1.833,1.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M79.05,225.472 c0.087,0.272,0.143,0.55,0.167,0.833" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M73.884,222.639 c0,0.167,0,0.333,0,0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M72.55,219.805c0.466-0.325,0.875-0.797,1.167-1.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M71.717,211.972c0.422-0.553,0.776-1.305,1-2" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M78.55,214.472c0-0.111,0-0.222,0-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M79.384,218.805c-0.001-0.137,0.055-0.248,0.167-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M80.217,221.139c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M75.55,226.472c0.103-0.5,0.156-0.977,0.167-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M78.55,230.139c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M83.384,227.639c0.118-0.059,0.215-0.107,0.333-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M81.55,237.139c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M86.217,233.805c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M87.884,230.472c0.595-0.181,1.219-0.527,1.833-0.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M88.717,222.139 c-0.929,2.359-1.615,4.865-2.667,7.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M89.05,216.139 c0.784-0.736,1.709-1.565,2.833-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M94.217,210.139 c1.599-0.089,3.199-0.167,4.833-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M94.884,224.639 c0.052-0.588-0.004-1.155-0.167-1.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M92.384,228.305 c0.585-0.062,1.244-0.132,1.667-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M88.717,240.139 c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M95.884,243.305 c0.526,0.1,1.017-0.015,1.333-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M98.55,248.305 c0.069-0.24,0.265-0.926,0.333-1.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M96.55,249.805 c0.125,0.014,0.18-0.042,0.167-0.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M104.55,250.139 c0.01-0.238,0.126-0.428,0.333-0.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M106.884,251.972 c0.195,0.045,0.37-0.013,0.5-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M113.884,254.805 c0.758-0.586,1.595-1.171,2.382-1.774c0.072,0.376,0.418,0.685,0.48,1.079c0.833,0.265,1.624-0.021,1.638-0.971" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M122.217,254.639 c0.063-0.165,0.179-0.288,0.333-0.334" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M125.884,255.805 c1.13-0.745,2.783-0.962,3.667-2" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M132.217,255.972 c0.638-0.492,1.104-1.173,1.141-1.975c-1.11,0.062-1.449-0.888-1.475-1.858" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M129.717,249.305 c-0.045,0.154-0.168,0.271-0.333,0.334" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M136.551,252.305 c0.222,0,0.444,0,0.666,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M110.217,251.305 c0.056-0.056,0.111-0.11,0.167-0.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M140.717,251.805 c0.111,0,0.223,0,0.334,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M150.051,249.472 c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M143.217,255.472 c1.022-0.313,1.724-1.175,2.646-1.654c0.203,0.321,0.44,0.626,0.521,0.987" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M152.217,253.472 c0.165-0.063,0.288-0.179,0.334-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M155.051,254.639 c0.222,0,0.444,0,0.666,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M157.717,256.472 c0.326-0.027,0.546-0.073,0.834-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M163.217,252.639 c0.552-0.891,2.082-1.512,2.341-2.334c0.37-1.177-1.156-3.069-1.007-4.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M167.384,235.972 c0.118-0.54,0.353-1.064,0.667-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M170.717,242.805 c0-0.333,0-0.667,0-1" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M170.217,236.972 c0-0.333,0-0.667,0-1" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M179.051,235.805 c0.378-0.101,0.738-0.35,1-0.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M185.051,232.805 c0.379-0.319,0.656-0.702,0.833-1.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M188.051,231.139 c0.063-0.39,0.178-0.792,0.333-1.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M197.884,223.305 c-0.166,0.277-0.334,0.556-0.5,0.833" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "mouths", + "children": [ + { + "name": "mouth1", + "children": [ + { + "shape": { + "type": "path", + "path": "M177.122,216.821c-0.515,2.282-5.213,3.21-7.433,3.854 c-3.254,0.945-6.596,1.345-9.895,1.851c-3.26,0.5-6.665,0.671-10.107,0.671c-3.596,0-6.645,0.559-10.107,0.671 c-3.105,0.1-6.898-0.474-9.694-1.3c-3.527-1.043-6.672-1.666-10.096-3.062c-2.823-1.152-5.746-1.876-8.462-3.143 c-2.594-1.209-6.084-1.994-8.221-3.552c-1.068,1.834-5.867,3.748-8.1,4.546c-2.444,0.874-8.881,2.725-7.817,5.512 c0.457,1.195,1.948,2.273,2.63,3.385c0.774,1.261,1.139,2.601,2.057,3.859c1.83,2.5,4.506,4.773,6,7.34 c1.308,2.249,2.096,4.74,4.01,6.67c2.214,2.233,5.792,2.634,9.231,2.399c7.028-0.479,13.982-2.129,20.481-3.983 c3.295-0.941,6.699-1.536,10.087-2.686c3.272-1.111,6.641-3,9.402-4.777c5.248-3.377,10.278-6.409,14.283-10.705 c1.479-1.587,3.429-2.503,5.15-3.859" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M135.25,241.319 c0.723-4.757-10.487-8.47-14.898-9.526c-3.09-0.74-6.68-1.17-9.858-1.712c-2.758-0.47-6.865-0.836-9.437,0.369 c-1.385,0.649-2.843,1.724-4.141,2.513c2.156,3.964,4.728,8.861,9.468,11.506c3.229,1.801,5.511,0.777,8.859,0.373 c3.045-0.369,6.046-0.703,9.029-1.72c3.479-1.186,7.228-2.385,10.978-2.475" + }, + "fill": "#FFC0C0", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M148.656,225.547c1.267,0.697,1.301,2.838,0.671,3.9 c-0.702,1.182-2.063,1.4-3.306,2.01c-2.271,1.116-4.581,2.624-7.482,2.638c-4.619,0.023-2.143-4.067-0.253-5.869 c2.405-2.292,5.057-2.72,8.72-2.512c0.588,0.034,1.095,0.041,1.65,0.168" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M130.299,223.365 c2.687,0.437,5.619,4.384,3.727,6.422c-1.234,1.33-7.94,1.391-9.915,1.296c-4.896-0.233-2.502-2.445-0.613-4.525 c1.604-1.767,5.088-3.249,7.833-3.36" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M113.178,217.157 c2.56,0.958,4.922,5.057,5.352,7.215c0.377,1.885-0.324,2.106-2.526,2.643c-1.366,0.333-3.636,0.723-5.105,0.385 c-2.506-0.577-5.883-5.051-4.909-7.223c1.03-2.298,5.944-2.923,8.427-2.852" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M99.359,217.661 c2.038,0.432,4.015,4.279,2.468,5.625c-1.083,0.943-5.221,1.795-6.799,1.589c-4.032-0.526-2.265-4.102-0.866-5.872 c0.706-0.894,1.049-1.976,2.514-2.186c1.627-0.233,2.501,0.99,3.921,1.346" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M181.815,222.895c-3.101-2.75-4.764-8.777-9.282-10.403" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "mouth2", + "children": [ + { + "shape": { + "type": "path", + "path": "M87.57,221.951c5.563-1.759,11.066-1.32,16.694-1.782c2.93-0.24,5.228-1.14,8.309-0.927c3.142,0.217,6.085-0.235,9.289,0.176 c7.136,0.914,13.96,0.598,21.112,1.506c3.654,0.464,7.218,0.609,10.81,0.869c4.017,0.291,7.646,1.582,11.433,2.623 c2.948,0.812,6.347,1.618,9.011,2.99c2.521,1.298,6.354,2.856,8.3,4.72c-2.775,0.027-5.601,2.603-8.021,3.769 c-2.93,1.412-5.741,2.949-8.656,4.432c-5.599,2.849-11.885,5.468-18.104,6.53c-6.793,1.161-13.195,2.107-20.067,2.197 c-7.699,0.102-14.313-4.705-20.735-8.396c-2.071-1.19-4.69-2.182-6.504-3.666c-1.792-1.466-3.469-3.386-5.154-4.984 c-2.703-2.564-7.519-5.649-8.13-9.438" + }, + "stroke": { + "color": "#000000", + "width": "3", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M87.785,228.193 c-5.907-3.235-0.344-9.531,3.971-11.424" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2" + } + }, + { + "shape": { + "type": "path", + "path": "M184.679,227.228c-1.534,2.583-2.548,5.334-4.025,7.889" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M106.862,219.528 c-3.071-0.74-5.608,2.166-6.318,4.738c-0.379,1.375-0.494,2.55,0.748,3.337c1.519,0.962,2.905-0.052,4.418-0.332 c2.518-0.467,7.293,0.053,6.461-4.248c-0.568-2.938-3.743-3.682-6.338-3.335c-0.451,0.06-0.758,0.212-1.205,0.229" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M119.764,218.479 c-2.648,1.243-4.657,3.518-5.346,6.377c-0.866,3.594,3.9,3.711,6.356,2.865c2.64-0.91,4.77-3.351,3.299-6.133 c-1.01-1.91-3.979-2.548-6.026-2.823" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M130.388,219.492 c-1.753,1.382-4.069,4.525-4.835,6.61c-1.159,3.156,2.296,3.371,4.868,3.348c3.061-0.028,6.6-1.148,5.022-4.78 c-1.168-2.691-2.552-4.85-5.551-5.241" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M142.954,221.087 c-1.502,0.337-5.418,3.249-5.638,4.997c-0.292,2.311,4.856,4.536,6.854,4.234c2.503-0.377,4.384-3.175,3.167-5.65 c-0.92-1.873-3.36-2.252-4.508-3.932" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M155.354,222.663 c-2.039,0.426-4.212,2.287-4.766,4.444c-0.723,2.821,3.225,3.383,5.458,3.331c2.541-0.059,5.126-1.752,3.249-4.32 c-1.394-1.908-3.707-3.189-5.304-4.636" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M168.367,237.924 c-1.554-1.217-3.302-2.557-5.203-2.976c-2.973-0.654-3.537,2.131-3.377,4.406c0.205,2.913,1.032,3.883,3.901,2.344 c1.988-1.066,4.272-1.997,4.599-4.456" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M151.524,246.202 c-1.912-0.166-4.003-4.491-2.91-6.25c0.771-1.239,5.456-1.688,6.858-1.292c0.271,0.917,0.979,1.841,0.829,2.771 c-0.088,0.54-0.994,1.645-1.296,2.188c-1.08,1.951-2.133,1.866-3.998,2.684" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M145.911,241.457 c-0.209,1.649-0.215,2.702-1.528,3.801c-0.885,0.739-1.773,1.19-2.54,2.1c-0.786,0.933-1.226,2.38-2.792,1.812 c-1.042-0.377-1.959-2.318-2.138-3.311c-0.299-1.676-1.003-5.228,0.783-6.158c1.155-0.603,7.067-0.18,7.43,1.32" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M133.12,238.991 c-1.495-0.087-2.253-1.33-3.918-0.964c-1.42,0.311-2.489,1.354-2.54,2.836c-0.052,1.527,0.99,5.581,1.852,6.956 c2.363,3.771,4.329-1.535,5.516-3.159c1.117-1.526,2.643-2.053,2.271-3.958c-0.318-1.632-1.118-2.047-2.766-2.329 c-0.382-0.065-0.773-0.095-1.158-0.147" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M116.853,237.429 c-1.049,2.211-0.173,5.147,0.047,7.566c0.357,3.929,3.827,2.028,5.831,0.067c1.575-1.541,4.599-4.86,2.209-6.484 c-1.881-1.279-5.727-2.458-7.756-1.107" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M107.455,233.38 c-0.813,2.487-1.704,5.049,0.073,7.364c1.91,2.486,4.009,1.229,5.537-0.939c1.056-1.5,3.316-4.481,1.563-6.017 c-1.347-1.179-6.468-1.518-7.854-0.325" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "mouth3", + "children": [ + { + "shape": { + "type": "path", + "path": "M99.05,218.972 c1.691-0.875,3.313-2.39,4.833-3.537c1.231-0.928,2.782-1.671,3.5-3.072c1.846,3.486,7.661,4.669,11.003,6.067 c3.553,1.486,7.174,3.066,10.784,4.166c4.271,1.301,9.277,1.67,13.721,2.343c4.155,0.629,9.979,1.365,14.162,0.496 c1.181-0.245,2.343-1.024,3.462-1.446c0.162,1.905-3.637,3.023-4.933,3.487c-2.435,0.871-4.18,2.541-6.362,3.871 c-1.623,0.989-2.974,1.669-4.755,2.117c-1.77,0.445-3.353,0.806-4.825,1.878c-5.915,4.311-15.264,3.247-22.424,3.13 c-5.384-0.088-6.719-5.372-9.337-9c-1.437-1.991-2.843-3.854-3.796-6.138c-0.871-2.086-1.119-4.582-2.033-6.528" + }, + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M107.217,227.972 c1.182-2.033,4.375-2.176,6.5-1.963c2.879,0.289,4.124,1.217,6.168,3.167c1.834,1.749,5.906,5.509,5.64,8.271 c-2.808,0.89-7.847,0.402-10.346-1.104c-1.334-0.804-1.151-2.256-2.246-3.588c-0.712-0.866-1.836-2.673-2.855-3.311 c-0.209-0.94-2.106-1.499-3.028-1.805" + }, + "fill": "#F4BDBD", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + } + ] + }, + { + "name": "personalProps", + "children": [ + { + "name": "hat", + "children": [ + { + "children": [ + { + "children": [ + { + "shape": { + "type": "path", + "path": "M88.374,173.144c0.474-0.074,16.606,2.725,18.01,5.879 c1.145,2.572,28.184,4.568,28.184,4.568l35.971-5.618l5.025,1.132l7.211,0.315l9.295,0.851l10.188,3.248l5.75,2.935 l1.615-1.832l-0.264-5.27l-3.967-7.087c0,0-22.045-13.031-23.273-13.703c-1.229-0.669-4.941-2.294-6.484-4.542 c-8.584-12.528-8.404-18.05-3.371-6.461c0,0,2.662-7.592,2.52-8.575c-0.143-0.982,0.355-5.031,0.355-5.031l2.396-6.832 c0,0-1.379-5.341-2.738-7.19c-1.357-1.844-15.793-4.078-18.162-4.011c-24.933,0.706-3.783,0.071-25.567,0.724 c-24.317,0.728-0.882-2.591-24.068,3.551c-24.228,6.418-5.35-1.298-23.187,6.142c-18.301,7.633-16.67,7.186-16.704,10.685 c-0.034,3.499-3.057-4.884-0.034,3.499c3.023,8.381,3.037-3.871,3.023,8.381c-0.015,12.252,6.696,4.557,1.678,12.373 c-5.017,7.813-3.831,7.91-0.179,8.543c17.017,2.953,4.157,4.378,17.427,3.175" + }, + "fill": "#FF0000", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M156.605,114.92l-13.936,0.381l-11.633,0.343c-10.646,0.319-11.973-0.155-12.021-0.175l-0.599-0.238 l-0.577,0.514l0.049-0.047c-0.118,0.09-1.43,0.957-11.145,3.53c-9.989,2.646-12.812,2.931-13.421,2.704 c-0.822-0.306-0.821-0.306-7.791,2.604l-2.104,0.878c-16.037,6.689-17.342,7.324-17.342,10.316c0,0.019,0.001,0.041,0.001,0.06 c-0.224-0.108-0.459-0.199-0.787-0.04c-0.357,0.173-0.565,0.275-0.565,0.672c0,0.557,0.411,1.697,1.399,4.438 c0.924,2.561,1.71,3.671,2.714,3.833c0.083,0.014,0.164,0.02,0.241,0.02c0.007,0.584,0.01,1.339,0.01,2.313 c0,0.561-0.001,1.902-0.001,1.916c0,6.908,2.176,8.105,3.347,8.749c0,0,0.075,0.045,0.151,0.09 c-0.095,0.332-0.47,1.1-1.661,2.955c-2.509,3.908-3.516,5.931-3.516,7.303c0,0.358,0.068,0.671,0.196,0.962 c0.544,1.237,1.926,1.477,3.677,1.78l0.135,0.023c8.138,1.412,9.14,2.422,9.568,2.854c0.923,0.931,1.511,0.928,7.224,0.413 c0.06,0.014,0.102,0.068,0.165,0.071c2.167,0.105,16.131,3.138,17.087,5.288c1.147,2.578,16.416,4.228,29.023,5.159 l0.115,0.009c0,0,35.523-5.548,35.896-5.606c0.345,0.078,4.927,1.11,4.927,1.11l7.3,0.319c0,0,8.927,0.818,9.139,0.837 c0.202,0.064,9.854,3.142,10.006,3.19c0.143,0.073,6.368,3.251,6.368,3.251l2.398-2.719l-0.296-5.911l-4.213-7.526 l-0.232-0.137c-0.9-0.532-22.073-13.047-23.303-13.72c-0.001,0-0.735-0.38-0.735-0.38c-1.48-0.752-4.238-2.151-5.404-3.85 c-1.357-1.982-2.451-3.729-3.355-5.268c0.022-0.064,0.104-0.296,0.104-0.296c1.193-3.402,2.576-7.619,2.576-8.885 c0-0.063-0.004-0.118-0.011-0.165c-0.012-0.083-0.017-0.204-0.017-0.356c0-0.909,0.194-2.911,0.363-4.307 c0.072-0.205,2.46-7.013,2.46-7.013l-0.076-0.294c-0.146-0.566-1.468-5.584-2.9-7.532 C173.721,116.784,158.242,114.874,156.605,114.92z M131.097,117.643l11.614-0.342l13.951-0.382 c2.575-0.073,16.104,2.238,17.336,3.614c0.956,1.3,2.058,4.938,2.49,6.549c-0.188,0.536-2.33,6.642-2.33,6.642l-0.013,0.107 c-0.073,0.592-0.387,3.224-0.387,4.658c0,0.258,0.011,0.477,0.034,0.639c-0.006,0.493-0.768,3.026-1.659,5.709 c-2.14-4.566-2.792-4.606-3.242-4.629l-0.62-0.031l-0.354,0.571c-0.069,0.124-0.102,0.29-0.102,0.492 c0,2.273,4.134,9.172,6.993,13.346c1.456,2.12,4.509,3.669,6.149,4.501l0.682,0.353c1.138,0.622,20.813,12.25,23.011,13.549 c0.239,0.427,3.513,6.275,3.721,6.647c0.02,0.393,0.199,3.971,0.231,4.629c-0.23,0.262-0.472,0.535-0.832,0.944 c-1.07-0.546-5.132-2.619-5.132-2.619l-10.369-3.306l-9.404-0.86c0,0-6.995-0.307-7.169-0.315 c-0.168-0.038-5.124-1.155-5.124-1.155s-35.814,5.594-36.044,5.63c-12.419-0.922-25.993-2.687-27.285-4.058 c-1.366-3.097-13.245-5.574-17.517-6.211c-0.203-0.212-0.479-0.346-0.793-0.318c-3.083,0.28-5.996,0.544-6.4,0.369 c0-0.003-0.12-0.117-0.12-0.117c-0.703-0.708-1.879-1.895-10.646-3.416l-0.135-0.023c-0.827-0.143-2.075-0.359-2.188-0.614 c-0.021-0.048-0.033-0.111-0.033-0.193c0-0.592,0.632-2.179,3.205-6.187c1.488-2.318,2.024-3.388,2.024-4.188 c0-0.15-0.019-0.291-0.054-0.428c-0.181-0.712-0.758-1.03-1.179-1.261c-0.865-0.476-2.311-1.271-2.311-6.993 c0-0.014,0.001-1.098,0.001-1.56c0-4.969-0.065-4.992-0.833-5.258c-0.424-0.146-0.816,0.001-1.178,0.377 c-0.208-0.289-0.558-0.898-1.073-2.324c-0.205-0.568-0.385-1.068-0.542-1.506c0.587-0.423,0.632-1.277,0.636-1.644 l-0.014-0.825c-0.004-0.119-0.007-0.231-0.007-0.338c0-1.702,0.899-2.264,16.109-8.608l2.105-0.878 c4.165-1.739,5.948-2.482,6.375-2.562c0.817,0.296,2.292,0.597,14.579-2.658c8.169-2.164,10.697-3.187,11.58-3.704 C120.451,117.773,124.529,117.84,131.097,117.643z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M155.146,147.929c4.879-9.398-5.344-20.199-12.65-21.176 c-12.05-1.61-13.404,10.426-13.684,21.258c3.73,2.016,8.915,3.425,11.721,6.534" + }, + "fill": "#FFFFFF", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M133.446,127.979c-4.599,3.921-5.426,11.933-5.635,20.006l-0.017,0.654l4.415,2.067 c2.849,1.244,5.793,2.529,7.581,4.509c0.371,0.41,1.004,0.442,1.412,0.072c0.219-0.197,0.33-0.469,0.33-0.743 c0-0.239-0.084-0.479-0.258-0.67c-2.076-2.299-5.222-3.673-8.266-5.001c0,0-2.377-1.112-3.174-1.486 c0.223-7.385,1.021-14.572,4.909-17.887c1.892-1.614,4.386-2.189,7.621-1.757c4.143,0.554,9.086,4.472,11.5,9.113 c1.348,2.591,2.51,6.535,0.395,10.611c-0.254,0.49-0.064,1.093,0.426,1.348c0.49,0.254,1.094,0.063,1.35-0.427 c1.959-3.775,1.818-8.199-0.395-12.456c-2.732-5.251-8.203-9.53-13.012-10.172C138.853,125.257,135.763,126,133.446,127.979z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M154.077,146.278c-2.156,1.18-4.24,2.619-6.256,4.01c-3.635,2.509-7.068,4.878-10.941,5.924 c-2.991,0.808-6.055,1.058-9.3,1.324c-3.222,0.263-6.553,0.536-9.783,1.406c-2.027,0.546-4.117,1.397-6.137,2.221 c-3.491,1.423-7.102,2.895-10.528,2.866c-0.552-0.005-1.004,0.439-1.009,0.991s0.439,1.004,0.991,1.009 c3.828,0.033,7.627-1.516,11.301-3.014c2.054-0.837,3.994-1.628,5.902-2.142c3.054-0.823,6.292-1.088,9.425-1.344 c3.191-0.261,6.492-0.531,9.659-1.386c4.205-1.135,7.941-3.714,11.557-6.208c1.973-1.362,4.014-2.771,6.08-3.901 c0.484-0.265,0.662-0.873,0.396-1.357S154.562,146.013,154.077,146.278z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M156.458,153.549c-2.619,0.064-5.709,0.812-8.98,1.604c-4.279,1.035-8.701,2.104-11.902,1.536 c-0.543-0.096-1.063,0.267-1.159,0.81c-0.097,0.544,0.267,1.063,0.81,1.16c3.613,0.641,8.24-0.481,12.72-1.562 c3.166-0.766,6.154-1.489,8.561-1.548c5.664-0.141,7.961,0.698,13.508,2.724c0.518,0.189,1.094-0.077,1.281-0.596 c0.189-0.519-0.076-1.091-0.596-1.282C165.069,154.337,162.501,153.399,156.458,153.549z" + }, + "stroke": { + } + } + ] + } + ] + } + ] + }, + { + "name": "textSurface", + "children": [ + { + "name": "spokenBubble", + "children": [ + { + "name": "textContainer", + "shape": { + "type": "path", + "path": "M225.719,45.306c0-6.627,5.373-12,12-12h181.333 c6.627,0,12,5.373,12,12V150.64c0,6.627-5.373,12-12,12H237.719c-6.627,0-12-5.373-12-12V45.306z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "textArrowBelow", + "shape": { + "type": "path", + "path": "M249.052,160.639 c-0.775,14.251-1.676,18.525-9.1,30.565c9.705-0.79,21.952-21.605,25.1-30.045" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "thoughtBubble", + "children": [ + { + "name": "textContainer_1_", + "shape": { + "type": "path", + "path": "M202.698,21.089 c19.686-26.45,59.686-24.45,79.747-0.084c2.697,1.349,5.571,1.709,7.472,0.781c15.28-13.888,33.272-14.043,49.893-7.839 c2.771,1.034,5.478,2.219,8.031,3.421c28.543-21.729,75.543-10.729,83.166,27.658c0,0-1.324,3.889,1.165,6.603 c18.212,11.011,26.212,32.011,22.212,53.011c-1,5.333-3.223,9.667-6.037,13.52c-2.814,3.854-1.381,0-2.613-0.591 c-1.35-0.929-3.35-0.929-4.35-1.929c16,7,27,22,30,39c2,21-8,41-27,50c-16,7.5-32.5,5.5-45.745-2.556 c-2.532-1.384-4.229-1.856-5.336-1.551c-1.919,0.107-3.919,2.107-5.919,2.107c4-1,6-5,10-6c-15,11-35,12-52,3c-13-7-20-20-24-34 c1,5,3,9,3.299,13.505c-0.397,0.708-3.423,2.219-6.655,3.466c-22.627,8.729-49.423,1.729-65.241-19.971 c-3.453,0-6.263,0.589-8.723,0.879c-17.3,3.2-32.381-7.709-40.771-22.689c-1.678-2.996-3.089-6.153-4.195-9.396 c-15.714-7.795-29.714-18.795-33.714-37.795c-5-25,11-45,29.842-57.667c0.719-2.335,1.697-4.636,3.006-6.896 C201.159,23.306,202.698,21.089,202.698,21.089z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M269.719,186.306c0,4.602-4.179,8.333-9.333,8.333c-5.155,0-9.334-3.731-9.334-8.333 c0-4.603,4.179-8.333,9.334-8.333C265.54,177.973,269.719,181.704,269.719,186.306z" + }, + "fill": "#FFFFFF", + "stroke": { + } + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M269.719,186.306c0,4.602-4.179,8.333-9.333,8.333c-5.155,0-9.334-3.731-9.334-8.333 c0-4.603,4.179-8.333,9.334-8.333C265.54,177.973,269.719,181.704,269.719,186.306z" + }, + "fill": "none", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M268.225,186.165c-0.564,8.736-13.982,9.286-15.633,0.853 c-1.785-9.125,15.017-10.254,15.649-0.451c0.125,1.929,3.078,1.388,2.955-0.521c-0.814-12.597-20.828-12.412-21.639,0.119 c-0.827,12.813,20.831,13.028,21.655,0.283C271.337,184.518,268.35,184.235,268.225,186.165z" + }, + "fill": "#FFFFFF", + "stroke": { + } + } + ] + } + ] + }, + { + "shape": { + "type": "path", + "path": "M260.386,188.306c0,3.498-2.985,6.333-6.667,6.333 s-6.667-2.835-6.667-6.333c0-3.498,2.985-6.333,6.667-6.333S260.386,184.808,260.386,188.306z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M238.386,196.973c0,1.289-1.045,2.333-2.334,2.333 c-1.288,0-2.333-1.045-2.333-2.333s1.045-2.333,2.333-2.333C237.341,194.639,238.386,195.684,238.386,196.973z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M285.719,179.973c0,4.602-4.253,8.333-9.5,8.333 s-9.5-3.731-9.5-8.333c0-4.603,4.253-8.333,9.5-8.333S285.719,175.371,285.719,179.973z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "yellBubble", + "children": [ + { + "shape": { + "type": "path", + "path": "M251.156,176.051 l40.228-15.992" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M280.932,149.385 l-40.667,36.42" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "textContainer_2_", + "shape": { + "type": "path", + "path": "M217.778,34.643 c8.609,6.684,9.952,3.684,7.987-5.785c6.308,5.125,9.308,3.782,10.188-4.309c2.433,8.091,5.266,8.091,9.12-1.703 c6.063,9.793,13.146,9.793,24.043,3.878c6.103,5.915,16.02,5.915,20.094-4.64c17.178,10.555,28.511,10.555,45.233-5.505 c5.941,16.06,17.273,16.06,18.835,1.458c19.688,14.603,29.605,14.603,46.749-17.802c-0.144,32.405,6.939,32.405,29.26,16.182 c-12.403,16.223-9.57,16.223,4.813,6.576c-11.07,9.646-8.07,10.99,4.333,9.089c-8.061,6.244-6.717,9.244,2.533,11.068 c-9.25,1.489-9.25,5.703-0.315,13.07c-8.935,6.115-8.935,15.385,7.513,10.932c-16.447,24.677-16.447,35.631,14.938,36.553 c-31.385,19.303-31.385,28.571-4.39,40.526c-26.995,1.528-26.995,5.741-5.942,17.857c-21.053-8.801-22.396-5.802-9.526,11.916 c-17.213-13.374-20.213-12.03-12.048,8.029c-11.479-20.06-14.312-20.06-10.553,3.532c-13.676-23.591-20.759-23.591-29.814-2.664 c-7.944-20.927-17.861-20.927-27.072,12.467c-12.039-33.395-23.373-33.395-23.148-1.581 c-22.89-31.814-34.224-31.814-61.517-8.479c6.042-23.335-3.874-23.335-11.9-9.703c-8.975-13.632-16.058-13.632-23.926,4.361 c-2.049-17.993-4.882-17.993-10.51-1.486c2.314-16.508-0.686-17.851-12.385-5.019c7.356-17.175,6.013-20.176-10.27-7.879 c16.283-15.61,16.283-19.824-9.255-12.972c25.538-20.334,25.538-29.603,1.919-46.578c23.619-3.249,23.619-14.204-0.313-25.522 c23.933-8.905,23.933-18.175,7.798-37.429C226.385,48.854,226.385,44.64,217.778,34.643z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/includes/js/dojox/gfx/demos/data/Lars.svg b/includes/js/dojox/gfx/demos/data/Lars.svg new file mode 100644 index 0000000..7295501 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/Lars.svg @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/gfx/demos/data/LarsDreaming.json b/includes/js/dojox/gfx/demos/data/LarsDreaming.json new file mode 100644 index 0000000..d4cd1ad --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/LarsDreaming.json @@ -0,0 +1,1823 @@ +[ + { + "name": "torso", + "children": [ + { + "name": "leftArm", + "shape": { + "type": "path", + "path": "M156.007,292.675c2.737,1.778,5.563,3.321,8.752,3.946c7.099,1.391,19.25-5.666,23.136-11.698 c1.572-2.441,8.077-21.031,11.178-14.271c1.224,2.67-1.59,4-1.399,6.462c3.108-1.425,5.48-5.242,8.918-2.182 c0.672,4.019-4.472,4.343-3.918,7.669c1.376,0.218,5.395-1.595,6.285-0.535c1.707,2.027-2.933,3.561-4.072,4.018 c-1.852,0.741-4.294,1.233-5.988,2.369c-2.636,1.769-4.766,5.144-7.033,7.4c-11.657,11.604-26.184,10.553-40.646,5.515 c-4.713-1.642-17.399-4.472-18.655-9.427c-1.647-6.502,5.523-7.999,10.184-6.74C147.658,286.528,151.725,289.892,156.007,292.675z" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "leftArmThumb", + "shape": { + "type": "path", + "path": "M188.257,284.902c-1.932-1.391-3.313-4.206-3.506-6.494c-0.149-1.786,0.59-6.521,3.199-3.95c0.792,0.78,0.083,2.155,0.558,2.943 c0.885,1.47,1.071,0.493,2.748,1.002c1.406,0.426,3.827,2.05,4.251,3.499" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "rightArm", + "shape": { + "type": "path", + "path": "M57.05,283.307c-5.502,5.354-13.185,8.541-18.249,14.221c-4.303,4.827-7.721,11.575-11.138,17.112 c-6.752,10.938-10.794,26.076-19.912,35.185c-3.869,3.866-7.637,5.722-7.251,12.032c0.932,0.372,1.548,0.589,2.418,0.683 c0.605-2.745,2.569-4.198,5.362-3.799c-0.14,3.365-3.512,5.941-3.228,9.235c0.364,4.223,3.983,5.968,7.181,2.662 c2.61-2.699,0.192-7.849,3.338-10.18c5.535-4.103,2.889,2.998,4.13,5.515c5.19,10.519,8.634-1.859,7.35-7.996 c-2.336-11.159-3.003-15.126,3.267-24.416c6.358-9.419,12.194-18.708,19.399-27.588c1.116-1.375,2.08-2.729,3.333-4" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "shirt", + "children": [ + { + "name": "tShirt", + "shape": { + "type": "path", + "path": "M96.509,268.265 c-2.301,0.323-4.69,0.205-6.945,0.72c-2.234,0.509-4.5,0.8-6.749,1.249c-4.369,0.872-8.206,3.265-12.3,5.024 c-3.259,1.4-6.644,2.57-9.763,4.26c-1.923,1.041-3.688,2.616-5.487,3.97c-1.543,1.16-3.495,2.11-4.854,3.563 c-2.205,2.354,0.896,7.407,1.854,9.873c0.92,2.367,2.149,4.819,2.749,7.29c0.228,0.937,0.235,2.058,0.875,2.872 c0.644,0.821,0.64,0.735,1.822,0.049c1.513-0.878,2.873-1.993,4.329-2.993c2.431-1.67,5.462-2.849,7.434-5.111 c-3.335,1.652-5.335,4.679-6.931,8.012c-1.398,2.921-4.482,35.854-5.389,38.947c-0.195,0.003-0.775,0.003-0.749,0.013 c20.561,0,41.123-0.069,61.684,0c2.1,0.008,3.607-0.496,5.529-1.252c0.715-0.28,2.257-0.355,2.807-0.744 c1.412-0.998-0.094-3.916-0.646-5.303c-1.425-3.579-2.111-37.767-4.726-40.543c1.842,0.058,4.127,1.312,5.938,1.95 c1.351,0.478,2.633,1.092,3.956,1.66c1.39,0.597,3.667,1.927,5.168,1.857c0.296-1.872,1.045-3.285,1.839-5.02 c0.942-2.061,1.155-4.214,1.528-6.415c0.351-2.07,0.897-3.787,1.938-5.635c0.531-0.942,1.356-1.73,1.693-2.769 c-0.443-0.401-1.043-0.906-1.604-1.125c-0.56-0.219-1.292-0.11-1.908-0.33c-1.236-0.438-2.439-1.089-3.668-1.575 c-3.773-1.499-7.519-2.983-11.319-4.467c-3.575-1.396-6.977-3.238-10.784-3.871c-1.735-0.289-3.467-0.529-5.073-0.906" + }, + "fill": "#4459A5", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "name": "shirtNeck", + "shape": { + "type": "path", + "path": "M99.759,268.89 c-0.984,0.151-1.746-0.549-2.75-0.5c-1.369,0.065-1.649,0.872-2.153,2c-1.037,2.325-2.442,4.974,0.064,6.945 c2.53,1.991,6.964,1.718,9.829,0.804c1.616-0.517,3.045-1.24,3.825-2.867c0.508-1.062,0.935-2.771,0.149-3.598 c-0.231-0.243-0.562-0.376-0.84-0.534" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "name": "shirtLogo", + "children": [ + { + "children": [ + { + "shape": { + "type": "path", + "path": "M104.864,296.921c-0.151-0.004,7.101,0.409,7.052,0.403c0.132,0.028-0.172,0.633-0.021,0.632 c-0.226,0.028-7.244-0.454-7.28-0.464C104.657,297.519,104.776,296.904,104.864,296.921z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M90.071,295.919c-0.199,0.005,6.792,0.431,6.79,0.446c0.153,0.005-0.031,0.663,0.012,0.665 c0.272,0.016-6.79-0.471-6.875-0.459C89.881,296.561,89.796,295.899,90.071,295.919z" + }, + "stroke": { + } + } + ] + }, + { + "shape": { + "type": "path", + "path": "M84.407,306.477c0.2-0.159,0.322-1.04,0.254,0.057c-0.542-0.355-2.02,2.083-4.215,2.001 c-1.887-1.706-4.559-3.384-4.302-7.092c0.652-2.599,3.082-4.084,5.213-3.942c1.889,0.378,2.899,0.717,4,1.318 c-0.497,0.957-0.175,0.866-0.459,0.703c0.456-2.398,0.598-5.75,0.312-7.855c0.594-0.554,0.714,0.125,1.249,0.941 c0.502-0.727,0.509-1.425,0.875-0.571c-0.207,1.328-0.809,7.187-0.711,10.174c-0.126,2.798-0.375,4.354-0.051,4.985 c-0.718,0.613-0.667,1.006-0.981,1.381c-0.72-1.33-1.056-0.132-1.339-0.157C84.632,308.442,84.493,305.791,84.407,306.477z M81.186,307.177c2.403,0.206,3.734-2.164,3.841-4.223c0.269-2.72-0.896-5.104-3.198-5.04c-1.972,0.438-3.46,2.188-3.331,4.639 C78.171,306.266,79.847,306.962,81.186,307.177z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M93.321,297.767c2.592,0.147,5.688,2.314,5.696,5.627c-0.611,4.576-3.69,5.316-6.158,5.581 c-2.68-0.76-5.708-1.872-5.413-6.472C88.086,299.395,90.653,297.875,93.321,297.767z M92.939,307.46 c2.531,0.735,3.706-1.297,3.666-3.935c0.114-2.219-0.641-4.584-3.389-4.896c-2.29-0.553-3.366,2.188-3.661,4.688 C89.339,305.265,89.934,307.95,92.939,307.46z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M99.688,303.916c0.03-1.511,0.055-4.73,0.022-4.646c0.481-1.355,0.658-0.556,1.034-1.297 c0.263,1.473,0.653,0.326,1.186,0.065c-0.386,2.518-0.513,3.348-0.574,4.949c-0.068-0.47-0.128,2.28-0.238,2.188 c-0.055,1.935-0.036,2.201-0.047,4.219c-0.079,0.914-0.28,2.412-1.126,3.831c-0.61,1.212-1.73,1.146-3.24,1.651 c0.073-0.945-0.065-1.242-0.096-1.822c0.098,0.138,0.213,0.604,0.225,0.397c1.892,0.229,2.209-1.896,2.362-3.365 c0.042,0.304,0.512-6.934,0.415-7.062C99.73,302.637,99.75,303.179,99.688,303.916z M100.978,295.564 c0.717,0.14,1.11,0.61,1.099,1.156c0.052,0.552-0.595,0.993-1.286,1.015c-0.541-0.074-1.025-0.548-1.022-1.054 C99.813,296.084,100.292,295.644,100.978,295.564z" + }, + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M108.115,298.791c3.028-0.066,5.283,1.359,5.256,5.758c-0.264,3.479-3.366,4.63-5.883,5.119 c-2.429-0.033-5.619-2.24-5.16-5.811C102.322,300.085,105.715,298.846,108.115,298.791z M107.351,309.232 c2.675-0.132,3.839-2.333,3.841-4.497c0.246-2.344-0.263-4.833-2.923-5.396c-2.844,0.299-3.974,1.917-4.053,4.479 C104.136,306.655,104.854,308.372,107.351,309.232z" + }, + "stroke": { + } + } + ] + } + ] + } + ] + }, + { + "name": "heads", + "children": [ + { + "name": "head1", + "children": [ + { + "name": "leftEart", + "children": [ + { + "shape": { + "type": "path", + "path": "M201.557,195.475 c7.734-4.547,16.592-5.012,18.405,4.443c2.43,12.659-3.317,13.328-14.598,13.328" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M211.711,203.09 c0.523,0.004,0.946-0.208,1.271-0.635" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M211.076,197.377 c3.062,3.013,5.489,5.624,4.442,10.155" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "bgHairTop", + "shape": { + "type": "path", + "path": "M54.384,199.307c-5.253-4.402-7.511-11.061-15.779-10.632c3.449-1.277,7.116-2.397,10.911-2.666 c-2.873-1.397-5.865-2.575-8.231-4.718c3.986-1.119,11.47-1.817,14.864,0.75c-5.183-2.758-8.397-7.816-13.062-10.598 c6.014-0.643,12.377,0.978,18.022,2.265c-2.547-4.486-6.682-10.83-10.523-14.297c5.033,1.052,10.647,4.518,15.062,7.177 c-1.614-4.176-5.634-8.406-7.859-12.513c10.312-1.125,12.522,4.919,19.7,9.932c-0.412-0.127-1.114-0.113-1.527,0.015 c0.875-7.261,3.058-12.8,8.258-18.566c6.771-7.507,17.813-9.131,24.095-15.381c-4.699,1.821-4.518,23.765-4.875,28.955" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "bgHairLeft", + "shape": { + "type": "path", + "path": "M92.384,243.973c-6.334,7.929-12.601,12.241-22.465,15.361c3.65-1.263,7.735-5.859,7.695-9.928 c-2.208,0.218-4.49,0.605-6.498,1.098c1.244-1.098,2.087-3.239,3.198-4.396c-5.77,0.001-12.131,1.133-18.396,1.23 c5.013-2.81,10.665-3.25,12.398-9.247c-3.59,0.313-7.233,1.606-11.033,1.097c1.731-2.022,3.953-3.995,5.049-6.447 c-3.781,0.056-6.665,3.098-10.547,2.465c0.962-2.863,3.187-5.208,4.531-7.766c-5.59-0.273-11.658,2.45-17.732,2.564 c5.494-2.857,8.967-7.819,12.3-12.718c5.233-7.693,10.625-9.96,20.349-9.981c11.059-0.024,15.558,6.714,20.984,16 c2.786,4.767,7.249,14.375,0.832,18" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "bgHair", + "shape": { + "type": "path", + "path": "M142.384,255.307c2.984,6.076,3.567,11.855,10.531,14.6c-0.134-3.114-0.094-6.664,1.619-9.033 c1.604,1.969,3.122,4.211,5.048,5.698c-0.29-1.769,0.412-4.023,0.233-5.828c3.444,0.261,4.979,3.965,8.468,4.479 c0.065-2.78,0.427-5.151,0.868-7.813c2.687,0.2,4.768,1.565,7.132,2.997c0.452-4.921-0.409-10.579-0.667-15.666 c-5.795-0.756-12.291,2.827-17.899,3.899c-4.414,0.844-14.136,0.523-15.333,6" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "neck", + "shape": { + "type": "path", + "path": "M106.989,254.499c-2.932,6.063-4.613,11.997-8.947,17.138c7.288,10.194,16.311-10.9,15.183-17.026 c-1.926-1.138-3.928-1.589-6.236-1.38" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "headShape", + "shape": { + "type": "path", + "path": "M210.941,207.666c-0.844,3.985-2.081,7.982-3.77,11.783c-3.374,7.604-8.543,14.427-16.052,18.899 c-2.94,2.13-5.983,4.167-9.109,6.085c-25.013,15.342-55.353,23.08-82.254,10.57c-3.433-1.558-6.785-3.432-10.053-5.66 c-1.821-1.185-3.592-2.46-5.308-3.832c-1.715-1.373-3.375-2.842-4.972-4.412c-2.352-2.148-4.576-4.425-6.631-6.814 c-6.168-7.169-10.823-15.358-12.87-24.185c-0.649-3.284-0.84-6.634-0.5-9.975c4.48-13.743,14.22-24.364,26.109-32.149 c2.973-1.946,6.079-3.715,9.271-5.309c30.581-15.027,69.581-10.027,95.852,12.209c2.563,2.254,4.987,4.651,7.244,7.178 c4.513,5.054,8.354,10.626,11.312,16.64C210.178,201.505,210.798,204.497,210.941,207.666z" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "rightEar", + "children": [ + { + "shape": { + "type": "path", + "path": "M64.857,195.606 c-6.59-7.181-15.047-10.664-19.467,3.676c-1.235,4.007-1.87,14.468,1.29,17.786c4.223,4.435,13.591,0.529,19.055-0.015" + }, + "fill": "#FFE8B0", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M52.407,196.744 c-1.702,3.613-1.257,7.505-1.27,11.424" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M51.772,209.438 c-3.39-4.661,0.922-5.769,5.078-6.347" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "fgHair", + "shape": { + "type": "path", + "path": "M90.384,154.64c8.453-11.353,15.678-13.458,28.581-15.915c-1.382,3.376-3.89,7.352-5.179,11.16 c5.01-1.816,9.571-6.545,15.218-8.413c11.355-3.755,23.853-1.903,35.671-2.213c-3.004,3.712-4.912,7.88-2.025,11.447 c5.855-2.212,13.369-6.871,19.635-6.646c0.263,4.561-0.024,9.278,0.201,13.841c3.509-1.201,6.015-3.04,8.276-5.148 c2.263-2.108,3.761-4.049,4.942-5.2c1.063,2.408,2.134,5.334,2.24,8.494c-0.183,3.462-0.866,6.794-2.66,9.291 c3.663,0.65,6.098-2.021,8.35-4.479c-0.655,4.349-3.164,8.604-3.851,13.013c2.178-0.072,4.382,0.216,6.367-0.48 c-1.39,3.093-3.069,7.287-6.616,8.414c-4.476,1.423-4.354-0.992-7.315-4.332c-4.892-5.518-9.773-6.791-15.872-9.464 c-6.585-2.887-10.982-6.47-17.963-8.219c-8.994-2.255-19.864-3.867-28.093-5.196c2.466,1.967,1.138,5.594,0.659,8.625 c-2.729-0.646-4.41-3.813-6.301-5.158c0.953,3.195,0.983,6.953-2.134,8.491c-6.145-5.226-9.199-9.721-17.527-11.647 c1,1.83,1.728,4.208,1.396,6.402c-0.751,4.971-0.289,3.134-3.836,2.466c-5.192-0.977-9.953-3.677-15.815-4.496 c3.292,2.002,5.469,5.017,7.418,8.21c-2.651,0.404-6.238,0.257-8.382,1.671c2.456,0.38,3.44,2.166,3.197,4.714 c-7.45,0.386-13.623,0.731-19.915,5.434" + }, + "fill": "#FFF471", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + } + ] + }, + { + "name": "eyes", + "children": [ + { + "name": "eyes1", + "children": [ + { + "shape": { + "type": "path", + "path": "M123.163,176.668 c-5.066,1.17-9.01,7.888-13.666,10.335c-4.238,2.227-8.648,6.636-7.009,12.332c1.971,6.848,12.042,3.991,16.261,1.165 c5.282-3.539,9.59-8.517,12.006-14.524c1.523-3.787,2.568-7.272-1.509-9.391c-2.905-1.51-8.174-1.386-11.417-0.583" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M182.545,179.865 c-3.533,0.169-4.854-1.166-8.408-0.001c-3,0.983-6.239,1.936-8.852,3.743c-3.938,2.725-7.46,5.555-4.73,13.592 c1.974,5.811,8.791,7.571,14.656,6.667c5.537-0.854,9.078-4.977,11.408-10.007c3.666-7.918,0.942-11.639-6.742-13.659" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000", + "cap": "round" + } + }, + { + "shape": { + "type": "path", + "path": "M108.829,183.668c-1.308-1.03-4.557,0.011-5.6-1.733 c-1.056-1.765,1.735-5.409,2.984-6.192c5.684-3.562,15.946-0.39,19.95-6.742" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M163.877,167.198c2.369,1.282,6.539,0.307,9.408,0.815 c3.449,0.612,7.065,2.657,10.592,2.851" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M127.496,192.002c-4.917-2.12-9.188-1.708-8.608,4.942 c3.132,1.734,5.428-2.82,7.275-4.942" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M174.852,203.144c-0.293,0.12-0.307,0.577-0.942,0.282 c-1.605-3.188-0.404-6.507,2.676-8.192c2.15-1.176,5.67-1.759,7.471,0.359c0.199,0.234,0.412,0.521,0.515,0.813 c0.229,0.649-0.285,0.95-0.285,0.95s-3.988,6.009-3.285,1.934c0.438,1.743-5.537,5.743-2.287,1.653 c-1.955,2.583-2.524,1.977-3.859,2.868" + }, + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "eyes2", + "children": [ + { + "shape": { + "type": "path", + "path": "M98.668,186.108c0.668-8.915,15.545-13.749,22.667-15" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M169.667,178.108c5.307,3.436,16.928,5.632,19.668,12.333" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M105.334,197.775c8.085-4.283,17.059-2.8,25-6.333" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M164.001,198.775c4.656-0.417,9.664,1.805,14.334,2.017 c3.951,0.18,5.773,0.189,9,2.316" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M124.001,188.108c3.039-0.258,4.594,2.571,5.301,4.983 c-1.096,1.242-2.065,2.646-2.968,4.017" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M168.335,194.108c-1.77,2.293-4.869,3.271-6.299,5.91 c1.377,0.991,3.02,2.122,3.965,3.424" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + }, + { + "name": "beard", + "children": [ + { + "shape": { + "type": "path", + "path": "M96.05,213.64 c-0.366,0.21-0.783,0.389-1.167,0.5" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M102.55,211.973 c0.314-0.01,0.554-0.198,0.667-0.5" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M105.717,208.806 c0.164-0.109,0.336-0.224,0.5-0.333" + }, + "fill": "#AFA8A5", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M111.05,207.973 c-0.651-1.81,0.859-2.262,2.333-1.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M117.717,209.806 c1.738,0,3.653,0.369,5.333,0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M132.717,214.473 c0.104-0.21,0.162-0.435,0.167-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M139.551,216.973 c0.215-0.175,0.465-0.426,0.666-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M144.551,213.306 c0.277-0.056,0.557-0.111,0.833-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M147.884,216.64 c0.195,0.045,0.369-0.013,0.5-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M148.384,214.14 c0.112-0.168,0.223-0.332,0.333-0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M98.217,219.306c1.697-1.772,4.233-2.109,5.967-4.046c1.519-1.696,3.812-3.001,4.2-5.454" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M152.717,216.14 c0.611,0,1.224,0,1.834,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M160.384,217.473 c0.333,0,0.667,0,1,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M163.217,215.973 c0.321-0.042,0.658-0.175,0.834-0.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M164.217,218.806 c0.167,0,0.333,0,0.5,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M168.384,217.973 c0.057-0.056,0.111-0.111,0.167-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M169.884,225.806 c0.491-0.397,0.882-0.926,1.167-1.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M172.717,221.973 c0.057,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M171.717,229.806 c0.334,0.075,0.659,0.025,0.834-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M190.051,227.806 c0.163-0.242,0.398-0.423,0.666-0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M197.384,221.473 c0.258-0.007,0.485-0.125,0.667-0.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M199.384,214.973 c-0.04-0.333,0.075-0.609,0.333-0.833" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M117.884,257.306 c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M142.717,252.473 c0.358,0.068,0.71,0.016,1-0.167" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M137.884,256.473 c0.277,0,0.557,0,0.833,0" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M160.884,252.973 c0.366-0.139,0.766-0.402,1-0.667" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M171.384,250.14 c0.235-0.264,0.476-0.562,0.667-0.834" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M89.384,243.973 c0.537,0.378,1.329,0.876,1.833,1.333" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M79.05,225.473 c0.087,0.272,0.143,0.55,0.167,0.833" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M73.884,222.64 c0,0.167,0,0.333,0,0.5" + }, + "fill": "none", + "stroke": { + "color": "#AAAAAA", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M72.55,219.806c0.466-0.325,0.875-0.797,1.167-1.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M71.717,211.973c0.422-0.553,0.776-1.305,1-2" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M78.55,214.473c0-0.111,0-0.222,0-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M79.384,218.806c-0.001-0.137,0.055-0.248,0.167-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M80.217,221.14c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M75.55,226.473c0.103-0.5,0.156-0.977,0.167-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M78.55,230.14c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M83.384,227.64c0.118-0.059,0.215-0.107,0.333-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M81.55,237.14c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M86.217,233.806c0.056,0,0.111,0,0.167,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M87.884,230.473c0.595-0.181,1.219-0.527,1.833-0.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M88.717,222.14 c-0.929,2.359-1.615,4.865-2.667,7.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M89.05,216.14 c0.784-0.736,1.709-1.565,2.833-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M94.217,210.14 c1.599-0.089,3.199-0.167,4.833-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M94.884,224.64 c0.052-0.588-0.004-1.155-0.167-1.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M92.384,228.306 c0.585-0.062,1.244-0.132,1.667-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M88.717,240.14 c0.111,0,0.222,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M95.884,243.306 c0.526,0.1,1.017-0.016,1.333-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M98.55,248.306 c0.069-0.24,0.265-0.926,0.333-1.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M96.55,249.806 c0.125,0.014,0.18-0.042,0.167-0.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M104.55,250.14 c0.01-0.238,0.126-0.428,0.333-0.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M106.884,251.973 c0.195,0.045,0.37-0.014,0.5-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M113.884,254.806 c0.758-0.586,1.595-1.171,2.382-1.774c0.072,0.376,0.418,0.686,0.48,1.079c0.833,0.265,1.624-0.021,1.638-0.971" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M122.217,254.64 c0.063-0.165,0.179-0.288,0.333-0.334" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M125.884,255.806 c1.13-0.745,2.783-0.962,3.667-2" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M132.217,255.973 c0.638-0.492,1.104-1.173,1.141-1.976c-1.11,0.063-1.449-0.888-1.475-1.857" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M129.717,249.306 c-0.045,0.153-0.168,0.271-0.333,0.334" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M136.551,252.306 c0.223,0,0.444,0,0.666,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M110.217,251.306 c0.056-0.057,0.111-0.11,0.167-0.166" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M140.717,251.806 c0.111,0,0.224,0,0.334,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M150.051,249.473 c0.111,0,0.223,0,0.333,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M143.217,255.473 c1.022-0.313,1.725-1.175,2.646-1.654c0.203,0.321,0.439,0.626,0.521,0.987" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M152.217,253.473 c0.165-0.063,0.288-0.179,0.334-0.333" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M155.051,254.64 c0.223,0,0.444,0,0.666,0" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M157.717,256.473 c0.326-0.027,0.546-0.073,0.834-0.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M163.217,252.64 c0.552-0.892,2.082-1.512,2.341-2.334c0.37-1.178-1.155-3.069-1.007-4.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M167.384,235.973 c0.118-0.54,0.354-1.064,0.667-1.5" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M170.717,242.806 c0-0.333,0-0.667,0-1" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M170.217,236.973 c0-0.333,0-0.667,0-1" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M179.051,235.806 c0.378-0.101,0.738-0.35,1-0.667" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M185.051,232.806 c0.379-0.319,0.656-0.702,0.833-1.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M188.051,231.14 c0.063-0.39,0.178-0.792,0.333-1.167" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M197.884,223.306 c-0.166,0.277-0.334,0.556-0.5,0.833" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + }, + { + "name": "mouths", + "children": [ + { + "name": "mouth1", + "children": [ + { + "shape": { + "type": "path", + "path": "M177.122,216.821c-0.515,2.282-5.213,3.21-7.434,3.854 c-3.254,0.945-6.596,1.345-9.895,1.851c-3.26,0.5-6.665,0.671-10.107,0.671c-3.596,0-6.645,0.559-10.106,0.671 c-3.105,0.1-6.898-0.474-9.694-1.3c-3.527-1.043-6.672-1.666-10.096-3.062c-2.823-1.152-5.746-1.876-8.462-3.143 c-2.594-1.209-6.084-1.994-8.221-3.552c-1.068,1.834-5.867,3.748-8.1,4.546c-2.444,0.874-8.881,2.725-7.817,5.512 c0.457,1.195,1.948,2.273,2.63,3.385c0.774,1.261,1.139,2.601,2.057,3.859c1.83,2.5,4.506,4.773,6,7.34 c1.308,2.249,2.096,4.74,4.01,6.669c2.214,2.233,5.792,2.635,9.231,2.399c7.028-0.479,13.982-2.129,20.481-3.983 c3.295-0.941,6.699-1.536,10.086-2.686c3.272-1.111,6.642-3,9.402-4.777c5.248-3.377,10.278-6.409,14.283-10.705 c1.479-1.587,3.429-2.503,5.149-3.859" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M135.25,241.319 c0.723-4.757-10.487-8.47-14.898-9.526c-3.09-0.74-6.68-1.17-9.858-1.712c-2.758-0.47-6.865-0.836-9.437,0.369 c-1.385,0.649-2.843,1.724-4.141,2.513c2.156,3.964,4.728,8.861,9.468,11.506c3.229,1.801,5.511,0.776,8.859,0.373 c3.045-0.369,6.046-0.703,9.029-1.721c3.479-1.186,7.228-2.385,10.978-2.475" + }, + "fill": "#FFC0C0", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M148.656,225.547c1.267,0.697,1.301,2.838,0.671,3.9 c-0.702,1.182-2.063,1.4-3.307,2.01c-2.271,1.116-4.58,2.624-7.481,2.638c-4.619,0.023-2.144-4.067-0.253-5.869 c2.405-2.292,5.057-2.72,8.72-2.512c0.588,0.034,1.095,0.041,1.65,0.168" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M130.299,223.365 c2.687,0.437,5.619,4.384,3.727,6.422c-1.234,1.33-7.94,1.391-9.915,1.296c-4.896-0.233-2.502-2.445-0.613-4.525 c1.604-1.767,5.088-3.249,7.833-3.36" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M113.178,217.157 c2.56,0.958,4.922,5.057,5.352,7.215c0.377,1.885-0.324,2.106-2.526,2.643c-1.366,0.333-3.636,0.723-5.105,0.385 c-2.506-0.577-5.883-5.051-4.909-7.223c1.03-2.298,5.944-2.923,8.427-2.852" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M99.359,217.662 c2.038,0.432,4.015,4.279,2.468,5.625c-1.083,0.943-5.221,1.795-6.799,1.589c-4.032-0.526-2.265-4.102-0.866-5.872 c0.706-0.894,1.049-1.976,2.514-2.186c1.627-0.233,2.501,0.99,3.921,1.346" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M181.815,222.896c-3.102-2.75-4.765-8.777-9.282-10.403" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "mouth2", + "children": [ + { + "shape": { + "type": "path", + "path": "M87.57,221.951c5.563-1.759,11.066-1.32,16.694-1.782c2.93-0.24,5.228-1.14,8.309-0.927c3.142,0.217,6.085-0.235,9.289,0.176 c7.136,0.914,13.96,0.598,21.112,1.506c3.654,0.464,7.219,0.609,10.811,0.869c4.017,0.291,7.646,1.582,11.433,2.623 c2.948,0.812,6.347,1.618,9.011,2.99c2.521,1.298,6.354,2.856,8.301,4.72c-2.775,0.027-5.602,2.603-8.021,3.769 c-2.93,1.412-5.741,2.949-8.656,4.432c-5.599,2.849-11.885,5.468-18.104,6.53c-6.793,1.161-13.195,2.107-20.067,2.197 c-7.699,0.102-14.313-4.705-20.735-8.396c-2.071-1.19-4.69-2.182-6.504-3.666c-1.792-1.466-3.469-3.386-5.154-4.984 c-2.703-2.564-7.519-5.649-8.13-9.438" + }, + "stroke": { + "color": "#000000", + "width": "3", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M87.785,228.193 c-5.907-3.235-0.344-9.531,3.971-11.424" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2" + } + }, + { + "shape": { + "type": "path", + "path": "M184.679,227.229c-1.534,2.583-2.548,5.334-4.024,7.889" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "width": "2", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M106.862,219.528 c-3.071-0.74-5.608,2.166-6.318,4.738c-0.379,1.375-0.494,2.55,0.748,3.337c1.519,0.962,2.905-0.052,4.418-0.332 c2.518-0.467,7.293,0.053,6.461-4.248c-0.568-2.938-3.743-3.682-6.338-3.335c-0.451,0.06-0.758,0.212-1.205,0.229" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M119.764,218.479 c-2.648,1.243-4.657,3.518-5.346,6.377c-0.866,3.594,3.9,3.711,6.356,2.865c2.64-0.91,4.77-3.351,3.299-6.133 c-1.01-1.91-3.979-2.548-6.026-2.823" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M130.388,219.492 c-1.753,1.382-4.069,4.525-4.835,6.61c-1.159,3.156,2.296,3.371,4.868,3.348c3.061-0.028,6.6-1.148,5.022-4.78 c-1.168-2.691-2.552-4.85-5.551-5.241" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M142.954,221.087 c-1.502,0.337-5.418,3.249-5.638,4.997c-0.292,2.311,4.855,4.536,6.854,4.234c2.503-0.377,4.384-3.175,3.167-5.65 c-0.92-1.873-3.36-2.252-4.508-3.932" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M155.354,222.664 c-2.038,0.426-4.212,2.287-4.766,4.444c-0.723,2.821,3.226,3.383,5.458,3.331c2.541-0.059,5.126-1.752,3.249-4.32 c-1.394-1.908-3.707-3.189-5.304-4.636" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M168.367,237.924 c-1.554-1.217-3.302-2.557-5.203-2.976c-2.973-0.654-3.537,2.131-3.377,4.406c0.205,2.913,1.032,3.883,3.901,2.344 c1.987-1.066,4.271-1.997,4.599-4.456" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M151.524,246.202 c-1.912-0.166-4.004-4.491-2.91-6.25c0.771-1.239,5.456-1.688,6.857-1.292c0.271,0.917,0.979,1.841,0.829,2.771 c-0.088,0.54-0.994,1.645-1.296,2.188c-1.08,1.951-2.133,1.866-3.998,2.685" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M145.911,241.458 c-0.209,1.649-0.215,2.702-1.528,3.801c-0.885,0.738-1.772,1.189-2.54,2.1c-0.786,0.933-1.226,2.38-2.792,1.813 c-1.042-0.377-1.959-2.318-2.138-3.312c-0.299-1.676-1.003-5.228,0.783-6.158c1.154-0.603,7.066-0.18,7.43,1.32" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M133.12,238.991 c-1.495-0.087-2.253-1.33-3.918-0.964c-1.42,0.311-2.489,1.354-2.54,2.836c-0.052,1.527,0.99,5.581,1.852,6.956 c2.363,3.771,4.329-1.535,5.516-3.159c1.117-1.525,2.643-2.053,2.271-3.958c-0.318-1.632-1.118-2.047-2.766-2.329 c-0.382-0.065-0.773-0.095-1.158-0.147" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M116.853,237.43 c-1.049,2.211-0.173,5.147,0.047,7.565c0.357,3.93,3.827,2.028,5.831,0.067c1.575-1.541,4.599-4.86,2.209-6.484 c-1.881-1.279-5.727-2.458-7.756-1.107" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M107.455,233.38 c-0.813,2.487-1.704,5.049,0.073,7.364c1.91,2.486,4.009,1.229,5.537-0.939c1.056-1.5,3.316-4.481,1.563-6.017 c-1.347-1.179-6.468-1.518-7.854-0.325" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "mouth3", + "children": [ + { + "shape": { + "type": "path", + "path": "M99.05,218.973c1.691-0.875,3.313-2.39,4.833-3.537c1.231-0.928,2.782-1.671,3.5-3.072c1.846,3.486,7.661,4.669,11.003,6.067 c3.553,1.486,7.174,3.066,10.784,4.166c4.271,1.301,9.277,1.67,13.721,2.343c4.155,0.629,9.979,1.365,14.162,0.496 c1.182-0.245,2.343-1.024,3.462-1.446c0.162,1.905-3.637,3.023-4.933,3.487c-2.435,0.871-4.18,2.541-6.362,3.871 c-1.623,0.989-2.974,1.669-4.755,2.117c-1.77,0.445-3.353,0.806-4.825,1.878c-5.915,4.311-15.264,3.247-22.424,3.13 c-5.384-0.088-6.719-5.372-9.337-9c-1.437-1.991-2.843-3.854-3.796-6.138c-0.871-2.086-1.119-4.582-2.033-6.528" + }, + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M107.217,227.973c1.182-2.033,4.375-2.176,6.5-1.963c2.879,0.289,4.124,1.217,6.168,3.167c1.834,1.749,5.906,5.509,5.64,8.271 c-2.808,0.89-7.847,0.402-10.346-1.104c-1.334-0.804-1.151-2.256-2.246-3.588c-0.712-0.866-1.836-2.673-2.855-3.311 c-0.209-0.94-2.106-1.499-3.028-1.805" + }, + "fill": "#F4BDBD", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + } + ] + } + ] + }, + { + "name": "personalProps", + "children": [ + { + "name": "hat", + "children": [ + { + "children": [ + { + "children": [ + { + "shape": { + "type": "path", + "path": "M88.374,173.145c0.474-0.074,16.606,2.725,18.01,5.879 c1.145,2.572,28.184,4.568,28.184,4.568l35.971-5.618l5.024,1.132l7.212,0.315l9.295,0.851l10.188,3.248l5.75,2.935 l1.615-1.832l-0.264-5.27l-3.968-7.087c0,0-22.045-13.031-23.272-13.703c-1.229-0.669-4.941-2.294-6.484-4.542 c-8.584-12.528-8.403-18.05-3.371-6.461c0,0,2.662-7.592,2.521-8.575c-0.144-0.982,0.354-5.031,0.354-5.031l2.396-6.832 c0,0-1.379-5.341-2.738-7.19c-1.356-1.844-15.793-4.078-18.162-4.011c-24.933,0.706-3.783,0.071-25.567,0.724 c-24.317,0.728-0.882-2.591-24.068,3.551c-24.228,6.418-5.35-1.298-23.187,6.142c-18.301,7.633-16.67,7.186-16.704,10.685 c-0.034,3.499-3.057-4.884-0.034,3.499c3.023,8.381,3.037-3.871,3.023,8.381c-0.015,12.252,6.696,4.557,1.678,12.373 c-5.017,7.813-3.831,7.91-0.179,8.543c17.017,2.953,4.157,4.378,17.427,3.175" + }, + "fill": "#FF0000", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M156.604,114.92l-13.936,0.381l-11.633,0.343c-10.646,0.319-11.973-0.155-12.021-0.175l-0.599-0.238 l-0.577,0.514l0.049-0.047c-0.118,0.09-1.43,0.957-11.145,3.53c-9.989,2.646-12.812,2.931-13.421,2.704 c-0.822-0.306-0.821-0.306-7.791,2.604l-2.104,0.878c-16.037,6.689-17.342,7.324-17.342,10.316c0,0.019,0.001,0.041,0.001,0.06 c-0.224-0.108-0.459-0.199-0.787-0.04c-0.357,0.173-0.565,0.275-0.565,0.672c0,0.557,0.411,1.697,1.399,4.438 c0.924,2.561,1.71,3.671,2.714,3.833c0.083,0.014,0.164,0.02,0.241,0.02c0.007,0.584,0.01,1.339,0.01,2.313 c0,0.561-0.001,1.902-0.001,1.916c0,6.908,2.176,8.105,3.347,8.749c0,0,0.075,0.045,0.151,0.09 c-0.095,0.332-0.47,1.1-1.661,2.955c-2.509,3.908-3.516,5.931-3.516,7.303c0,0.358,0.068,0.671,0.196,0.962 c0.544,1.237,1.926,1.477,3.677,1.78l0.135,0.023c8.138,1.412,9.14,2.422,9.568,2.854c0.923,0.931,1.511,0.928,7.224,0.413 c0.06,0.014,0.102,0.068,0.165,0.071c2.167,0.105,16.131,3.138,17.087,5.288c1.147,2.578,16.416,4.228,29.023,5.159 l0.115,0.009c0,0,35.523-5.548,35.896-5.606c0.345,0.078,4.927,1.11,4.927,1.11l7.301,0.319c0,0,8.927,0.818,9.139,0.837 c0.202,0.064,9.854,3.142,10.006,3.19c0.143,0.073,6.368,3.251,6.368,3.251l2.397-2.719l-0.296-5.911l-4.213-7.526 l-0.231-0.137c-0.9-0.532-22.073-13.047-23.304-13.72c-0.001,0-0.734-0.38-0.734-0.38c-1.48-0.752-4.238-2.151-5.404-3.85 c-1.357-1.982-2.451-3.729-3.354-5.268c0.021-0.064,0.104-0.296,0.104-0.296c1.193-3.402,2.576-7.619,2.576-8.885 c0-0.063-0.004-0.118-0.011-0.165c-0.013-0.083-0.018-0.204-0.018-0.356c0-0.909,0.194-2.911,0.363-4.307 c0.072-0.205,2.46-7.013,2.46-7.013l-0.076-0.294c-0.146-0.566-1.468-5.584-2.9-7.532 C173.721,116.784,158.242,114.875,156.604,114.92z M131.097,117.644l11.614-0.342l13.951-0.382 c2.575-0.073,16.104,2.238,17.336,3.614c0.956,1.3,2.058,4.938,2.49,6.549c-0.188,0.536-2.33,6.642-2.33,6.642l-0.014,0.107 c-0.072,0.592-0.387,3.224-0.387,4.658c0,0.258,0.011,0.477,0.034,0.639c-0.006,0.493-0.768,3.026-1.659,5.709 c-2.14-4.566-2.792-4.606-3.242-4.629l-0.62-0.031l-0.354,0.571c-0.069,0.124-0.102,0.29-0.102,0.492 c0,2.273,4.134,9.172,6.992,13.346c1.456,2.12,4.51,3.669,6.149,4.501l0.682,0.353c1.139,0.622,20.813,12.25,23.012,13.549 c0.238,0.427,3.513,6.275,3.721,6.647c0.02,0.393,0.199,3.971,0.23,4.629c-0.229,0.262-0.472,0.535-0.832,0.944 c-1.069-0.546-5.132-2.619-5.132-2.619l-10.369-3.306l-9.403-0.86c0,0-6.995-0.307-7.169-0.315 c-0.168-0.038-5.124-1.155-5.124-1.155s-35.814,5.594-36.044,5.63c-12.419-0.922-25.993-2.687-27.285-4.058 c-1.366-3.097-13.245-5.574-17.517-6.211c-0.203-0.212-0.479-0.346-0.793-0.318c-3.083,0.28-5.996,0.544-6.4,0.369 c0-0.003-0.12-0.117-0.12-0.117c-0.703-0.708-1.879-1.895-10.646-3.416l-0.135-0.023c-0.827-0.143-2.075-0.359-2.188-0.614 c-0.021-0.048-0.033-0.111-0.033-0.193c0-0.592,0.632-2.179,3.205-6.187c1.488-2.318,2.024-3.388,2.024-4.188 c0-0.15-0.019-0.291-0.054-0.428c-0.181-0.712-0.758-1.03-1.179-1.261c-0.865-0.476-2.311-1.271-2.311-6.993 c0-0.014,0.001-1.098,0.001-1.56c0-4.969-0.065-4.992-0.833-5.258c-0.424-0.146-0.816,0.001-1.178,0.377 c-0.208-0.289-0.558-0.898-1.073-2.324c-0.205-0.568-0.385-1.068-0.542-1.506c0.587-0.423,0.632-1.277,0.636-1.644 l-0.014-0.825c-0.004-0.119-0.007-0.231-0.007-0.338c0-1.702,0.899-2.264,16.109-8.608l2.105-0.878 c4.165-1.739,5.948-2.482,6.375-2.562c0.817,0.296,2.292,0.597,14.579-2.658c8.169-2.164,10.697-3.187,11.58-3.704 C120.451,117.773,124.529,117.84,131.097,117.644z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M155.146,147.93c4.88-9.398-5.344-20.199-12.649-21.176 c-12.05-1.61-13.404,10.426-13.684,21.258c3.73,2.016,8.915,3.425,11.721,6.534" + }, + "fill": "#FFFFFF", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M133.446,127.979c-4.599,3.921-5.426,11.933-5.635,20.006l-0.017,0.654l4.415,2.067 c2.849,1.244,5.793,2.529,7.581,4.509c0.371,0.41,1.004,0.442,1.412,0.072c0.219-0.197,0.33-0.469,0.33-0.743 c0-0.239-0.084-0.479-0.258-0.67c-2.076-2.299-5.223-3.673-8.267-5.001c0,0-2.377-1.112-3.174-1.486 c0.223-7.385,1.021-14.572,4.909-17.887c1.892-1.614,4.386-2.189,7.621-1.757c4.143,0.554,9.086,4.472,11.5,9.113 c1.348,2.591,2.51,6.535,0.395,10.611c-0.254,0.49-0.063,1.093,0.426,1.348c0.49,0.254,1.095,0.063,1.351-0.427 c1.959-3.775,1.817-8.199-0.396-12.456c-2.731-5.251-8.203-9.53-13.012-10.172C138.853,125.257,135.763,126,133.446,127.979z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M154.077,146.278c-2.156,1.18-4.24,2.619-6.256,4.01c-3.636,2.509-7.068,4.878-10.941,5.924 c-2.991,0.808-6.055,1.058-9.3,1.324c-3.222,0.263-6.553,0.536-9.783,1.406c-2.027,0.546-4.117,1.397-6.137,2.221 c-3.491,1.423-7.102,2.895-10.528,2.866c-0.552-0.005-1.004,0.439-1.009,0.991c-0.005,0.552,0.439,1.004,0.991,1.009 c3.828,0.033,7.627-1.516,11.301-3.014c2.054-0.837,3.994-1.628,5.902-2.142c3.054-0.823,6.292-1.088,9.425-1.344 c3.191-0.261,6.492-0.531,9.659-1.386c4.205-1.135,7.94-3.714,11.557-6.208c1.973-1.362,4.014-2.771,6.08-3.901 c0.484-0.265,0.662-0.873,0.396-1.357C155.168,146.193,154.562,146.014,154.077,146.278z" + }, + "stroke": { + } + } + ] + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M156.458,153.549c-2.619,0.064-5.709,0.812-8.98,1.604c-4.278,1.035-8.7,2.104-11.901,1.536 c-0.543-0.096-1.063,0.267-1.159,0.81c-0.097,0.544,0.267,1.063,0.81,1.16c3.613,0.641,8.24-0.481,12.72-1.562 c3.166-0.766,6.153-1.489,8.561-1.548c5.664-0.141,7.961,0.698,13.508,2.724c0.519,0.189,1.095-0.077,1.281-0.596 c0.189-0.519-0.076-1.091-0.596-1.282C165.069,154.337,162.501,153.399,156.458,153.549z" + }, + "stroke": { + } + } + ] + } + ] + } + ] + }, + { + "name": "textSurface", + "children": [ + { + "name": "spokenBubble", + "children": [ + { + "name": "textContainer", + "shape": { + "type": "path", + "path": "M225.719,45.307 c0-6.627,5.373-12,12-12h181.333c6.627,0,12,5.373,12,12v105.334c0,6.627-5.373,12-12,12H237.719c-6.627,0-12-5.373-12-12 V45.307z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "textArrowBelow", + "shape": { + "type": "path", + "path": "M249.052,160.64 c-0.774,14.251-1.676,18.525-9.1,30.565c9.705-0.79,21.952-21.605,25.1-30.045" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "thoughtBubble", + "children": [ + { + "name": "textContainer_1_", + "shape": { + "type": "path", + "path": "M202.698,21.089 c19.686-26.45,59.686-24.45,79.747-0.084c2.696,1.349,5.57,1.709,7.472,0.781c15.28-13.888,33.271-14.043,49.893-7.839 c2.771,1.034,5.479,2.219,8.031,3.421C376.384-4.36,423.384,6.64,431.007,45.026c0,0-1.324,3.889,1.165,6.603 c18.212,11.011,26.212,32.011,22.212,53.011c-1,5.333-3.223,9.667-6.037,13.52c-2.813,3.854-1.381,0-2.612-0.591 c-1.351-0.929-3.351-0.929-4.351-1.929c16,7,27,22,30,39c2,21-8,41-27,50c-16,7.5-32.5,5.5-45.745-2.556 c-2.531-1.384-4.229-1.856-5.336-1.551c-1.919,0.107-3.919,2.107-5.919,2.107c4-1,6-5,10-6c-15,11-35,12-52,3c-13-7-20-20-24-34 c1,5,3,9,3.299,13.505c-0.396,0.708-3.423,2.219-6.654,3.466c-22.627,8.729-49.423,1.729-65.241-19.971 c-3.453,0-6.263,0.589-8.723,0.879c-17.301,3.2-32.382-7.709-40.771-22.689c-1.678-2.996-3.089-6.153-4.195-9.396 c-15.714-7.795-29.714-18.795-33.714-37.795c-5-25,11-45,29.842-57.667c0.72-2.335,1.697-4.636,3.007-6.896 C201.159,23.307,202.698,21.089,202.698,21.089z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M269.719,186.307c0,4.602-4.179,8.333-9.333,8.333s-9.334-3.731-9.334-8.333 c0-4.603,4.18-8.333,9.334-8.333S269.719,181.705,269.719,186.307z" + }, + "fill": "#FFFFFF", + "stroke": { + } + }, + { + "children": [ + { + "shape": { + "type": "path", + "path": "M269.719,186.307c0,4.602-4.179,8.333-9.333,8.333s-9.334-3.731-9.334-8.333 c0-4.603,4.18-8.333,9.334-8.333S269.719,181.705,269.719,186.307z" + }, + "fill": "none", + "stroke": { + } + }, + { + "shape": { + "type": "path", + "path": "M268.225,186.166c-0.563,8.736-13.981,9.286-15.633,0.853 c-1.785-9.125,15.018-10.254,15.649-0.451c0.125,1.929,3.078,1.388,2.955-0.521c-0.814-12.597-20.828-12.412-21.64,0.119 c-0.827,12.813,20.831,13.028,21.655,0.283C271.337,184.519,268.35,184.235,268.225,186.166z" + }, + "fill": "#FFFFFF", + "stroke": { + } + } + ] + } + ] + }, + { + "shape": { + "type": "path", + "path": "M260.386,188.307c0,3.498-2.984,6.333-6.667,6.333 c-3.682,0-6.667-2.835-6.667-6.333s2.985-6.333,6.667-6.333C257.401,181.974,260.386,184.809,260.386,188.307z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M238.386,196.974c0,1.289-1.045,2.333-2.334,2.333 c-1.288,0-2.333-1.045-2.333-2.333c0-1.288,1.045-2.333,2.333-2.333C237.341,194.64,238.386,195.685,238.386,196.974z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M285.719,179.974c0,4.602-4.253,8.333-9.5,8.333 s-9.5-3.731-9.5-8.333c0-4.603,4.253-8.333,9.5-8.333S285.719,175.372,285.719,179.974z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "yellBubble", + "children": [ + { + "shape": { + "type": "path", + "path": "M251.156,176.051l40.228-15.992" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "shape": { + "type": "path", + "path": "M280.932,149.385l-40.667,36.42" + }, + "fill": "none", + "stroke": { + "color": "#000000", + "cap": "round", + "join": "bevel" + } + }, + { + "name": "textContainer_2_", + "shape": { + "type": "path", + "path": "M217.778,34.644 c8.608,6.684,9.951,3.684,7.986-5.785c6.309,5.125,9.309,3.782,10.188-4.309c2.433,8.091,5.266,8.091,9.12-1.703 c6.063,9.793,13.146,9.793,24.043,3.878c6.103,5.915,16.02,5.915,20.094-4.64c17.178,10.555,28.511,10.555,45.233-5.505 c5.94,16.06,17.272,16.06,18.835,1.458c19.688,14.603,29.604,14.603,46.749-17.802c-0.145,32.405,6.938,32.405,29.26,16.182 c-12.403,16.223-9.57,16.223,4.813,6.576c-11.069,9.646-8.069,10.99,4.333,9.089c-8.061,6.244-6.717,9.244,2.533,11.068 c-9.25,1.489-9.25,5.703-0.314,13.07c-8.936,6.115-8.936,15.385,7.513,10.932c-16.447,24.677-16.447,35.631,14.938,36.553 c-31.385,19.303-31.385,28.571-4.39,40.526c-26.995,1.528-26.995,5.741-5.942,17.857c-21.053-8.801-22.396-5.802-9.525,11.916 c-17.213-13.374-20.213-12.03-12.048,8.029c-11.479-20.06-14.313-20.06-10.554,3.532c-13.676-23.591-20.759-23.591-29.813-2.664 c-7.944-20.927-17.861-20.927-27.072,12.467c-12.039-33.395-23.373-33.395-23.147-1.581 c-22.891-31.814-34.225-31.814-61.518-8.479c6.042-23.335-3.874-23.335-11.899-9.703c-8.976-13.632-16.059-13.632-23.927,4.361 c-2.049-17.993-4.882-17.993-10.51-1.486c2.314-16.508-0.686-17.851-12.385-5.019c7.355-17.175,6.013-20.176-10.271-7.879 c16.283-15.61,16.283-19.824-9.255-12.972c25.538-20.334,25.538-29.603,1.919-46.578c23.619-3.249,23.619-14.204-0.313-25.522 c23.933-8.905,23.933-18.175,7.798-37.429C226.385,48.854,226.385,44.641,217.778,34.644z" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/includes/js/dojox/gfx/demos/data/LarsDreaming.svg b/includes/js/dojox/gfx/demos/data/LarsDreaming.svg new file mode 100644 index 0000000..3f4b903 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/LarsDreaming.svg @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/gfx/demos/data/Nils.json b/includes/js/dojox/gfx/demos/data/Nils.json new file mode 100644 index 0000000..59e40cb --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/Nils.json @@ -0,0 +1,717 @@ +[ + { + "name": "nils_1_", + "children": [ + { + "name": "lowerBody", + "children": [ + { + "name": "leftShoe", + "children": [ + { + "shape": { + "type": "path", + "path": "M44.787,442.042c13.536-0.097,28.515-2.647,40.667-8.815 c13.064-6.631,3.188-24.604,0.553-34.404c-5.771-1.73-10.549-4.837-16.568-0.148c-4.371,3.405-6.025,11.462-2.07,15.501 c-3.212,7.339-17.804,1.912-23.732,6.7c-5.825,4.706-7.32,17.966,0.484,21.167" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M133.453,425.375c0.901-2.979,2.793-5.781,4.667-8" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M56.787,426.708c-2.551-2.07-3.97-5.252-5.333-8" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "rightShoe", + "children": [ + { + "shape": { + "type": "path", + "path": "M111.453,402.042c-2.005-0.426-3.947-0.363-5.899-0.566 c-0.104,2.376,0.438,5.478,0.048,7.751c-0.4,2.327-1.597,4.06-2.146,6.817c-0.975,4.9,0.412,10.561,3.813,13.517 c3.718,3.23,8.442,2.56,12.87,3.797c4.256,1.189,7.959,3.502,12.5,4.849c9.169,2.717,20.433,7.657,25.649-4.685 c2.797-6.618-0.894-5.624-6.331-7.982c-4.049-1.757-6.774-4.353-10.32-7.014c-4.123-3.095-8.203-5.957-13.415-6.584 c-0.11-3.353,1.616-5.692,1.132-9.117c-5.299-2.318-13.883-3.984-19.233-0.116" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M62.787,424.708c-1.417-2.271-3.012-5.388-2.667-8.666" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M141.453,428.042c2.076-1.991,4.274-3.745,6-6" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "leftLeft", + "shape": { + "type": "path", + "path": "M111.687,360.891c0.036,4.747,1.844,9.223,1.56,14.078 c-0.24,4.099-1.372,8.075-1.553,12.199c-0.2,4.558-1.141,9.069-1.142,13.648c0,3.48-0.275,5.533,3.084,7.379 c2.301,1.264,4.909,1.163,7.094-0.113c2.993-1.748,2.841-3.747,2.868-6.904c0.025-2.952,0.712-5.943,1.162-8.841 c0.446-2.868,0.401-5.667,0.398-8.578c-0.004-3.788,0.138-7.556,0.003-11.357c-0.118-3.318-1.49-6.782-1.279-10.093" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "name": "rightLeg", + "shape": { + "type": "path", + "path": "M74.107,353.8c-0.57,1.485-0.055,3.729-0.142,5.357 c-0.076,1.44-0.315,2.774-0.571,4.184c-0.786,4.316-1,8.786-1.732,13.181c-1.158,6.942-0.906,14.193-1.777,21.167 c-0.456,3.648,0.862,8.169,5.499,7.139c2.579-0.572,4.859-3.016,5.846-5.361c2.937-6.981-0.974-13.832-0.457-21.057 c0.331-4.619,2.141-8.637,3.402-13.056c0.769-2.694,1.709-5.131,1.703-7.972c-0.004-1.809,0-3.616,0-5.425" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "name": "pants", + "children": [ + { + "name": "pants_1_", + "shape": { + "type": "path", + "path": "M72.453,299.375 c1.947,19.47-1.848,38.143-0.849,57.849c3.905,0.681,11.166,0.417,14.849-0.849c7.135-2.453,6.497-2.631,7-11 c0.81-13.479-2.849-20.278,12.845-17.853c-1.125,13.305-9.43,25.115-3.42,38.649c8.404-0.38,20.265,0.661,28.427-1.944 c0.505-10.198-1.523-17.622-2.853-26.853c-1.398-9.708,3.313-18.866-1.174-27.826c-9.218,0.693-18.358,2.747-27.722,0.798 c-9.863-2.054-18.89-8.623-29.104-8.972" + }, + "fill": "#ADA274", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + }, + { + "name": "leftArm_1_", + "children": [ + { + "name": "leftArm", + "shape": { + "type": "path", + "path": "M161.453,199.375c-6.73,0.606-12.711,7.192-9.248,13.248 c3.358,5.87,13.618,5.538,19.021,6.979c4,1.066,16.837,3.192,19.52,5.703c3.974,3.72,5.243,15.844,5.854,20.924 c13.641,4.354,26.949-0.671,33.102-13.826c5.331-11.398-5.783-19.505-17.098-22.174c1.771-8.465,14.167-32.061-0.128-36.899 c-4.761-1.611-15.726,3.346-17.801,7.272c-3.095,5.855-0.055,15.902-0.374,22.623c-13.399,0.68-27.351-3.555-39.849-1.849" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M221.453,220.375c-4.604-1.889-17.369-6.456-21.801-1.801 c-4.797,5.039,1.256,14.077,6.027,16.578c4.118,2.159,20.628,4.348,24.575,1c4.999-4.241,2.906-14.993-2.801-17.777" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M214.453,253.375c-1.006,3.482-0.767,9-3.174,12.826 c-15.878,0.834-16.244-5.43-25.674-14.571c10.53-5.253,19.583,4.754,29.849,2.745" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M226.453,239.375c0.54,16.962-8.377,15.391-21.023,12.023 c-17.34-4.617-11.577-7.176,3.023-13.023" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M208.453,188.375c-4.474,0.83-8.972-0.434-11-4" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M203.453,221.375c6.112-0.45,18.967,6.649,8,10" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M195.453,258.375c3.441-0.666,5.408-2.2,4-5" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "rightArm", + "children": [ + { + "shape": { + "type": "path", + "path": "M39.453,187.375c-3.104,7.216-3.137,14.998-7.278,21.997 c-5.137,8.684-9.794,6.9-17.5,12.281c-8.803,6.146-12.141,29.697-14.095,40.548c20.2,3.536,18.779-23.776,21.649-34.524 c0.975,13.012-0.289,26.468,0.374,39.546c2.257,0.582,6.44,0.582,8.697,0c2.04-10.494-3.53-22.034-0.852-33.546 c0.009,7.58-2.598,32.2,10.852,28.546c0.514-10.124-1.899-18.938-4.868-25.972c2.181,8.766,4.798,18.48,15.845,15.949 c6.407-12.781-3.909-15.105-8.048-25.604c-2.531-6.422,0.527-25.44,6.223-31.223" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M6.453,248.042c2.111,0,6.324-0.997,6.667,1.666" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M22.453,255.375c2.85-0.37,4.155,0.539,4.999,3.001 c1.085,3.168-0.233,4.173-2.999,5.332" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M31.787,255.042c3.675-0.503,7.077,4.971,3,6" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M48.453,235.708c-5.387-0.935-3.676,10.551,3.667,8.667" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M207.453,241.375c2.63,1.686,2.368,4.909,1.884,7.884 c-0.744,0.175-1.23,0.456-1.884,0.783" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "shirt", + "children": [ + { + "name": "mainShirt", + "shape": { + "type": "path", + "path": "M39.453,189.375 c0.777-3.467,1.211-7.217,1.151-10.849c14.871-1.403,32.372-7.656,46.875-11.125c9.423-2.254,31.959-20.14,39.244-11.079 c3.778,4.7,2.066,16.102,5.456,22.08c2.827,4.986,9.093,12.445,13.003,16.217c5.193,5.009,15.695-3.271,18.271,2.754 c3.024,7.075-0.511,20.739-10.02,18.016c-5.084-1.456-12.238-5.093-15.228-9.769c-4.055-6.341-8.831-13.012-10.53-19.167 c-0.713,10.697,1.173,22.369,2.726,32.92c1.637,11.128,1.886,22.261,3.052,34c2.02,20.336,6.915,42.053,10.845,61.855 c-14.599,4.091-47.868-3.832-47.868-3.832s-14.457-3.595-21.2-5.801c-8.131-2.661-21.777-11.223-13.777-11.223 s-3.063-9.756,2.468-40.878s14.003-39.61,19.806-56.122c1.387-3.946,2.399-8.004,4.375-11.845 c-17.565,1.273-26.117,7.964-40.475,16.742c-2.413-9.11-9.707-14.336-17.174-18.897" + }, + "fill": "#4867FF", + "stroke": { + "color": "#000000", + "width": "2" + } + }, + { + "name": "highlight", + "shape": { + "type": "path", + "path": "M99.453,179.375 c-5.364,2.937-10.603,8.065-17,8" + }, + "fill": "#4867FF", + "stroke": { + "color": "#000000", + "width": "2" + } + }, + { + "name": "logo", + "children": [ + ] + } + ] + }, + { + "name": "heads", + "children": [ + { + "name": "head1", + "children": [ + { + "name": "hair_1_", + "shape": { + "type": "path", + "path": "M60.453,97.375c-3.965-0.012-7.98,0.045-11.897-0.147 c2.645-5.735,10.791-8.417,14.794-13.65c-2.384,0.19-5.083-0.61-7.543-0.154c2.395-1.359,4.008-3.487,6.347-4.846 c-2.993-0.207-6.326-0.467-9.399-0.18c2.893-0.874,5.243-2.063,7.821-3.05c-0.92-0.166-4.625-2.732-6.772-4.221 c5.187-4.255,12.317-5.834,17.573-8.534c-2.844-0.13-5.037-1.713-7.75-2.393c-0.424-7.244-1.302-14.461-1.223-21.475 c2.166,2.761,3.541,5.976,4.849,8.546c-0.996-11.489,4.773-13.594,13.025-18.797c0.403,1.91,1.943,3.845,2.229,5.546 c1.27-13.312,22.924-28.644,34.016-33.272c0.039,6.247-2.955,11.957-5.365,17.475c-0.365,0.375-0.375,0.366-0.028-0.028 c5.849-6.92,14-8.882,22.143-10.721c-1.215,5.635-5.28,10.684-6.698,16.602c6.258-10.069,20.421-4.135,27.949-11.351 c-1.011,3.251-2.028,6.254-3.143,9.276c7.035-8.774,15.902-11.37,25.894-14.499c-0.668,7.995-10.243,18.061-0.822,20.872 c8.889,2.653,17.435-7.31,26.698-6.075c-2.976,1.954-5.822,4.12-8.614,6.345c7.596,2.01,18.243,0.852,26.614,0.658 c-4.125,3.304-9.116,7.352-9.593,12.943c3.896-0.826,8.6-1.318,12.741-0.725c-1.013,1.726-1.479,5.845-2.718,7.678 c3.136-0.265,6.17,1.053,8.519,1.452c-3.019,0.804-5.247,3.16-7.566,4.52c3.765,0.755,7.282,2.001,10.844,3.398 c-3.322,1.78-5.724,5.475-4.776,9.657c0.798,0.374,2.536,0.977,2.995,1.147c-6.481,3.645-21.331-1.522-28.945-2.752 c-13.967-2.257-27.844-4.641-41.913-6.244c-17.039-1.941-37.716-3.446-54.359,1.025C83.983,67.42,68.871,76.651,58.453,98.375" + }, + "fill": "#605542", + "stroke": { + "color": "#000000" + } + }, + { + "name": "neck", + "shape": { + "type": "path", + "path": "M108.453,132.375c0.902,8.412-0.835,20.235-3.849,27.797 c4.164,2.769,15.721,4.339,19.868,0c3.538-3.701,1.964-17.522,1.98-22.797" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "name": "leftEar_1_", + "children": [ + { + "name": "leftEar", + "shape": { + "type": "path", + "path": "M232.453,76.375c10.186-6.915,21.465,6.994,19.052,17 c-2.781,11.53-20.253,15.518-27.052,5" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M245.453,91.375c-0.398-2.267-1.99-4.77-3.171-6.829 c-2.738-0.936-5.713-1.545-8.829-1.171" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M238.453,90.375c1.863-0.367,3.589-1.433,5-3" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "headShape", + "shape": { + "type": "path", + "path": "M116.453,35.375 c-13.417,2.219-31.83,24.639-39.777,35.055c-8.128,10.652-24.737,25.747-20.219,39.945 c5.161,16.221,22.089,14.526,34.025,19.972c15.448,7.047,30.645,11.875,46.749,14.251c18.146,2.676,27.633,0.161,44.223-7.972 c15.701-7.697,29.862-9.589,41.801-24.303c8.182-10.084,15.033-28.733,8.174-38.923c-6.159-9.151-21.79-19.289-31.201-25.75 c-12.144-8.339-26.876-10.032-41-11.274c-15.007-1.32-33.207-3.056-47.774,1" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "name": "rightEar_1_", + "children": [ + { + "name": "rightEar", + "shape": { + "type": "path", + "path": "M66.453,94.375 c-10.188-4.124-23.701-5.729-27.774,7.226c-4.779,15.198,14.506,23.077,25.774,15.774" + }, + "fill": "#FFF0A9", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M42.453,106.375c4.149-4.954,11.06-7.737,16-10" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M48.453,100.375c1.337,3.541,2.787,6.955,5,10" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "adamsApple", + "shape": { + "type": "path", + "path": "M113.453,152.375c-0.526-2.327,1.546-3.837,5-4" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + } + ] + }, + { + "name": "expressions", + "children": [ + { + "name": "confused", + "children": [ + { + "name": "mouth_1_", + "children": [ + { + "name": "mouth", + "shape": { + "type": "path", + "path": "M102.148,120.014c13.398-6.9,33.568-7.688,49-10.026 c12.555-1.903,36.519-2.575,44,9.026" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "name": "tooth_1_", + "shape": { + "type": "path", + "path": "M178.148,109.014 c-0.563-2.655-0.017-6.196,0.151-8.849c4.788-0.944,9.637,0.768,13.675,3.022c0.664,3.187,0.065,6.267-1.826,8.826" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "tooth", + "shape": { + "type": "path", + "path": "M168.148,108.014c-2.021-7.958,5.04-7.752,10.826-6.826 c1.286,2.446,1.752,5.863,1.022,8.675c-3.801,0.292-8.049,0.308-10.849-0.849" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "eyes", + "children": [ + { + "name": "rightEye", + "shape": { + "type": "path", + "path": "M121.148,52.014 c-6.562,8.145-20.057,16.28-21.023,26.977c-1.104,12.227,10.759,15.164,21.02,11.798c18.8-6.168,24.482-40.499,0.004-39.774" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "pupilRight", + "shape": { + "type": "path", + "path": "M112.148,61.014c-7.625,3.067-4.047,12.428,3.826,10.826 C118.354,67.432,118.046,61.261,112.148,61.014" + }, + "stroke": { + "color": "#000000" + } + }, + { + "name": "leftEye", + "shape": { + "type": "path", + "path": "M184.148,55.014c-13.391-8.758-17.664,28.504,5,25.996 c10.862-1.201,14.124-12.581,8.004-19.996c-6.121-7.415-14.988-4.947-22.004-8" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "pupilLeft", + "shape": { + "type": "path", + "path": "M176.148,54.014c-2.04,2.896-2.657,6.347-1.849,9.849 C184.707,66.621,182.108,56.322,176.148,54.014" + }, + "stroke": { + "color": "#000000" + } + } + ] + } + ] + }, + { + "name": "confused2", + "children": [ + { + "name": "rightEye_1_", + "shape": { + "type": "path", + "path": "M121.148,52.014 c-6.562,8.145-20.057,16.28-21.023,26.977c-1.104,12.227,10.759,15.164,21.02,11.798c18.8-6.168,24.482-40.499,0.004-39.774" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "pupilRight_1_", + "shape": { + "type": "path", + "path": "M112.148,61.014 c-7.625,3.067-4.047,12.428,3.826,10.826C118.354,67.432,118.046,61.261,112.148,61.014" + }, + "stroke": { + "color": "#000000" + } + }, + { + "name": "leftEye_1_", + "shape": { + "type": "path", + "path": "M184.148,55.014 c-13.391-8.758-17.664,28.504,5,25.996c10.862-1.201,14.124-12.581,8.004-19.996c-6.121-7.415-14.988-4.947-22.004-8" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "name": "pupilLeft_1_", + "shape": { + "type": "path", + "path": "M176.148,54.014 c-2.04,2.896-2.657,6.347-1.849,9.849C184.707,66.621,182.108,56.322,176.148,54.014" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M114.934,118.74 c18.933-4.896,31.704-2.456,49.826,1.171c6.734,1.348,17.654,7.566,23.408,0.323c5.436-6.841-0.011-16.179-7.237-17.994" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "talking", + "children": [ + { + "shape": { + "type": "path", + "path": "M150.536,116.479c0.413,18.115,48.746,18.222,37.276-7.278 c-10.396-1.757-28.836,2.451-38.776,5.778" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M103.453,104.875c-2.277,2.169-1.729,7.324-4.849,8 c8.889,3.074,18.975,7.877,28.849,6.998c6.759-0.602,18.439-1.511,23.5-5.998" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M104.453,64.875 c-6.218-0.224-17.093,9.247-13.875,15.887c2.822,5.825,15.087,4.174,20.375,3.113c4.505-0.904,7.783-1.37,9.889-6.123 c1.107-2.499,2.855-9.088,1.623-11.889c-2.859-6.496-15.374-3.248-19.512,0.012" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M176.953,59.875 c-4.742,8.403,0.46,13.596,6.486,18.376c4.779,3.791,15.903,8.529,19.512,0.622c8.012-17.554-22.026-19.554-32.498-17.887 c-0.345,0.055-1.151,0.291-1.5,0.389" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M98.953,66.875c-6.969-2.545-10.165,5.418-3.002,8.05 c2.178-2.129,5.596-6.88,2.502-9.05" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M178.453,60.875c-5.534,0.708-5.259,9.173,0.5,7.387 c6.145-1.906,5.217-9.047-1.5-8.387" + }, + "stroke": { + "color": "#000000" + } + } + ] + }, + { + "name": "talking2", + "children": [ + { + "shape": { + "type": "path", + "path": "M102.87,94.503c-2.279,15.037-5.934,27.828,15.027,23.027 c15.334-3.512,25.379-13.239,28.973-28.027" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M92.87,104.503 c4.248-16.004,34.717-10.765,47.052-11.948c8.414-0.807,15.879-1.97,24.948-1.055c8.295,0.837,19.3,2.941,27-0.997" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M84.87,73.503c2.341-8.752,12.467-12.772,19-18" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M181.87,59.503c8.968-3.27,16.681,2.245,25,3" + }, + "fill": "none", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M98.87,68.503 c-7.218,11.165,3.031,17.234,13.003,17.997c13.201,1.009,21.125-8.677,18.845-21.842c-11.637-0.604-21.219,1.818-31.849,2.845" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M178.87,67.503 c-9.045,2.007-6.264,11.616-1.249,15.249c3.778,2.737,13.479,4.477,18.249,2.528C210.946,79.123,185.327,71.038,178.87,67.503" + }, + "fill": "#FFFFFF", + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M115.87,85.503c2.365-1.63,3.646-3.553,2.826-6.826 c-16.491-8.159-17.436,11.182-1.826,8.826" + }, + "stroke": { + "color": "#000000" + } + }, + { + "shape": { + "type": "path", + "path": "M174.87,80.503c-0.492-1.165-0.677-2.687-0.872-3.826 c3.483-0.285,7.207-0.292,10.698-0.023c3.568,7.301-6.079,7.593-10.826,5.849" + }, + "stroke": { + "color": "#000000" + } + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/includes/js/dojox/gfx/demos/data/Nils.svg b/includes/js/dojox/gfx/demos/data/Nils.svg new file mode 100644 index 0000000..48908a2 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/Nils.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/gfx/demos/data/buratino-bg.png b/includes/js/dojox/gfx/demos/data/buratino-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ee50a15ea44f8099db176cdfed0442ff494dcfd6 GIT binary patch literal 27507 zcmW(+WmsEH6D1H_0>M2%0u;AmMS>MAR~DU?CwP;mXTNt0N%+BoH4n3^c@*0-I(W#23&~;vM2* z^^gE+)IQ=jxvPwh>w5ox;cE`%wFhDvHj-BK1eD?%#%nC+r6k|B;N! z~-pva`UIh?I)A0A_epfB||aZL-Ru;W2)IF zgOk2DD=sN7$D2mH$R?Cdz&WytFLOPuRS3=bEJ(nTM;Q=+cf=Gva6}&YH zHA*^o6>`}wQPA!iljV@vJgK)3F!U(YWnZL1+xR%yW-?{#YZ6sbPJ&UR@wN%M>mG)5 zP{?u|sYyF*crvAM5Vrr3?(;MCR2~C9CfJ?VvGdeGM;3O+E|>qF2UzltP8>NvWmJ8f{hF?G`!{VM94fcaplZ_2B4xBRX{!J}lJx^3CqhhA*2yXydW46P3J2&D zX%R!Ya7ubUgXV;E02N+$zVzb%{}YO$eh1p2y$*lHTgHFOBWD?KgwQxt*S+^BI^pJf ztu_65)d{;asnedWO_&IIB?3_o4{HpQL&CQP8(;ln@3{|w6}|p%!u4hp>};pg>Vc#R zhpwNT=ZRtSIloMp5NpX6__c&o-@!R_=9+EqFh`n0I%@lz3M04pZ$W2E&(~@HJhNc( z3CB3T?=j>9=1qKM{E`2Aq8EUWb~VtAN{c#m(*64m=Q!F+_A?MjFVS;}bkg76n^XnT z_*kEg?^fIe+Xw%rPHNOY`X-$Y>9EN71ks!z%L5*||CC9zxAO>41k>&vH_pEH|G#>S z1JR0`Zo&tOqU|0CX}_VS?w0UqXcw6lncDoPm}Ro$gHs|!VX?Z2iD0DcyU!Y72Mbws zMoF|`2Wc_`h2t-yE#6;8yAyKQjm?*3AYdvRbu zGMqP)H$)l5_X^kIVD7-YXcCQz>lOWmlfYC61vp~Nu7Y$nF4~emavs9q&|Pth;WOBy zM=O)kWQS4l2$jzP#v<}(E}c@3B5_T3JXC)(nEl|C zLx}Od%WkhxXa2;7?DwixA|1kfo1z0zyAWG}+8w76Q24Bc_6m-ixJJ_*t^Q;pKlEwu zj+&_CB6G);8L`2wH>ZJ-AUh@(@|2JY0pLJfqHWA07Q!%F!D)}T?{&}%@BbcR<@JG>)dHNspb8Xt$ZT0pOe7!fNLGoIvB_U_%14IXlk z0^Zu{i0Ac6AmlXYV)P$-HcZ-T)P5uW6MK&?q5#!;s0$ZDIoGxMMoW7?!o_%3I5}Ek8fvZnAbAbs~TDwW3_#~~hw9$CNjzV}JI0`N#RCtiCpM)dzjLeLK%Y9{2b zZrXO9PPCB6hA;nF*7!9H46bL>&FOu(SjAQsilWhs{Ape~%xaNAOVAC*1pgHCc{tVK zc|qZnw(-}a1#Fy44IcS-hMkel(&K&ntV?s6FVZX?#42tX{DA5(+VAIdq0`W7=`oLQnGr*8|*Vuo`FziFnR ztnq$fdNm3m4yJJ`0eVzCue1LO8<)8+^<1NF-Q@fcrZ*;HBLKZl@&P|JxLor-DaWpp z^w6b3Ifqmd;ZVV~CMYrXr;+)6(`6pm0^|Y_r}6kT8K;hEhyrH9vM+Q|BZ`FW_uObt)3=K9cNIzkHB%CD2L^{0J)m93y7<=#&YQ`t@!u3n01h)K!UFf&QqMs^dz4FnC|bM3@bNBP$8c1gvJ%)TO0K;(-@RFUj za36z*nn&8Z!Wzk#C5W;`oC<|AqqGSmGRhbh{wM6w2Bf0Xe391PCI_JurC3!;^LDIK1p;Qgj!YxucQ>DOF|8%(o zImbq`PG}cT0g0d_X`%?zS*Oc|_aY_33bS5}!Vn_l2>k+Hsccz7L2%?lx@J5*ue4-i z4SvLfqY>d!+*pz6D*=Y?FCmGAdgv`)g@>*>9=EG#*O>{i1XdWFOaUxi*GsooT|;*W zcsm^oDmy4E3(K7Om0S5HXU~EMxWG!;nKt`?EgvAIiQKy`IZGtNy4S*v(y$#C;?%MXvs6(EM}knv1gxdcuMxgYWtEF7*3y+}Zb13C4uJi}r*|=s^QTap(C{)eRU}kXEEWC|ibi@q6=&*1m;Y6G5&gNn3JQ+p0ayNlIMi?8!o6<;67ko?-Uv9g=zAT1D!=QG z*;G1+QXpNJLy6!2Ele9Mma?be3STLCSIU@(BOZQr;1D`6(6v)38c!k(qhxX4Z(;pB`2&71C=>q_EAA|a+l zX&cQa?@<-*h5+W2%C8mdw^|K}8mc)so`ttE-%I@a35FPAkB{BF)vY7urR!a8gYvh% zn)jyptDbcp&P<0VnUUrIjUV=uE28Tpe~Mz0UI_zj^zln+b9iWa0> z)L8y-TdyXr7TTOQ#5HfZoK(@^nwTqD(S4s|@{|)Z&;rJ+LfJ#U3}=%M@a&Zju(+Gv z+XK1EjQa|UUp8iO*%1Ohv2vv+CeQbDCcfZp3o+k^G~1%CbUD5J%9j#ZAS*n>!aPG) z2jIZ~B)ILj&h}exWO|qUi#pCWh32!qtEbtEzl7ohE2?)lEKGybWB(kn#<1PXBW5M# z0Sd;@Ico64OtZoRUXKdOqu}8NhuU2811Xs?A?=YRZa{HB|8C zKKuE*Ijw6uqL#6w^c?Y>6Ubqn2y)aF;yE%CLw@#bzh3@a%75QoVxLoq{@iYR)o+BR zgC%wO$s-5}wN$L<5-I_OFQM3hSOGhH%YN2{*WGFMoeP+~>7$pIwE0qeAA_`IS{#Z$ zT?k=>?7j^mL-scUul@QMn22Qmj(2k2W|ge*a`!1h00MkI4>}zO01jLgI21qVXS1TF z64BWnLhG}{Ca3X;4k*YSkN(MgWe=fwi@ZewHg33%^>sfZnG4Nc$L z58jqW9R7eRyyx86$GuPGPMVrT&Y}AtXv~i^p^+t#MWh^YNwAyp^TVXh2FvE~WPrcz z5o33Y^Z}Hd9xO82qPvy{g&Sz5T+SwXFa{t^f&I&7?jAoEJSXBSsS%F=Zvt856BO$r z&@vy@k$*t6tK41;t9lk+rmBofTlZxYG_i z{ee2!?u0Oz(F7NX?---2Z*-=+6B#AHbiceGoPVzjrg|%KWdL7tZCu{j6>nEV?gJtx zgxlC;l-3mU^1D+5kRxS_M^m&xq)`q?fP-T$&x_ff$H_M)dtg9Sq)y!nwQJf1RrTmE z--bz5g~>dN=*Ypc|^Qwtw3n*sY~T95Lk1h$_S_5Ba21fMnE&z#07c zGbn;Se)UZS>01g3F1OCvHdLY}b~ji0bnA(!W-nGr2R><}D~}D==6f3Ej!asaXrozD zvCPXQYx*u~*!L_AgI1H(q#Bgwt&KKq zl{ED+lv2AYv(|Kznc{z-zs(-B_kKxtzWSDHt|&n?Tg^7%e_J@?B?oM(3~AKsQN{|t z;leyITP}4xb^{v=TKs*O&|q2BAVeh_=GAlSwenlJ{QkurV()1H=qv8fC~tolxb5)w ztXz{bVV&(CQ*W&5PBt&&1nuzSl1ByH8ve0(F3CtVVEUJno+^3pYqy zLE@SOV}}~U#2Z0t+?k345{HJqO*WTiOh~stbHF@U&1Ga?e=tAus)Oi+Neid`QQdwk zIOAjc+PT&FNKa3AyzudxLL^M`!iIQ0Z*x#0uE~aH=|7&3f4c`A z9xvtnp|q1tCqx90JlRT9N@``ie|wHcxZu7KPoquJ0aFeI!y_c=;7s=vBhYP~&z z4U;9esz(U&1#wO;AA|%MKYBL1*4lhvI`i#X+!wWL?7&$+#D#H&~onBMzr}C)k+C)CKJ+`4~?CppHXDhMr|_K)ym9P}GR;++nUl(1DNLaWfQ4 zue~T-KeeY*>Y8WzVNliAbk2S1297G6%(oa@)0@Zb{?$sI`1|UpeBgNqJ2jfh0;3&t z@r*<9d+&HXZYs=}`&?Sg!;U`3pW(S6_`atqiUwIjsymB(uo1wUx!Lgv>dyqvFRpA>lF0zra^DZpxumrbImvm z&jj^0%}Xz;@@&lLy|S4%+7e-!OU0M;h7REpF05gAup+@Sr#gK<-1_d@mNYx-+vkE; z^S(7REcmOSq&h%Oy%ibi`&qs=pgv4(d&FX@*{t@v1PzP*Ykh$Pn5k8;V^Z$?r$`=Qjc=20-Lyc)}Mna{|&&w6NZXixOd@5JrQHp|xh{sPCs@x&BAq;oe;0~xv**cQ9o zitJW@8DPm5nP$vx7EL#5gr)>$h1jV{jaEFt-}1s$x%clf1#$$l^wJts1=2v>Op}M7 z@v=ubdk$&PE{HL^*9?vAY+rA?pIn~^Y&`td)C^t~f6w#pPtdM-y0b6{CgpH|7h7m& zmEl*V?t2LDa0FzJAzkkZz02{eE&ICMych1aTAn;U_bYt35QrWDl!XDlU+;_zV959F z$(%cH}PF@L1bzEeg&8WIIZh<6$Sm%!-HAZ z?S%ao^AM`4w?W=%-7@wVQ11r9FlDW6IzXyYflrnC16s*jHj`g*L?IrPRnJ?W>b=}} zF*6p7H8t1CGz?KuZ&?Nf(#=uN*ESv#r!uThjQ+KwzO`{&(1g6|rtYyJrICa3s51vw!X+vMOX!lfhq@A|X;bHX4) zqs0gG0heYM!G(x^YNx0j>Gj7=1;RG-o|)Klpaqku6O3{WTF3+HKaJ)oA#XAA%YW2x%E8Ro}*ynq|rVhPrbmq^B^= zSjmsuFP#s(EZwBOvUbrM2FdynJwXy_dXrMvfsC3z(Fmk%{0J%^gn3*XV{&e91+g;P?y*DTR{ z;%(WB?6q(EoT`|%R1_Q|0{tK0pCqz!d(VC3xpr#amBKN^5%~|3QCaNc4L;ge^#YAj zlK@CpIB{vhr>jrA$X%AW1Wn(rzozZh%sP%fC?Po&uahE93S~%?_#sN#6-} zKU5fbFQ;l%NWsJcp8n+D+;nF028V*UR~WKdj4XYSpV;dROiBHnD^Xr_D0k$vf}*|1 z#Y&cRS+(4XH8~Hc%L2@PkR-;)yZilP#tXj94a6j(&BW`ymNE(j3eQ~w@ou0QS2`CRpT=iyeT7Z@c9dv@;w(m z`8!uHw}qKFkJm9GDz5HJXJd1K$vuup_KkZg1Yo*9xv#LT$!FQW$b7pb(<=g;v{h+6 zxjNTB>9-?`!NUKt^Dn~Q3?Phhq35~bdcrkO;*p*Z))#aTCsPaMVO2r*q9ZECXk|~k$_%KZ{s=;%MMjylNld^uLB@j#f2~{qVV(p z2frLHMc{te_7>JH(=SWg;TG8?@wu6cef#8brjM0TiHu1Dme2&B{p=a9xmFXil|pH{`CsRFzDzW6!L>)Zj%O#7YRoj;ahiwmpVemD?_1OE-`Y zx69z@4jwIu<+z}K*(IYW%5N7f=~@gjq3R;V13HLVHFN|G_MMs`3Z7e4I)BX7c*;0)?AGnIOKvOxbB8 zS>i>EAlWQPX0^^7_oGFZ7v=ALT!~@)9`&_xqTTDG0x51CXi0^;rKB^2~#l6m!$xKk>+Op)-YY%QuYN zN|X2GQP53qM7H@z;=`l6!62gQ3i>>|F=NK0bKA81?7PSV0tk^zk(o~2oOEAKzSqUc zQy~gV>?RNb55c%b;RSq6cq%?uZ zvo|$LA6ZJ;8E)6J1t+${kFVe1$f%8{XV}E)T&pGiCfe}+XCZn+^L0hf`Gq^g(TgbJ zAGK#DwXLE|6F+2XxCp|cCgK0nocNs0CZpDAxpX@7pmS+alK z$)j1h&}tB{HJN@!`%^DxR_PE!q$6q-ZT6Ooh&8<#tc4XhrG4ffcxCW5GReMM0sYEM zCz*{~6#=<1mX()vnH5dX2S_WQ9T^%Q5h8{B#br`65rX54qpB*$b{XkMb4&1~4Kq^> z?M^b3DFFp zJQ1>ayxJR(bMWUDb02W27C`aG8+DpCpCT-F8Q)Em#U$v#g3o}Jpc~iIW~pga*(U@% zon~8-?d;H79ga+<7@8n}9-XibxYT1Aik91kr=OG#IiK`RYx-s)@ zTrgcg=9ii6gTJt4!Jm5%9*`{qr2aSua@;U(I#Pf6BjwsQ1s0-Q*BOuWc}6ZXgbF~W z!nH|B{nkVC;-5zF%e3pE%-EG#-s1yIxf)CtVYMJB57kve z0mL87A7G0++)7~k(@O3Wcs?N$rcYLL&0_YDLk|8RnyS=-${#hl@#~C&9oycqB-Fg6 zkKr*Yj#K_-V+E;D4%(v$&LX;+%?4s_$mMxn7>j{`1kvB^ba77iks?*q0OUjgz#WNk zH!a)5=w9Px<{&I@BQqP5iBo+vSc57WF-D&YQTCEuSoh{&)>qEd;rmfs?&DfCB7^bcHK} zCGVJx9!pr;tlcB{%LWlwepsJ2_t+EMM(c~~VBfLRS(^}Kj)8ObEr*rPm)L9lOwKvq z7ffP*0{#HDa{|C8z;EJ?m*W^BqkT?#yLY@QUlbew5=Wb2ZuF(PB;A|tl$Dpu z2=DZ&pzho48FmK!dFL8FRqve&cb37hj2Ag3-f4S%C=BuhQ${BjUC2Q7p@Q$!W?vQi zl7HD9cjY7$YXzJ-Ncuf55Ox3l&26Aoo~r{wCf8CoLxuF}5A)qjkt;3Gt3&NjFguX2 z*^9KU2x7cLT$(rWgG_z1Q=bZk?r2!_E@J!S$!Cq3Vkmrwqggc4;dT#rq){abv#66# z;887>?{0#{hlFGb!DX%D$ATV^rM7?(>@T_MH^H(hnG@}5qbvSDR6obU{Cq1B;Xsy* z#&VV^=_2hTEwHZ4X_0ja>**DS3+WUFF?s{-7%7L7(AOs7+js~5gB)pVEg|^@4eSEVTIHYb+mS?iv8Lb>Xa^ zmHfI~J~vWats-I02AnA?fH#w~u8DEtXGY7Y|Zg$hP|FN%8DjZI-$T?NnfQC)T-~u zy(o7*!`yE?)aLHwO^TreCOh}3zP;x=9E=2r{txNgk%Bw{G)oGBe>~ki+R78OKoAb-L) z|Hj3~CTbuxM4@2U*GV-YoK2HeM*gQxx%aaa)rCfV1$U-u_$jCpG;(#mthMQ~_%5kU zg(E1^^jWE&Z?fm~OFzp4pIqIU5MvhCfumC9FCn=FDo5jo!=y8Muh<6Od56y&`FdAT z0#<(r^*>vhl$XQfczN*(u#~6@LKA>PpVefcwP);~Qe zBQ;oqv`e}gbaqQq!q+Z~I&i{U$IsO;1(GOQmeRxk`T&Nwx#9S1P4hN>)0n++BT2r> zw^V-Pb+XD|SyzL1X>?CN+EW4)b^G2{8_VhT89%eYY(oH|@}Lb)#$O zz(*<}qgWCVZv9j0`|lt*Q)x(>RrN4*p}zu|EnBAa5Ufxug>aHX)jY>qt2E+8O>lTI zoClFS4#w|bI~YgoJBgtyIFb;O=2D%qo{uTX48CkoZ6Z>-^dDEpk$;;lY%+WWjhdJ@ zBtNdS{I&7@Q!P%4i9sWdwSEGivqf1>n4D~xC~*2K79rXp@+wNpQe;<{M7wy=I2%Wq zqE(RR-tz2O<>Hg>7#2PLr@xshy|yQve8Sh3)v<9e=ZQY+(9t3Fi}IckQr#0*bFBuI(}P?ukPKcHS?;&f9Jn-m-L5 z15ffr+YgOcxm1T80tTSRyC3r;QWsCnk4}`5<~{^e3u1?Yjq$_^)fw{s9NyFW`sprN zuPTd~g_M546P&X7=dd{+z&6% zj`HIuo~Z(bjI>7%Js!)HaJe?O$!#>y>afM_ySlIU?;jILwa4!@8!-B6BZ8A4cI@Id zjSh~wwqMD}_xKYaExem#@7xe=s$LhOn{Dt{5`id-(?&g`GcgZ^Eep>V{;-~kzl^)@ zgeKTA&O!4^4?sq#ni$lcc?%|tZx*p**x7*@mQ#k;^}ktxIw{8v74)_04Wbz~ZO zw~x2YSYc`eKU5ISdOUClwsxuRwY3tN95T_Ujf=JMy#_A#N#3a9eM_mWOV{S96NY$v zD$XTWLU#2lHd+<)=={>Qs(231l})cn?<5vs>nt~}*W#fy^Ah#JQg<8uO*RMzrSP z23ra4Th(Q6q=QRvbnPDfqj6|f3!eBxmlXx%0AV=US(h!r=Hw{gD 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-head.png b/includes/js/dojox/gfx/demos/data/buratino-head.png new file mode 100644 index 0000000000000000000000000000000000000000..d57687308a84fa64e2bd0876e5f57e0bd900736f GIT binary patch literal 30696 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-left-arm.png b/includes/js/dojox/gfx/demos/data/buratino-left-arm.png new file mode 100644 index 0000000000000000000000000000000000000000..1e620f36586f14f8f7c95631510515cfa1f0fe44 GIT binary patch literal 9631 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%0A|}szR4a-s4djV^0j$gl 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 Vt7kr+q)h+-002ovPDHLkV1nyQTN3~P literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-left-leg.png b/includes/js/dojox/gfx/demos/data/buratino-left-leg.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae560043575ed4fedb2341ec411431c44f1dab2 GIT binary patch literal 21682 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 N002ovPDHLkV1h9FJ_!H- literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-lollipop.png b/includes/js/dojox/gfx/demos/data/buratino-lollipop.png new file mode 100644 index 0000000000000000000000000000000000000000..9a52c1e19caaaa0dcc88ada13904394359bd70b5 GIT binary patch literal 21976 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-right-arm.png b/includes/js/dojox/gfx/demos/data/buratino-right-arm.png new file mode 100644 index 0000000000000000000000000000000000000000..206bdb1feb0f0c0cfb459f4d2a13e5747178bd7a GIT binary patch literal 13033 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 Ef`27#NdN!< literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino-torso.png b/includes/js/dojox/gfx/demos/data/buratino-torso.png new file mode 100644 index 0000000000000000000000000000000000000000..64c2336af5ad3518374b1dfbd773fa79cf9bd757 GIT binary patch literal 23405 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino.jpg b/includes/js/dojox/gfx/demos/data/buratino.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95aaf050f30621d8529ce665ddf7576760857fcd GIT binary patch literal 33344 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 Ky}b3u?EeS*6O2Is literal 0 HcmV?d00001 diff --git a/includes/js/dojox/gfx/demos/data/buratino.json b/includes/js/dojox/gfx/demos/data/buratino.json new file mode 100644 index 0000000..45ed668 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/buratino.json @@ -0,0 +1,12 @@ +[ + {name: "bg", shape: {type: "image", width: 321, height: 355, src: "data/buratino-bg.png"}}, + {name: "left-arm", shape: {type: "image", width: 111, height: 40, src: "data/buratino-left-arm.png"}}, + {name: "right-arm", shape: {type: "image", width: 59, height: 130, src: "data/buratino-right-arm.png"}}, + {name: "left-leg", shape: {type: "image", width: 152, height: 99, src: "data/buratino-left-leg.png"}}, + {name: "right-leg", shape: {type: "image", width: 104, height: 158, src: "data/buratino-right-leg.png"}}, + {name: "torso", shape: {type: "image", width: 90, height: 130, src: "data/buratino-torso.png"}}, + {name: "head", shape: {type: "image", width: 116, height: 139, src: "data/buratino-head.png"}}, + {name: "nose-medium", shape: {type: "image", width: 50, height: 43, src: "data/buratino-nose-medium.png"}}, + {name: "nose-large", shape: {type: "image", width: 70, height: 66, src: "data/buratino-nose-large.png"}}, + {name: "lollipop", shape: {type: "image", width: 82, height: 144, src: "data/buratino-lollipop.png"}} +] diff --git a/includes/js/dojox/gfx/demos/data/svg2gfx.xsl b/includes/js/dojox/gfx/demos/data/svg2gfx.xsl new file mode 100644 index 0000000..90a463f --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/svg2gfx.xsl @@ -0,0 +1,72 @@ + + + + + + + + fill: " + + ", + + + + + stroke: { + + color: " + + ", + + + width: " + + ", + + + cap: " + + ", + + + join: " + + ", + + }, + + + { + + name: " + + ", + + children: [ + + ]}, + + + { + + name: " + + ", + + shape: {type: "path", path: " + + "}, + + + + + + + }, + + + [ + + ] + + diff --git a/includes/js/dojox/gfx/demos/data/transform.json b/includes/js/dojox/gfx/demos/data/transform.json new file mode 100644 index 0000000..60bd466 --- /dev/null +++ b/includes/js/dojox/gfx/demos/data/transform.json @@ -0,0 +1,1567 @@ +[ + { + "children": [ + { + "shape": { + "type": "line", + "x1": 0, + "y1": 0, + "x2": 500, + "y2": 0 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 0, + "x2": 0, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 50, + "x2": 500, + "y2": 50 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 50, + "y1": 0, + "x2": 50, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 100, + "x2": 500, + "y2": 100 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 100, + "y1": 0, + "x2": 100, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 150, + "x2": 500, + "y2": 150 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 150, + "y1": 0, + "x2": 150, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 200, + "x2": 500, + "y2": 200 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 200, + "y1": 0, + "x2": 200, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 250, + "x2": 500, + "y2": 250 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 250, + "y1": 0, + "x2": 250, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 300, + "x2": 500, + "y2": 300 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 300, + "y1": 0, + "x2": 300, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 350, + "x2": 500, + "y2": 350 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 350, + "y1": 0, + "x2": 350, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 400, + "x2": 500, + "y2": 400 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 400, + "y1": 0, + "x2": 400, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 450, + "x2": 500, + "y2": 450 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 450, + "y1": 0, + "x2": 450, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 0, + "y1": 500, + "x2": 500, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + }, + { + "shape": { + "type": "line", + "x1": 500, + "y1": 0, + "x2": 500, + "y2": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + } + } + ], + "name": "grid" + }, + { + "children": [ + { + "shape": { + "type": "rect", + "x": 0, + "y": 0, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 100, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 200, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 300, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 400, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 50, + "y": 50, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 50, + "y": 150, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 50, + "y": 250, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 50, + "y": 350, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 50, + "y": 450, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 100, + "y": 0, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 100, + "y": 100, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 100, + "y": 200, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 100, + "y": 300, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 100, + "y": 400, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 150, + "y": 50, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 150, + "y": 150, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 150, + "y": 250, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 150, + "y": 350, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 150, + "y": 450, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 200, + "y": 0, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 200, + "y": 100, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 200, + "y": 200, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 200, + "y": 300, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 200, + "y": 400, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 250, + "y": 50, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 250, + "y": 150, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 250, + "y": 250, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 250, + "y": 350, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 250, + "y": 450, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 300, + "y": 0, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 300, + "y": 100, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 300, + "y": 200, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 300, + "y": 300, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 300, + "y": 400, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 350, + "y": 50, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 350, + "y": 150, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 350, + "y": 250, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 350, + "y": 350, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 350, + "y": 450, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 400, + "y": 0, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 400, + "y": 100, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 400, + "y": 200, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 400, + "y": 300, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 400, + "y": 400, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 450, + "y": 50, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 450, + "y": 150, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 450, + "y": 250, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 450, + "y": 350, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + }, + { + "shape": { + "type": "rect", + "x": 450, + "y": 450, + "width": 50, + "height": 50, + "r": 0 + }, + "fill": { + "g": 0, + "b": 0, + "a": 0.1, + "r": 255 + } + } + ], + "name": "checkerboard" + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 0, + "width": 100, + "height": 100, + "r": 0 + }, + "transform": { + "dx": 100, + "dy": 100, + "xx": 1, + "xy": 0, + "yx": 0, + "yy": 1 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + }, + "fill": { + "type": "linear", + "x1": 0, + "y1": 0, + "x2": 100, + "y2": 100, + "colors": [ + { + "offset": 0, + "color": { + "r": 0, + "g": 128, + "b": 0, + "a": 1 + } + }, + { + "offset": 0.5, + "color": { + "g": 0, + "b": 0, + "r": 255, + "a": 1 + } + }, + { + "offset": 1, + "color": { + "r": 0, + "g": 0, + "b": 255, + "a": 1 + } + } + ] + }, + "name": "rect with color gradient" + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 0, + "width": 100, + "height": 100, + "r": 0 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + }, + "fill": { + "type": "linear", + "x1": 0, + "y1": 0, + "x2": 100, + "y2": 100, + "colors": [ + { + "offset": 0, + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + } + }, + { + "offset": 1, + "color": { + "r": 255, + "g": 255, + "b": 255, + "a": 1 + } + } + ] + }, + "name": "rect with gray gradient" + }, + { + "children": [ + { + "shape": { + "type": "rect", + "x": 200, + "y": 200, + "width": 100, + "height": 100, + "r": 0 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + }, + "fill": { + "r": 0, + "g": 128, + "b": 0, + "a": 1 + }, + name: "green rect" + }, + { + "shape": { + "type": "rect", + "x": 0, + "y": 0, + "width": 100, + "height": 100, + "r": 0 + }, + "transform": { + "xx": 0.8660254037844387, + "xy": 0.49999999999999994, + "yx": -0.49999999999999994, + "yy": 0.8660254037844387, + "dx": 281.69872981077805, + "dy": 231.69872981077808 + }, + "fill": { + "r": 0, + "g": 0, + "b": 255, + "a": 1 + }, + name: "blue rect" + }, + { + "shape": { + "type": "path", + "path": "M 300 100L 400 200L 400 300L 300 400C 400 300 400 200 300 100" + }, + "transform": { + "xx": 1, + "xy": 0, + "yx": 0, + "yy": 1, + "dx": 0, + "dy": 0 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "style": "solid", + "width": 1, + "cap": "butt", + "join": 4 + }, + name: "black path" + }, + { + "shape": { + "type": "path", + "path": "M 300 100L 400 200L 400 300L 300 400C 400 300 400 200 300 100" + }, + "transform": { + "dx": 100, + "xx": 1, + "xy": 0, + "yx": 0, + "yy": 1, + "dy": 0 + }, + "stroke": { + "type": "stroke", + "color": { + "g": 0, + "b": 0, + "r": 255, + "a": 1 + }, + "style": "solid", + "width": 2, + "cap": "butt", + "join": 4 + }, + name: "red path" + }, + { + "shape": { + "type": "path", + "path": "M 300 100l 100 100l 0 100l-100 100c 100-100 100-200 0-300" + }, + "transform": { + "xx": -1, + "xy": -1.2246063538223773e-16, + "yx": 1.2246063538223773e-16, + "yy": -1, + "dx": 500, + "dy": 500 + }, + "stroke": { + "type": "stroke", + "color": { + "r": 0, + "g": 0, + "b": 255, + "a": 1 + }, + "style": "solid", + "width": 2, + "cap": "butt", + "join": 4 + }, + name: "blue path" + } + ], + "transform": { + "xx": 0.9659258262890683, + "xy": 0.25881904510252074, + "yx": -0.25881904510252074, + "yy": 0.9659258262890683, + "dx": -56.1862178478973, + "dy": 73.22330470336311 + }, + "name": "rotated group" + } +] diff --git a/includes/js/dojox/gfx/demos/images/clock_face.jpg b/includes/js/dojox/gfx/demos/images/clock_face.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12f190345a1b27b076d4c51cfa70bbe3d7c8a34c GIT binary patch literal 31088 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 s>LDU!@P10@H?Jwa{l6*}=jsArG!>xhF8}y + +Inspect DojoX GFX JSON + + + + + + + +

            Inspect DojoX GFX JSON

            +

            Help: load a file, select an object, and add it, move it around, or apply operations to selected items:
            + F — bring to front, B — bring to back, Q — rotate CCW, W — rotate CW, D — delete.
            + (all operations work on currently dragged item).

            +

            VML note: VML doesn't process PNG images with opacity correctly.

            + + + +
            + + + + + + + + + + + + + +
            Source:
             
            +  
            Available sources:
            data/Lars.json — vectors from SVG
            data/Nils.json — vectors from SVG
            data/LarsDreaming.json — vectors from SVG
            data/buratino.json — images
            data/transform.json — from dojox.gfx
             
            Objects:
            Object names are hierarchical and separated by "/". Adding a selected object creates a group for this object. + A higher-level object (a group) always includes lower-level objects as children.
            + + diff --git a/includes/js/dojox/gfx/demos/lion.html b/includes/js/dojox/gfx/demos/lion.html new file mode 100644 index 0000000..445945c --- /dev/null +++ b/includes/js/dojox/gfx/demos/lion.html @@ -0,0 +1,235 @@ + + +dojox.gfx: Lion + + + + + + + + + + + + + +

            dojox.gfx: Lion

            +

            This example was directly converted from SVG file.

            + + + + + +
            Rotation (0)
            +
            +
            +
            +
            +
            +
            Scaling (1.000)
            +
            +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/gfx/demos/roundedPane.html b/includes/js/dojox/gfx/demos/roundedPane.html new file mode 100644 index 0000000..4abb775 --- /dev/null +++ b/includes/js/dojox/gfx/demos/roundedPane.html @@ -0,0 +1,191 @@ + + + + + rounded skeleton page | The Dojo Toolkit + + + + + + + + + + +

            Some gfx + ContentPane's

            + +
            +

            YO!

            +

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            lorem

            +
            + +
            + LOREM, ipsum, dollllllllllor: + .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            .roundedContent { + padding: 31px; + font-family: 'Tahoma'; + font-size: 12px; + color:#fff; + }

            + +
            + + +
            +

            Moveable Handle

            + LOREM, ipsum, dollllllllllor: +
            + + +
            + lorem ipsum (small moveable) +
            + + + diff --git a/includes/js/dojox/gfx/demos/tiger.html b/includes/js/dojox/gfx/demos/tiger.html new file mode 100644 index 0000000..afb45ef --- /dev/null +++ b/includes/js/dojox/gfx/demos/tiger.html @@ -0,0 +1,566 @@ + + +dojox.gfx: Tiger + + + + + + + + +

            dojox.gfx: Tiger

            +

            This example was directly converted from SVG file.

            + + + + + +
            Rotation (0)
            +
            +
            +
            +
            +
            +
            Scaling (1.000)
            +
            +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/gfx/demos/tooltip.html b/includes/js/dojox/gfx/demos/tooltip.html new file mode 100644 index 0000000..96bb694 --- /dev/null +++ b/includes/js/dojox/gfx/demos/tooltip.html @@ -0,0 +1,238 @@ + + + A Sample ToolTip using dijit and dojox.gfx + + + + + + + + + +

            dojox.gfx: A Sample tooltip

            + +
              + + + +
            • + Tooltip + Button +

              Canvas renderer doesn't implement event handling. + +

              +
            • + + +
            • + Hover trigger / persists +
              Canvas renderer doesn't implement event handling.
              +
            • + + +
            • MultiTip trigger 1
            • +
            • I do nothing
            • +
            • Trigger two
            • + +
            • show this way + + +
            • + + +
            • + Parent Attached Tooltip +
              +
              +

              + Name:

              + Pass:
              +

              +
              +
              +
            • + +
            + + +
            Canvas renderer doesn't implement event handling. (shared tooltip)
            + + + diff --git a/includes/js/dojox/gfx/fx.js b/includes/js/dojox/gfx/fx.js new file mode 100644 index 0000000..2b576d6 --- /dev/null +++ b/includes/js/dojox/gfx/fx.js @@ -0,0 +1,281 @@ +if(!dojo._hasResource["dojox.gfx.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.fx"] = true; +dojo.provide("dojox.gfx.fx"); + +dojo.require("dojox.gfx.matrix"); + +(function(){ + var d = dojo, g = dojox.gfx, m = g.matrix; + + // Generic interpolators. Should they be moved to dojox.fx? + + var InterpolNumber = function(start, end){ + this.start = start, this.end = end; + }; + d.extend(InterpolNumber, { + getValue: function(r){ + return (this.end - this.start) * r + this.start; + } + }); + + var InterpolUnit = function(start, end, unit){ + this.start = start, this.end = end; + this.unit = unit; + }; + d.extend(InterpolUnit, { + getValue: function(r){ + return (this.end - this.start) * r + this.start + this.unit; + } + }); + + var InterpolColor = function(start, end){ + this.start = start, this.end = end; + this.temp = new dojo.Color(); + }; + d.extend(InterpolColor, { + getValue: function(r){ + return d.blendColors(this.start, this.end, r, this.temp); + } + }); + + var InterpolValues = function(values){ + this.values = values; + this.length = values.length; + }; + d.extend(InterpolValues, { + getValue: function(r){ + return this.values[Math.min(Math.floor(r * this.length), this.length - 1)]; + } + }); + + var InterpolObject = function(values, def){ + this.values = values; + this.def = def ? def : {}; + }; + d.extend(InterpolObject, { + getValue: function(r){ + var ret = dojo.clone(this.def); + for(var i in this.values){ + ret[i] = this.values[i].getValue(r); + } + return ret; + } + }); + + var InterpolTransform = function(stack, original){ + this.stack = stack; + this.original = original; + }; + d.extend(InterpolTransform, { + getValue: function(r){ + var ret = []; + dojo.forEach(this.stack, function(t){ + if(t instanceof m.Matrix2D){ + ret.push(t); + return; + } + if(t.name == "original" && this.original){ + ret.push(this.original); + return; + } + if(!(t.name in m)){ return; } + var f = m[t.name]; + if(typeof f != "function"){ + // constant + ret.push(f); + return; + } + var val = dojo.map(t.start, function(v, i){ + return (t.end[i] - v) * r + v; + }), + matrix = f.apply(m, val); + if(matrix instanceof m.Matrix2D){ + ret.push(matrix); + } + }, this); + return ret; + } + }); + + var transparent = new d.Color(0, 0, 0, 0); + + var getColorInterpol = function(prop, obj, name, def){ + if(prop.values){ + return new InterpolValues(prop.values); + } + var value, start, end; + if(prop.start){ + start = g.normalizeColor(prop.start); + }else{ + start = value = obj ? (name ? obj[name] : obj) : def; + } + if(prop.end){ + end = g.normalizeColor(prop.end); + }else{ + if(!value){ + value = obj ? (name ? obj[name] : obj) : def; + } + end = value; + } + return new InterpolColor(start, end); + }; + + var getNumberInterpol = function(prop, obj, name, def){ + if(prop.values){ + return new InterpolValues(prop.values); + } + var value, start, end; + if(prop.start){ + start = prop.start; + }else{ + start = value = obj ? obj[name] : def; + } + if(prop.end){ + end = prop.end; + }else{ + if(typeof value != "number"){ + value = obj ? obj[name] : def; + } + end = value; + } + return new InterpolNumber(start, end); + }; + + g.fx.animateStroke = function(/*Object*/ args){ + // summary: + // returns the animation, which will change stroke properties over time + // example: + // | dojox.gfx.fx.animateStroke{{ + // | shape: shape, + // | duration: 500, + // | color: {start: "red", end: "green"}, + // | width: {end: 15}, + // | join: {values: ["miter", "bevel", "round"]} + // | }).play(); + if(!args.easing){ args.easing = d._defaultEasing; } + var anim = new d._Animation(args), shape = args.shape, stroke; + d.connect(anim, "beforeBegin", anim, function(){ + stroke = shape.getStroke(); + var prop = args.color, values = {}, value, start, end; + if(prop){ + values.color = getColorInterpol(prop, stroke, "color", transparent); + } + prop = args.style; + if(prop && prop.values){ + values.style = new InterpolValues(prop.values); + } + prop = args.width; + if(prop){ + values.width = getNumberInterpol(prop, stroke, "width", 1); + } + prop = args.cap; + if(prop && prop.values){ + values.cap = new InterpolValues(prop.values); + } + prop = args.join; + if(prop){ + if(prop.values){ + values.join = new InterpolValues(prop.values); + }else{ + start = prop.start ? prop.start : (stroke && stroke.join || 0); + end = prop.end ? prop.end : (stroke && stroke.join || 0); + if(typeof start == "number" && typeof end == "number"){ + values.join = new InterpolNumber(start, end); + } + } + } + this.curve = new InterpolObject(values, stroke); + }); + d.connect(anim, "onAnimate", shape, "setStroke"); + return anim; + }; + + g.fx.animateFill = function(/*Object*/ args){ + // summary: + // returns the animation, which will change fill color over time, + // only solid fill color is supported at the moment + // example: + // | dojox.gfx.fx.animateFill{{ + // | shape: shape, + // | duration: 500, + // | color: {start: "red", end: "green"} + // | }).play(); + if(!args.easing){ args.easing = d._defaultEasing; } + var anim = new d._Animation(args), shape = args.shape, fill; + d.connect(anim, "beforeBegin", anim, function(){ + fill = shape.getFill(); + var prop = args.color, values = {}; + if(prop){ + this.curve = getColorInterpol(prop, fill, "", transparent); + } + }); + d.connect(anim, "onAnimate", shape, "setFill"); + return anim; + }; + + g.fx.animateFont = function(/*Object*/ args){ + // summary: + // returns the animation, which will change font properties over time + // example: + // | dojox.gfx.fx.animateFont{{ + // | shape: shape, + // | duration: 500, + // | variant: {values: ["normal", "small-caps"]}, + // | size: {end: 10, unit: "pt"} + // | }).play(); + if(!args.easing){ args.easing = d._defaultEasing; } + var anim = new d._Animation(args), shape = args.shape, font; + d.connect(anim, "beforeBegin", anim, function(){ + font = shape.getFont(); + var prop = args.style, values = {}, value, start, end; + if(prop && prop.values){ + values.style = new InterpolValues(prop.values); + } + prop = args.variant; + if(prop && prop.values){ + values.variant = new InterpolValues(prop.values); + } + prop = args.weight; + if(prop && prop.values){ + values.weight = new InterpolValues(prop.values); + } + prop = args.family; + if(prop && prop.values){ + values.family = new InterpolValues(prop.values); + } + prop = args.size; + if(prop && prop.unit){ + start = parseFloat(prop.start ? prop.start : (shape.font && shape.font.size || "0")); + end = parseFloat(prop.end ? prop.end : (shape.font && shape.font.size || "0")); + values.size = new InterpolUnit(start, end, prop.unit); + } + this.curve = new InterpolObject(values, font); + }); + d.connect(anim, "onAnimate", shape, "setFont"); + return anim; + }; + + g.fx.animateTransform = function(/*Object*/ args){ + // summary: + // returns the animation, which will change transformation over time + // example: + // | dojox.gfx.fx.animateTransform{{ + // | shape: shape, + // | duration: 500, + // | transform: [ + // | {name: "translate", start: [0, 0], end: [200, 200]}, + // | {name: "original"} + // | ] + // | }).play(); + if(!args.easing){ args.easing = d._defaultEasing; } + var anim = new d._Animation(args), shape = args.shape, original; + d.connect(anim, "beforeBegin", anim, function(){ + original = shape.getTransform(); + this.curve = new InterpolTransform(args.transform, original); + }); + d.connect(anim, "onAnimate", shape, "setTransform"); + return anim; + }; +})(); + +} diff --git a/includes/js/dojox/gfx/matrix.js b/includes/js/dojox/gfx/matrix.js new file mode 100644 index 0000000..f3402b1 --- /dev/null +++ b/includes/js/dojox/gfx/matrix.js @@ -0,0 +1,444 @@ +if(!dojo._hasResource["dojox.gfx.matrix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.matrix"] = true; +dojo.provide("dojox.gfx.matrix"); + +(function(){ + var m = dojox.gfx.matrix; + + // candidates for dojox.math: + m._degToRad = function(degree){ return Math.PI * degree / 180; }; + m._radToDeg = function(radian){ return radian / Math.PI * 180; }; + + m.Matrix2D = function(arg){ + // summary: a 2D matrix object + // description: Normalizes a 2D matrix-like object. If arrays is passed, + // all objects of the array are normalized and multiplied sequentially. + // arg: Object + // a 2D matrix-like object, a number, or an array of such objects + if(arg){ + if(typeof arg == "number"){ + this.xx = this.yy = arg; + }else if(arg instanceof Array){ + if(arg.length > 0){ + var matrix = m.normalize(arg[0]); + // combine matrices + for(var i = 1; i < arg.length; ++i){ + var l = matrix, r = dojox.gfx.matrix.normalize(arg[i]); + matrix = new m.Matrix2D(); + matrix.xx = l.xx * r.xx + l.xy * r.yx; + matrix.xy = l.xx * r.xy + l.xy * r.yy; + matrix.yx = l.yx * r.xx + l.yy * r.yx; + matrix.yy = l.yx * r.xy + l.yy * r.yy; + matrix.dx = l.xx * r.dx + l.xy * r.dy + l.dx; + matrix.dy = l.yx * r.dx + l.yy * r.dy + l.dy; + } + dojo.mixin(this, matrix); + } + }else{ + dojo.mixin(this, arg); + } + } + }; + + // the default (identity) matrix, which is used to fill in missing values + dojo.extend(m.Matrix2D, {xx: 1, xy: 0, yx: 0, yy: 1, dx: 0, dy: 0}); + + dojo.mixin(m, { + // summary: class constants, and methods of dojox.gfx.matrix + + // matrix constants + + // identity: dojox.gfx.matrix.Matrix2D + // an identity matrix constant: identity * (x, y) == (x, y) + identity: new m.Matrix2D(), + + // flipX: dojox.gfx.matrix.Matrix2D + // a matrix, which reflects points at x = 0 line: flipX * (x, y) == (-x, y) + flipX: new m.Matrix2D({xx: -1}), + + // flipY: dojox.gfx.matrix.Matrix2D + // a matrix, which reflects points at y = 0 line: flipY * (x, y) == (x, -y) + flipY: new m.Matrix2D({yy: -1}), + + // flipXY: dojox.gfx.matrix.Matrix2D + // a matrix, which reflects points at the origin of coordinates: flipXY * (x, y) == (-x, -y) + flipXY: new m.Matrix2D({xx: -1, yy: -1}), + + // matrix creators + + translate: function(a, b){ + // summary: forms a translation matrix + // description: The resulting matrix is used to translate (move) points by specified offsets. + // a: Number: an x coordinate value + // b: Number: a y coordinate value + if(arguments.length > 1){ + return new m.Matrix2D({dx: a, dy: b}); // dojox.gfx.matrix.Matrix2D + } + // branch + // a: dojox.gfx.Point: a point-like object, which specifies offsets for both dimensions + // b: null + return new m.Matrix2D({dx: a.x, dy: a.y}); // dojox.gfx.matrix.Matrix2D + }, + scale: function(a, b){ + // summary: forms a scaling matrix + // description: The resulting matrix is used to scale (magnify) points by specified offsets. + // a: Number: a scaling factor used for the x coordinate + // b: Number: a scaling factor used for the y coordinate + if(arguments.length > 1){ + return new m.Matrix2D({xx: a, yy: b}); // dojox.gfx.matrix.Matrix2D + } + if(typeof a == "number"){ + // branch + // a: Number: a uniform scaling factor used for the both coordinates + // b: null + return new m.Matrix2D({xx: a, yy: a}); // dojox.gfx.matrix.Matrix2D + } + // branch + // a: dojox.gfx.Point: a point-like object, which specifies scale factors for both dimensions + // b: null + return new m.Matrix2D({xx: a.x, yy: a.y}); // dojox.gfx.matrix.Matrix2D + }, + rotate: function(angle){ + // summary: forms a rotating matrix + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(angle); + var s = Math.sin(angle); + return new m.Matrix2D({xx: c, xy: -s, yx: s, yy: c}); // dojox.gfx.matrix.Matrix2D + }, + rotateg: function(degree){ + // summary: forms a rotating matrix + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx.matrix.rotate() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return m.rotate(m._degToRad(degree)); // dojox.gfx.matrix.Matrix2D + }, + skewX: function(angle) { + // summary: forms an x skewing matrix + // description: The resulting matrix is used to skew points in the x dimension + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an skewing angle in radians + return new m.Matrix2D({xy: -Math.tan(angle)}); // dojox.gfx.matrix.Matrix2D + }, + skewXg: function(degree){ + // summary: forms an x skewing matrix + // description: The resulting matrix is used to skew points in the x dimension + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx.matrix.skewX() for comparison. + // degree: Number: an skewing angle in degrees + return m.skewX(m._degToRad(degree)); // dojox.gfx.matrix.Matrix2D + }, + skewY: function(angle){ + // summary: forms a y skewing matrix + // description: The resulting matrix is used to skew points in the y dimension + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an skewing angle in radians + return new m.Matrix2D({yx: Math.tan(angle)}); // dojox.gfx.matrix.Matrix2D + }, + skewYg: function(degree){ + // summary: forms a y skewing matrix + // description: The resulting matrix is used to skew points in the y dimension + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx.matrix.skewY() for comparison. + // degree: Number: an skewing angle in degrees + return m.skewY(m._degToRad(degree)); // dojox.gfx.matrix.Matrix2D + }, + reflect: function(a, b){ + // summary: forms a reflection matrix + // description: The resulting matrix is used to reflect points around a vector, + // which goes through the origin. + // a: dojox.gfx.Point: a point-like object, which specifies a vector of reflection + // b: null + if(arguments.length == 1){ + b = a.y; + a = a.x; + } + // branch + // a: Number: an x coordinate value + // b: Number: a y coordinate value + + // make a unit vector + var a2 = a * a, b2 = b * b, n2 = a2 + b2, xy = 2 * a * b / n2; + return new m.Matrix2D({xx: 2 * a2 / n2 - 1, xy: xy, yx: xy, yy: 2 * b2 / n2 - 1}); // dojox.gfx.matrix.Matrix2D + }, + project: function(a, b){ + // summary: forms an orthogonal projection matrix + // description: The resulting matrix is used to project points orthogonally on a vector, + // which goes through the origin. + // a: dojox.gfx.Point: a point-like object, which specifies a vector of projection + // b: null + if(arguments.length == 1){ + b = a.y; + a = a.x; + } + // branch + // a: Number: an x coordinate value + // b: Number: a y coordinate value + + // make a unit vector + var a2 = a * a, b2 = b * b, n2 = a2 + b2, xy = a * b / n2; + return new m.Matrix2D({xx: a2 / n2, xy: xy, yx: xy, yy: b2 / n2}); // dojox.gfx.matrix.Matrix2D + }, + + // ensure matrix 2D conformance + normalize: function(matrix){ + // summary: converts an object to a matrix, if necessary + // description: Converts any 2D matrix-like object or an array of + // such objects to a valid dojox.gfx.matrix.Matrix2D object. + // matrix: Object: an object, which is converted to a matrix, if necessary + return (matrix instanceof m.Matrix2D) ? matrix : new m.Matrix2D(matrix); // dojox.gfx.matrix.Matrix2D + }, + + // common operations + + clone: function(matrix){ + // summary: creates a copy of a 2D matrix + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object to be cloned + var obj = new m.Matrix2D(); + for(var i in matrix){ + if(typeof(matrix[i]) == "number" && typeof(obj[i]) == "number" && obj[i] != matrix[i]) obj[i] = matrix[i]; + } + return obj; // dojox.gfx.matrix.Matrix2D + }, + invert: function(matrix){ + // summary: inverts a 2D matrix + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object to be inverted + var M = m.normalize(matrix), + D = M.xx * M.yy - M.xy * M.yx, + M = new m.Matrix2D({ + xx: M.yy/D, xy: -M.xy/D, + yx: -M.yx/D, yy: M.xx/D, + dx: (M.xy * M.dy - M.yy * M.dx) / D, + dy: (M.yx * M.dx - M.xx * M.dy) / D + }); + return M; // dojox.gfx.matrix.Matrix2D + }, + _multiplyPoint: function(matrix, x, y){ + // summary: applies a matrix to a point + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix object to be applied + // x: Number: an x coordinate of a point + // y: Number: a y coordinate of a point + return {x: matrix.xx * x + matrix.xy * y + matrix.dx, y: matrix.yx * x + matrix.yy * y + matrix.dy}; // dojox.gfx.Point + }, + multiplyPoint: function(matrix, /* Number||Point */ a, /* Number, optional */ b){ + // summary: applies a matrix to a point + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix object to be applied + // a: Number: an x coordinate of a point + // b: Number: a y coordinate of a point + var M = m.normalize(matrix); + if(typeof a == "number" && typeof b == "number"){ + return m._multiplyPoint(M, a, b); // dojox.gfx.Point + } + // branch + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix object to be applied + // a: dojox.gfx.Point: a point + // b: null + return m._multiplyPoint(M, a.x, a.y); // dojox.gfx.Point + }, + multiply: function(matrix){ + // summary: combines matrices by multiplying them sequentially in the given order + // matrix: dojox.gfx.matrix.Matrix2D...: a 2D matrix-like object, + // all subsequent arguments are matrix-like objects too + var M = m.normalize(matrix); + // combine matrices + for(var i = 1; i < arguments.length; ++i){ + var l = M, r = m.normalize(arguments[i]); + M = new m.Matrix2D(); + M.xx = l.xx * r.xx + l.xy * r.yx; + M.xy = l.xx * r.xy + l.xy * r.yy; + M.yx = l.yx * r.xx + l.yy * r.yx; + M.yy = l.yx * r.xy + l.yy * r.yy; + M.dx = l.xx * r.dx + l.xy * r.dy + l.dx; + M.dy = l.yx * r.dx + l.yy * r.dy + l.dy; + } + return M; // dojox.gfx.matrix.Matrix2D + }, + + // high level operations + + _sandwich: function(matrix, x, y){ + // summary: applies a matrix at a centrtal point + // matrix: dojox.gfx.matrix.Matrix2D: a 2D matrix-like object, which is applied at a central point + // x: Number: an x component of the central point + // y: Number: a y component of the central point + return m.multiply(m.translate(x, y), matrix, m.translate(-x, -y)); // dojox.gfx.matrix.Matrix2D + }, + scaleAt: function(a, b, c, d){ + // summary: scales a picture using a specified point as a center of scaling + // description: Compare with dojox.gfx.matrix.scale(). + // a: Number: a scaling factor used for the x coordinate + // b: Number: a scaling factor used for the y coordinate + // c: Number: an x component of a central point + // d: Number: a y component of a central point + + // accepts several signatures: + // 1) uniform scale factor, Point + // 2) uniform scale factor, x, y + // 3) x scale, y scale, Point + // 4) x scale, y scale, x, y + + switch(arguments.length){ + case 4: + // a and b are scale factor components, c and d are components of a point + return m._sandwich(m.scale(a, b), c, d); // dojox.gfx.matrix.Matrix2D + case 3: + if(typeof c == "number"){ + // branch + // a: Number: a uniform scaling factor used for both coordinates + // b: Number: an x component of a central point + // c: Number: a y component of a central point + // d: null + return m._sandwich(m.scale(a), b, c); // dojox.gfx.matrix.Matrix2D + } + // branch + // a: Number: a scaling factor used for the x coordinate + // b: Number: a scaling factor used for the y coordinate + // c: dojox.gfx.Point: a central point + // d: null + return m._sandwich(m.scale(a, b), c.x, c.y); // dojox.gfx.matrix.Matrix2D + } + // branch + // a: Number: a uniform scaling factor used for both coordinates + // b: dojox.gfx.Point: a central point + // c: null + // d: null + return m._sandwich(m.scale(a), b.x, b.y); // dojox.gfx.matrix.Matrix2D + }, + rotateAt: function(angle, a, b){ + // summary: rotates a picture using a specified point as a center of rotation + // description: Compare with dojox.gfx.matrix.rotate(). + // angle: Number: an angle of rotation in radians (>0 for CW) + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) rotation angle in radians, Point + // 2) rotation angle in radians, x, y + + if(arguments.length > 2){ + return m._sandwich(m.rotate(angle), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // angle: Number: an angle of rotation in radians (>0 for CCW) + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.rotate(angle), a.x, a.y); // dojox.gfx.matrix.Matrix2D + }, + rotategAt: function(degree, a, b){ + // summary: rotates a picture using a specified point as a center of rotation + // description: Compare with dojox.gfx.matrix.rotateg(). + // degree: Number: an angle of rotation in degrees (>0 for CW) + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) rotation angle in degrees, Point + // 2) rotation angle in degrees, x, y + + if(arguments.length > 2){ + return m._sandwich(m.rotateg(degree), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // degree: Number: an angle of rotation in degrees (>0 for CCW) + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.rotateg(degree), a.x, a.y); // dojox.gfx.matrix.Matrix2D + }, + skewXAt: function(angle, a, b){ + // summary: skews a picture along the x axis using a specified point as a center of skewing + // description: Compare with dojox.gfx.matrix.skewX(). + // angle: Number: an skewing angle in radians + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) skew angle in radians, Point + // 2) skew angle in radians, x, y + + if(arguments.length > 2){ + return m._sandwich(m.skewX(angle), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // angle: Number: an skewing angle in radians + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.skewX(angle), a.x, a.y); // dojox.gfx.matrix.Matrix2D + }, + skewXgAt: function(degree, a, b){ + // summary: skews a picture along the x axis using a specified point as a center of skewing + // description: Compare with dojox.gfx.matrix.skewXg(). + // degree: Number: an skewing angle in degrees + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) skew angle in degrees, Point + // 2) skew angle in degrees, x, y + + if(arguments.length > 2){ + return m._sandwich(m.skewXg(degree), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // degree: Number: an skewing angle in degrees + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.skewXg(degree), a.x, a.y); // dojox.gfx.matrix.Matrix2D + }, + skewYAt: function(angle, a, b){ + // summary: skews a picture along the y axis using a specified point as a center of skewing + // description: Compare with dojox.gfx.matrix.skewY(). + // angle: Number: an skewing angle in radians + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) skew angle in radians, Point + // 2) skew angle in radians, x, y + + if(arguments.length > 2){ + return m._sandwich(m.skewY(angle), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // angle: Number: an skewing angle in radians + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.skewY(angle), a.x, a.y); // dojox.gfx.matrix.Matrix2D + }, + skewYgAt: function(/* Number */ degree, /* Number||Point */ a, /* Number, optional */ b){ + // summary: skews a picture along the y axis using a specified point as a center of skewing + // description: Compare with dojox.gfx.matrix.skewYg(). + // degree: Number: an skewing angle in degrees + // a: Number: an x component of a central point + // b: Number: a y component of a central point + + // accepts several signatures: + // 1) skew angle in degrees, Point + // 2) skew angle in degrees, x, y + + if(arguments.length > 2){ + return m._sandwich(m.skewYg(degree), a, b); // dojox.gfx.matrix.Matrix2D + } + + // branch + // degree: Number: an skewing angle in degrees + // a: dojox.gfx.Point: a central point + // b: null + return m._sandwich(m.skewYg(degree), a.x, a.y); // dojox.gfx.matrix.Matrix2D + } + + //TODO: rect-to-rect mapping, scale-to-fit (isotropic and anisotropic versions) + + }); +})(); + +// propagate Matrix2D up +dojox.gfx.Matrix2D = dojox.gfx.matrix.Matrix2D; + +} diff --git a/includes/js/dojox/gfx/move.js b/includes/js/dojox/gfx/move.js new file mode 100644 index 0000000..dba5ced --- /dev/null +++ b/includes/js/dojox/gfx/move.js @@ -0,0 +1,8 @@ +if(!dojo._hasResource["dojox.gfx.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.move"] = true; +dojo.provide("dojox.gfx.move"); + +dojo.require("dojox.gfx.Mover"); +dojo.require("dojox.gfx.Moveable"); + +} diff --git a/includes/js/dojox/gfx/path.js b/includes/js/dojox/gfx/path.js new file mode 100644 index 0000000..657136b --- /dev/null +++ b/includes/js/dojox/gfx/path.js @@ -0,0 +1,361 @@ +if(!dojo._hasResource["dojox.gfx.path"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.path"] = true; +dojo.provide("dojox.gfx.path"); + +dojo.require("dojox.gfx.shape"); + +dojo.declare("dojox.gfx.path.Path", dojox.gfx.Shape, { + // summary: a generalized path shape + + constructor: function(rawNode){ + // summary: a path constructor + // rawNode: Node: a DOM node to be used by this path object + this.shape = dojo.clone(dojox.gfx.defaultPath); + this.segments = []; + this.absolute = true; + this.last = {}; + this.rawNode = rawNode; + }, + + // mode manipulations + setAbsoluteMode: function(mode){ + // summary: sets an absolute or relative mode for path points + // mode: Boolean: true/false or "absolute"/"relative" to specify the mode + this.absolute = typeof mode == "string" ? (mode == "absolute") : mode; + return this; // self + }, + getAbsoluteMode: function(){ + // summary: returns a current value of the absolute mode + return this.absolute; // Boolean + }, + + getBoundingBox: function(){ + // summary: returns the bounding box {x, y, width, height} or null + return (this.bbox && ("l" in this.bbox)) ? {x: this.bbox.l, y: this.bbox.t, width: this.bbox.r - this.bbox.l, height: this.bbox.b - this.bbox.t} : null; // dojox.gfx.Rectangle + }, + + getLastPosition: function(){ + // summary: returns the last point in the path, or null + return "x" in this.last ? this.last : null; // Object + }, + + // segment interpretation + _updateBBox: function(x, y){ + // summary: updates the bounding box of path with new point + // x: Number: an x coordinate + // y: Number: a y coordinate + + // we use {l, b, r, t} representation of a bbox + if(this.bbox && ("l" in this.bbox)){ + if(this.bbox.l > x) this.bbox.l = x; + if(this.bbox.r < x) this.bbox.r = x; + if(this.bbox.t > y) this.bbox.t = y; + if(this.bbox.b < y) this.bbox.b = y; + }else{ + this.bbox = {l: x, b: y, r: x, t: y}; + } + }, + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + var n = segment.args, l = n.length; + // update internal variables: bbox, absolute, last + switch(segment.action){ + case "M": + case "L": + case "C": + case "S": + case "Q": + case "T": + for(var i = 0; i < l; i += 2){ + this._updateBBox(n[i], n[i + 1]); + } + this.last.x = n[l - 2]; + this.last.y = n[l - 1]; + this.absolute = true; + break; + case "H": + for(var i = 0; i < l; ++i){ + this._updateBBox(n[i], this.last.y); + } + this.last.x = n[l - 1]; + this.absolute = true; + break; + case "V": + for(var i = 0; i < l; ++i){ + this._updateBBox(this.last.x, n[i]); + } + this.last.y = n[l - 1]; + this.absolute = true; + break; + case "m": + var start = 0; + if(!("x" in this.last)){ + this._updateBBox(this.last.x = n[0], this.last.y = n[1]); + start = 2; + } + for(var i = start; i < l; i += 2){ + this._updateBBox(this.last.x += n[i], this.last.y += n[i + 1]); + } + this.absolute = false; + break; + case "l": + case "t": + for(var i = 0; i < l; i += 2){ + this._updateBBox(this.last.x += n[i], this.last.y += n[i + 1]); + } + this.absolute = false; + break; + case "h": + for(var i = 0; i < l; ++i){ + this._updateBBox(this.last.x += n[i], this.last.y); + } + this.absolute = false; + break; + case "v": + for(var i = 0; i < l; ++i){ + this._updateBBox(this.last.x, this.last.y += n[i]); + } + this.absolute = false; + break; + case "c": + for(var i = 0; i < l; i += 6){ + this._updateBBox(this.last.x + n[i], this.last.y + n[i + 1]); + this._updateBBox(this.last.x + n[i + 2], this.last.y + n[i + 3]); + this._updateBBox(this.last.x += n[i + 4], this.last.y += n[i + 5]); + } + this.absolute = false; + break; + case "s": + case "q": + for(var i = 0; i < l; i += 4){ + this._updateBBox(this.last.x + n[i], this.last.y + n[i + 1]); + this._updateBBox(this.last.x += n[i + 2], this.last.y += n[i + 3]); + } + this.absolute = false; + break; + case "A": + for(var i = 0; i < l; i += 7){ + this._updateBBox(n[i + 5], n[i + 6]); + } + this.last.x = n[l - 2]; + this.last.y = n[l - 1]; + this.absolute = true; + break; + case "a": + for(var i = 0; i < l; i += 7){ + this._updateBBox(this.last.x += n[i + 5], this.last.y += n[i + 6]); + } + this.absolute = false; + break; + } + // add an SVG path segment + var path = [segment.action]; + for(var i = 0; i < l; ++i){ + path.push(dojox.gfx.formatNumber(n[i], true)); + } + if(typeof this.shape.path == "string"){ + this.shape.path += path.join(""); + }else{ + var l = path.length, a = this.shape.path; + for(var i = 0; i < l; ++i){ + a.push(path[i]); + } + } + }, + + // a dictionary, which maps segment type codes to a number of their argemnts + _validSegments: {m: 2, l: 2, h: 1, v: 1, c: 6, s: 4, q: 4, t: 2, a: 7, z: 0}, + + _pushSegment: function(action, args){ + // summary: adds a segment + // action: String: valid SVG code for a segment's type + // args: Array: a list of parameters for this segment + var group = this._validSegments[action.toLowerCase()]; + if(typeof group == "number"){ + if(group){ + if(args.length >= group){ + var segment = {action: action, args: args.slice(0, args.length - args.length % group)}; + this.segments.push(segment); + this._updateWithSegment(segment); + } + }else{ + var segment = {action: action, args: []}; + this.segments.push(segment); + this._updateWithSegment(segment); + } + } + }, + + _collectArgs: function(array, args){ + // summary: converts an array of arguments to plain numeric values + // array: Array: an output argument (array of numbers) + // args: Array: an input argument (can be values of Boolean, Number, dojox.gfx.Point, or an embedded array of them) + for(var i = 0; i < args.length; ++i){ + var t = args[i]; + if(typeof t == "boolean"){ + array.push(t ? 1 : 0); + }else if(typeof t == "number"){ + array.push(t); + }else if(t instanceof Array){ + this._collectArgs(array, t); + }else if("x" in t && "y" in t){ + array.push(t.x, t.y); + } + } + }, + + // segments + moveTo: function(){ + // summary: formes a move segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "M" : "m", args); + return this; // self + }, + lineTo: function(){ + // summary: formes a line segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "L" : "l", args); + return this; // self + }, + hLineTo: function(){ + // summary: formes a horizontal line segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "H" : "h", args); + return this; // self + }, + vLineTo: function(){ + // summary: formes a vertical line segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "V" : "v", args); + return this; // self + }, + curveTo: function(){ + // summary: formes a curve segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "C" : "c", args); + return this; // self + }, + smoothCurveTo: function(){ + // summary: formes a smooth curve segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "S" : "s", args); + return this; // self + }, + qCurveTo: function(){ + // summary: formes a quadratic curve segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "Q" : "q", args); + return this; // self + }, + qSmoothCurveTo: function(){ + // summary: formes a quadratic smooth curve segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "T" : "t", args); + return this; // self + }, + arcTo: function(){ + // summary: formes an elliptic arc segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "A" : "a", args); + return this; // self + }, + closePath: function(){ + // summary: closes a path + this._pushSegment("Z", []); + return this; // self + }, + + // setShape + _setPath: function(path){ + // summary: forms a path using an SVG path string + // path: String: an SVG path string + var p = dojo.isArray(path) ? path : path.match(dojox.gfx.pathSvgRegExp); + this.segments = []; + this.absolute = true; + this.bbox = {}; + this.last = {}; + if(!p) return; + // create segments + var action = "", // current action + args = [], // current arguments + l = p.length; + for(var i = 0; i < l; ++i){ + var t = p[i], x = parseFloat(t); + if(isNaN(x)){ + if(action){ + this._pushSegment(action, args); + } + args = []; + action = t; + }else{ + args.push(x); + } + } + this._pushSegment(action, args); + }, + setShape: function(newShape){ + // summary: forms a path using a shape + // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath) + dojox.gfx.Shape.prototype.setShape.call(this, typeof newShape == "string" ? {path: newShape} : newShape); + var path = this.shape.path; + // switch to non-updating version of path building + this.shape.path = []; + this._setPath(path); + // switch back to the string path + this.shape.path = this.shape.path.join(""); + return this; // self + }, + + // useful constant for descendants + _2PI: Math.PI * 2 +}); + +dojo.declare("dojox.gfx.path.TextPath", dojox.gfx.path.Path, { + // summary: a generalized TextPath shape + + constructor: function(rawNode){ + // summary: a TextPath shape constructor + // rawNode: Node: a DOM node to be used by this TextPath object + if(!("text" in this)){ + this.text = dojo.clone(dojox.gfx.defaultTextPath); + } + if(!("fontStyle" in this)){ + this.fontStyle = dojo.clone(dojox.gfx.defaultFont); + } + }, + getText: function(){ + // summary: returns the current text object or null + return this.text; // Object + }, + setText: function(newText){ + // summary: sets a text to be drawn along the path + this.text = dojox.gfx.makeParameters(this.text, + typeof newText == "string" ? {text: newText} : newText); + this._setText(); + return this; // self + }, + getFont: function(){ + // summary: returns the current font object or null + return this.fontStyle; // Object + }, + setFont: function(newFont){ + // summary: sets a font for text + this.fontStyle = typeof newFont == "string" ? + dojox.gfx.splitFontString(newFont) : + dojox.gfx.makeParameters(dojox.gfx.defaultFont, newFont); + this._setFont(); + return this; // self + } +}); + +} diff --git a/includes/js/dojox/gfx/shape.js b/includes/js/dojox/gfx/shape.js new file mode 100644 index 0000000..179f6c5 --- /dev/null +++ b/includes/js/dojox/gfx/shape.js @@ -0,0 +1,691 @@ +if(!dojo._hasResource["dojox.gfx.shape"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.shape"] = true; +dojo.provide("dojox.gfx.shape"); + +dojo.require("dojox.gfx._base"); + +dojo.declare("dojox.gfx.Shape", null, { + // summary: a Shape object, which knows how to apply + // graphical attributes and transformations + + constructor: function(){ + // rawNode: Node: underlying node + this.rawNode = null; + + // shape: Object: an abstract shape object + // (see dojox.gfx.defaultPath, + // dojox.gfx.defaultPolyline, + // dojox.gfx.defaultRect, + // dojox.gfx.defaultEllipse, + // dojox.gfx.defaultCircle, + // dojox.gfx.defaultLine, + // or dojox.gfx.defaultImage) + this.shape = null; + + // matrix: dojox.gfx.Matrix2D: a transformation matrix + this.matrix = null; + + // fillStyle: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + this.fillStyle = null; + + // strokeStyle: Object: a stroke object + // (see dojox.gfx.defaultStroke) + this.strokeStyle = null; + + // bbox: dojox.gfx.Rectangle: a bounding box of this shape + // (see dojox.gfx.defaultRect) + this.bbox = null; + + // virtual group structure + + // parent: Object: a parent or null + // (see dojox.gfx.Surface, + // dojox.gfx.shape.VirtualGroup, + // or dojox.gfx.Group) + this.parent = null; + + // parentMatrix: dojox.gfx.Matrix2D + // a transformation matrix inherited from the parent + this.parentMatrix = null; + }, + + // trivial getters + + getNode: function(){ + // summary: returns the current DOM Node or null + return this.rawNode; // Node + }, + getShape: function(){ + // summary: returns the current shape object or null + // (see dojox.gfx.defaultPath, + // dojox.gfx.defaultPolyline, + // dojox.gfx.defaultRect, + // dojox.gfx.defaultEllipse, + // dojox.gfx.defaultCircle, + // dojox.gfx.defaultLine, + // or dojox.gfx.defaultImage) + return this.shape; // Object + }, + getTransform: function(){ + // summary: returns the current transformation matrix or null + return this.matrix; // dojox.gfx.Matrix2D + }, + getFill: function(){ + // summary: returns the current fill object or null + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + return this.fillStyle; // Object + }, + getStroke: function(){ + // summary: returns the current stroke object or null + // (see dojox.gfx.defaultStroke) + return this.strokeStyle; // Object + }, + getParent: function(){ + // summary: returns the parent or null + // (see dojox.gfx.Surface, + // dojox.gfx.shape.VirtualGroup, + // or dojox.gfx.Group) + return this.parent; // Object + }, + getBoundingBox: function(){ + // summary: returns the bounding box or null + // (see dojox.gfx.defaultRect) + return this.bbox; // dojox.gfx.Rectangle + }, + getTransformedBoundingBox: function(){ + // summary: returns an array of four points or null + // four points represent four corners of the untransformed bounding box + var b = this.getBoundingBox(); + if(!b){ + return null; // null + } + var m = this._getRealMatrix(); + var r = []; + var g = dojox.gfx.matrix; + r.push(g.multiplyPoint(m, b.x, b.y)); + r.push(g.multiplyPoint(m, b.x + b.width, b.y)); + r.push(g.multiplyPoint(m, b.x + b.width, b.y + b.height)); + r.push(g.multiplyPoint(m, b.x, b.y + b.height)); + return r; // Array + }, + getEventSource: function(){ + // summary: returns a Node, which is used as + // a source of events for this shape + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + return this.rawNode; // Node + }, + + // empty settings + + setShape: function(shape){ + // summary: sets a shape object + // (the default implementation simply ignores it) + // shape: Object: a shape object + // (see dojox.gfx.defaultPath, + // dojox.gfx.defaultPolyline, + // dojox.gfx.defaultRect, + // dojox.gfx.defaultEllipse, + // dojox.gfx.defaultCircle, + // dojox.gfx.defaultLine, + // or dojox.gfx.defaultImage) + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + this.shape = dojox.gfx.makeParameters(this.shape, shape); + this.bbox = null; + return this; // self + }, + setFill: function(fill){ + // summary: sets a fill object + // (the default implementation simply ignores it) + // fill: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + if(!fill){ + // don't fill + this.fillStyle = null; + return this; // self + } + var f = null; + if(typeof(fill) == "object" && "type" in fill){ + // gradient or pattern + switch(fill.type){ + case "linear": + f = dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient, fill); + break; + case "radial": + f = dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient, fill); + break; + case "pattern": + f = dojox.gfx.makeParameters(dojox.gfx.defaultPattern, fill); + break; + } + }else{ + // color object + f = dojox.gfx.normalizeColor(fill); + } + this.fillStyle = f; + return this; // self + }, + setStroke: function(stroke){ + // summary: sets a stroke object + // (the default implementation simply ignores it) + // stroke: Object: a stroke object + // (see dojox.gfx.defaultStroke) + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + if(!stroke){ + // don't stroke + this.strokeStyle = null; + return this; // self + } + // normalize the stroke + if(typeof stroke == "string"){ + stroke = {color: stroke}; + } + var s = this.strokeStyle = dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke); + s.color = dojox.gfx.normalizeColor(s.color); + return this; // self + }, + setTransform: function(matrix){ + // summary: sets a transformation matrix + // matrix: dojox.gfx.Matrix2D: a matrix or a matrix-like object + // (see an argument of dojox.gfx.Matrix2D + // constructor for a list of acceptable arguments) + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + this.matrix = dojox.gfx.matrix.clone(matrix ? dojox.gfx.matrix.normalize(matrix) : dojox.gfx.matrix.identity); + return this._applyTransform(); // self + }, + + _applyTransform: function(){ + // summary: physically sets a matrix + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + return this; // self + }, + + // z-index + + moveToFront: function(){ + // summary: moves a shape to front of its parent's list of shapes + var p = this.getParent(); + if(p){ + p._moveChildToFront(this); + this._moveToFront(); // execute renderer-specific action + } + return this; // self + }, + moveToBack: function(){ + // summary: moves a shape to back of its parent's list of shapes + var p = this.getParent(); + if(p){ + p._moveChildToBack(this); + this._moveToBack(); // execute renderer-specific action + } + return this; + }, + _moveToFront: function(){ + // summary: renderer-specific hook, see dojox.gfx.shape.Shape.moveToFront() + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + }, + _moveToBack: function(){ + // summary: renderer-specific hook, see dojox.gfx.shape.Shape.moveToFront() + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + }, + + // apply left & right transformation + + applyRightTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on right side + // (this.matrix * matrix) + // matrix: dojox.gfx.Matrix2D: a matrix or a matrix-like object + // (see an argument of dojox.gfx.Matrix2D + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([this.matrix, matrix]) : this; // self + }, + applyLeftTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on left side + // (matrix * this.matrix) + // matrix: dojox.gfx.Matrix2D: a matrix or a matrix-like object + // (see an argument of dojox.gfx.Matrix2D + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([matrix, this.matrix]) : this; // self + }, + applyTransform: function(matrix){ + // summary: a shortcut for dojox.gfx.Shape.applyRightTransform + // matrix: dojox.gfx.Matrix2D: a matrix or a matrix-like object + // (see an argument of dojox.gfx.Matrix2D + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([this.matrix, matrix]) : this; // self + }, + + // virtual group methods + + removeShape: function(silently){ + // summary: removes the shape from its parent's list of shapes + // silently: Boolean?: if true, do not redraw a picture yet + if(this.parent){ + this.parent.remove(this, silently); + } + return this; // self + }, + _setParent: function(parent, matrix){ + // summary: sets a parent + // parent: Object: a parent or null + // (see dojox.gfx.Surface, + // dojox.gfx.shape.VirtualGroup, + // or dojox.gfx.Group) + // matrix: dojox.gfx.Matrix2D: + // a 2D matrix or a matrix-like object + this.parent = parent; + return this._updateParentMatrix(matrix); // self + }, + _updateParentMatrix: function(matrix){ + // summary: updates the parent matrix with new matrix + // matrix: dojox.gfx.Matrix2D: + // a 2D matrix or a matrix-like object + this.parentMatrix = matrix ? dojox.gfx.matrix.clone(matrix) : null; + return this._applyTransform(); // self + }, + _getRealMatrix: function(){ + // summary: returns the cumulative ("real") transformation matrix + // by combining the shape's matrix with its parent's matrix + var m = this.matrix; + var p = this.parent; + while(p){ + if(p.matrix){ + m = dojox.gfx.matrix.multiply(p.matrix, m); + } + p = p.parent; + } + return m; // dojox.gfx.Matrix2D + } +}); + +dojox.gfx.shape._eventsProcessing = { + connect: function(name, object, method){ + // summary: connects a handler to an event on this shape + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + return arguments.length > 2 ? // Object + dojo.connect(this.getEventSource(), name, object, method) : + dojo.connect(this.getEventSource(), name, object); + }, + disconnect: function(token){ + // summary: connects a handler by token from an event on this shape + + // COULD BE RE-IMPLEMENTED BY THE RENDERER! + + dojo.disconnect(token); + } +}; + +dojo.extend(dojox.gfx.Shape, dojox.gfx.shape._eventsProcessing); + +dojox.gfx.shape.Container = { + // summary: a container of shapes, which can be used + // as a foundation for renderer-specific groups, or as a way + // to logically group shapes (e.g, to propagate matricies) + + _init: function() { + // children: Array: a list of children + this.children = []; + }, + + // group management + + add: function(shape){ + // summary: adds a shape to the list + // shape: dojox.gfx.Shape: a shape + var oldParent = shape.getParent(); + if(oldParent){ + oldParent.remove(shape, true); + } + this.children.push(shape); + return shape._setParent(this, this._getRealMatrix()); // self + }, + remove: function(shape, silently){ + // summary: removes a shape from the list + // silently: Boolean?: if true, do not redraw a picture yet + for(var i = 0; i < this.children.length; ++i){ + if(this.children[i] == shape){ + if(silently){ + // skip for now + }else{ + shape._setParent(null, null); + } + this.children.splice(i, 1); + break; + } + } + return this; // self + }, + clear: function(){ + // summary: removes all shapes from a group/surface + this.children = []; + return this; // self + }, + + // moving child nodes + + _moveChildToFront: function(shape){ + // summary: moves a shape to front of the list of shapes + for(var i = 0; i < this.children.length; ++i){ + if(this.children[i] == shape){ + this.children.splice(i, 1); + this.children.push(shape); + break; + } + } + return this; // self + }, + _moveChildToBack: function(shape){ + // summary: moves a shape to back of the list of shapes + for(var i = 0; i < this.children.length; ++i){ + if(this.children[i] == shape){ + this.children.splice(i, 1); + this.children.unshift(shape); + break; + } + } + return this; // self + } +}; + +dojo.declare("dojox.gfx.shape.Surface", null, { + // summary: a surface object to be used for drawings + constructor: function(){ + // underlying node + this.rawNode = null; + }, + getEventSource: function(){ + // summary: returns a node, which can be used to attach event listeners + return this.rawNode; // Node + }, + _getRealMatrix: function(){ + // summary: always returns the identity matrix + return null; // dojox.gfx.Matrix2D + } +}); + +dojo.extend(dojox.gfx.shape.Surface, dojox.gfx.shape._eventsProcessing); + +dojo.declare("dojox.gfx.Point", null, { + // summary: a hypothetical 2D point to be used for drawings - {x, y} + // description: This object is defined for documentation purposes. + // You should use the naked object instead: {x: 1, y: 2}. +}); + +dojo.declare("dojox.gfx.Rectangle", null, { + // summary: a hypothetical rectangle - {x, y, width, height} + // description: This object is defined for documentation purposes. + // You should use the naked object instead: {x: 1, y: 2, width: 100, height: 200}. +}); + +dojo.declare("dojox.gfx.shape.Rect", dojox.gfx.Shape, { + // summary: a generic rectangle + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultRect); + this.rawNode = rawNode; + }, + getBoundingBox: function(){ + // summary: returns the bounding box (its shape in this case) + return this.shape; // dojox.gfx.Rectangle + } +}); + +dojo.declare("dojox.gfx.shape.Ellipse", dojox.gfx.Shape, { + // summary: a generic ellipse + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultEllipse); + this.rawNode = rawNode; + }, + getBoundingBox: function(){ + // summary: returns the bounding box + if(!this.bbox){ + var shape = this.shape; + this.bbox = {x: shape.cx - shape.rx, y: shape.cy - shape.ry, + width: 2 * shape.rx, height: 2 * shape.ry}; + } + return this.bbox; // dojox.gfx.Rectangle + } +}); + +dojo.declare("dojox.gfx.shape.Circle", dojox.gfx.Shape, { + // summary: a generic circle + // (this is a helper object, which is defined for convenience) + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultCircle); + this.rawNode = rawNode; + }, + getBoundingBox: function(){ + // summary: returns the bounding box + if(!this.bbox){ + var shape = this.shape; + this.bbox = {x: shape.cx - shape.r, y: shape.cy - shape.r, + width: 2 * shape.r, height: 2 * shape.r}; + } + return this.bbox; // dojox.gfx.Rectangle + } +}); + +dojo.declare("dojox.gfx.shape.Line", dojox.gfx.Shape, { + // summary: a generic line + // (this is a helper object, which is defined for convenience) + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultLine); + this.rawNode = rawNode; + }, + getBoundingBox: function(){ + // summary: returns the bounding box + if(!this.bbox){ + var shape = this.shape; + this.bbox = { + x: Math.min(shape.x1, shape.x2), + y: Math.min(shape.y1, shape.y2), + width: Math.abs(shape.x2 - shape.x1), + height: Math.abs(shape.y2 - shape.y1) + }; + } + return this.bbox; // dojox.gfx.Rectangle + } +}); + +dojo.declare("dojox.gfx.shape.Polyline", dojox.gfx.Shape, { + // summary: a generic polyline/polygon + // (this is a helper object, which is defined for convenience) + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultPolyline); + this.rawNode = rawNode; + }, + setShape: function(points, closed){ + // summary: sets a polyline/polygon shape object + // points: Object: a polyline/polygon shape object + // closed: Boolean: close the polyline to make a polygon + if(points && points instanceof Array){ + // points: Array: an array of points + dojox.gfx.Shape.prototype.setShape.call(this, {points: points}); + if(closed && this.shape.points.length){ + this.shape.points.push(this.shape.points[0]); + } + }else{ + dojox.gfx.Shape.prototype.setShape.call(this, points); + } + return this; // self + }, + getBoundingBox: function(){ + // summary: returns the bounding box + if(!this.bbox && this.shape.points.length){ + var p = this.shape.points; + var l = p.length; + var t = p[0]; + var bbox = {l: t.x, t: t.y, r: t.x, b: t.y}; + for(var i = 1; i < l; ++i){ + t = p[i]; + if(bbox.l > t.x) bbox.l = t.x; + if(bbox.r < t.x) bbox.r = t.x; + if(bbox.t > t.y) bbox.t = t.y; + if(bbox.b < t.y) bbox.b = t.y; + } + this.bbox = { + x: bbox.l, + y: bbox.t, + width: bbox.r - bbox.l, + height: bbox.b - bbox.t + }; + } + return this.bbox; // dojox.gfx.Rectangle + } +}); + +dojo.declare("dojox.gfx.shape.Image", dojox.gfx.Shape, { + // summary: a generic image + // (this is a helper object, which is defined for convenience) + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.shape = dojo.clone(dojox.gfx.defaultImage); + this.rawNode = rawNode; + }, + getBoundingBox: function(){ + // summary: returns the bounding box (its shape in this case) + return this.shape; // dojox.gfx.Rectangle + }, + setStroke: function(){ + // summary: ignore setting a stroke style + return this; // self + }, + setFill: function(){ + // summary: ignore setting a fill style + return this; // self + } +}); + +dojo.declare("dojox.gfx.shape.Text", dojox.gfx.Shape, { + // summary: a generic text + constructor: function(rawNode) { + // rawNode: Node: a DOM Node + this.fontStyle = null; + this.shape = dojo.clone(dojox.gfx.defaultText); + this.rawNode = rawNode; + }, + getFont: function(){ + // summary: returns the current font object or null + return this.fontStyle; // Object + }, + setFont: function(newFont){ + // summary: sets a font for text + // newFont: Object: a font object (see dojox.gfx.defaultFont) or a font string + this.fontStyle = typeof newFont == "string" ? dojox.gfx.splitFontString(newFont) : + dojox.gfx.makeParameters(dojox.gfx.defaultFont, newFont); + this._setFont(); + return this; // self + } +}); + +dojox.gfx.shape.Creator = { + // summary: shape creators + createShape: function(shape){ + // summary: creates a shape object based on its type; it is meant to be used + // by group-like objects + // shape: Object: a shape descriptor object + switch(shape.type){ + case dojox.gfx.defaultPath.type: return this.createPath(shape); + case dojox.gfx.defaultRect.type: return this.createRect(shape); + case dojox.gfx.defaultCircle.type: return this.createCircle(shape); + case dojox.gfx.defaultEllipse.type: return this.createEllipse(shape); + case dojox.gfx.defaultLine.type: return this.createLine(shape); + case dojox.gfx.defaultPolyline.type: return this.createPolyline(shape); + case dojox.gfx.defaultImage.type: return this.createImage(shape); + case dojox.gfx.defaultText.type: return this.createText(shape); + case dojox.gfx.defaultTextPath.type: return this.createTextPath(shape); + } + return null; + }, + createGroup: function(){ + // summary: creates an SVG group shape + return this.createObject(dojox.gfx.Group); // dojox.gfx.Group + }, + createRect: function(rect){ + // summary: creates an SVG rectangle shape + // rect: Object: a path object (see dojox.gfx.defaultRect) + return this.createObject(dojox.gfx.Rect, rect); // dojox.gfx.Rect + }, + createEllipse: function(ellipse){ + // summary: creates an SVG ellipse shape + // ellipse: Object: an ellipse object (see dojox.gfx.defaultEllipse) + return this.createObject(dojox.gfx.Ellipse, ellipse); // dojox.gfx.Ellipse + }, + createCircle: function(circle){ + // summary: creates an SVG circle shape + // circle: Object: a circle object (see dojox.gfx.defaultCircle) + return this.createObject(dojox.gfx.Circle, circle); // dojox.gfx.Circle + }, + createLine: function(line){ + // summary: creates an SVG line shape + // line: Object: a line object (see dojox.gfx.defaultLine) + return this.createObject(dojox.gfx.Line, line); // dojox.gfx.Line + }, + createPolyline: function(points){ + // summary: creates an SVG polyline/polygon shape + // points: Object: a points object (see dojox.gfx.defaultPolyline) + // or an Array of points + return this.createObject(dojox.gfx.Polyline, points); // dojox.gfx.Polyline + }, + createImage: function(image){ + // summary: creates an SVG image shape + // image: Object: an image object (see dojox.gfx.defaultImage) + return this.createObject(dojox.gfx.Image, image); // dojox.gfx.Image + }, + createText: function(text){ + // summary: creates an SVG text shape + // text: Object: a text object (see dojox.gfx.defaultText) + return this.createObject(dojox.gfx.Text, text); // dojox.gfx.Text + }, + createPath: function(path){ + // summary: creates an SVG path shape + // path: Object: a path object (see dojox.gfx.defaultPath) + return this.createObject(dojox.gfx.Path, path); // dojox.gfx.Path + }, + createTextPath: function(text){ + // summary: creates an SVG text shape + // text: Object: a textpath object (see dojox.gfx.defaultTextPath) + return this.createObject(dojox.gfx.TextPath, {}).setText(text); // dojox.gfx.TextPath + }, + createObject: function(shapeType, rawShape){ + // summary: creates an instance of the passed shapeType class + // shapeType: Function: a class constructor to create an instance of + // rawShape: Object: properties to be passed in to the classes "setShape" method + + // SHOULD BE RE-IMPLEMENTED BY THE RENDERER! + + return null; // dojox.gfx.Shape + } +}; + +} diff --git a/includes/js/dojox/gfx/silverlight.js b/includes/js/dojox/gfx/silverlight.js new file mode 100644 index 0000000..7a4becc --- /dev/null +++ b/includes/js/dojox/gfx/silverlight.js @@ -0,0 +1,693 @@ +if(!dojo._hasResource["dojox.gfx.silverlight"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.silverlight"] = true; +dojo.provide("dojox.gfx.silverlight"); + +dojo.require("dojox.gfx._base"); +dojo.require("dojox.gfx.shape"); +dojo.require("dojox.gfx.path"); + +dojo.experimental("dojox.gfx.silverlight"); + +dojox.gfx.silverlight.dasharray = { + solid: "none", + shortdash: [4, 1], + shortdot: [1, 1], + shortdashdot: [4, 1, 1, 1], + shortdashdotdot: [4, 1, 1, 1, 1, 1], + dot: [1, 3], + dash: [4, 3], + longdash: [8, 3], + dashdot: [4, 3, 1, 3], + longdashdot: [8, 3, 1, 3], + longdashdotdot: [8, 3, 1, 3, 1, 3] +}; + +dojox.gfx.silverlight.fontweight = { + normal: 400, + bold: 700 +}; + +dojox.gfx.silverlight.caps = {butt: "Flat", round: "Round", square: "Square"}; +dojox.gfx.silverlight.joins = {bevel: "Bevel", round: "Round"}; + +dojox.gfx.silverlight.fonts = { + serif: "Times New Roman", + times: "Times New Roman", + "sans-serif": "Arial", + helvetica: "Arial", + monotone: "Courier New", + courier: "Courier New" +}; + +dojox.gfx.silverlight.hexColor = function(/*String|Array|dojo.Color*/ color){ + // summary: converts a color object to a Silverlight hex color string (#aarrggbb) + var c = dojox.gfx.normalizeColor(color), + t = c.toHex(), a = Math.round(c.a * 255); + a = (a < 0 ? 0 : a > 255 ? 255 : a).toString(16); + return "#" + (a.length < 2 ? "0" + a : a) + t.slice(1); // String +}; + +dojo.extend(dojox.gfx.Shape, { + // summary: Silverlight-specific implementation of dojox.gfx.Shape methods + + setFill: function(fill){ + // summary: sets a fill object (Silverlight) + // fill: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + + var p = this.rawNode.getHost().content, r = this.rawNode, f; + if(!fill){ + // don't fill + this.fillStyle = null; + this._setFillAttr(null); + return this; // self + } + if(typeof(fill) == "object" && "type" in fill){ + // gradient + switch(fill.type){ + case "linear": + this.fillStyle = f = dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient, fill); + var lgb = p.createFromXaml(""); + lgb.mappingMode = "Absolute"; + lgb.startPoint = f.x1 + "," + f.y1; + lgb.endPoint = f.x2 + "," + f.y2; + dojo.forEach(f.colors, function(c){ + var t = p.createFromXaml(""); + t.offset = c.offset; + t.color = dojox.gfx.silverlight.hexColor(c.color); + lgb.gradientStops.add(t); + }); + this._setFillAttr(lgb); + break; + case "radial": + this.fillStyle = f = dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient, fill); + var rgb = p.createFromXaml(""), w = r.width, h = r.height, + l = this.rawNode["Canvas.Left"], t = this.rawNode["Canvas.Top"]; + rgb.center = (f.cx - l) / w + "," + (f.cy - t) / h; + rgb.radiusX = f.r / w; + rgb.radiusY = f.r / h; + dojo.forEach(f.colors, function(c){ + var t = p.createFromXaml(""); + t.offset = c.offset; + t.color = dojox.gfx.silverlight.hexColor(c.color); + rgb.gradientStops.add(t); + }); + this._setFillAttr(rgb); + break; + case "pattern": + // don't fill: Silverlight doesn't define TileBrush for some reason + this.fillStyle = null; + this._setFillAttr(null); + break; + } + return this; // self + } + // color object + this.fillStyle = f = dojox.gfx.normalizeColor(fill); + var scb = p.createFromXaml(""); + scb.color = f.toHex(); + scb.opacity = f.a; + this._setFillAttr(scb); + return this; // self + }, + _setFillAttr: function(f){ + this.rawNode.fill = f; + }, + + setStroke: function(stroke){ + // summary: sets a stroke object (Silverlight) + // stroke: Object: a stroke object + // (see dojox.gfx.defaultStroke) + + var p = this.rawNode.getHost().content, r = this.rawNode; + if(!stroke){ + // don't stroke + this.strokeStyle = null; + r.stroke = null; + return this; + } + // normalize the stroke + if(typeof stroke == "string"){ + stroke = {color: stroke}; + } + var s = this.strokeStyle = dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke); + s.color = dojox.gfx.normalizeColor(s.color); + // generate attributes + if(s){ + var scb = p.createFromXaml(""); + scb.color = s.color.toHex(); + scb.opacity = s.color.a; + r.stroke = scb; + r.strokeThickness = s.width; + r.strokeStartLineCap = r.strokeEndLineCap = r.strokeDashCap = + dojox.gfx.silverlight.caps[s.cap]; + if(typeof s.join == "number"){ + r.strokeLineJoin = "Miter"; + r.strokeMiterLimit = s.join; + }else{ + r.strokeLineJoin = dojox.gfx.silverlight.joins[s.join]; + } + var da = s.style.toLowerCase(); + if(da in dojox.gfx.silverlight.dasharray){ da = dojox.gfx.silverlight.dasharray[da]; } + if(da instanceof Array){ + da = dojo.clone(da); + /* + for(var i = 0; i < da.length; ++i){ + da[i] *= s.width; + } + */ + if(s.cap != "butt"){ + for(var i = 0; i < da.length; i += 2){ + //da[i] -= s.width; + --da[i] + if(da[i] < 1){ da[i] = 1; } + } + for(var i = 1; i < da.length; i += 2){ + //da[i] += s.width; + ++da[i]; + } + } + r.strokeDashArray = da.join(","); + }else{ + r.strokeDashArray = null; + } + } + return this; // self + }, + + _getParentSurface: function(){ + var surface = this.parent; + for(; surface && !(surface instanceof dojox.gfx.Surface); surface = surface.parent); + return surface; + }, + + _applyTransform: function() { + var tm = this.matrix, r = this.rawNode; + if(tm){ + var p = this.rawNode.getHost().content, + m = p.createFromXaml(""), + mm = p.createFromXaml(""); + mm.m11 = tm.xx; + mm.m21 = tm.xy; + mm.m12 = tm.yx; + mm.m22 = tm.yy; + mm.offsetX = tm.dx; + mm.offsetY = tm.dy; + m.matrix = mm; + r.renderTransform = m; + }else{ + r.renderTransform = null; + } + return this; + }, + + setRawNode: function(rawNode){ + // summary: + // assigns and clears the underlying node that will represent this + // shape. Once set, transforms, gradients, etc, can be applied. + // (no fill & stroke by default) + rawNode.fill = null; + rawNode.stroke = null; + this.rawNode = rawNode; + }, + + // move family + + _moveToFront: function(){ + // summary: moves a shape to front of its parent's list of shapes (Silverlight) + var c = this.parent.rawNode.children, r = this.rawNode; + c.remove(r); + c.add(r); + return this; // self + }, + _moveToBack: function(){ + // summary: moves a shape to back of its parent's list of shapes (Silverlight) + var c = this.parent.rawNode.children, r = this.rawNode; + c.remove(r); + c.insert(0, r); + return this; // self + } +}); + +dojo.declare("dojox.gfx.Group", dojox.gfx.Shape, { + // summary: a group shape (Silverlight), which can be used + // to logically group shapes (e.g, to propagate matricies) + constructor: function(){ + dojox.gfx.silverlight.Container._init.call(this); + }, + setRawNode: function(rawNode){ + // summary: sets a raw Silverlight node to be used by this shape + // rawNode: Node: an Silverlight node + this.rawNode = rawNode; + } +}); +dojox.gfx.Group.nodeType = "Canvas"; + +dojo.declare("dojox.gfx.Rect", dojox.gfx.shape.Rect, { + // summary: a rectangle shape (Silverlight) + setShape: function(newShape){ + // summary: sets a rectangle shape object (Silverlight) + // newShape: Object: a rectangle shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, n = this.shape; + r["Canvas.Left"] = n.x; + r["Canvas.Top"] = n.y; + r.width = n.width; + r.height = n.height; + r.radiusX = r.radiusY = n.r; + return this; // self + } +}); +dojox.gfx.Rect.nodeType = "Rectangle"; + +dojo.declare("dojox.gfx.Ellipse", dojox.gfx.shape.Ellipse, { + // summary: an ellipse shape (Silverlight) + setShape: function(newShape){ + // summary: sets an ellipse shape object (Silverlight) + // newShape: Object: an ellipse shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, n = this.shape; + r["Canvas.Left"] = n.cx - n.rx; + r["Canvas.Top"] = n.cy - n.ry; + r.width = 2 * n.rx; + r.height = 2 * n.ry; + return this; // self + } +}); +dojox.gfx.Ellipse.nodeType = "Ellipse"; + +dojo.declare("dojox.gfx.Circle", dojox.gfx.shape.Circle, { + // summary: a circle shape (Silverlight) + setShape: function(newShape){ + // summary: sets a circle shape object (Silverlight) + // newShape: Object: a circle shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, n = this.shape; + r["Canvas.Left"] = n.cx - n.r; + r["Canvas.Top"] = n.cy - n.r; + r.width = r.height = 2 * n.r; + return this; // self + } +}); +dojox.gfx.Circle.nodeType = "Ellipse"; + +dojo.declare("dojox.gfx.Line", dojox.gfx.shape.Line, { + // summary: a line shape (Silverlight) + setShape: function(newShape){ + // summary: sets a line shape object (Silverlight) + // newShape: Object: a line shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, n = this.shape; + r.x1 = n.x1; r.y1 = n.y1; r.x2 = n.x2; r.y2 = n.y2; + return this; // self + } +}); +dojox.gfx.Line.nodeType = "Line"; + +dojo.declare("dojox.gfx.Polyline", dojox.gfx.shape.Polyline, { + // summary: a polyline/polygon shape (Silverlight) + setShape: function(points, closed){ + // summary: sets a polyline/polygon shape object (Silverlight) + // points: Object: a polyline/polygon shape object + if(points && points instanceof Array){ + // branch + // points: Array: an array of points + this.shape = dojox.gfx.makeParameters(this.shape, {points: points}); + if(closed && this.shape.points.length){ + this.shape.points.push(this.shape.points[0]); + } + }else{ + this.shape = dojox.gfx.makeParameters(this.shape, points); + } + this.box = null; + var p = this.shape.points, rp = []; + for(var i = 0; i < p.length; ++i){ + if(typeof p[i] == "number"){ + rp.push(p[i], p[++i]); + }else{ + rp.push(p[i].x, p[i].y); + } + } + this.rawNode.points = rp.join(","); + return this; // self + } +}); +dojox.gfx.Polyline.nodeType = "Polyline"; + +dojo.declare("dojox.gfx.Image", dojox.gfx.shape.Image, { + // summary: an image (Silverlight) + setShape: function(newShape){ + // summary: sets an image shape object (Silverlight) + // newShape: Object: an image shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, n = this.shape; + r["Canvas.Left"] = n.x; + r["Canvas.Top"] = n.y; + r.width = n.width; + r.height = n.height; + r.source = n.src; + return this; // self + }, + setRawNode: function(rawNode){ + // summary: + // assigns and clears the underlying node that will represent this + // shape. Once set, transforms, gradients, etc, can be applied. + // (no fill & stroke by default) + this.rawNode = rawNode; + } +}); +dojox.gfx.Image.nodeType = "Image"; + +dojo.declare("dojox.gfx.Text", dojox.gfx.shape.Text, { + // summary: an anchored text (Silverlight) + setShape: function(newShape){ + // summary: sets a text shape object (Silverlight) + // newShape: Object: a text shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, s = this.shape; + r.text = s.text; + r.textDecorations = s.decoration == "underline" ? "Underline" : "None"; + r["Canvas.Left"] = -10000; + r["Canvas.Top"] = -10000; + window.setTimeout(dojo.hitch(this, "_delayAlignment"), 0); + return this; // self + }, + _delayAlignment: function(){ + // handle alignment + var r = this.rawNode, s = this.shape, + w = r.actualWidth, h = r.actualHeight, x = s.x, y = s.y - h * 0.75; + switch(s.align){ + case "middle": + x -= w / 2; + break; + case "end": + x -= w; + break; + } + var a = this.matrix ? dojox.gfx.matrix.multiplyPoint(this.matrix, x, y) : {x: x, y: y}; + r["Canvas.Left"] = a.x; + r["Canvas.Top"] = a.y; + }, + setStroke: function(){ + // summary: ignore setting a stroke style + return this; // self + }, + _setFillAttr: function(f){ + this.rawNode.foreground = f; + }, + setRawNode: function(rawNode){ + // summary: + // assigns and clears the underlying node that will represent this + // shape. Once set, transforms, gradients, etc, can be applied. + // (no fill & stroke by default) + this.rawNode = rawNode; + }, + _applyTransform: function() { + var tm = this.matrix, r = this.rawNode; + if(tm){ + // the next line is pure magic :-( + tm = dojox.gfx.matrix.normalize([1/100, tm, 100]); + var p = this.rawNode.getHost().content, + m = p.createFromXaml(""), + mm = p.createFromXaml(""); + mm.m11 = tm.xx; + mm.m21 = tm.xy; + mm.m12 = tm.yx; + mm.m22 = tm.yy; + mm.offsetX = tm.dx; + mm.offsetY = tm.dy; + m.matrix = mm; + r.renderTransform = m; + }else{ + r.renderTransform = null; + } + return this; + }, + getTextWidth: function(){ + // summary: get the text width in pixels + return this.rawNode.actualWidth; + } +}); +dojox.gfx.Text.nodeType = "TextBlock"; + +dojo.declare("dojox.gfx.Path", dojox.gfx.path.Path, { + // summary: a path shape (Silverlight) + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments); + var p = this.shape.path; + if(typeof(p) == "string"){ + this.rawNode.data = p ? p : null; + } + }, + setShape: function(newShape){ + // summary: forms a path using a shape (Silverlight) + // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath) + dojox.gfx.Path.superclass.setShape.apply(this, arguments); + var p = this.shape.path; + this.rawNode.data = p ? p : null; + return this; // self + } +}); +dojox.gfx.Path.nodeType = "Path"; + +dojo.declare("dojox.gfx.TextPath", dojox.gfx.path.TextPath, { + // summary: a textpath shape (Silverlight) + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + }, + setShape: function(newShape){ + // summary: forms a path using a shape (Silverlight) + // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath) + }, + _setText: function(){ + } +}); +dojox.gfx.TextPath.nodeType = "text"; + +dojo.declare("dojox.gfx.Surface", dojox.gfx.shape.Surface, { + // summary: a surface object to be used for drawings (Silverlight) + constructor: function(){ + dojox.gfx.silverlight.Container._init.call(this); + }, + setDimensions: function(width, height){ + // summary: sets the width and height of the rawNode + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + this.width = dojox.gfx.normalizedLength(width); // in pixels + this.height = dojox.gfx.normalizedLength(height); // in pixels + var p = this.rawNode && this.rawNode.getHost(); + if(p){ + p.width = width; + p.height = height; + } + return this; // self + }, + getDimensions: function(){ + // summary: returns an object with properties "width" and "height" + var p = this.rawNode && this.rawNode.getHost(); + var t = p ? {width: p.content.actualWidth, height: p.content.actualHeight} : null; + if(t.width <= 0){ t.width = this.width; } + if(t.height <= 0){ t.height = this.height; } + return t; // Object + } +}); + +dojox.gfx.silverlight.surfaces = {}; + +dojox.gfx.createSurface = function(parentNode, width, height){ + // summary: creates a surface (Silverlight) + // parentNode: Node: a parent node + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + + var s = new dojox.gfx.Surface(); + parentNode = dojo.byId(parentNode); + // create an empty canvas + var t = parentNode.ownerDocument.createElement("script"); + t.type = "text/xaml"; + t.id = dojox.gfx._base._getUniqueId(); + t.text = ""; + document.body.appendChild(t); + // create a plugin + var pluginName = dojox.gfx._base._getUniqueId(); + Silverlight.createObject( + "#" + t.id, // none + parentNode, + pluginName, + { // Plugin properties. + width: String(width), // Width of rectangular region of plugin in pixels. + height: String(height), // Height of rectangular region of plugin in pixels. + inplaceInstallPrompt: "false", // Determines whether to display in-place install prompt if invalid version detected. + //background: "white", // Background color of plugin. + //isWindowless: "false", // Determines whether to display plugin in Windowless mode. + background: "transparent", // Background color of plugin. + isWindowless: "true", // Determines whether to display plugin in Windowless mode. + framerate: "24", // MaxFrameRate property value. + version: "1.0" // Silverlight version. + }, + {}, + null, + null + ); + s.rawNode = dojo.byId(pluginName).content.root; + // register the plugin with its parent node + dojox.gfx.silverlight.surfaces[s.rawNode.name] = parentNode; + s.width = dojox.gfx.normalizedLength(width); // in pixels + s.height = dojox.gfx.normalizedLength(height); // in pixels + return s; // dojox.gfx.Surface +}; + +// Extenders + +dojox.gfx.silverlight.Font = { + _setFont: function(){ + // summary: sets a font object (Silverlight) + var f = this.fontStyle, r = this.rawNode, + fw = dojox.gfx.silverlight.fontweight, + fo = dojox.gfx.silverlight.fonts, t = f.family.toLowerCase(); + r.fontStyle = f.style == "italic" ? "Italic" : "Normal"; + r.fontWeight = f.weight in fw ? fw[f.weight] : f.weight; + r.fontSize = dojox.gfx.normalizedLength(f.size); + r.fontFamily = t in fo ? fo[t] : f.family; + } +}; + +dojox.gfx.silverlight.Container = { + _init: function(){ + dojox.gfx.shape.Container._init.call(this); + }, + add: function(shape){ + // summary: adds a shape to a group/surface + // shape: dojox.gfx.Shape: an VML shape object + if(this != shape.getParent()){ + //dojox.gfx.Group.superclass.add.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.add.apply(this, arguments); + this.rawNode.children.add(shape.rawNode); + } + return this; // self + }, + remove: function(shape, silently){ + // summary: remove a shape from a group/surface + // shape: dojox.gfx.Shape: an VML shape object + // silently: Boolean?: if true, regenerate a picture + if(this == shape.getParent()){ + var parent = shape.rawNode.getParent(); + if(parent){ + parent.children.remove(shape.rawNode); + } + //dojox.gfx.Group.superclass.remove.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.remove.apply(this, arguments); + } + return this; // self + }, + clear: function(){ + // summary: removes all shapes from a group/surface + this.rawNode.children.clear(); + //return this.inherited(arguments); // self + return dojox.gfx.shape.Container.clear.apply(this, arguments); + }, + _moveChildToFront: dojox.gfx.shape.Container._moveChildToFront, + _moveChildToBack: dojox.gfx.shape.Container._moveChildToBack +}; + +dojo.mixin(dojox.gfx.shape.Creator, { + createObject: function(shapeType, rawShape){ + // summary: creates an instance of the passed shapeType class + // shapeType: Function: a class constructor to create an instance of + // rawShape: Object: properties to be passed in to the classes "setShape" method + if(!this.rawNode){ return null; } + var shape = new shapeType(); + var node = this.rawNode.getHost().content.createFromXaml("<" + shapeType.nodeType + "/>"); + shape.setRawNode(node); + shape.setShape(rawShape); + this.add(shape); + return shape; // dojox.gfx.Shape + } +}); + +dojo.extend(dojox.gfx.Text, dojox.gfx.silverlight.Font); +//dojo.extend(dojox.gfx.TextPath, dojox.gfx.silverlight.Font); + +dojo.extend(dojox.gfx.Group, dojox.gfx.silverlight.Container); +dojo.extend(dojox.gfx.Group, dojox.gfx.shape.Creator); + +dojo.extend(dojox.gfx.Surface, dojox.gfx.silverlight.Container); +dojo.extend(dojox.gfx.Surface, dojox.gfx.shape.Creator); + +(function(){ + var surfaces = dojox.gfx.silverlight.surfaces; + var mouseFix = function(s, a){ + var ev = {target: s, currentTarget: s, + preventDefault: function(){}, stopPropagation: function(){}}; + if(a){ + ev.ctrlKey = a.ctrl; + ev.shiftKey = a.shift; + var p = a.getPosition(null); + ev.x = ev.offsetX = ev.layerX = p.x; + ev.y = ev.offsetY = ev.layerY = p.y; + // calculate clientX and clientY + var parent = surfaces[s.getHost().content.root.name]; + var t = dojo._abs(parent); + ev.clientX = t.x + p.x; + ev.clientY = t.y + p.y; + } + return ev; + }; + var keyFix = function(s, a){ + var ev = { + keyCode: a.platformKeyCode, + ctrlKey: a.ctrl, + shiftKey: a.shift + }; + return ev; + }; + var eventNames = { + onclick: {name: "MouseLeftButtonUp", fix: mouseFix}, + onmouseenter: {name: "MouseEnter", fix: mouseFix}, + onmouseleave: {name: "MouseLeave", fix: mouseFix}, + onmousedown: {name: "MouseLeftButtonDown", fix: mouseFix}, + onmouseup: {name: "MouseLeftButtonUp", fix: mouseFix}, + onmousemove: {name: "MouseMove", fix: mouseFix}, + onkeydown: {name: "KeyDown", fix: keyFix}, + onkeyup: {name: "KeyUp", fix: keyFix} + }; + var eventsProcessing = { + connect: function(name, object, method){ + var token, n = name in eventNames ? eventNames[name] : + {name: name, fix: function(){ return {}; }}; + if(arguments.length > 2){ + token = this.getEventSource().addEventListener(n.name, + function(s, a){ dojo.hitch(object, method)(n.fix(s, a)); }); + }else{ + token = this.getEventSource().addEventListener(n.name, + function(s, a){ object(n.fix(s, a)); }); + } + return {name: n.name, token: token}; + }, + disconnect: function(token){ + this.getEventSource().removeEventListener(token.name, token.token); + } + }; + dojo.extend(dojox.gfx.Shape, eventsProcessing); + dojo.extend(dojox.gfx.Surface, eventsProcessing); + dojox.gfx.equalSources = function(a, b){ + return a && b && a.equals(b); + } + +})(); + +} diff --git a/includes/js/dojox/gfx/silverlight_attach.js b/includes/js/dojox/gfx/silverlight_attach.js new file mode 100644 index 0000000..1f5cd90 --- /dev/null +++ b/includes/js/dojox/gfx/silverlight_attach.js @@ -0,0 +1,87 @@ +dojo.require("dojox.gfx.silverlight"); + +dojo.experimental("dojox.gfx.silverlight_attach"); + +(function(){ + dojox.gfx.attachNode = function(node){ + // summary: creates a shape from a Node + // node: Node: an Silverlight node + return null; // for now + if(!node) return null; + var s = null; + switch(node.tagName.toLowerCase()){ + case dojox.gfx.Rect.nodeType: + s = new dojox.gfx.Rect(node); + break; + case dojox.gfx.Ellipse.nodeType: + if(node.width == node.height){ + s = new dojox.gfx.Circle(node); + }else{ + s = new dojox.gfx.Ellipse(node); + } + break; + case dojox.gfx.Polyline.nodeType: + s = new dojox.gfx.Polyline(node); + break; + case dojox.gfx.Path.nodeType: + s = new dojox.gfx.Path(node); + break; + case dojox.gfx.Line.nodeType: + s = new dojox.gfx.Line(node); + break; + case dojox.gfx.Image.nodeType: + s = new dojox.gfx.Image(node); + break; + case dojox.gfx.Text.nodeType: + s = new dojox.gfx.Text(node); + attachFont(s); + break; + default: + //console.debug("FATAL ERROR! tagName = " + node.tagName); + return null; + } + attachShape(s); + if(!(s instanceof dojox.gfx.Image)){ + attachFill(s); + attachStroke(s); + } + attachTransform(s); + return s; // dojox.gfx.Shape + }; + + dojox.gfx.attachSurface = function(node){ + // summary: creates a surface from a Node + // node: Node: an Silverlight node + return null; // dojox.gfx.Surface + }; + + var attachFill = function(rawNode){ + // summary: deduces a fill style from a Node. + // rawNode: Node: an Silverlight node + return null; // Object + }; + + var attachStroke = function(rawNode){ + // summary: deduces a stroke style from a Node. + // rawNode: Node: an SVG node + return null; // Object + }; + + var attachTransform = function(rawNode){ + // summary: deduces a transformation matrix from a Node. + // rawNode: Node: an Silverlight node + return null; // dojox.gfx.matrix.Matrix + }; + + var attachFont = function(rawNode){ + // summary: deduces a font style from a Node. + // rawNode: Node: an Silverlight node + return null; // Object + }; + + var attachShape = function(rawNode){ + // summary: builds a shape from a Node. + // rawNode: Node: an Silverlight node + return null; // dojox.gfx.Shape + }; +})(); diff --git a/includes/js/dojox/gfx/svg.js b/includes/js/dojox/gfx/svg.js new file mode 100644 index 0000000..5f6101c --- /dev/null +++ b/includes/js/dojox/gfx/svg.js @@ -0,0 +1,638 @@ +if(!dojo._hasResource["dojox.gfx.svg"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.svg"] = true; +dojo.provide("dojox.gfx.svg"); + +dojo.require("dojox.gfx._base"); +dojo.require("dojox.gfx.shape"); +dojo.require("dojox.gfx.path"); + +dojox.gfx.svg.xmlns = { + xlink: "http://www.w3.org/1999/xlink", + svg: "http://www.w3.org/2000/svg" +}; + +dojox.gfx.svg.getRef = function(name){ + // summary: returns a DOM Node specified by the name argument or null + // name: String: an SVG external reference + if(!name || name == "none") return null; + if(name.match(/^url\(#.+\)$/)){ + return dojo.byId(name.slice(5, -1)); // Node + } + // alternative representation of a reference + if(name.match(/^#dojoUnique\d+$/)){ + // we assume here that a reference was generated by dojox.gfx + return dojo.byId(name.slice(1)); // Node + } + return null; // Node +}; + +dojox.gfx.svg.dasharray = { + solid: "none", + shortdash: [4, 1], + shortdot: [1, 1], + shortdashdot: [4, 1, 1, 1], + shortdashdotdot: [4, 1, 1, 1, 1, 1], + dot: [1, 3], + dash: [4, 3], + longdash: [8, 3], + dashdot: [4, 3, 1, 3], + longdashdot: [8, 3, 1, 3], + longdashdotdot: [8, 3, 1, 3, 1, 3] +}; + +dojo.extend(dojox.gfx.Shape, { + // summary: SVG-specific implementation of dojox.gfx.Shape methods + + setFill: function(fill){ + // summary: sets a fill object (SVG) + // fill: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + + if(!fill){ + // don't fill + this.fillStyle = null; + this.rawNode.setAttribute("fill", "none"); + this.rawNode.setAttribute("fill-opacity", 0); + return this; + } + var f; + // FIXME: slightly magical. We're using the outer scope's "f", but setting it later + var setter = function(x){ + // we assume that we're executing in the scope of the node to mutate + this.setAttribute(x, f[x].toFixed(8)); + }; + if(typeof(fill) == "object" && "type" in fill){ + // gradient + switch(fill.type){ + case "linear": + f = dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient, fill); + var gradient = this._setFillObject(f, "linearGradient"); + dojo.forEach(["x1", "y1", "x2", "y2"], setter, gradient); + break; + case "radial": + f = dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient, fill); + var gradient = this._setFillObject(f, "radialGradient"); + dojo.forEach(["cx", "cy", "r"], setter, gradient); + break; + case "pattern": + f = dojox.gfx.makeParameters(dojox.gfx.defaultPattern, fill); + var pattern = this._setFillObject(f, "pattern"); + dojo.forEach(["x", "y", "width", "height"], setter, pattern); + break; + } + this.fillStyle = f; + return this; + } + // color object + var f = dojox.gfx.normalizeColor(fill); + this.fillStyle = f; + this.rawNode.setAttribute("fill", f.toCss()); + this.rawNode.setAttribute("fill-opacity", f.a); + this.rawNode.setAttribute("fill-rule", "evenodd"); + return this; // self + }, + + setStroke: function(stroke){ + // summary: sets a stroke object (SVG) + // stroke: Object: a stroke object + // (see dojox.gfx.defaultStroke) + + if(!stroke){ + // don't stroke + this.strokeStyle = null; + this.rawNode.setAttribute("stroke", "none"); + this.rawNode.setAttribute("stroke-opacity", 0); + return this; + } + // normalize the stroke + if(typeof stroke == "string"){ + stroke = {color: stroke}; + } + var s = this.strokeStyle = dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke); + s.color = dojox.gfx.normalizeColor(s.color); + // generate attributes + var rn = this.rawNode; + if(s){ + rn.setAttribute("stroke", s.color.toCss()); + rn.setAttribute("stroke-opacity", s.color.a); + rn.setAttribute("stroke-width", s.width); + rn.setAttribute("stroke-linecap", s.cap); + if(typeof s.join == "number"){ + rn.setAttribute("stroke-linejoin", "miter"); + rn.setAttribute("stroke-miterlimit", s.join); + }else{ + rn.setAttribute("stroke-linejoin", s.join); + } + var da = s.style.toLowerCase(); + if(da in dojox.gfx.svg.dasharray){ da = dojox.gfx.svg.dasharray[da]; } + if(da instanceof Array){ + da = dojo.clone(da); + for(var i = 0; i < da.length; ++i){ + da[i] *= s.width; + } + if(s.cap != "butt"){ + for(var i = 0; i < da.length; i += 2){ + da[i] -= s.width; + if(da[i] < 1){ da[i] = 1; } + } + for(var i = 1; i < da.length; i += 2){ + da[i] += s.width; + } + } + da = da.join(","); + } + rn.setAttribute("stroke-dasharray", da); + rn.setAttribute("dojoGfxStrokeStyle", s.style); + } + return this; // self + }, + + _getParentSurface: function(){ + var surface = this.parent; + for(; surface && !(surface instanceof dojox.gfx.Surface); surface = surface.parent); + return surface; + }, + + _setFillObject: function(f, nodeType){ + var svgns = dojox.gfx.svg.xmlns.svg; + this.fillStyle = f; + var surface = this._getParentSurface(), + defs = surface.defNode, + fill = this.rawNode.getAttribute("fill"), + ref = dojox.gfx.svg.getRef(fill); + if(ref){ + fill = ref; + if(fill.tagName.toLowerCase() != nodeType.toLowerCase()){ + var id = fill.id; + fill.parentNode.removeChild(fill); + fill = document.createElementNS(svgns, nodeType); + fill.setAttribute("id", id); + defs.appendChild(fill); + }else{ + while(fill.childNodes.length){ + fill.removeChild(fill.lastChild); + } + } + }else{ + fill = document.createElementNS(svgns, nodeType); + fill.setAttribute("id", dojox.gfx._base._getUniqueId()); + defs.appendChild(fill); + } + if(nodeType == "pattern"){ + if(dojo.isSafari){ + fill.setAttributeNS(null, "patternUnits", "userSpaceOnUse"); + }else{ + fill.setAttribute("patternUnits", "userSpaceOnUse"); + } + var img = document.createElementNS(svgns, "image"); + img.setAttribute("x", 0); + img.setAttribute("y", 0); + img.setAttribute("width", f.width .toFixed(8)); + img.setAttribute("height", f.height.toFixed(8)); + img.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", f.src); + fill.appendChild(img); + }else{ + if(dojo.isSafari){ + fill.setAttributeNS(null, "gradientUnits", "userSpaceOnUse"); + }else{ + fill.setAttribute("gradientUnits", "userSpaceOnUse"); + } + for(var i = 0; i < f.colors.length; ++i){ + var c = f.colors[i], t = document.createElementNS(svgns, "stop"), + cc = c.color = dojox.gfx.normalizeColor(c.color); + t.setAttribute("offset", c.offset.toFixed(8)); + t.setAttribute("stop-color", cc.toCss()); + t.setAttribute("stop-opacity", cc.a); + fill.appendChild(t); + } + } + this.rawNode.setAttribute("fill", "url(#" + fill.getAttribute("id") +")"); + this.rawNode.removeAttribute("fill-opacity"); + this.rawNode.setAttribute("fill-rule", "evenodd"); + return fill; + }, + + _applyTransform: function() { + var matrix = this.matrix; + if(matrix){ + var tm = this.matrix; + this.rawNode.setAttribute("transform", "matrix(" + + tm.xx.toFixed(8) + "," + tm.yx.toFixed(8) + "," + + tm.xy.toFixed(8) + "," + tm.yy.toFixed(8) + "," + + tm.dx.toFixed(8) + "," + tm.dy.toFixed(8) + ")"); + }else{ + this.rawNode.removeAttribute("transform"); + } + return this; + }, + + setRawNode: function(rawNode){ + // summary: + // assigns and clears the underlying node that will represent this + // shape. Once set, transforms, gradients, etc, can be applied. + // (no fill & stroke by default) + var r = this.rawNode = rawNode; + r.setAttribute("fill", "none"); + r.setAttribute("fill-opacity", 0); + r.setAttribute("stroke", "none"); + r.setAttribute("stroke-opacity", 0); + r.setAttribute("stroke-width", 1); + r.setAttribute("stroke-linecap", "butt"); + r.setAttribute("stroke-linejoin", "miter"); + r.setAttribute("stroke-miterlimit", 4); + }, + + setShape: function(newShape){ + // summary: sets a shape object (SVG) + // newShape: Object: a shape object + // (see dojox.gfx.defaultPath, + // dojox.gfx.defaultPolyline, + // dojox.gfx.defaultRect, + // dojox.gfx.defaultEllipse, + // dojox.gfx.defaultCircle, + // dojox.gfx.defaultLine, + // or dojox.gfx.defaultImage) + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + for(var i in this.shape){ + if(i != "type"){ this.rawNode.setAttribute(i, this.shape[i]); } + } + return this; // self + }, + + // move family + + _moveToFront: function(){ + // summary: moves a shape to front of its parent's list of shapes (SVG) + this.rawNode.parentNode.appendChild(this.rawNode); + return this; // self + }, + _moveToBack: function(){ + // summary: moves a shape to back of its parent's list of shapes (SVG) + this.rawNode.parentNode.insertBefore(this.rawNode, this.rawNode.parentNode.firstChild); + return this; // self + } +}); + +dojo.declare("dojox.gfx.Group", dojox.gfx.Shape, { + // summary: a group shape (SVG), which can be used + // to logically group shapes (e.g, to propagate matricies) + constructor: function(){ + dojox.gfx.svg.Container._init.call(this); + }, + setRawNode: function(rawNode){ + // summary: sets a raw SVG node to be used by this shape + // rawNode: Node: an SVG node + this.rawNode = rawNode; + } +}); +dojox.gfx.Group.nodeType = "g"; + +dojo.declare("dojox.gfx.Rect", dojox.gfx.shape.Rect, { + // summary: a rectangle shape (SVG) + setShape: function(newShape){ + // summary: sets a rectangle shape object (SVG) + // newShape: Object: a rectangle shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + for(var i in this.shape){ + if(i != "type" && i != "r"){ this.rawNode.setAttribute(i, this.shape[i]); } + } + if(this.shape.r){ + this.rawNode.setAttribute("ry", this.shape.r); + this.rawNode.setAttribute("rx", this.shape.r); + } + return this; // self + } +}); +dojox.gfx.Rect.nodeType = "rect"; + +dojox.gfx.Ellipse = dojox.gfx.shape.Ellipse; +dojox.gfx.Ellipse.nodeType = "ellipse"; + +dojox.gfx.Circle = dojox.gfx.shape.Circle; +dojox.gfx.Circle.nodeType = "circle"; + +dojox.gfx.Line = dojox.gfx.shape.Line; +dojox.gfx.Line.nodeType = "line"; + +dojo.declare("dojox.gfx.Polyline", dojox.gfx.shape.Polyline, { + // summary: a polyline/polygon shape (SVG) + setShape: function(points, closed){ + // summary: sets a polyline/polygon shape object (SVG) + // points: Object: a polyline/polygon shape object + if(points && points instanceof Array){ + // branch + // points: Array: an array of points + this.shape = dojox.gfx.makeParameters(this.shape, { points: points }); + if(closed && this.shape.points.length){ + this.shape.points.push(this.shape.points[0]); + } + }else{ + this.shape = dojox.gfx.makeParameters(this.shape, points); + } + this.box = null; + var attr = [], p = this.shape.points; + for(var i = 0; i < p.length; ++i){ + if(typeof p[i] == "number"){ + attr.push(p[i].toFixed(8)); + }else{ + attr.push(p[i].x.toFixed(8)); + attr.push(p[i].y.toFixed(8)); + } + } + this.rawNode.setAttribute("points", attr.join(" ")); + return this; // self + } +}); +dojox.gfx.Polyline.nodeType = "polyline"; + +dojo.declare("dojox.gfx.Image", dojox.gfx.shape.Image, { + // summary: an image (SVG) + setShape: function(newShape){ + // summary: sets an image shape object (SVG) + // newShape: Object: an image shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var rawNode = this.rawNode; + for(var i in this.shape){ + if(i != "type" && i != "src"){ rawNode.setAttribute(i, this.shape[i]); } + } + rawNode.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", this.shape.src); + return this; // self + } +}); +dojox.gfx.Image.nodeType = "image"; + +dojo.declare("dojox.gfx.Text", dojox.gfx.shape.Text, { + // summary: an anchored text (SVG) + setShape: function(newShape){ + // summary: sets a text shape object (SVG) + // newShape: Object: a text shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, s = this.shape; + r.setAttribute("x", s.x); + r.setAttribute("y", s.y); + r.setAttribute("text-anchor", s.align); + r.setAttribute("text-decoration", s.decoration); + r.setAttribute("rotate", s.rotated ? 90 : 0); + r.setAttribute("kerning", s.kerning ? "auto" : 0); + r.setAttribute("text-rendering", "optimizeLegibility"); + r.textContent = s.text; + return this; // self + }, + getTextWidth: function(){ + // summary: get the text width in pixels + var rawNode = this.rawNode, + oldParent = rawNode.parentNode, + _measurementNode = rawNode.cloneNode(true); + _measurementNode.style.visibility = "hidden"; + + // solution to the "orphan issue" in FF + var _width = 0, _text = _measurementNode.firstChild.nodeValue; + oldParent.appendChild(_measurementNode); + + // solution to the "orphan issue" in Opera + // (nodeValue == "" hangs firefox) + if(_text!=""){ + while(!_width){ + _width = parseInt(_measurementNode.getBBox().width); + } + } + oldParent.removeChild(_measurementNode); + return _width; + } +}); +dojox.gfx.Text.nodeType = "text"; + +dojo.declare("dojox.gfx.Path", dojox.gfx.path.Path, { + // summary: a path shape (SVG) + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments); + if(typeof(this.shape.path) == "string"){ + this.rawNode.setAttribute("d", this.shape.path); + } + }, + setShape: function(newShape){ + // summary: forms a path using a shape (SVG) + // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath) + dojox.gfx.Path.superclass.setShape.apply(this, arguments); + this.rawNode.setAttribute("d", this.shape.path); + return this; // self + } +}); +dojox.gfx.Path.nodeType = "path"; + +dojo.declare("dojox.gfx.TextPath", dojox.gfx.path.TextPath, { + // summary: a textpath shape (SVG) + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments); + this._setTextPath(); + }, + setShape: function(newShape){ + // summary: forms a path using a shape (SVG) + // newShape: Object: an SVG path string or a path object (see dojox.gfx.defaultPath) + dojox.gfx.Path.superclass.setShape.apply(this, arguments); + this._setTextPath(); + return this; // self + }, + _setTextPath: function(){ + if(typeof this.shape.path != "string"){ return; } + var r = this.rawNode; + if(!r.firstChild){ + var tp = document.createElementNS(dojox.gfx.svg.xmlns.svg, "textPath"), + tx = document.createTextNode(""); + tp.appendChild(tx); + r.appendChild(tp); + } + var ref = r.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink, "href"), + path = ref && dojox.gfx.svg.getRef(ref); + if(!path){ + var surface = this._getParentSurface(); + if(surface){ + var defs = surface.defNode; + path = document.createElementNS(dojox.gfx.svg.xmlns.svg, "path"); + var id = dojox.gfx._base._getUniqueId(); + path.setAttribute("id", id); + defs.appendChild(path); + r.firstChild.setAttributeNS(dojox.gfx.svg.xmlns.xlink, "href", "#" + id); + } + } + if(path){ + path.setAttribute("d", this.shape.path); + } + }, + _setText: function(){ + var r = this.rawNode; + if(!r.firstChild){ + var tp = document.createElementNS(dojox.gfx.svg.xmlns.svg, "textPath"), + tx = document.createTextNode(""); + tp.appendChild(tx); + r.appendChild(tp); + } + r = r.firstChild; + var t = this.text; + r.setAttribute("alignment-baseline", "middle"); + switch(t.align){ + case "middle": + r.setAttribute("text-anchor", "middle"); + r.setAttribute("startOffset", "50%"); + break; + case "end": + r.setAttribute("text-anchor", "end"); + r.setAttribute("startOffset", "100%"); + break; + default: + r.setAttribute("text-anchor", "start"); + r.setAttribute("startOffset", "0%"); + break; + } + //r.parentNode.setAttribute("alignment-baseline", "central"); + //r.setAttribute("dominant-baseline", "central"); + r.setAttribute("baseline-shift", "0.5ex"); + r.setAttribute("text-decoration", t.decoration); + r.setAttribute("rotate", t.rotated ? 90 : 0); + r.setAttribute("kerning", t.kerning ? "auto" : 0); + r.firstChild.data = t.text; + } +}); +dojox.gfx.TextPath.nodeType = "text"; + +dojo.declare("dojox.gfx.Surface", dojox.gfx.shape.Surface, { + // summary: a surface object to be used for drawings (SVG) + constructor: function(){ + dojox.gfx.svg.Container._init.call(this); + }, + setDimensions: function(width, height){ + // summary: sets the width and height of the rawNode + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + if(!this.rawNode){ return this; } + this.rawNode.setAttribute("width", width); + this.rawNode.setAttribute("height", height); + return this; // self + }, + getDimensions: function(){ + // summary: returns an object with properties "width" and "height" + return this.rawNode ? {width: this.rawNode.getAttribute("width"), height: this.rawNode.getAttribute("height")} : null; // Object + } +}); + +dojox.gfx.createSurface = function(parentNode, width, height){ + // summary: creates a surface (SVG) + // parentNode: Node: a parent node + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + + var s = new dojox.gfx.Surface(); + s.rawNode = document.createElementNS(dojox.gfx.svg.xmlns.svg, "svg"); + s.rawNode.setAttribute("width", width); + s.rawNode.setAttribute("height", height); + + var node = document.createElementNS(dojox.gfx.svg.xmlns.svg, "defs"); + s.rawNode.appendChild(node); + s.defNode = node; + + dojo.byId(parentNode).appendChild(s.rawNode); + return s; // dojox.gfx.Surface +}; + +// Extenders + +dojox.gfx.svg.Font = { + _setFont: function(){ + // summary: sets a font object (SVG) + var f = this.fontStyle; + // next line doesn't work in Firefox 2 or Opera 9 + //this.rawNode.setAttribute("font", dojox.gfx.makeFontString(this.fontStyle)); + this.rawNode.setAttribute("font-style", f.style); + this.rawNode.setAttribute("font-variant", f.variant); + this.rawNode.setAttribute("font-weight", f.weight); + this.rawNode.setAttribute("font-size", f.size); + this.rawNode.setAttribute("font-family", f.family); + } +}; + +dojox.gfx.svg.Container = { + _init: function(){ + dojox.gfx.shape.Container._init.call(this); + }, + add: function(shape){ + // summary: adds a shape to a group/surface + // shape: dojox.gfx.Shape: an VML shape object + if(this != shape.getParent()){ + this.rawNode.appendChild(shape.rawNode); + //dojox.gfx.Group.superclass.add.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.add.apply(this, arguments); + } + return this; // self + }, + remove: function(shape, silently){ + // summary: remove a shape from a group/surface + // shape: dojox.gfx.Shape: an VML shape object + // silently: Boolean?: if true, regenerate a picture + if(this == shape.getParent()){ + if(this.rawNode == shape.rawNode.parentNode){ + this.rawNode.removeChild(shape.rawNode); + } + //dojox.gfx.Group.superclass.remove.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.remove.apply(this, arguments); + } + return this; // self + }, + clear: function(){ + // summary: removes all shapes from a group/surface + var r = this.rawNode; + while(r.lastChild){ + r.removeChild(r.lastChild); + } + var d = this.defNode; + if(d){ + while(d.lastChild){ + d.removeChild(d.lastChild); + } + r.appendChild(d); + } + //return this.inherited(arguments); // self + return dojox.gfx.shape.Container.clear.apply(this, arguments); + }, + _moveChildToFront: dojox.gfx.shape.Container._moveChildToFront, + _moveChildToBack: dojox.gfx.shape.Container._moveChildToBack +}; + +dojo.mixin(dojox.gfx.shape.Creator, { + // summary: SVG shape creators + createObject: function(shapeType, rawShape){ + // summary: creates an instance of the passed shapeType class + // shapeType: Function: a class constructor to create an instance of + // rawShape: Object: properties to be passed in to the classes "setShape" method + if(!this.rawNode){ return null; } + var shape = new shapeType(), + node = document.createElementNS(dojox.gfx.svg.xmlns.svg, shapeType.nodeType); + shape.setRawNode(node); + this.rawNode.appendChild(node); + shape.setShape(rawShape); + this.add(shape); + return shape; // dojox.gfx.Shape + } +}); + +dojo.extend(dojox.gfx.Text, dojox.gfx.svg.Font); +dojo.extend(dojox.gfx.TextPath, dojox.gfx.svg.Font); + +dojo.extend(dojox.gfx.Group, dojox.gfx.svg.Container); +dojo.extend(dojox.gfx.Group, dojox.gfx.shape.Creator); + +dojo.extend(dojox.gfx.Surface, dojox.gfx.svg.Container); +dojo.extend(dojox.gfx.Surface, dojox.gfx.shape.Creator); + +} diff --git a/includes/js/dojox/gfx/svg_attach.js b/includes/js/dojox/gfx/svg_attach.js new file mode 100644 index 0000000..7ec9ed8 --- /dev/null +++ b/includes/js/dojox/gfx/svg_attach.js @@ -0,0 +1,224 @@ +dojo.require("dojox.gfx.svg"); + +dojo.experimental("dojox.gfx.svg_attach"); + +(function(){ + dojox.gfx.attachNode = function(node){ + // summary: creates a shape from a Node + // node: Node: an SVG node + if(!node) return null; + var s = null; + switch(node.tagName.toLowerCase()){ + case dojox.gfx.Rect.nodeType: + s = new dojox.gfx.Rect(node); + attachRect(s); + break; + case dojox.gfx.Ellipse.nodeType: + s = new dojox.gfx.Ellipse(node); + attachShape(s, dojox.gfx.defaultEllipse); + break; + case dojox.gfx.Polyline.nodeType: + s = new dojox.gfx.Polyline(node); + attachShape(s, dojox.gfx.defaultPolyline); + break; + case dojox.gfx.Path.nodeType: + s = new dojox.gfx.Path(node); + attachShape(s, dojox.gfx.defaultPath); + break; + case dojox.gfx.Circle.nodeType: + s = new dojox.gfx.Circle(node); + attachShape(s, dojox.gfx.defaultCircle); + break; + case dojox.gfx.Line.nodeType: + s = new dojox.gfx.Line(node); + attachShape(s, dojox.gfx.defaultLine); + break; + case dojox.gfx.Image.nodeType: + s = new dojox.gfx.Image(node); + attachShape(s, dojox.gfx.defaultImage); + break; + case dojox.gfx.Text.nodeType: + var t = node.getElementsByTagName("textPath"); + if(t && t.length){ + s = new dojox.gfx.TextPath(node); + attachShape(s, dojox.gfx.defaultPath); + attachTextPath(s); + }else{ + s = new dojox.gfx.Text(node); + attachText(s); + } + attachFont(s); + break; + default: + //console.debug("FATAL ERROR! tagName = " + node.tagName); + return null; + } + if(!(s instanceof dojox.gfx.Image)){ + attachFill(s); + attachStroke(s); + } + attachTransform(s); + return s; // dojox.gfx.Shape + }; + + dojox.gfx.attachSurface = function(node){ + // summary: creates a surface from a Node + // node: Node: an SVG node + var s = new dojox.gfx.Surface(); + s.rawNode = node; + var def_elems = node.getElementsByTagName("defs"); + if(def_elems.length == 0){ + return null; // dojox.gfx.Surface + } + s.defNode = def_elems[0]; + return s; // dojox.gfx.Surface + }; + + var attachFill = function(object){ + // summary: deduces a fill style from a node. + // object: dojox.gfx.Shape: an SVG shape + var fill = object.rawNode.getAttribute("fill"); + if(fill == "none"){ + object.fillStyle = null; + return; + } + var fillStyle = null, gradient = dojox.gfx.svg.getRef(fill); + if(ref){ + switch(gradient.tagName.toLowerCase()){ + case "lineargradient": + fillStyle = _getGradient(dojox.gfx.defaultLinearGradient, gradient); + dojo.forEach(["x1", "y1", "x2", "y2"], function(x){ + fillStyle[x] = gradient.getAttribute(x); + }); + break; + case "radialgradient": + fillStyle = _getGradient(dojox.gfx.defaultRadialGradient, gradient); + dojo.forEach(["cx", "cy", "r"], function(x){ + fillStyle[x] = gradient.getAttribute(x); + }); + fillStyle.cx = gradient.getAttribute("cx"); + fillStyle.cy = gradient.getAttribute("cy"); + fillStyle.r = gradient.getAttribute("r"); + break; + case "pattern": + fillStyle = dojo.lang.shallowCopy(dojox.gfx.defaultPattern, true); + dojo.forEach(["x", "y", "width", "height"], function(x){ + fillStyle[x] = gradient.getAttribute(x); + }); + fillStyle.src = gradient.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink, "href"); + break; + } + }else{ + fillStyle = new dojo.Color(fill); + var opacity = rawNode.getAttribute("fill-opacity"); + if(opacity != null){ fillStyle.a = opacity; } + } + object.fillStyle = fillStyle; + }; + + var _getGradient = function(defaultGradient, gradient){ + var fillStyle = dojo.clone(defaultGradient); + fillStyle.colors = []; + for(var i = 0; i < gradient.childNodes.length; ++i){ + fillStyle.colors.push({ + offset: gradient.childNodes[i].getAttribute("offset"), + color: new dojo.Color(gradient.childNodes[i].getAttribute("stop-color")) + }); + } + return fillStyle; + }; + + var attachStroke = function(object){ + // summary: deduces a stroke style from a node. + // object: dojox.gfx.Shape: an SVG shape + var rawNode = object.rawNode, stroke = rawNode.getAttribute("stroke"); + if(stroke == null || stroke == "none"){ + object.strokeStyle = null; + return; + } + var strokeStyle = object.strokeStyle = dojo.clone(dojox.gfx.defaultStroke); + var color = new dojo.Color(stroke); + if(color){ + strokeStyle.color = color; + strokeStyle.color.a = rawNode.getAttribute("stroke-opacity"); + strokeStyle.width = rawNode.getAttribute("stroke-width"); + strokeStyle.cap = rawNode.getAttribute("stroke-linecap"); + strokeStyle.join = rawNode.getAttribute("stroke-linejoin"); + if(strokeStyle.join == "miter"){ + strokeStyle.join = rawNode.getAttribute("stroke-miterlimit"); + } + strokeStyle.style = rawNode.getAttribute("dojoGfxStrokeStyle"); + } + }; + + var attachTransform = function(object){ + // summary: deduces a transformation matrix from a node. + // object: dojox.gfx.Shape: an SVG shape + var matrix = object.rawNode.getAttribute("transform"); + if(matrix.match(/^matrix\(.+\)$/)){ + var t = matrix.slice(7, -1).split(","); + object.matrix = dojox.gfx.matrix.normalize({ + xx: parseFloat(t[0]), xy: parseFloat(t[2]), + yx: parseFloat(t[1]), yy: parseFloat(t[3]), + dx: parseFloat(t[4]), dy: parseFloat(t[5]) + }); + }else{ + object.matrix = null; + } + }; + + var attachFont = function(object){ + // summary: deduces a font style from a Node. + // object: dojox.gfx.Shape: an SVG shape + var fontStyle = object.fontStyle = dojo.clone(dojox.gfx.defaultFont), + r = object.rawNode; + fontStyle.style = r.getAttribute("font-style"); + fontStyle.variant = r.getAttribute("font-variant"); + fontStyle.weight = r.getAttribute("font-weight"); + fontStyle.size = r.getAttribute("font-size"); + fontStyle.family = r.getAttribute("font-family"); + }; + + var attachShape = function(object, def){ + // summary: builds a shape from a node. + // object: dojox.gfx.Shape: an SVG shape + // def: Object: a default shape template + var shape = object.shape = dojo.clone(def), r = object.rawNode; + for(var i in shape) { + shape[i] = r.getAttribute(i); + } + }; + + var attachRect = function(object){ + // summary: builds a rectangle shape from a node. + // object: dojox.gfx.Shape: an SVG shape + attachShape(object, dojox.gfx.defaultRect); + object.shape.r = Math.min(object.rawNode.getAttribute("rx"), object.rawNode.getAttribute("ry")); + }; + + var attachText = function(object){ + // summary: builds a text shape from a node. + // object: dojox.gfx.Shape: an SVG shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultText), + r = object.rawNode; + shape.x = r.getAttribute("x"); + shape.y = r.getAttribute("y"); + shape.align = r.getAttribute("text-anchor"); + shape.decoration = r.getAttribute("text-decoration"); + shape.rotated = parseFloat(r.getAttribute("rotate")) != 0; + shape.kerning = r.getAttribute("kerning") == "auto"; + shape.text = r.firstChild.nodeValue; + }; + + var attachTextPath = function(object){ + // summary: builds a textpath shape from a node. + // object: dojox.gfx.Shape: an SVG shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultTextPath), + r = object.rawNode; + shape.align = r.getAttribute("text-anchor"); + shape.decoration = r.getAttribute("text-decoration"); + shape.rotated = parseFloat(r.getAttribute("rotate")) != 0; + shape.kerning = r.getAttribute("kerning") == "auto"; + shape.text = r.firstChild.nodeValue; + }; +})(); diff --git a/includes/js/dojox/gfx/tests/decompose.js b/includes/js/dojox/gfx/tests/decompose.js new file mode 100644 index 0000000..b488bdd --- /dev/null +++ b/includes/js/dojox/gfx/tests/decompose.js @@ -0,0 +1,114 @@ +if(!dojo._hasResource["dojox.gfx.tests.decompose"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.tests.decompose"] = true; +dojo.provide("dojox.gfx.tests.decompose"); +dojo.require("dojox.gfx.decompose"); + +(function(){ + var m = dojox.gfx.matrix; + var eq = function(t, a, b){ t.t(2 * Math.abs(a - b) / ((a < 1 && b < 1) ? 1 : a + b) < 1e-6); }; + var eqM = function(t, a, b){ + eq(t, a.xx, b.xx); + eq(t, a.yy, b.yy); + eq(t, a.xy, b.xy); + eq(t, a.yx, b.yx); + eq(t, a.dx, b.dx); + eq(t, a.dy, b.dy); + }; + var compose = function(r){ + return m.normalize([ + m.translate(r.dx, r.dy), + m.rotate(r.angle2), + m.scale(r.sx, r.sy), + m.rotate(r.angle1) + ]); + }; + var reconstruct = function(a){ + return compose(dojox.gfx.decompose(a)); + }; + var compare = function(t, a){ + var A = m.normalize(a); + eqM(t, A, reconstruct(A)); + }; + tests.register("dojox.gfx.tests.decompose", [ + function IdentityTest(t){ + compare(t, m.identity); + }, + function FlipXTest(t){ + compare(t, m.flipX); + }, + function FlipYTest(t){ + compare(t, m.flipY); + }, + function FlipXYTest(t){ + compare(t, m.flipXY); + }, + function TranslationTest(t){ + compare(t, m.translate(45, -15)); + }, + function RotationTest(t){ + compare(t, m.rotateg(35)); + }, + function SkewXTest(t){ + compare(t, m.skewXg(35)); + }, + function SkewYTest(t){ + compare(t, m.skewYg(35)); + }, + function ReflectTest(t){ + compare(t, m.reflect(13, 27)); + }, + function ProjectTest(t){ + compare(t, m.project(13, 27)); + }, + function ScaleTest1(t){ + compare(t, m.scale(3)); + }, + function ScaleTest2(t){ + compare(t, m.scale(3, -1)); + }, + function ScaleTest3(t){ + compare(t, m.scale(-3, 1)); + }, + function ScaleTest4(t){ + compare(t, m.scale(-3, -1)); + }, + function ScaleRotateTest1(t){ + compare(t, [m.scale(3), m.rotateAt(35, 13, 27)]); + }, + function ScaleRotateTest2(t){ + compare(t, [m.scale(3, -1), m.rotateAt(35, 13, 27)]); + }, + function ScaleRotateTest3(t){ + compare(t, [m.scale(-3, 1), m.rotateAt(35, 13, 27)]); + }, + function ScaleRotateTest4(t){ + compare(t, [m.scale(-3, -1), m.rotateAt(35, 13, 27)]); + }, + function RotateScaleTest1(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(3)]); + }, + function RotateScaleTest2(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(3, -1)]); + }, + function RotateScaleTest3(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(-3, 1)]); + }, + function RotateScaleTest4(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(-3, -1)]); + }, + function RotateScaleRotateTest1(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(3), m.rotateAt(-15, 163, -287)]); + }, + function RotateScaleRotateTest2(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(3, -1), m.rotateAt(-15, 163, -287)]); + }, + function RotateScaleRotateTest3(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(-3, 1), m.rotateAt(-15, 163, -287)]); + }, + function RotateScaleRotateTest4(t){ + compare(t, [m.rotateAt(35, 13, 27), m.scale(-3, -1), m.rotateAt(-15, 163, -287)]); + } + ]); +})(); + +} diff --git a/includes/js/dojox/gfx/tests/matrix.js b/includes/js/dojox/gfx/tests/matrix.js new file mode 100644 index 0000000..282ec36 --- /dev/null +++ b/includes/js/dojox/gfx/tests/matrix.js @@ -0,0 +1,228 @@ +if(!dojo._hasResource["dojox.gfx.tests.matrix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.tests.matrix"] = true; +dojo.provide("dojox.gfx.tests.matrix"); +dojo.require("dojox.gfx.matrix"); + +(function(){ + var m = dojox.gfx.matrix; + var eq = function(t, a, b){ t.t(2 * Math.abs(a - b) / ((a < 1 && b < 1) ? 1 : a + b) < 1e-6); }; + tests.register("dojox.gfx.tests.matrix", [ + function IdentityTest(t){ + var a = new m.Matrix2D(); + eq(t, a.xx, 1); + eq(t, a.yy, 1); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function Rot30gTest(t){ + var a = m.rotateg(30); + eq(t, a.xx, a.yy); + eq(t, a.xy, -a.yx); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.yx, 0.5); + t.t(a.xy < 0); + t.t(a.yx > 0); + }, + function Rot45gTest(t){ + var a = m.rotateg(45); + eq(t, a.xx, a.yy); + eq(t, a.xy, -a.yx); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, a.yx); + eq(t, a.yy, -a.xy); + }, + function Rot90gTest(t){ + var a = m.rotateg(90); + eq(t, a.xx, a.yy); + eq(t, a.xy, -a.yx); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, 0); + eq(t, a.yx, 1); + }, + function CombineIdentitiesTest(t){ + var a = m.normalize([new m.Matrix2D(), new m.Matrix2D(), new m.Matrix2D()]); + eq(t, a.xx, 1); + eq(t, a.yy, 1); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function CombineExclusiveTest(t){ + var a = m.normalize([m.rotateg(30), m.rotateg(-30)]); + eq(t, a.xx, 1); + eq(t, a.yy, 1); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function CombineInvertedTest(t){ + var a = m.normalize([m.rotateg(30), m.invert(m.rotateg(30))]); + eq(t, a.xx, 1); + eq(t, a.yy, 1); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function Rot90gAtTest(t){ + var a = m.rotategAt(90, 10, 10); + eq(t, a.xx, a.yy); + eq(t, a.xy, -a.yx); + eq(t, a.dx, 20); + eq(t, a.dy, 0); + eq(t, a.xx, 0); + eq(t, a.yx, 1); + }, + function MultPointTest1(t){ + var b = m.multiplyPoint(m.rotategAt(90, 10, 10), 10, 10); + eq(t, b.x, 10); + eq(t, b.y, 10); + }, + function MultPointTest2(t){ + var b = m.multiplyPoint(m.rotategAt(90, 10, 10), {x: 10, y: 5}); + eq(t, b.x, 15); + eq(t, b.y, 10); + }, + function MultPointTest3(t){ + var b = m.multiplyPoint(m.rotategAt(90, 10, 10), 10, 15); + eq(t, b.x, 5); + eq(t, b.y, 10); + }, + function ScaleTest1(t){ + var a = m.normalize([m.scale(2, 1), m.invert(m.rotateg(45))]); + eq(t, a.xx, 2 * a.yy); + eq(t, a.xy, -2 * a.yx); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, a.xy); + eq(t, a.yy, -a.yx); + }, + function ScaleTest2(t){ + var a = m.normalize([m.scale(1, 2), m.invert(m.rotateg(45))]); + eq(t, 2 * a.xx, a.yy); + eq(t, 2 * a.xy, -a.yx); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, a.xy); + eq(t, a.yy, -a.yx); + }, + function ScaleTest3(t){ + var a = m.normalize([m.rotateg(45), m.scale(2, 1)]); + eq(t, a.xx, 2 * a.yy); + eq(t, a.yx, -2 * a.xy); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, a.yx); + eq(t, a.yy, -a.xy); + }, + function ScaleTest4(t){ + var a = m.normalize([m.rotateg(45), m.scale(1, 2)]); + eq(t, 2 * a.xx, a.yy); + eq(t, 2 * a.yx, -a.xy); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + eq(t, a.xx, a.yx); + eq(t, a.yy, -a.xy); + }, + function ScaleTest5(t){ + var a = m.normalize([m.rotategAt(45, 100, 100), m.scale(2)]); + eq(t, a.xx, a.yy); + eq(t, a.xy, -a.yx); + eq(t, a.xx, a.yx); + eq(t, a.yy, -a.xy); + eq(t, a.dx, 100); + t.t(a.dy < 0); + var b = m.normalize([m.scale(2), m.rotategAt(45, 100, 100)]); + eq(t, b.xx, b.yy); + eq(t, b.xy, -b.yx); + eq(t, b.xx, b.yx); + eq(t, b.yy, -b.xy); + eq(t, b.dx, 200); + t.t(b.dy < 0); + eq(t, a.xx, b.xx); + eq(t, a.xy, b.xy); + eq(t, a.yx, b.yx); + eq(t, a.yy, b.yy); + eq(t, 2 * a.dx, b.dx); + eq(t, 2 * a.dy, b.dy); + var c = m.normalize([m.rotateg(45), m.scale(2)]); + eq(t, c.xx, c.yy); + eq(t, c.xy, -c.yx); + eq(t, c.xx, c.yx); + eq(t, c.yy, -c.xy); + eq(t, c.dx, 0); + eq(t, c.dy, 0); + var d = m.normalize([m.scale(2), m.rotateg(45)]); + eq(t, d.xx, d.yy); + eq(t, d.xy, -d.yx); + eq(t, d.xx, d.yx); + eq(t, d.yy, -d.xy); + eq(t, d.dx, 0); + eq(t, d.dy, 0); + eq(t, a.xx, c.xx); + eq(t, a.xy, c.xy); + eq(t, a.yx, c.yx); + eq(t, a.yy, c.yy); + eq(t, a.xx, d.xx); + eq(t, a.xy, d.xy); + eq(t, a.yx, d.yx); + eq(t, a.yy, d.yy); + }, + function ScaleTest6(t){ + var a = m.normalize(6); + eq(t, a.xx, 6); + eq(t, a.yy, 6); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function ScaleTest7(t){ + var a = m.normalize([2, m.scale(2, 1)]); + eq(t, a.xx, 4); + eq(t, a.yy, 2); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 0); + eq(t, a.dy, 0); + }, + function TranslateTest(t){ + var a = m.normalize({dx: 100, dy: 200}); + eq(t, a.xx, 1); + eq(t, a.yy, 1); + eq(t, a.xy, 0); + eq(t, a.yx, 0); + eq(t, a.dx, 100); + eq(t, a.dy, 200); + }, + function ReflectTest1(t){ + var b = m.multiplyPoint(m.reflect(1, 1), 1, 0); + eq(t, b.x, 0); + eq(t, b.y, 1); + }, + function ReflectTest2(t){ + var b = m.multiplyPoint(m.reflect(1, 1), 0, 1); + eq(t, b.x, 1); + eq(t, b.y, 0); + }, + function ProjectTest1(t){ + var b = m.multiplyPoint(m.project(1, 1), 1, 0); + eq(t, b.x, 0.5); + eq(t, b.y, 0.5); + }, + function ProjectTest2(t){ + var b = m.multiplyPoint(m.project(1, 1), 0, 1); + eq(t, b.x, 0.5); + eq(t, b.y, 0.5); + } + ]); +})(); + +} diff --git a/includes/js/dojox/gfx/tests/module.js b/includes/js/dojox/gfx/tests/module.js new file mode 100644 index 0000000..0790b6b --- /dev/null +++ b/includes/js/dojox/gfx/tests/module.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojox.gfx.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.tests.module"] = true; +dojo.provide("dojox.gfx.tests.module"); + +try{ + dojo.require("dojox.gfx.tests.matrix"); + dojo.require("dojox.gfx.tests.decompose"); +}catch(e){ + doh.debug(e); +} + + +} diff --git a/includes/js/dojox/gfx/tests/runTests.html b/includes/js/dojox/gfx/tests/runTests.html new file mode 100644 index 0000000..4e13179 --- /dev/null +++ b/includes/js/dojox/gfx/tests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/gfx/tests/test_arc.html b/includes/js/dojox/gfx/tests/test_arc.html new file mode 100644 index 0000000..f7fc589 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_arc.html @@ -0,0 +1,71 @@ + + +Testing arc + + + + + + + + + + + + + + + +

            Testing arc

            + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_bezier.html b/includes/js/dojox/gfx/tests/test_bezier.html new file mode 100644 index 0000000..bcee2d0 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_bezier.html @@ -0,0 +1,85 @@ + + +Approximation of an arc with bezier + + + + + + + + + + + + + + + +

            Approximation of an arc with bezier

            + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_decompose.html b/includes/js/dojox/gfx/tests/test_decompose.html new file mode 100644 index 0000000..6291cc2 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_decompose.html @@ -0,0 +1,54 @@ + + +Testing decompose + + + + + + + + +

            Testing decompose

            +

            + Example: m.rotategAt(30, 100, 100), m.scaleAt(2, 3, 5, 5), m.rotate(45)
            + +

            +

            Result:

            +

            + Original matrix
            + +

            +

            + Decomposed matrix
            + +

            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_fill.html b/includes/js/dojox/gfx/tests/test_fill.html new file mode 100644 index 0000000..84827ea --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_fill.html @@ -0,0 +1,47 @@ + + +Testing fill rule + + + + + + + + + + + + + +

            Testing fill rule

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_fx.html b/includes/js/dojox/gfx/tests/test_fx.html new file mode 100644 index 0000000..c7b5b81 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_fx.html @@ -0,0 +1,113 @@ + + + +Testing animation + + + + + + + + + + + + + +

            Testing animation

            +

            + +   + +   + +   + +

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_gfx.html b/includes/js/dojox/gfx/tests/test_gfx.html new file mode 100644 index 0000000..6d2bef3 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_gfx.html @@ -0,0 +1,489 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + + + +

            dojox.gfx tests

            + + + +
            + + diff --git a/includes/js/dojox/gfx/tests/test_gradient.html b/includes/js/dojox/gfx/tests/test_gradient.html new file mode 100644 index 0000000..cd4e772 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_gradient.html @@ -0,0 +1,70 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + +

            dojox.gfx Alpha gradient test

            +
            + + diff --git a/includes/js/dojox/gfx/tests/test_group.html b/includes/js/dojox/gfx/tests/test_group.html new file mode 100644 index 0000000..fe11b37 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_group.html @@ -0,0 +1,73 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + + + + +

            dojox.gfx Group tests

            +

            +
            +
            + +

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_image1.html b/includes/js/dojox/gfx/tests/test_image1.html new file mode 100644 index 0000000..41b168e --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_image1.html @@ -0,0 +1,74 @@ + + +Testing image + + + + + + + + + + +

            dojox.gfx Image tests

            +

            Note: Silverlight doesn't allow downloading images when run from a file system. This demo should be run from a server.

            +

            +
            +
            +
            +
            +
            +

            +

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_image2.html b/includes/js/dojox/gfx/tests/test_image2.html new file mode 100644 index 0000000..25f71c0 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_image2.html @@ -0,0 +1,50 @@ + + +Testing image + + + + + + + + + +

            Testing image:

            +

            Note: Silverlight doesn't allow downloading images when run from a file system. This demo should be run from a server.

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_linearGradient.html b/includes/js/dojox/gfx/tests/test_linearGradient.html new file mode 100644 index 0000000..f18021a --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_linearGradient.html @@ -0,0 +1,80 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + + + + + + + +

            dojox.gfx Linear Gradient test

            +
            + + diff --git a/includes/js/dojox/gfx/tests/test_linestyle.html b/includes/js/dojox/gfx/tests/test_linestyle.html new file mode 100644 index 0000000..c4a422b --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_linestyle.html @@ -0,0 +1,45 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + + + +

            dojox.gfx: Line style test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_pattern.html b/includes/js/dojox/gfx/tests/test_pattern.html new file mode 100644 index 0000000..04d5c3d --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_pattern.html @@ -0,0 +1,44 @@ + + +Testing pattern + + + + + + + + + + + + +

            dojox.gfx Pattern test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_poly.html b/includes/js/dojox/gfx/tests/test_poly.html new file mode 100644 index 0000000..7db70f1 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_poly.html @@ -0,0 +1,53 @@ + + +Testing polyline and line transforms + + + + + + + + + + + + + + + +

            dojox.gfx Polyline test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_resize.html b/includes/js/dojox/gfx/tests/test_resize.html new file mode 100644 index 0000000..3870ab0 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_resize.html @@ -0,0 +1,61 @@ + + +Testing surface resizing + + + + + + + + + + + + + + + +

            Testing surface resizing

            + +

            + +   + +   + +   + +

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_setPath.html b/includes/js/dojox/gfx/tests/test_setPath.html new file mode 100644 index 0000000..c8d7749 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_setPath.html @@ -0,0 +1,76 @@ + + +Testing setPath and curves + + + + + + + + + + + +

            dojox.gfx setPath and curve test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_tbbox.html b/includes/js/dojox/gfx/tests/test_tbbox.html new file mode 100644 index 0000000..1fb1275 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_tbbox.html @@ -0,0 +1,117 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + + + + + + + +

            dojox.gfx Transformation test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_text.html b/includes/js/dojox/gfx/tests/test_text.html new file mode 100644 index 0000000..446156f --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_text.html @@ -0,0 +1,88 @@ + + +Testing text + + + + + + + + + + + +

            dojox.gfx Text test

            +
            +
             
            +

             

            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_textpath.html b/includes/js/dojox/gfx/tests/test_textpath.html new file mode 100644 index 0000000..201b0b5 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_textpath.html @@ -0,0 +1,76 @@ + + +Testing textpath + + + + + + + + + +

            dojox.gfx Text on a Path test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/tests/test_transform.html b/includes/js/dojox/gfx/tests/test_transform.html new file mode 100644 index 0000000..abc50d5 --- /dev/null +++ b/includes/js/dojox/gfx/tests/test_transform.html @@ -0,0 +1,98 @@ + + +Dojo Unified 2D Graphics + + + + + + + + + + +

            dojox.gfx Transform test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx/utils.js b/includes/js/dojox/gfx/utils.js new file mode 100644 index 0000000..7ee4d9d --- /dev/null +++ b/includes/js/dojox/gfx/utils.js @@ -0,0 +1,87 @@ +if(!dojo._hasResource["dojox.gfx.utils"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.utils"] = true; +dojo.provide("dojox.gfx.utils"); + +dojo.require("dojox.gfx"); + +dojox.gfx.utils.serialize = function( + /* dojox.gfx.Surface || dojox.gfx.Shape */ object +){ + var t = {}, v, isSurface = object instanceof dojox.gfx.Surface; + if(isSurface || object instanceof dojox.gfx.Group){ + t.children = []; + for(var i = 0; i < object.children.length; ++i){ + t.children.push(dojox.gfx.utils.serialize(object.children[i])); + } + if(isSurface){ + return t.children; // Array + } + }else{ + t.shape = object.getShape(); + } + if(object.getTransform){ + v = object.getTransform(); + if(v){ t.transform = v; } + } + if(object.getStroke){ + v = object.getStroke(); + if(v){ t.stroke = v; } + } + if(object.getFill){ + v = object.getFill(); + if(v){ t.fill = v; } + } + if(object.getFont){ + v = object.getFont(); + if(v){ t.font = v; } + } + return t; // Object +}; + +dojox.gfx.utils.toJson = function( + /* dojox.gfx.Surface || dojox.gfx.Shape */ object, + /* Boolean? */ prettyPrint +){ + return dojo.toJson(dojox.gfx.utils.serialize(object), prettyPrint); // String +}; + +dojox.gfx.utils.deserialize = function( + /* dojox.gfx.Surface || dojox.gfx.Shape */ parent, + /* dojox.gfx.Shape || Array */ object +){ + if(object instanceof Array){ + var t = []; + for(var i = 0; i < object.length; ++i){ + t.push(dojox.gfx.utils.deserialize(parent, object[i])); + } + return t; // Array + } + var shape = ("shape" in object) ? parent.createShape(object.shape) : parent.createGroup(); + if("transform" in object){ + shape.setTransform(object.transform); + } + if("stroke" in object){ + shape.setStroke(object.stroke); + } + if("fill" in object){ + shape.setFill(object.fill); + } + if("font" in object){ + shape.setFont(object.font); + } + if("children" in object){ + for(var i = 0; i < object.children.length; ++i){ + dojox.gfx.utils.deserialize(shape, object.children[i]); + } + } + return shape; // dojox.gfx.Shape +}; + +dojox.gfx.utils.fromJson = function( + /* dojox.gfx.Surface || dojox.gfx.Shape */ parent, + /* String */ json +){ + return dojox.gfx.utils.deserialize(parent, dojo.fromJson(json)); // Array || dojox.gfx.Shape +}; + +} diff --git a/includes/js/dojox/gfx/vml.js b/includes/js/dojox/gfx/vml.js new file mode 100644 index 0000000..44f01db --- /dev/null +++ b/includes/js/dojox/gfx/vml.js @@ -0,0 +1,1165 @@ +if(!dojo._hasResource["dojox.gfx.vml"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx.vml"] = true; +dojo.provide("dojox.gfx.vml"); + +dojo.require("dojox.gfx._base"); +dojo.require("dojox.gfx.shape"); +dojo.require("dojox.gfx.path"); +dojo.require("dojox.gfx.arc"); + +// dojox.gfx.vml.xmlns: String: a VML's namespace +dojox.gfx.vml.xmlns = "urn:schemas-microsoft-com:vml"; + +// dojox.gfx.vml.text_alignment: Object: mapping from SVG alignment to VML alignment +dojox.gfx.vml.text_alignment = {start: "left", middle: "center", end: "right"}; + +dojox.gfx.vml._parseFloat = function(str) { + // summary: a helper function to parse VML-specific floating-point values + // str: String: a representation of a floating-point number + return str.match(/^\d+f$/i) ? parseInt(str) / 65536 : parseFloat(str); // Number +}; + +dojox.gfx.vml._bool = {"t": 1, "true": 1}; + +dojo.extend(dojox.gfx.Shape, { + // summary: VML-specific implementation of dojox.gfx.Shape methods + + setFill: function(fill){ + // summary: sets a fill object (VML) + // fill: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // or dojo.Color) + + if(!fill){ + // don't fill + this.fillStyle = null; + this.rawNode.filled = "f"; + return this; + } + if(typeof fill == "object" && "type" in fill){ + // gradient + var i, f, fo, a, s; + switch(fill.type){ + case "linear": + var matrix = this._getRealMatrix(), m = dojox.gfx.matrix; + s = []; + f = dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient, fill); + a = f.colors; + this.fillStyle = f; + dojo.forEach(a, function(v, i, a){ + a[i].color = dojox.gfx.normalizeColor(v.color); + }); + if(a[0].offset > 0){ + s.push("0 " + a[0].color.toHex()); + } + for(i = 0; i < a.length; ++i){ + s.push(a[i].offset.toFixed(8) + " " + a[i].color.toHex()); + } + i = a.length - 1; + if(a[i].offset < 1){ + s.push("1 " + a[i].color.toHex()); + } + fo = this.rawNode.fill; + fo.colors.value = s.join(";"); + fo.method = "sigma"; + fo.type = "gradient"; + var fc1 = matrix ? m.multiplyPoint(matrix, f.x1, f.y1) : {x: f.x1, y: f.y1}, + fc2 = matrix ? m.multiplyPoint(matrix, f.x2, f.y2) : {x: f.x2, y: f.y2}; + fo.angle = (m._radToDeg(Math.atan2(fc2.x - fc1.x, fc2.y - fc1.y)) + 180) % 360; + fo.on = true; + break; + case "radial": + f = dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient, fill); + this.fillStyle = f; + var l = parseFloat(this.rawNode.style.left), + t = parseFloat(this.rawNode.style.top), + w = parseFloat(this.rawNode.style.width), + h = parseFloat(this.rawNode.style.height), + c = isNaN(w) ? 1 : 2 * f.r / w; + a = []; + // add a color at the offset 0 (1 in VML coordinates) + if(f.colors[0].offset > 0){ + a.push({offset: 1, color: dojox.gfx.normalizeColor(f.colors[0].color)}); + } + // massage colors + dojo.forEach(f.colors, function(v, i){ + a.push({offset: 1 - v.offset * c, color: dojox.gfx.normalizeColor(v.color)}); + }); + i = a.length - 1; + while(i >= 0 && a[i].offset < 0){ --i; } + if(i < a.length - 1){ + // correct excessive colors + var q = a[i], p = a[i + 1]; + p.color = dojo.blendColors(q.color, p.color, q.offset / (q.offset - p.offset)); + p.offset = 0; + while(a.length - i > 2) a.pop(); + } + // set colors + i = a.length - 1, s = []; + if(a[i].offset > 0){ + s.push("0 " + a[i].color.toHex()); + } + for(; i >= 0; --i){ + s.push(a[i].offset.toFixed(8) + " " + a[i].color.toHex()); + } + fo = this.rawNode.fill; + fo.colors.value = s.join(";"); + fo.method = "sigma"; + fo.type = "gradientradial"; + if(isNaN(w) || isNaN(h) || isNaN(l) || isNaN(t)){ + fo.focusposition = "0.5 0.5"; + }else{ + fo.focusposition = ((f.cx - l) / w).toFixed(8) + " " + ((f.cy - t) / h).toFixed(8); + } + fo.focussize = "0 0"; + fo.on = true; + break; + case "pattern": + f = dojox.gfx.makeParameters(dojox.gfx.defaultPattern, fill); + this.fillStyle = f; + fo = this.rawNode.fill; + fo.type = "tile"; + fo.src = f.src; + if(f.width && f.height){ + // in points + fo.size.x = dojox.gfx.px2pt(f.width); + fo.size.y = dojox.gfx.px2pt(f.height); + } + fo.alignShape = "f"; + fo.position.x = 0; + fo.position.y = 0; + fo.origin.x = f.width ? f.x / f.width : 0; + fo.origin.y = f.height ? f.y / f.height : 0; + fo.on = true; + break; + } + this.rawNode.fill.opacity = 1; + return this; + } + // color object + this.fillStyle = dojox.gfx.normalizeColor(fill); + this.rawNode.fill.method = "any"; + this.rawNode.fill.type = "solid"; + this.rawNode.fillcolor = this.fillStyle.toHex(); + this.rawNode.fill.opacity = this.fillStyle.a; + this.rawNode.filled = true; + return this; // self + }, + + setStroke: function(stroke){ + // summary: sets a stroke object (VML) + // stroke: Object: a stroke object + // (see dojox.gfx.defaultStroke) + + if(!stroke){ + // don't stroke + this.strokeStyle = null; + this.rawNode.stroked = "f"; + return this; + } + // normalize the stroke + if(typeof stroke == "string"){ + stroke = {color: stroke}; + } + var s = this.strokeStyle = dojox.gfx.makeParameters(dojox.gfx.defaultStroke, stroke); + s.color = dojox.gfx.normalizeColor(s.color); + // generate attributes + var rn = this.rawNode; + rn.stroked = true; + rn.strokecolor = s.color.toCss(); + rn.strokeweight = s.width + "px"; // TODO: should we assume that the width is always in pixels? + if(rn.stroke) { + rn.stroke.opacity = s.color.a; + rn.stroke.endcap = this._translate(this._capMap, s.cap); + if(typeof s.join == "number") { + rn.stroke.joinstyle = "miter"; + rn.stroke.miterlimit = s.join; + }else{ + rn.stroke.joinstyle = s.join; + // rn.stroke.miterlimit = s.width; + } + rn.stroke.dashstyle = s.style == "none" ? "Solid" : s.style; + } + return this; // self + }, + + _capMap: { butt: 'flat' }, + _capMapReversed: { flat: 'butt' }, + + _translate: function(dict, value) { + return (value in dict) ? dict[value] : value; + }, + + _applyTransform: function() { + if(this.fillStyle && this.fillStyle.type == "linear"){ + this.setFill(this.fillStyle); + } + var matrix = this._getRealMatrix(); + if(!matrix) return this; + var skew = this.rawNode.skew; + if(typeof skew == "undefined"){ + for(var i = 0; i < this.rawNode.childNodes.length; ++i){ + if(this.rawNode.childNodes[i].tagName == "skew"){ + skew = this.rawNode.childNodes[i]; + break; + } + } + } + if(skew){ + skew.on = "f"; + var mt = matrix.xx.toFixed(8) + " " + matrix.xy.toFixed(8) + " " + + matrix.yx.toFixed(8) + " " + matrix.yy.toFixed(8) + " 0 0", + offset = Math.floor(matrix.dx).toFixed() + "px " + Math.floor(matrix.dy).toFixed() + "px", + s = this.rawNode.style, + l = parseFloat(s.left), + t = parseFloat(s.top), + w = parseFloat(s.width), + h = parseFloat(s.height); + if(isNaN(l)) l = 0; + if(isNaN(t)) t = 0; + if(isNaN(w)) w = 1; + if(isNaN(h)) h = 1; + var origin = (-l / w - 0.5).toFixed(8) + " " + (-t / h - 0.5).toFixed(8); + skew.matrix = mt; + skew.origin = origin; + skew.offset = offset; + skew.on = true; + } + return this; + }, + + setRawNode: function(rawNode){ + // summary: + // assigns and clears the underlying node that will represent this + // shape. Once set, transforms, gradients, etc, can be applied. + // (no fill & stroke by default) + rawNode.stroked = "f"; + rawNode.filled = "f"; + this.rawNode = rawNode; + }, + + // move family + + _moveToFront: function(){ + // summary: moves a shape to front of its parent's list of shapes (VML) + this.rawNode.parentNode.appendChild(this.rawNode); + return this; + }, + _moveToBack: function(){ + // summary: moves a shape to back of its parent's list of shapes (VML) + var r = this.rawNode, p = r.parentNode, n = p.firstChild; + p.insertBefore(r, n); + if(n.tagName == "rect"){ + // surface has a background rectangle, which position should be preserved + n.swapNode(r); + } + return this; + }, + + _getRealMatrix: function(){ + // summary: returns the cumulative ("real") transformation matrix + // by combining the shape's matrix with its parent's matrix + return this.parentMatrix ? new dojox.gfx.Matrix2D([this.parentMatrix, this.matrix]) : this.matrix; // dojox.gfx.Matrix2D + } +}); + +dojo.declare("dojox.gfx.Group", dojox.gfx.Shape, { + // summary: a group shape (VML), which can be used + // to logically group shapes (e.g, to propagate matricies) + constructor: function(){ + dojox.gfx.vml.Container._init.call(this); + }, + // apply transformation + _applyTransform: function(){ + // summary: applies a transformation matrix to a group + var matrix = this._getRealMatrix(); + for(var i = 0; i < this.children.length; ++i){ + this.children[i]._updateParentMatrix(matrix); + } + return this; // self + } +}); +dojox.gfx.Group.nodeType = "group"; + +dojo.declare("dojox.gfx.Rect", dojox.gfx.shape.Rect, { + // summary: a rectangle shape (VML) + setShape: function(newShape){ + // summary: sets a rectangle shape object (VML) + // newShape: Object: a rectangle shape object + var shape = this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var style = this.rawNode.style; + style.left = shape.x.toFixed(); + style.top = shape.y.toFixed(); + style.width = (typeof shape.width == "string" && shape.width.indexOf("%") >= 0) ? shape.width : shape.width.toFixed(); + style.height = (typeof shape.width == "string" && shape.height.indexOf("%") >= 0) ? shape.height : shape.height.toFixed(); + var r = Math.min(1, (shape.r / Math.min(parseFloat(shape.width), parseFloat(shape.height)))).toFixed(8); + // a workaround for the VML's arcsize bug: cannot read arcsize of an instantiated node + var parent = this.rawNode.parentNode, before = null; + if(parent){ + if(parent.lastChild != this.rawNode){ + for(var i = 0; i < parent.childNodes.length; ++i){ + if(parent.childNodes[i] == this.rawNode){ + before = parent.childNodes[i+1]; + break; + } + } + } + parent.removeChild(this.rawNode); + } + this.rawNode.arcsize = r; + if(parent){ + if(before){ + parent.insertBefore(this.rawNode, before); + }else{ + parent.appendChild(this.rawNode); + } + } + // set all necessary styles, which are lost by VML (yes, it's a VML's bug) + return this.setTransform(this.matrix).setFill(this.fillStyle).setStroke(this.strokeStyle); // self + } +}); +dojox.gfx.Rect.nodeType = "roundrect"; // use a roundrect so the stroke join type is respected + +dojo.declare("dojox.gfx.Ellipse", dojox.gfx.shape.Ellipse, { + // summary: an ellipse shape (VML) + setShape: function(newShape){ + // summary: sets an ellipse shape object (VML) + // newShape: Object: an ellipse shape object + var shape = this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var style = this.rawNode.style; + style.left = (shape.cx - shape.rx).toFixed(); + style.top = (shape.cy - shape.ry).toFixed(); + style.width = (shape.rx * 2).toFixed(); + style.height = (shape.ry * 2).toFixed(); + return this.setTransform(this.matrix); // self + } +}); +dojox.gfx.Ellipse.nodeType = "oval"; + +dojo.declare("dojox.gfx.Circle", dojox.gfx.shape.Circle, { + // summary: a circle shape (VML) + setShape: function(newShape){ + // summary: sets a circle shape object (VML) + // newShape: Object: a circle shape object + var shape = this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var style = this.rawNode.style; + style.left = (shape.cx - shape.r).toFixed(); + style.top = (shape.cy - shape.r).toFixed(); + style.width = (shape.r * 2).toFixed(); + style.height = (shape.r * 2).toFixed(); + return this; // self + } +}); +dojox.gfx.Circle.nodeType = "oval"; + +dojo.declare("dojox.gfx.Line", dojox.gfx.shape.Line, { + // summary: a line shape (VML) + constructor: function(rawNode){ + if(rawNode) rawNode.setAttribute("dojoGfxType", "line"); + }, + setShape: function(newShape){ + // summary: sets a line shape object (VML) + // newShape: Object: a line shape object + var shape = this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + this.rawNode.path.v = "m" + shape.x1.toFixed() + " " + shape.y1.toFixed() + + "l" + shape.x2.toFixed() + " " + shape.y2.toFixed() + "e"; + return this.setTransform(this.matrix); // self + } +}); +dojox.gfx.Line.nodeType = "shape"; + +dojo.declare("dojox.gfx.Polyline", dojox.gfx.shape.Polyline, { + // summary: a polyline/polygon shape (VML) + constructor: function(rawNode){ + if(rawNode) rawNode.setAttribute("dojoGfxType", "polyline"); + }, + setShape: function(points, closed){ + // summary: sets a polyline/polygon shape object (VML) + // points: Object: a polyline/polygon shape object + // closed: Boolean?: if true, close the polyline explicitely + if(points && points instanceof Array){ + // branch + // points: Array: an array of points + this.shape = dojox.gfx.makeParameters(this.shape, { points: points }); + if(closed && this.shape.points.length) this.shape.points.push(this.shape.points[0]); + }else{ + this.shape = dojox.gfx.makeParameters(this.shape, points); + } + this.bbox = null; + var attr = [], p = this.shape.points; + if(p.length > 0){ + attr.push("m"); + var k = 1; + if(typeof p[0] == "number"){ + attr.push(p[0].toFixed()); + attr.push(p[1].toFixed()); + k = 2; + }else{ + attr.push(p[0].x.toFixed()); + attr.push(p[0].y.toFixed()); + } + if(p.length > k){ + attr.push("l"); + for(var i = k; i < p.length; ++i){ + if(typeof p[i] == "number"){ + attr.push(p[i].toFixed()); + }else{ + attr.push(p[i].x.toFixed()); + attr.push(p[i].y.toFixed()); + } + } + } + } + attr.push("e"); + this.rawNode.path.v = attr.join(" "); + return this.setTransform(this.matrix); // self + } +}); +dojox.gfx.Polyline.nodeType = "shape"; + +dojo.declare("dojox.gfx.Image", dojox.gfx.shape.Image, { + // summary: an image (VML) + constructor: function(rawNode){ + if(rawNode) rawNode.setAttribute("dojoGfxType", "image"); + }, + getEventSource: function() { + // summary: returns a Node, which is used as + // a source of events for this shape + return this.rawNode ? this.rawNode.firstChild : null; // Node + }, + setShape: function(newShape){ + // summary: sets an image shape object (VML) + // newShape: Object: an image shape object + var shape = this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + this.rawNode.firstChild.src = shape.src; + return this.setTransform(this.matrix); // self + }, + _setDimensions: function(s, w, h){ + if(w || h){ + s.width = w + "px"; + s.height = h + "px"; + } + }, + _resetImage: function(){ + var s = this.rawNode.firstChild.style, + shape = this.shape; + s.left = "0px"; + s.top = "0px"; + this._setDimensions(s, shape.width, shape.height); + }, + _applyTransform: function() { + var matrix = this._getRealMatrix(), + img = this.rawNode.firstChild, + s = img.style, + shape = this.shape; + if(matrix){ + matrix = dojox.gfx.matrix.multiply(matrix, {dx: shape.x, dy: shape.y}); + }else{ + matrix = dojox.gfx.matrix.normalize({dx: shape.x, dy: shape.y}); + } + if(matrix.xy == 0 && matrix.yx == 0 && matrix.xx > 0 && matrix.yy > 0){ + // special case to avoid filters + this.rawNode.style.filter = ""; + s.left = Math.floor(matrix.dx) + "px"; + s.top = Math.floor(matrix.dy) + "px"; + this._setDimensions(s, Math.floor(matrix.xx * shape.width), Math.floor(matrix.yy * shape.height)); + }else{ + this._resetImage(); + var f = this.rawNode.filters["DXImageTransform.Microsoft.Matrix"]; + if(f){ + f.M11 = matrix.xx; + f.M12 = matrix.xy; + f.M21 = matrix.yx; + f.M22 = matrix.yy; + f.Dx = matrix.dx; + f.Dy = matrix.dy; + }else{ + this.rawNode.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11=" + matrix.xx + + ", M12=" + matrix.xy + ", M21=" + matrix.yx + ", M22=" + matrix.yy + + ", Dx=" + matrix.dx + ", Dy=" + matrix.dy + ")"; + } + } + return this; + } +}); +dojox.gfx.Image.nodeType = "div"; + +dojo.declare("dojox.gfx.Text", dojox.gfx.shape.Text, { + // summary: an anchored text (VML) + constructor: function(rawNode){ + if(rawNode){rawNode.setAttribute("dojoGfxType", "text");} + this.fontStyle = null; + }, + _alignment: {start: "left", middle: "center", end: "right"}, + setShape: function(newShape){ + // summary: sets a text shape object (VML) + // newShape: Object: a text shape object + this.shape = dojox.gfx.makeParameters(this.shape, newShape); + this.bbox = null; + var r = this.rawNode, s = this.shape, x = s.x, y = s.y.toFixed(); + switch(s.align){ + case "middle": + x -= 5; + break; + case "end": + x -= 10; + break; + } + this.rawNode.path.v = "m" + x.toFixed() + "," + y + + "l" + (x + 10).toFixed() + "," + y + "e"; + // find path and text path + var p = null, t = null, c = r.childNodes; + for(var i = 0; i < c.length; ++i){ + var tag = c[i].tagName; + if(tag == "path"){ + p = c[i]; + if(t) break; + }else if(tag == "textpath"){ + t = c[i]; + if(p) break; + } + } + if(!p){ + p = this.rawNode.ownerDocument.createElement("v:path"); + r.appendChild(p); + } + if(!t){ + t = this.rawNode.ownerDocument.createElement("v:textpath"); + r.appendChild(t); + } + p.textPathOk = true; + t.on = true; + var a = dojox.gfx.vml.text_alignment[s.align]; + t.style["v-text-align"] = a ? a : "left"; + t.style["text-decoration"] = s.decoration; + t.style["v-rotate-letters"] = s.rotated; + t.style["v-text-kern"] = s.kerning; + t.string = s.text; + return this.setTransform(this.matrix); // self + }, + _setFont: function(){ + // summary: sets a font object (VML) + var f = this.fontStyle, c = this.rawNode.childNodes; + for(var i = 0; i < c.length; ++i){ + if(c[i].tagName == "textpath"){ + c[i].style.font = dojox.gfx.makeFontString(f); + break; + } + } + this.setTransform(this.matrix); + }, + _getRealMatrix: function(){ + // summary: returns the cumulative ("real") transformation matrix + // by combining the shape's matrix with its parent's matrix; + // it makes a correction for a font size + var matrix = dojox.gfx.Shape.prototype._getRealMatrix.call(this); + // It appears that text is always aligned vertically at a middle of x-height (???). + // It is impossible to obtain these metrics from VML => I try to approximate it with + // more-or-less util value of 0.7 * FontSize, which is typical for European fonts. + if(matrix){ + matrix = dojox.gfx.matrix.multiply(matrix, + {dy: -dojox.gfx.normalizedLength(this.fontStyle ? this.fontStyle.size : "10pt") * 0.35}); + } + return matrix; // dojox.gfx.Matrix2D + }, + getTextWidth: function(){ + // summary: get the text width, in px + var rawNode = this.rawNode, _display = rawNode.style.display; + rawNode.style.display = "inline"; + var _width = dojox.gfx.pt2px(parseFloat(rawNode.currentStyle.width)); + rawNode.style.display = _display; + return _width; + } +}); +dojox.gfx.Text.nodeType = "shape"; + +dojox.gfx.path._calcArc = function(alpha){ + // return a start point, 1st and 2nd control points, and an end point + var cosa = Math.cos(alpha), sina = Math.sin(alpha), + p2 = {x: cosa + (4 / 3) * (1 - cosa), y: sina - (4 / 3) * cosa * (1 - cosa) / sina}; + return { + s: {x: cosa, y: -sina}, + c1: {x: p2.x, y: -p2.y}, + c2: p2, + e: {x: cosa, y: sina} + }; +}; + +dojo.declare("dojox.gfx.Path", dojox.gfx.path.Path, { + // summary: a path shape (VML) + constructor: function(rawNode){ + if(rawNode && !rawNode.getAttribute("dojoGfxType")){ + rawNode.setAttribute("dojoGfxType", "path"); + } + this.vmlPath = ""; + this.lastControl = {}; + }, + _updateWithSegment: function(segment){ + // summary: updates the bounding box of path with new segment + // segment: Object: a segment + var last = dojo.clone(this.last); + dojox.gfx.Path.superclass._updateWithSegment.apply(this, arguments); + // add a VML path segment + var path = this[this.renderers[segment.action]](segment, last); + if(typeof this.vmlPath == "string"){ + this.vmlPath += path.join(""); + this.rawNode.path.v = this.vmlPath + " r0,0 e"; + }else{ + this.vmlPath = this.vmlPath.concat(path); + } + }, + setShape: function(newShape){ + // summary: forms a path using a shape (VML) + // newShape: Object: an VML path string or a path object (see dojox.gfx.defaultPath) + this.vmlPath = []; + this.lastControl = {}; + dojox.gfx.Path.superclass.setShape.apply(this, arguments); + this.vmlPath = this.vmlPath.join(""); + this.rawNode.path.v = this.vmlPath + " r0,0 e"; + return this; + }, + _pathVmlToSvgMap: {m: "M", l: "L", t: "m", r: "l", c: "C", v: "c", qb: "Q", x: "z", e: ""}, + // VML-specific segment renderers + renderers: { + M: "_moveToA", m: "_moveToR", + L: "_lineToA", l: "_lineToR", + H: "_hLineToA", h: "_hLineToR", + V: "_vLineToA", v: "_vLineToR", + C: "_curveToA", c: "_curveToR", + S: "_smoothCurveToA", s: "_smoothCurveToR", + Q: "_qCurveToA", q: "_qCurveToR", + T: "_qSmoothCurveToA", t: "_qSmoothCurveToR", + A: "_arcTo", a: "_arcTo", + Z: "_closePath", z: "_closePath" + }, + _addArgs: function(path, args, from, upto){ + if(typeof upto == "undefined"){ + upto = args.length; + } + if(typeof from == "undefined"){ + from = 0; + } + for(var i = from; i < upto; ++i){ + path.push(" "); + path.push(args[i].toFixed()); + } + }, + _addArgsAdjusted: function(path, last, args, from, upto){ + if(typeof upto == "undefined"){ + upto = args.length; + } + if(typeof from == "undefined"){ + from = 0; + } + for(var i = from; i < upto; i += 2){ + path.push(" "); + path.push((last.x + args[i]).toFixed()); + path.push(" "); + path.push((last.y + args[i + 1]).toFixed()); + } + }, + _moveToA: function(segment){ + var p = [" m"], n = segment.args, l = n.length; + if(l == 2){ + this._addArgs(p, n); + }else{ + this._addArgs(p, n, 0, 2); + p.push(" l"); + this._addArgs(p, n, 2); + } + this.lastControl = {}; + return p; + }, + _moveToR: function(segment, last){ + var p = ["x" in last ? " t" : " m"], n = segment.args, l = n.length; + if(l == 2){ + this._addArgs(p, n); + }else{ + this._addArgs(p, n, 0, 2); + p.push(" r"); + this._addArgs(p, n, 2); + } + this.lastControl = {}; + return p; + }, + _lineToA: function(segment){ + var p = [" l"]; + this._addArgs(p, segment.args); + this.lastControl = {}; + return p; + }, + _lineToR: function(segment){ + var p = [" r"]; + this._addArgs(p, segment.args); + this.lastControl = {}; + return p; + }, + _hLineToA: function(segment, last){ + var p = [" l"], n = segment.args, l = n.length, y = " " + last.y.toFixed(); + for(var i = 0; i < l; ++i){ + p.push(" "); + p.push(n[i].toFixed()); + p.push(y); + } + this.lastControl = {}; + return p; + }, + _hLineToR: function(segment){ + var p = [" r"], n = segment.args, l = n.length; + for(var i = 0; i < l; ++i){ + p.push(" "); + p.push(n[i].toFixed()); + p.push(" 0"); + } + this.lastControl = {}; + return p; + }, + _vLineToA: function(segment, last){ + var p = [" l"], n = segment.args, l = n.length, x = " " + last.x.toFixed(); + for(var i = 0; i < l; ++i){ + p.push(x); + p.push(" "); + p.push(n[i].toFixed()); + } + this.lastControl = {}; + return p; + }, + _vLineToR: function(segment){ + var p = [" r"], n = segment.args, l = n.length; + for(var i = 0; i < l; ++i){ + p.push(" 0 "); + p.push(n[i].toFixed()); + } + this.lastControl = {}; + return p; + }, + _curveToA: function(segment){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 6){ + p.push(" c"); + this._addArgs(p, n, i, i + 6); + } + this.lastControl = {x: n[l - 4], y: n[l - 3], type: "C"}; + return p; + }, + _curveToR: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 6){ + p.push(" v"); + this._addArgs(p, n, i, i + 6); + this.lastControl = {x: last.x + n[i + 2], y: last.y + n[i + 3]}; + last.x += n[i + 4]; + last.y += n[i + 5]; + } + this.lastControl.type = "C"; + return p; + }, + _smoothCurveToA: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 4){ + p.push(" c"); + if(this.lastControl.type == "C"){ + this._addArgs(p, [ + 2 * last.x - this.lastControl.x, + 2 * last.y - this.lastControl.y + ]); + }else{ + this._addArgs(p, [last.x, last.y]); + } + this._addArgs(p, n, i, i + 4); + } + this.lastControl = {x: n[l - 4], y: n[l - 3], type: "C"}; + return p; + }, + _smoothCurveToR: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 4){ + p.push(" v"); + if(this.lastControl.type == "C"){ + this._addArgs(p, [ + last.x - this.lastControl.x, + last.y - this.lastControl.y + ]); + }else{ + this._addArgs(p, [0, 0]); + } + this._addArgs(p, n, i, i + 4); + this.lastControl = {x: last.x + n[i], y: last.y + n[i + 1]}; + last.x += n[i + 2]; + last.y += n[i + 3]; + } + this.lastControl.type = "C"; + return p; + }, + _qCurveToA: function(segment){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 4){ + p.push(" qb"); + this._addArgs(p, n, i, i + 4); + } + this.lastControl = {x: n[l - 4], y: n[l - 3], type: "Q"}; + return p; + }, + _qCurveToR: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 4){ + p.push(" qb"); + this._addArgsAdjusted(p, last, n, i, i + 4); + this.lastControl = {x: last.x + n[i], y: last.y + n[i + 1]}; + last.x += n[i + 2]; + last.y += n[i + 3]; + } + this.lastControl.type = "Q"; + return p; + }, + _qSmoothCurveToA: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 2){ + p.push(" qb"); + if(this.lastControl.type == "Q"){ + this._addArgs(p, [ + this.lastControl.x = 2 * last.x - this.lastControl.x, + this.lastControl.y = 2 * last.y - this.lastControl.y + ]); + }else{ + this._addArgs(p, [ + this.lastControl.x = last.x, + this.lastControl.y = last.y + ]); + } + this._addArgs(p, n, i, i + 2); + } + this.lastControl.type = "Q"; + return p; + }, + _qSmoothCurveToR: function(segment, last){ + var p = [], n = segment.args, l = n.length; + for(var i = 0; i < l; i += 2){ + p.push(" qb"); + if(this.lastControl.type == "Q"){ + this._addArgs(p, [ + this.lastControl.x = 2 * last.x - this.lastControl.x, + this.lastControl.y = 2 * last.y - this.lastControl.y + ]); + }else{ + this._addArgs(p, [ + this.lastControl.x = last.x, + this.lastControl.y = last.y + ]); + } + this._addArgsAdjusted(p, last, n, i, i + 2); + } + this.lastControl.type = "Q"; + return p; + }, + _arcTo: function(segment, last){ + var p = [], n = segment.args, l = n.length, relative = segment.action == "a"; + for(var i = 0; i < l; i += 7){ + var x1 = n[i + 5], y1 = n[i + 6]; + if(relative){ + x1 += last.x; + y1 += last.y; + } + var result = dojox.gfx.arc.arcAsBezier( + last, n[i], n[i + 1], n[i + 2], + n[i + 3] ? 1 : 0, n[i + 4] ? 1 : 0, + x1, y1 + ); + for(var j = 0; j < result.length; ++j){ + p.push(" c"); + this._addArgs(p, result[j]); + } + last = {x: x1, y: y1}; + } + this.lastControl = {}; + return p; + }, + _closePath: function(){ + this.lastControl = {}; + return ["x"]; + } +}); +dojox.gfx.Path.nodeType = "shape"; + +dojo.declare("dojox.gfx.TextPath", dojox.gfx.Path, { + // summary: a textpath shape (VML) + constructor: function(rawNode){ + if(rawNode){rawNode.setAttribute("dojoGfxType", "textpath");} + this.fontStyle = null; + if(!("text" in this)){ + this.text = dojo.clone(dojox.gfx.defaultTextPath); + } + if(!("fontStyle" in this)){ + this.fontStyle = dojo.clone(dojox.gfx.defaultFont); + } + }, + setText: function(newText){ + // summary: sets a text to be drawn along the path + this.text = dojox.gfx.makeParameters(this.text, + typeof newText == "string" ? {text: newText} : newText); + this._setText(); + return this; // self + }, + setFont: function(newFont){ + // summary: sets a font for text + this.fontStyle = typeof newFont == "string" ? + dojox.gfx.splitFontString(newFont) : + dojox.gfx.makeParameters(dojox.gfx.defaultFont, newFont); + this._setFont(); + return this; // self + }, + + _setText: function(){ + // summary: sets a text shape object (VML) + this.bbox = null; + var r = this.rawNode, s = this.text, + // find path and text path + p = null, t = null, c = r.childNodes; + for(var i = 0; i < c.length; ++i){ + var tag = c[i].tagName; + if(tag == "path"){ + p = c[i]; + if(t) break; + }else if(tag == "textpath"){ + t = c[i]; + if(p) break; + } + } + if(!p){ + p = this.rawNode.ownerDocument.createElement("v:path"); + r.appendChild(p); + } + if(!t){ + t = this.rawNode.ownerDocument.createElement("v:textpath"); + r.appendChild(t); + } + p.textPathOk = true; + t.on = true; + var a = dojox.gfx.vml.text_alignment[s.align]; + t.style["v-text-align"] = a ? a : "left"; + t.style["text-decoration"] = s.decoration; + t.style["v-rotate-letters"] = s.rotated; + t.style["v-text-kern"] = s.kerning; + t.string = s.text; + }, + _setFont: function(){ + // summary: sets a font object (VML) + var f = this.fontStyle, c = this.rawNode.childNodes; + for(var i = 0; i < c.length; ++i){ + if(c[i].tagName == "textpath"){ + c[i].style.font = dojox.gfx.makeFontString(f); + break; + } + } + } +}); +dojox.gfx.TextPath.nodeType = "shape"; + +dojo.declare("dojox.gfx.Surface", dojox.gfx.shape.Surface, { + // summary: a surface object to be used for drawings (VML) + constructor: function(){ + dojox.gfx.vml.Container._init.call(this); + }, + setDimensions: function(width, height){ + // summary: sets the width and height of the rawNode + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + this.width = dojox.gfx.normalizedLength(width); // in pixels + this.height = dojox.gfx.normalizedLength(height); // in pixels + if(!this.rawNode) return this; + var cs = this.clipNode.style, + r = this.rawNode, rs = r.style, + bs = this.bgNode.style; + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + rs.width = width; + rs.height = height; + r.coordsize = width + " " + height; + bs.width = width; + bs.height = height; + return this; // self + }, + getDimensions: function(){ + // summary: returns an object with properties "width" and "height" + var t = this.rawNode ? { + width: dojox.gfx.normalizedLength(this.rawNode.style.width), + height: dojox.gfx.normalizedLength(this.rawNode.style.height)} : null; + if(t.width <= 0){ t.width = this.width; } + if(t.height <= 0){ t.height = this.height; } + return t; // Object + } +}); + +dojox.gfx.createSurface = function(parentNode, width, height){ + // summary: creates a surface (VML) + // parentNode: Node: a parent node + // width: String: width of surface, e.g., "100px" + // height: String: height of surface, e.g., "100px" + + if(!width){ width = "100%"; } + if(!height){ height = "100%"; } + var s = new dojox.gfx.Surface(), p = dojo.byId(parentNode), + c = s.clipNode = p.ownerDocument.createElement("div"), + r = s.rawNode = p.ownerDocument.createElement("v:group"), + cs = c.style, rs = r.style; + + p.style.width = width; + p.style.height = height; + + cs.position = "absolute"; + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + rs.position = "absolute"; + rs.width = width; + rs.height = height; + r.coordsize = (width == "100%" ? width : parseFloat(width)) + " " + + (height == "100%" ? height : parseFloat(height)); + r.coordorigin = "0 0"; + + // create a background rectangle, which is required to show all other shapes + var b = s.bgNode = r.ownerDocument.createElement("v:rect"), bs = b.style; + bs.left = bs.top = 0; + bs.width = rs.width; + bs.height = rs.height; + b.filled = b.stroked = "f"; + + r.appendChild(b); + c.appendChild(r); + p.appendChild(c); + + s.width = dojox.gfx.normalizedLength(width); // in pixels + s.height = dojox.gfx.normalizedLength(height); // in pixels + + return s; // dojox.gfx.Surface +}; + +// Extenders + +dojox.gfx.vml.Container = { + _init: function(){ + dojox.gfx.shape.Container._init.call(this); + }, + add: function(shape){ + // summary: adds a shape to a group/surface + // shape: dojox.gfx.Shape: an VML shape object + if(this != shape.getParent()){ + this.rawNode.appendChild(shape.rawNode); + //dojox.gfx.Group.superclass.add.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.add.apply(this, arguments); + } + return this; // self + }, + remove: function(shape, silently){ + // summary: remove a shape from a group/surface + // shape: dojox.gfx.Shape: an VML shape object + // silently: Boolean?: if true, regenerate a picture + if(this == shape.getParent()){ + if(this.rawNode == shape.rawNode.parentNode){ + this.rawNode.removeChild(shape.rawNode); + } + //dojox.gfx.Group.superclass.remove.apply(this, arguments); + //this.inherited(arguments); + dojox.gfx.shape.Container.remove.apply(this, arguments); + } + return this; // self + }, + clear: function(){ + // summary: removes all shapes from a group/surface + var r = this.rawNode; + while(r.firstChild != r.lastChild){ + if(r.firstChild != this.bgNode){ + r.removeChild(r.firstChild); + } + if(r.lastChild != this.bgNode){ + r.removeChild(r.lastChild); + } + } + //return this.inherited(arguments); // self + return dojox.gfx.shape.Container.clear.apply(this, arguments); + }, + _moveChildToFront: dojox.gfx.shape.Container._moveChildToFront, + _moveChildToBack: dojox.gfx.shape.Container._moveChildToBack +}; + +dojo.mixin(dojox.gfx.shape.Creator, { + // summary: VML shape creators + createGroup: function(){ + // summary: creates a VML group shape + var g = this.createObject(dojox.gfx.Group, null); // dojox.gfx.Group + // create a background rectangle, which is required to show all other shapes + var r = g.rawNode.ownerDocument.createElement("v:rect"); + r.style.left = r.style.top = 0; + r.style.width = g.rawNode.style.width; + r.style.height = g.rawNode.style.height; + r.filled = r.stroked = "f"; + g.rawNode.appendChild(r); + g.bgNode = r; + return g; // dojox.gfx.Group + }, + createImage: function(image){ + // summary: creates a VML image shape + // image: Object: an image object (see dojox.gfx.defaultImage) + if(!this.rawNode) return null; + var shape = new dojox.gfx.Image(), node = this.rawNode.ownerDocument.createElement('div'); + node.style.position = "absolute"; + node.style.width = this.rawNode.style.width; + node.style.height = this.rawNode.style.height; + //node.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11=1, M12=0, M21=0, M22=1, Dx=0, Dy=0)"; + var img = this.rawNode.ownerDocument.createElement('img'); + img.style.position = "relative"; + node.appendChild(img); + shape.setRawNode(node); + this.rawNode.appendChild(node); + shape.setShape(image); + this.add(shape); + return shape; // dojox.gfx.Image + }, + createObject: function(shapeType, rawShape) { + // summary: creates an instance of the passed shapeType class + // shapeType: Function: a class constructor to create an instance of + // rawShape: Object: properties to be passed in to the classes "setShape" method + // overrideSize: Boolean: set the size explicitly, if true + if(!this.rawNode) return null; + var shape = new shapeType(), + node = this.rawNode.ownerDocument.createElement('v:' + shapeType.nodeType); + shape.setRawNode(node); + this.rawNode.appendChild(node); + switch(shapeType){ + case dojox.gfx.Group: + case dojox.gfx.Line: + case dojox.gfx.Polyline: + case dojox.gfx.Text: + case dojox.gfx.Path: + case dojox.gfx.TextPath: + this._overrideSize(node); + } + shape.setShape(rawShape); + this.add(shape); + return shape; // dojox.gfx.Shape + }, + _overrideSize: function(node){ + var p = this; + while(p && !(p instanceof dojox.gfx.Surface)){ p = p.parent; } + node.style.width = p.width; + node.style.height = p.height; + node.coordsize = p.width + " " + p.height; + } +}); + +dojo.extend(dojox.gfx.Group, dojox.gfx.vml.Container); +dojo.extend(dojox.gfx.Group, dojox.gfx.shape.Creator); + +dojo.extend(dojox.gfx.Surface, dojox.gfx.vml.Container); +dojo.extend(dojox.gfx.Surface, dojox.gfx.shape.Creator); + +} diff --git a/includes/js/dojox/gfx/vml_attach.js b/includes/js/dojox/gfx/vml_attach.js new file mode 100644 index 0000000..b54d31b --- /dev/null +++ b/includes/js/dojox/gfx/vml_attach.js @@ -0,0 +1,362 @@ +dojo.require("dojox.gfx.vml"); + +dojo.experimental("dojox.gfx.vml_attach"); + +(function(){ + dojox.gfx.attachNode = function(node){ + // summary: creates a shape from a Node + // node: Node: an VML node + if(!node) return null; + var s = null; + switch(node.tagName.toLowerCase()){ + case dojox.gfx.Rect.nodeType: + s = new dojox.gfx.Rect(node); + attachRect(s); + break; + case dojox.gfx.Ellipse.nodeType: + if(node.style.width == node.style.height){ + s = new dojox.gfx.Circle(node); + attachCircle(s); + }else{ + s = new dojox.gfx.Ellipse(node); + attachEllipse(s); + } + break; + case dojox.gfx.Path.nodeType: + switch(node.getAttribute("dojoGfxType")){ + case "line": + s = new dojox.gfx.Line(node); + attachLine(s); + break; + case "polyline": + s = new dojox.gfx.Polyline(node); + attachPolyline(s); + break; + case "path": + s = new dojox.gfx.Path(node); + attachPath(s); + break; + case "text": + s = new dojox.gfx.Text(node); + attachText(s); + attachFont(s); + attachTextTransform(s); + break; + case "textpath": + s = new dojox.gfx.TextPath(node); + attachPath(s); + attachText(s); + attachFont(s); + break; + } + break; + case dojox.gfx.Image.nodeType: + switch(node.getAttribute("dojoGfxType")){ + case "image": + s = new dojox.gfx.Image(node); + attachImage(s); + attachImageTransform(s); + break; + } + break; + default: + //console.debug("FATAL ERROR! tagName = " + node.tagName); + return null; + } + if(!(s instanceof dojox.gfx.Image)){ + attachFill(s); + attachStroke(s); + if(!(s instanceof dojox.gfx.Text)){ + attachTransform(s); + } + } + return s; // dojox.gfx.Shape + }; + + dojox.gfx.attachSurface = function(node){ + // summary: creates a surface from a Node + // node: Node: an VML node + var s = new dojox.gfx.Surface(); + s.clipNode = node; + var r = s.rawNode = node.firstChild; + var b = r.firstChild; + if(!b || b.tagName != "rect"){ + return null; // dojox.gfx.Surface + } + s.bgNode = r; + return s; // dojox.gfx.Surface + }; + + var attachFill = function(object){ + // summary: deduces a fill style from a node. + // object: dojox.gfx.Shape: an VML shape + var fillStyle = null, r = object.rawNode, fo = r.fill; + if(fo.on && fo.type == "gradient"){ + var fillStyle = dojo.clone(dojox.gfx.defaultLinearGradient), + rad = dojox.gfx.matrix._degToRad(fo.angle); + fillStyle.x2 = Math.cos(rad); + fillStyle.y2 = Math.sin(rad); + fillStyle.colors = []; + var stops = fo.colors.value.split(";"); + for(var i = 0; i < stops.length; ++i){ + var t = stops[i].match(/\S+/g); + if(!t || t.length != 2){ continue; } + fillStyle.colors.push({offset: dojox.gfx.vml._parseFloat(t[0]), color: new dojo.Color(t[1])}); + } + }else if(fo.on && fo.type == "gradientradial"){ + var fillStyle = dojo.clone(dojox.gfx.defaultRadialGradient), + w = parseFloat(r.style.width), h = parseFloat(r.style.height); + fillStyle.cx = isNaN(w) ? 0 : fo.focusposition.x * w; + fillStyle.cy = isNaN(h) ? 0 : fo.focusposition.y * h; + fillStyle.r = isNaN(w) ? 1 : w / 2; + fillStyle.colors = []; + var stops = fo.colors.value.split(";"); + for(var i = stops.length - 1; i >= 0; --i){ + var t = stops[i].match(/\S+/g); + if(!t || t.length != 2){ continue; } + fillStyle.colors.push({offset: dojox.gfx.vml._parseFloat(t[0]), color: new dojo.Color(t[1])}); + } + }else if(fo.on && fo.type == "tile"){ + var fillStyle = dojo.clone(dojox.gfx.defaultPattern); + fillStyle.width = dojox.gfx.pt2px(fo.size.x); // from pt + fillStyle.height = dojox.gfx.pt2px(fo.size.y); // from pt + fillStyle.x = fo.origin.x * fillStyle.width; + fillStyle.y = fo.origin.y * fillStyle.height; + fillStyle.src = fo.src; + }else if(fo.on && r.fillcolor){ + // a color object ! + fillStyle = new dojo.Color(r.fillcolor+""); + fillStyle.a = fo.opacity; + } + object.fillStyle = fillStyle; + }; + + var attachStroke = function(object) { + // summary: deduces a stroke style from a node. + // object: dojox.gfx.Shape: an VML shape + var r = object.rawNode; + if(!r.stroked){ + object.strokeStyle = null; + return; + } + var strokeStyle = object.strokeStyle = dojo.clone(dojox.gfx.defaultStroke), + rs = r.stroke; + strokeStyle.color = new dojo.Color(r.strokecolor.value); + strokeStyle.width = dojox.gfx.normalizedLength(r.strokeweight+""); + strokeStyle.color.a = rs.opacity; + strokeStyle.cap = this._translate(this._capMapReversed, rs.endcap); + strokeStyle.join = rs.joinstyle == "miter" ? rs.miterlimit : rs.joinstyle; + strokeStyle.style = rs.dashstyle; + }; + + var attachTransform = function(object) { + // summary: deduces a transformation matrix from a node. + // object: dojox.gfx.Shape: an VML shape + var s = rawNode.skew, sm = s.matrix, so = s.offset; + object.matrix = dojox.gfx.matrix.normalize({ + xx: sm.xtox, + xy: sm.ytox, + yx: sm.xtoy, + yy: sm.ytoy, + dx: dojox.gfx.pt2px(so.x), + dy: dojox.gfx.pt2px(so.y) + }); + }; + + var attachGroup = function(object){ + // summary: reconstructs all group shape parameters from a node (VML). + // object: dojox.gfx.Shape: an VML shape + // attach the background + object.bgNode = object.rawNode.firstChild; // TODO: check it first + }; + + var attachRect = function(object){ + // summary: builds a rectangle shape from a node. + // object: dojox.gfx.Shape: an VML shape + // a workaround for the VML's arcsize bug: cannot read arcsize of an instantiated node + var r = object.rawNode, arcsize = r.outerHTML.match(/arcsize = \"(\d*\.?\d+[%f]?)\"/)[1], + style = r.style, width = parseFloat(style.width), height = parseFloat(style.height); + arcsize = (arcsize.indexOf("%") >= 0) ? parseFloat(arcsize) / 100 : dojox.gfx.vml._parseFloat(arcsize); + // make an object + object.shape = dojox.gfx.makeParameters(dojox.gfx.defaultRect, { + x: parseInt(style.left), + y: parseInt(style.top), + width: width, + height: height, + r: Math.min(width, height) * arcsize + }); + }; + + var attachEllipse = function(object){ + // summary: builds an ellipse shape from a node. + // object: dojox.gfx.Shape: an VML shape + var style = object.rawNode.style, + rx = parseInt(style.width ) / 2, + ry = parseInt(style.height) / 2; + object.shape = dojox.gfx.makeParameters(dojox.gfx.defaultEllipse, { + cx: parseInt(style.left) + rx, + cy: parseInt(style.top ) + ry, + rx: rx, + ry: ry + }); + }; + + var attachCircle = function(object){ + // summary: builds a circle shape from a node. + // object: dojox.gfx.Shape: an VML shape + var style = object.rawNode.style, r = parseInt(style.width) / 2; + object.shape = dojox.gfx.makeParameters(dojox.gfx.defaultCircle, { + cx: parseInt(style.left) + r, + cy: parseInt(style.top) + r, + r: r + }); + }; + + var attachLine = function(object){ + // summary: builds a line shape from a node. + // object: dojox.gfx.Shape: an VML shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultLine), + p = object.rawNode.path.v.match(dojox.gfx.pathVmlRegExp); + do{ + if(p.length < 7 || p[0] != "m" || p[3] != "l" || p[6] != "e"){ break; } + shape.x1 = parseInt(p[1]); + shape.y1 = parseInt(p[2]); + shape.x2 = parseInt(p[4]); + shape.y2 = parseInt(p[5]); + }while(false); + }; + + var attachPolyline = function(object){ + // summary: builds a polyline/polygon shape from a node. + // object: dojox.gfx.Shape: an VML shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultPolyline), + p = object.rawNode.path.v.match(dojox.gfx.pathVmlRegExp); + do{ + if(p.length < 3 || p[0] != "m"){ break; } + var x = parseInt(p[0]), y = parseInt(p[1]); + if(isNaN(x) || isNaN(y)){ break; } + shape.points.push({x: x, y: y}); + if(p.length < 6 || p[3] != "l"){ break; } + for(var i = 4; i < p.length; i += 2){ + x = parseInt(p[i]); + y = parseInt(p[i + 1]); + if(isNaN(x) || isNaN(y)){ break; } + shape.points.push({x: x, y: y}); + } + }while(false); + }; + + var attachImage = function(object){ + // summary: builds an image shape from a node. + // object: dojox.gfx.Shape: an VML shape + object.shape = dojo.clone(dojox.gfx.defaultImage); + object.shape.src = object.rawNode.firstChild.src; + }; + + var attachImageTransform = function(object) { + // summary: deduces a transformation matrix from a node. + // object: dojox.gfx.Shape: an VML shape + var m = object.rawNode.filters["DXImageTransform.Microsoft.Matrix"]; + object.matrix = dojox.gfx.matrix.normalize({ + xx: m.M11, + xy: m.M12, + yx: m.M21, + yy: m.M22, + dx: m.Dx, + dy: m.Dy + }); + }; + + var attachText = function(object){ + // summary: builds a text shape from a node. + // object: dojox.gfx.Shape: an VML shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultText), + r = object.rawNode, p = r.path.v.match(dojox.gfx.pathVmlRegExp); + do{ + if(!p || p.length != 7){ break; } + var c = r.childNodes, i = 0; + for(; i < c.length && c[i].tagName != "textpath"; ++i); + if(i >= c.length){ break; } + var s = c[i].style; + shape.text = c[i].string; + switch(s["v-text-align"]){ + case "left": + shape.x = parseInt(p[1]); + shape.align = "start"; + break; + case "center": + shape.x = (parseInt(p[1]) + parseInt(p[4])) / 2; + shape.align = "middle"; + break; + case "right": + shape.x = parseInt(p[4]); + shape.align = "end"; + break; + } + shape.y = parseInt(p[2]); + shape.decoration = s["text-decoration"]; + shape.rotated = s["v-rotate-letters"].toLowerCase() in dojox.gfx.vml._bool; + shape.kerning = s["v-text-kern"].toLowerCase() in dojox.gfx.vml._bool; + return; + }while(false); + object.shape = null; + }; + + var attachFont = function(object){ + // summary: deduces a font style from a node. + // object: dojox.gfx.Shape: an VML shape + var fontStyle = object.fontStyle = dojo.clone(dojox.gfx.defaultFont), + c = object.rawNode.childNodes, i = 0; + for(; i < c.length && c[i].tagName == "textpath"; ++i); + if(i >= c.length){ + object.fontStyle = null; + return; + } + var s = c[i].style; + fontStyle.style = s.fontstyle; + fontStyle.variant = s.fontvariant; + fontStyle.weight = s.fontweight; + fontStyle.size = s.fontsize; + fontStyle.family = s.fontfamily; + }; + + var attachTextTransform = function(object) { + // summary: deduces a transformation matrix from a node. + // object: dojox.gfx.Shape: an VML shape + attachTransform(object); + var matrix = object.matrix, fs = object.fontStyle; + // see comments in _getRealMatrix() + if(matrix && fs){ + object.matrix = dojox.gfx.matrix.multiply(matrix, {dy: dojox.gfx.normalizedLength(fs.size) * 0.35}); + } + }; + + var attachPath = function(object){ + // summary: builds a path shape from a Node. + // object: dojox.gfx.Shape: an VML shape + var shape = object.shape = dojo.clone(dojox.gfx.defaultPath), + p = rawNode.path.v.match(dojox.gfx.pathVmlRegExp), + t = [], skip = false, map = dojox.gfx.Path._pathVmlToSvgMap; + for(var i = 0; i < p.length; ++p){ + var s = p[i]; + if(s in map) { + skip = false; + t.push(map[s]); + } else if(!skip){ + var n = parseInt(s); + if(isNaN(n)){ + skip = true; + }else{ + t.push(n); + } + } + } + var l = t.length; + if(l >= 4 && t[l - 1] == "" && t[l - 2] == 0 && t[l - 3] == 0 && t[l - 4] == "l"){ + t.splice(l - 4, 4); + } + if(l){ + shape.path = t.join(" "); + } + }; +})(); diff --git a/includes/js/dojox/gfx3d.js b/includes/js/dojox/gfx3d.js new file mode 100644 index 0000000..fbd5c63 --- /dev/null +++ b/includes/js/dojox/gfx3d.js @@ -0,0 +1,11 @@ +if(!dojo._hasResource["dojox.gfx3d"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d"] = true; +dojo.provide("dojox.gfx3d"); + +dojo.require("dojox.gfx3d.matrix"); +dojo.require("dojox.gfx3d._base"); +dojo.require("dojox.gfx3d.object"); + + + +} diff --git a/includes/js/dojox/gfx3d/README b/includes/js/dojox/gfx3d/README new file mode 100644 index 0000000..bc7ed4e --- /dev/null +++ b/includes/js/dojox/gfx3d/README @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------- +dojox.gfx3d +------------------------------------------------------------------------------- +Version 0.100 +Release date: 10/31/2007 +------------------------------------------------------------------------------- +Project state: +beta +------------------------------------------------------------------------------- +Credits + Kun Xi (bookstack@gmail.com) + Eugene Lazutkin (eugene.lazutkin@gmail.com) +------------------------------------------------------------------------------- +Project description + +Implementation of simple portable 3D graphics library. +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core, dojox.gfx. +------------------------------------------------------------------------------- +Documentation + +Not ready yet. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/gfx3d.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/gfx3d/* + +Install into the following directory structure: +/dojox/gfx3d/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/gfx3d/_base.js b/includes/js/dojox/gfx3d/_base.js new file mode 100644 index 0000000..dbc7748 --- /dev/null +++ b/includes/js/dojox/gfx3d/_base.js @@ -0,0 +1,19 @@ +if(!dojo._hasResource["dojox.gfx3d._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d._base"] = true; +dojo.provide("dojox.gfx3d._base"); + +dojo.mixin(dojox.gfx3d, { + // summary: defines constants, prototypes, and utility functions + + // default objects, which are used to fill in missing parameters + defaultEdges: {type: "edges", style: null, points: []}, + defaultTriangles: {type: "triangles", style: null, points: []}, + defaultQuads: {type: "quads", style: null, points: []}, + defaultOrbit: {type: "orbit", center: {x: 0, y: 0, z: 0}, radius: 50}, + defaultPath3d: {type: "path3d", path: []}, + defaultPolygon: {type: "polygon", path: []}, + defaultCube: {type: "cube", bottom: {x: 0, y: 0, z: 0}, top: {x: 100, y: 100, z: 100}}, + defaultCylinder: {type: "cylinder", center: /* center of bottom */ {x: 0, y: 0, z: 0}, height: 100, radius: 50} +}); + +} diff --git a/includes/js/dojox/gfx3d/gradient.js b/includes/js/dojox/gfx3d/gradient.js new file mode 100644 index 0000000..fa93720 --- /dev/null +++ b/includes/js/dojox/gfx3d/gradient.js @@ -0,0 +1,41 @@ +if(!dojo._hasResource["dojox.gfx3d.gradient"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d.gradient"] = true; +dojo.provide("dojox.gfx3d.gradient"); + +dojo.require("dojox.gfx3d.vector"); +dojo.require("dojox.gfx3d.matrix"); + +(function(){ + var dist = function(a, b){ return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)); }; + var N = 32; + + dojox.gfx3d.gradient = function(model, material, center, radius, from, to, matrix){ + // summary: calculate a cylindrical gradient + // model: dojox.gfx3d.lighting.Model: color model + // material: Object: defines visual properties + // center: Object: center of the cylinder's bottom + // radius: Number: radius of the cylinder + // from: Number: from position in radians + // to: Number: from position in radians + // matrix: dojox.gfx3d.Matrix3D: the cumulative transformation matrix + // tolerance: Number: tolerable diffirence in colors between gradient steps + + var m = dojox.gfx3d.matrix, v = dojox.gfx3d.vector, mx = m.normalize(matrix), + f = m.multiplyPoint(mx, radius * Math.cos(from) + center.x, radius * Math.sin(from) + center.y, center.z), + t = m.multiplyPoint(mx, radius * Math.cos(to) + center.x, radius * Math.sin(to) + center.y, center.z), + c = m.multiplyPoint(mx, center.x, center.y, center.z), step = (to - from) / N, r = dist(f, t) / 2, + mod = model[material.type], fin = material.finish, pmt = material.color, + colors = [{offset: 0, color: mod.call(model, v.substract(f, c), fin, pmt)}]; + + for(var a = from + step; a < to; a += step){ + var p = m.multiplyPoint(mx, radius * Math.cos(a) + center.x, radius * Math.sin(a) + center.y, center.z), + df = dist(f, p), dt = dist(t, p); + colors.push({offset: df / (df + dt), color: mod.call(model, v.substract(p, c), fin, pmt)}); + } + colors.push({offset: 1, color: mod.call(model, v.substract(t, c), fin, pmt)}); + + return {type: "linear", x1: 0, y1: -r, x2: 0, y2: r, colors: colors}; + }; +})(); + +} diff --git a/includes/js/dojox/gfx3d/lighting.js b/includes/js/dojox/gfx3d/lighting.js new file mode 100644 index 0000000..bbd40de --- /dev/null +++ b/includes/js/dojox/gfx3d/lighting.js @@ -0,0 +1,241 @@ +if(!dojo._hasResource["dojox.gfx3d.lighting"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d.lighting"] = true; +dojo.provide("dojox.gfx3d.lighting"); +dojo.require("dojox.gfx._base"); + +(function(){ + var lite = dojox.gfx3d.lighting; + + dojo.mixin(dojox.gfx3d.lighting, { + // color utilities + black: function(){ + return {r: 0, g: 0, b: 0, a: 1}; + }, + white: function(){ + return {r: 1, g: 1, b: 1, a: 1}; + }, + toStdColor: function(c){ + c = dojox.gfx.normalizeColor(c); + return {r: c.r / 255, g: c.g / 255, b: c.b / 255, a: c.a}; + }, + fromStdColor: function(c){ + return new dojo.Color([Math.round(255 * c.r), Math.round(255 * c.g), Math.round(255 * c.b), c.a]); + }, + scaleColor: function(s, c){ + return {r: s * c.r, g: s * c.g, b: s * c.b, a: s * c.a}; + }, + addColor: function(a, b){ + return {r: a.r + b.r, g: a.g + b.g, b: a.b + b.b, a: a.a + b.a}; + }, + multiplyColor: function(a, b){ + return {r: a.r * b.r, g: a.g * b.g, b: a.b * b.b, a: a.a * b.a}; + }, + saturateColor: function(c){ + return { + r: c.r < 0 ? 0 : c.r > 1 ? 1 : c.r, + g: c.g < 0 ? 0 : c.g > 1 ? 1 : c.g, + b: c.b < 0 ? 0 : c.b > 1 ? 1 : c.b, + a: c.a < 0 ? 0 : c.a > 1 ? 1 : c.a + }; + }, + mixColor: function(c1, c2, s){ + return lite.addColor(lite.scaleColor(s, c1), lite.scaleColor(1 - s, c2)); + }, + diff2Color: function(c1, c2){ + var r = c1.r - c2.r; + var g = c1.g - c2.g; + var b = c1.b - c2.b; + var a = c1.a - c2.a; + return r * r + g * g + b * b + a * a; + }, + length2Color: function(c){ + return c.r * c.r + c.g * c.g + c.b * c.b + c.a * c.a; + }, + + // vector utilities + //TODO: move vector utilities from this file to vector.js + dot: function(a, b){ + return a.x * b.x + a.y * b.y + a.z * b.z; + }, + scale: function(s, v){ + return {x: s * v.x, y: s * v.y, z: s * v.z}; + }, + add: function(a, b){ + return {x: a.x + b.x, y: a.y + b.y, z: a.z + b.z}; + }, + saturate: function(v){ + return Math.min(Math.max(v, 0), 1); + }, + length: function(v){ + return Math.sqrt(dojox.gfx3d.lighting.dot(v, v)); + }, + normalize: function(v){ + return lite.scale(1 / lite.length(v), v); + }, + faceforward: function(n, i){ + var p = dojox.gfx3d.lighting; + var s = p.dot(i, n) < 0 ? 1 : -1; + return p.scale(s, n); + }, + reflect: function(i, n){ + var p = dojox.gfx3d.lighting; + return p.add(i, p.scale(-2 * p.dot(i, n), n)); + }, + + // lighting utilities + diffuse: function(normal, lights){ + var c = lite.black(); + for(var i = 0; i < lights.length; ++i){ + var l = lights[i], + d = lite.dot(lite.normalize(l.direction), normal); + c = lite.addColor(c, lite.scaleColor(d, l.color)); + } + return lite.saturateColor(c); + }, + specular: function(normal, v, roughness, lights){ + var c = lite.black(); + for(var i = 0; i < lights.length; ++i){ + var l = lights[i], + h = lite.normalize(lite.add(lite.normalize(l.direction), v)), + s = Math.pow(Math.max(0, lite.dot(normal, h)), 1 / roughness); + c = lite.addColor(c, lite.scaleColor(s, l.color)); + } + return lite.saturateColor(c); + }, + phong: function(normal, v, size, lights){ + normal = lite.normalize(normal); + var c = lite.black(); + for(var i = 0; i < lights.length; ++i){ + var l = lights[i], + r = lite.reflect(lite.scale(-1, lite.normalize(v)), normal), + s = Math.pow(Math.max(0, lite.dot(r, lite.normalize(l.direction))), size); + c = lite.addColor(c, lite.scaleColor(s, l.color)); + } + return lite.saturateColor(c); + } + }); + + // this lighting model is derived from RenderMan Interface Specification Version 3.2 + + dojo.declare("dojox.gfx3d.lighting.Model", null, { + constructor: function(incident, lights, ambient, specular){ + this.incident = lite.normalize(incident); + this.lights = []; + for(var i = 0; i < lights.length; ++i){ + var l = lights[i]; + this.lights.push({direction: lite.normalize(l.direction), color: lite.toStdColor(l.color)}); + } + this.ambient = lite.toStdColor(ambient.color ? ambient.color : "white"); + this.ambient = lite.scaleColor(ambient.intensity, this.ambient); + this.ambient = lite.scaleColor(this.ambient.a, this.ambient); + this.ambient.a = 1; + this.specular = lite.toStdColor(specular ? specular : "white"); + this.specular = lite.scaleColor(this.specular.a, this.specular); + this.specular.a = 1; + this.npr_cool = {r: 0, g: 0, b: 0.4, a: 1}; + this.npr_warm = {r: 0.4, g: 0.4, b: 0.2, a: 1}; + this.npr_alpha = 0.2; + this.npr_beta = 0.6; + this.npr_scale = 0.6; + }, + constant: function(normal, finish, pigment){ + pigment = lite.toStdColor(pigment); + var alpha = pigment.a, color = lite.scaleColor(alpha, pigment); + color.a = alpha; + return lite.fromStdColor(lite.saturateColor(color)); + }, + matte: function(normal, finish, pigment){ + if(typeof finish == "string"){ finish = lite.finish[finish]; } + pigment = lite.toStdColor(pigment); + normal = lite.faceforward(lite.normalize(normal), this.incident); + var ambient = lite.scaleColor(finish.Ka, this.ambient), + shadow = lite.saturate(-4 * lite.dot(normal, this.incident)), + diffuse = lite.scaleColor(shadow * finish.Kd, lite.diffuse(normal, this.lights)), + color = lite.scaleColor(pigment.a, lite.multiplyColor(pigment, lite.addColor(ambient, diffuse))); + color.a = pigment.a; + return lite.fromStdColor(lite.saturateColor(color)); + }, + metal: function(normal, finish, pigment){ + if(typeof finish == "string"){ finish = lite.finish[finish]; } + pigment = lite.toStdColor(pigment); + normal = lite.faceforward(lite.normalize(normal), this.incident); + var v = lite.scale(-1, this.incident), specular, color, + ambient = lite.scaleColor(finish.Ka, this.ambient), + shadow = lite.saturate(-4 * lite.dot(normal, this.incident)); + if("phong" in finish){ + specular = lite.scaleColor(shadow * finish.Ks * finish.phong, lite.phong(normal, v, finish.phong_size, this.lights)); + }else{ + specular = lite.scaleColor(shadow * finish.Ks, lite.specular(normal, v, finish.roughness, this.lights)); + } + color = lite.scaleColor(pigment.a, lite.addColor(lite.multiplyColor(pigment, ambient), lite.multiplyColor(this.specular, specular))); + color.a = pigment.a; + return lite.fromStdColor(lite.saturateColor(color)); + }, + plastic: function(normal, finish, pigment){ + if(typeof finish == "string"){ finish = lite.finish[finish]; } + pigment = lite.toStdColor(pigment); + normal = lite.faceforward(lite.normalize(normal), this.incident); + var v = lite.scale(-1, this.incident), specular, color, + ambient = lite.scaleColor(finish.Ka, this.ambient), + shadow = lite.saturate(-4 * lite.dot(normal, this.incident)), + diffuse = lite.scaleColor(shadow * finish.Kd, lite.diffuse(normal, this.lights)); + if("phong" in finish){ + specular = lite.scaleColor(shadow * finish.Ks * finish.phong, lite.phong(normal, v, finish.phong_size, this.lights)); + }else{ + specular = lite.scaleColor(shadow * finish.Ks, lite.specular(normal, v, finish.roughness, this.lights)); + } + color = lite.scaleColor(pigment.a, lite.addColor(lite.multiplyColor(pigment, lite.addColor(ambient, diffuse)), lite.multiplyColor(this.specular, specular))); + color.a = pigment.a; + return lite.fromStdColor(lite.saturateColor(color)); + }, + npr: function(normal, finish, pigment){ + if(typeof finish == "string"){ finish = lite.finish[finish]; } + pigment = lite.toStdColor(pigment); + normal = lite.faceforward(lite.normalize(normal), this.incident); + var ambient = lite.scaleColor(finish.Ka, this.ambient), + shadow = lite.saturate(-4 * lite.dot(normal, this.incident)), + diffuse = lite.scaleColor(shadow * finish.Kd, lite.diffuse(normal, this.lights)), + color = lite.scaleColor(pigment.a, lite.multiplyColor(pigment, lite.addColor(ambient, diffuse))), + cool = lite.addColor(this.npr_cool, lite.scaleColor(this.npr_alpha, color)), + warm = lite.addColor(this.npr_warm, lite.scaleColor(this.npr_beta, color)), + d = (1 + lite.dot(this.incident, normal)) / 2, + color = lite.scaleColor(this.npr_scale, lite.addColor(color, lite.mixColor(cool, warm, d))); + color.a = pigment.a; + return lite.fromStdColor(lite.saturateColor(color)); + } + }); +})(); + +// POV-Ray basic finishes + +dojox.gfx3d.lighting.finish = { + + // Default + + defaults: {Ka: 0.1, Kd: 0.6, Ks: 0.0, roughness: 0.05}, + + dull: {Ka: 0.1, Kd: 0.6, Ks: 0.5, roughness: 0.15}, + shiny: {Ka: 0.1, Kd: 0.6, Ks: 1.0, roughness: 0.001}, + glossy: {Ka: 0.1, Kd: 0.6, Ks: 1.0, roughness: 0.0001}, + + phong_dull: {Ka: 0.1, Kd: 0.6, Ks: 0.5, phong: 0.5, phong_size: 1}, + phong_shiny: {Ka: 0.1, Kd: 0.6, Ks: 1.0, phong: 1.0, phong_size: 200}, + phong_glossy: {Ka: 0.1, Kd: 0.6, Ks: 1.0, phong: 1.0, phong_size: 300}, + + luminous: {Ka: 1.0, Kd: 0.0, Ks: 0.0, roughness: 0.05}, + + // Metals + + // very soft and dull + metalA: {Ka: 0.35, Kd: 0.3, Ks: 0.8, roughness: 1/20}, + // fairly soft and dull + metalB: {Ka: 0.30, Kd: 0.4, Ks: 0.7, roughness: 1/60}, + // medium reflectivity, holds color well + metalC: {Ka: 0.25, Kd: 0.5, Ks: 0.8, roughness: 1/80}, + // highly hard and polished, high reflectivity + metalD: {Ka: 0.15, Kd: 0.6, Ks: 0.8, roughness: 1/100}, + // very highly polished and reflective + metalE: {Ka: 0.10, Kd: 0.7, Ks: 0.8, roughness: 1/120} +}; + +} diff --git a/includes/js/dojox/gfx3d/matrix.js b/includes/js/dojox/gfx3d/matrix.js new file mode 100644 index 0000000..277b7d5 --- /dev/null +++ b/includes/js/dojox/gfx3d/matrix.js @@ -0,0 +1,339 @@ +if(!dojo._hasResource["dojox.gfx3d.matrix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d.matrix"] = true; +dojo.provide("dojox.gfx3d.matrix"); + +// candidates for dojox.math: +dojox.gfx3d.matrix._degToRad = function(degree){ return Math.PI * degree / 180; }; +dojox.gfx3d.matrix._radToDeg = function(radian){ return radian / Math.PI * 180; }; + +dojox.gfx3d.matrix.Matrix3D = function(arg){ + // summary: a 3D matrix object + // description: Normalizes a 3D matrix-like object. If arrays is passed, + // all objects of the array are normalized and multiplied sequentially. + // arg: Object + // a 3D matrix-like object, a number, or an array of such objects + if(arg){ + if(typeof arg == "number"){ + this.xx = this.yy = this.zz = arg; + }else if(arg instanceof Array){ + if(arg.length > 0){ + var m = dojox.gfx3d.matrix.normalize(arg[0]); + // combine matrices + for(var i = 1; i < arg.length; ++i){ + var l = m; + var r = dojox.gfx3d.matrix.normalize(arg[i]); + m = new dojox.gfx3d.matrix.Matrix3D(); + m.xx = l.xx * r.xx + l.xy * r.yx + l.xz * r.zx; + m.xy = l.xx * r.xy + l.xy * r.yy + l.xz * r.zy; + m.xz = l.xx * r.xz + l.xy * r.yz + l.xz * r.zz; + m.yx = l.yx * r.xx + l.yy * r.yx + l.yz * r.zx; + m.yy = l.yx * r.xy + l.yy * r.yy + l.yz * r.zy; + m.yz = l.yx * r.xz + l.yy * r.yz + l.yz * r.zz; + m.zx = l.zx * r.xx + l.zy * r.yx + l.zz * r.zx; + m.zy = l.zx * r.xy + l.zy * r.yy + l.zz * r.zy; + m.zz = l.zx * r.xz + l.zy * r.yz + l.zz * r.zz; + m.dx = l.xx * r.dx + l.xy * r.dy + l.xz * r.dz + l.dx; + m.dy = l.yx * r.dx + l.yy * r.dy + l.yz * r.dz + l.dy; + m.dz = l.zx * r.dx + l.zy * r.dy + l.zz * r.dz + l.dz; + } + dojo.mixin(this, m); + } + }else{ + dojo.mixin(this, arg); + } + } +}; + +// the default (identity) matrix, which is used to fill in missing values +dojo.extend(dojox.gfx3d.matrix.Matrix3D, {xx: 1, xy: 0, xz: 0, yx: 0, yy: 1, yz: 0, zx: 0, zy: 0, zz: 1, dx: 0, dy: 0, dz: 0}); + +dojo.mixin(dojox.gfx3d.matrix, { + // summary: class constants, and methods of dojox.gfx3d.matrix + + // matrix constants + + // identity: dojox.gfx3d.matrix.Matrix3D + // an identity matrix constant: identity * (x, y, z) == (x, y, z) + identity: new dojox.gfx3d.matrix.Matrix3D(), + + // matrix creators + + translate: function(a, b, c){ + // summary: forms a translation matrix + // description: The resulting matrix is used to translate (move) points by specified offsets. + // a: Number: an x coordinate value + // b: Number: a y coordinate value + // c: Number: a z coordinate value + if(arguments.length > 1){ + return new dojox.gfx3d.matrix.Matrix3D({dx: a, dy: b, dz: c}); // dojox.gfx3d.matrix.Matrix3D + } + // branch + // a: Object: a point-like object, which specifies offsets for 3 dimensions + // b: null + return new dojox.gfx3d.matrix.Matrix3D({dx: a.x, dy: a.y, dz: a.z}); // dojox.gfx3d.matrix.Matrix3D + }, + scale: function(a, b, c){ + // summary: forms a scaling matrix + // description: The resulting matrix is used to scale (magnify) points by specified offsets. + // a: Number: a scaling factor used for the x coordinate + // b: Number: a scaling factor used for the y coordinate + // c: Number: a scaling factor used for the z coordinate + if(arguments.length > 1){ + return new dojox.gfx3d.matrix.Matrix3D({xx: a, yy: b, zz: c}); // dojox.gfx3d.matrix.Matrix3D + } + if(typeof a == "number"){ + // branch + // a: Number: a uniform scaling factor used for the all coordinates + // b: null + return new dojox.gfx3d.matrix.Matrix3D({xx: a, yy: a, zz: a}); // dojox.gfx3d.matrix.Matrix3D + } + // branch + // a: Object: a point-like object, which specifies scale factors for 3 dimensions + // b: null + return new dojox.gfx3d.matrix.Matrix3D({xx: a.x, yy: a.y, zz: a.z}); // dojox.gfx3d.matrix.Matrix3D + }, + rotateX: function(angle){ + // summary: forms a rotating matrix (about the x axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(angle); + var s = Math.sin(angle); + return new dojox.gfx3d.matrix.Matrix3D({yy: c, yz: -s, zy: s, zz: c}); // dojox.gfx3d.matrix.Matrix3D + }, + rotateXg: function(degree){ + // summary: forms a rotating matrix (about the x axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateX() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + rotateY: function(angle){ + // summary: forms a rotating matrix (about the y axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(angle); + var s = Math.sin(angle); + return new dojox.gfx3d.matrix.Matrix3D({xx: c, xz: s, zx: -s, zz: c}); // dojox.gfx3d.matrix.Matrix3D + }, + rotateYg: function(degree){ + // summary: forms a rotating matrix (about the y axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateY() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + rotateZ: function(angle){ + // summary: forms a rotating matrix (about the z axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(angle); + var s = Math.sin(angle); + return new dojox.gfx3d.matrix.Matrix3D({xx: c, xy: -s, yx: s, yy: c}); // dojox.gfx3d.matrix.Matrix3D + }, + rotateZg: function(degree){ + // summary: forms a rotating matrix (about the z axis) + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateZ() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + + // camera transformation + cameraTranslate: function(a, b, c){ + // summary: forms a translation matrix + // description: The resulting matrix is used to translate (move) points by specified offsets. + // a: Number: an x coordinate value + // b: Number: a y coordinate value + // c: Number: a z coordinate value + if(arguments.length > 1){ + return new dojox.gfx3d.matrix.Matrix3D({dx: -a, dy: -b, dz: -c}); // dojox.gfx3d.matrix.Matrix3D + } + // branch + // a: Object: a point-like object, which specifies offsets for 3 dimensions + // b: null + return new dojox.gfx3d.matrix.Matrix3D({dx: -a.x, dy: -a.y, dz: -a.z}); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateX: function(angle){ + // summary: forms a rotating matrix (about the x axis) in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(-angle); + var s = Math.sin(-angle); + return new dojox.gfx3d.matrix.Matrix3D({yy: c, yz: -s, zy: s, zz: c}); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateXg: function(degree){ + // summary: forms a rotating matrix (about the x axis)in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateX() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateY: function(angle){ + // summary: forms a rotating matrix (about the y axis) in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(-angle); + var s = Math.sin(-angle); + return new dojox.gfx3d.matrix.Matrix3D({xx: c, xz: s, zx: -s, zz: c}); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateYg: function(degree){ + // summary: forms a rotating matrix (about the y axis) in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateY() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateZ: function(angle){ + // summary: forms a rotating matrix (about the z axis) in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified angle. + // angle: Number: an angle of rotation in radians (>0 for CW) + var c = Math.cos(-angle); + var s = Math.sin(-angle); + return new dojox.gfx3d.matrix.Matrix3D({xx: c, xy: -s, yx: s, yy: c}); // dojox.gfx3d.matrix.Matrix3D + }, + cameraRotateZg: function(degree){ + // summary: forms a rotating matrix (about the z axis) in cameraTransform manner + // description: The resulting matrix is used to rotate points + // around the origin of coordinates (0, 0) by specified degree. + // See dojox.gfx3d.matrix.rotateZ() for comparison. + // degree: Number: an angle of rotation in degrees (>0 for CW) + return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(degree)); // dojox.gfx3d.matrix.Matrix3D + }, + + // ensure matrix 3D conformance + normalize: function(matrix){ + // summary: converts an object to a matrix, if necessary + // description: Converts any 3D matrix-like object or an array of + // such objects to a valid dojox.gfx3d.matrix.Matrix3D object. + // matrix: Object: an object, which is converted to a matrix, if necessary + return (matrix instanceof dojox.gfx3d.matrix.Matrix3D) ? matrix : new dojox.gfx3d.matrix.Matrix3D(matrix); // dojox.gfx3d.matrix.Matrix3D + }, + + // common operations + + clone: function(matrix){ + // summary: creates a copy of a 3D matrix + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix-like object to be cloned + var obj = new dojox.gfx3d.matrix.Matrix3D(); + for(var i in matrix){ + if(typeof(matrix[i]) == "number" && typeof(obj[i]) == "number" && obj[i] != matrix[i]) obj[i] = matrix[i]; + } + return obj; // dojox.gfx3d.matrix.Matrix3D + }, + invert: function(matrix){ + // summary: inverts a 2D matrix + // matrix: dojox.gfx.matrix.Matrix3D: a 2D matrix-like object to be inverted + var m = dojox.gfx3d.matrix.normalize(matrix); + var D = m.xx * m.yy * m.zz + m.xy * m.yz * m.zx + m.xz * m.yx * m.zy - m.xx * m.yz * m.zy - m.xy * m.yx * m.zz - m.xz * m.yy * m.zx; + var M = new dojox.gfx3d.matrix.Matrix3D({ + xx: (m.yy * m.zz - m.yz * m.zy) / D, + xy: (m.xz * m.zy - m.xy * m.zz) / D, + xz: (m.xy * m.yz - m.xz * m.yy) / D, + yx: (m.yz * m.zx - m.yx * m.zz) / D, + yy: (m.xx * m.zz - m.xz * m.zx) / D, + yz: (m.xz * m.yx - m.xx * m.yz) / D, + zx: (m.yx * m.zy - m.yy * m.zx) / D, + zy: (m.xy * m.zx - m.xx * m.zy) / D, + zz: (m.xx * m.yy - m.xy * m.yx) / D, + dx: -1 * (m.xy * m.yz * m.dz + m.xz * m.dy * m.zy + m.dx * m.yy * m.zz - m.xy * m.dy * m.zz - m.xz * m.yy * m.dz - m.dx * m.yz * m.zy) / D, + dy: (m.xx * m.yz * m.dz + m.xz * m.dy * m.zx + m.dx * m.yx * m.zz - m.xx * m.dy * m.zz - m.xz * m.yx * m.dz - m.dx * m.yz * m.zx) / D, + dz: -1 * (m.xx * m.yy * m.dz + m.xy * m.dy * m.zx + m.dx * m.yx * m.zy - m.xx * m.dy * m.zy - m.xy * m.yx * m.dz - m.dx * m.yy * m.zx) / D + }); + return M; // dojox.gfx3d.matrix.Matrix3D + }, + _multiplyPoint: function(m, x, y, z){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // x: Number: an x coordinate of a point + // y: Number: a y coordinate of a point + // z: Number: a z coordinate of a point + return {x: m.xx * x + m.xy * y + m.xz * z + m.dx, y: m.yx * x + m.yy * y + m.yz * z + m.dy, z: m.zx * x + m.zy * y + m.zz * z + m.dz}; // Object + }, + multiplyPoint: function(matrix, /* Number||Point */ a, /* Number, optional */ b, /* Number, optional */ c){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Number: an x coordinate of a point + // b: Number: a y coordinate of a point + // c: Number: a z coordinate of a point + var m = dojox.gfx3d.matrix.normalize(matrix); + if(typeof a == "number" && typeof b == "number" && typeof c == "number"){ + return dojox.gfx3d.matrix._multiplyPoint(m, a, b, c); // Object + } + // branch + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Object: a point + // b: null + // c: null + return dojox.gfx3d.matrix._multiplyPoint(m, a.x, a.y, a.z); // Object + }, + multiply: function(matrix){ + // summary: combines matrices by multiplying them sequentially in the given order + // matrix: dojox.gfx3d.matrix.Matrix3D...: a 3D matrix-like object, + // all subsequent arguments are matrix-like objects too + var m = dojox.gfx3d.matrix.normalize(matrix); + // combine matrices + for(var i = 1; i < arguments.length; ++i){ + var l = m; + var r = dojox.gfx3d.matrix.normalize(arguments[i]); + m = new dojox.gfx3d.matrix.Matrix3D(); + m.xx = l.xx * r.xx + l.xy * r.yx + l.xz * r.zx; + m.xy = l.xx * r.xy + l.xy * r.yy + l.xz * r.zy; + m.xz = l.xx * r.xz + l.xy * r.yz + l.xz * r.zz; + m.yx = l.yx * r.xx + l.yy * r.yx + l.yz * r.zx; + m.yy = l.yx * r.xy + l.yy * r.yy + l.yz * r.zy; + m.yz = l.yx * r.xz + l.yy * r.yz + l.yz * r.zz; + m.zx = l.zx * r.xx + l.zy * r.yx + l.zz * r.zx; + m.zy = l.zx * r.xy + l.zy * r.yy + l.zz * r.zy; + m.zz = l.zx * r.xz + l.zy * r.yz + l.zz * r.zz; + m.dx = l.xx * r.dx + l.xy * r.dy + l.xz * r.dz + l.dx; + m.dy = l.yx * r.dx + l.yy * r.dy + l.yz * r.dz + l.dy; + m.dz = l.zx * r.dx + l.zy * r.dy + l.zz * r.dz + l.dz; + } + return m; // dojox.gfx3d.matrix.Matrix3D + }, + + _project: function(m, x, y, z){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // x: Number: an x coordinate of a point + // y: Number: a y coordinate of a point + // z: Number: a z coordinate of a point + return { // Object + x: m.xx * x + m.xy * y + m.xz * z + m.dx, + y: m.yx * x + m.yy * y + m.yz * z + m.dy, + z: m.zx * x + m.zy * y + m.zz * z + m.dz}; + }, + project: function(matrix, /* Number||Point */ a, /* Number, optional */ b, /* Number, optional */ c){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Number: an x coordinate of a point + // b: Number: a y coordinate of a point + // c: Number: a z coordinate of a point + var m = dojox.gfx3d.matrix.normalize(matrix); + if(typeof a == "number" && typeof b == "number" && typeof c == "number"){ + return dojox.gfx3d.matrix._project(m, a, b, c); // Object + } + // branch + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Object: a point + // b: null + // c: null + return dojox.gfx3d.matrix._project(m, a.x, a.y, a.z); // Object + } +}); + +// propagate matrix up +dojox.gfx3d.Matrix3D = dojox.gfx3d.matrix.Matrix3D; + +} diff --git a/includes/js/dojox/gfx3d/object.js b/includes/js/dojox/gfx3d/object.js new file mode 100644 index 0000000..e574c91 --- /dev/null +++ b/includes/js/dojox/gfx3d/object.js @@ -0,0 +1,1092 @@ +if(!dojo._hasResource["dojox.gfx3d.object"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d.object"] = true; +dojo.provide("dojox.gfx3d.object"); + +dojo.require("dojox.gfx"); +dojo.require("dojox.gfx3d.lighting"); +dojo.require("dojox.gfx3d.scheduler"); +dojo.require("dojox.gfx3d.vector"); +dojo.require("dojox.gfx3d.gradient"); + +// FIXME: why the global "out" var here? +var out = function(o, x){ + if(arguments.length > 1){ + // console.debug("debug:", o); + o = x; + } + var e = {}; + for(var i in o){ + if(i in e){ continue; } + // console.debug("debug:", i, typeof o[i], o[i]); + } +}; + +dojo.declare("dojox.gfx3d.Object", null, { + constructor: function(){ + // summary: a Object object, which knows how to map + // 3D objects to 2D shapes. + + // object: Object: an abstract Object object + // (see dojox.gfx3d.defaultEdges, + // dojox.gfx3d.defaultTriangles, + // dojox.gfx3d.defaultQuads + // dojox.gfx3d.defaultOrbit + // dojox.gfx3d.defaultCube + // or dojox.gfx3d.defaultCylinder) + this.object = null; + + // matrix: dojox.gfx3d.matrix: world transform + this.matrix = null; + // cache: buffer for intermediate result, used late for draw() + this.cache = null; + // renderer: a reference for the Viewport + this.renderer = null; + // parent: a reference for parent, Scene or Viewport object + this.parent = null; + + // strokeStyle: Object: a stroke object + this.strokeStyle = null; + // fillStyle: Object: a fill object or texture object + this.fillStyle = null; + // shape: dojox.gfx.Shape: an underlying 2D shape + this.shape = null; + }, + + setObject: function(newObject){ + // summary: sets a Object object + // object: Object: an abstract Object object + // (see dojox.gfx3d.defaultEdges, + // dojox.gfx3d.defaultTriangles, + // dojox.gfx3d.defaultQuads + // dojox.gfx3d.defaultOrbit + // dojox.gfx3d.defaultCube + // or dojox.gfx3d.defaultCylinder) + this.object = dojox.gfx.makeParameters(this.object, newObject); + return this; + }, + + setTransform: function(matrix){ + // summary: sets a transformation matrix + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx3d.matrix.Matrix + // constructor for a list of acceptable arguments) + this.matrix = dojox.gfx3d.matrix.clone(matrix ? dojox.gfx3d.matrix.normalize(matrix) : dojox.gfx3d.identity, true); + return this; // self + }, + + // apply left & right transformation + + applyRightTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on right side + // (this.matrix * matrix) + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx.matrix.Matrix + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([this.matrix, matrix]) : this; // self + }, + applyLeftTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on left side + // (matrix * this.matrix) + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx.matrix.Matrix + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([matrix, this.matrix]) : this; // self + }, + + applyTransform: function(matrix){ + // summary: a shortcut for dojox.gfx.Shape.applyRightTransform + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx.matrix.Matrix + // constructor for a list of acceptable arguments) + return matrix ? this.setTransform([this.matrix, matrix]) : this; // self + }, + + setFill: function(fill){ + // summary: sets a fill object + // (the default implementation is to delegate to + // the underlying 2D shape). + // fill: Object: a fill object + // (see dojox.gfx.defaultLinearGradient, + // dojox.gfx.defaultRadialGradient, + // dojox.gfx.defaultPattern, + // dojo.Color + // or dojox.gfx.MODEL) + this.fillStyle = fill; + return this; + }, + + setStroke: function(stroke){ + // summary: sets a stroke object + // (the default implementation simply ignores it) + // stroke: Object: a stroke object + // (see dojox.gfx.defaultStroke) + this.strokeStyle = stroke; + return this; + }, + + toStdFill: function(lighting, normal){ + return (this.fillStyle && typeof this.fillStyle['type'] != "undefined") ? lighting[this.fillStyle.type](normal, this.fillStyle.finish, this.fillStyle.color) : this.fillStyle; + }, + + invalidate: function(){ + this.renderer.addTodo(this); + }, + + destroy: function(){ + if(this.shape){ + var p = this.shape.getParent(); + if(p){ + p.remove(this.shape); + } + this.shape = null; + } + }, + + // All the 3D objects need to override the following virtual functions: + // render, getZOrder, getOutline, draw, redraw if necessary. + + render: function(camera){ + throw "Pure virtual function, not implemented"; + }, + + draw: function(lighting){ + throw "Pure virtual function, not implemented"; + }, + + getZOrder: function(){ + return 0; + }, + + getOutline: function(){ + return null; + } + +}); + +dojo.declare("dojox.gfx3d.Scene", dojox.gfx3d.Object, { + // summary: the Scene is just a containter. + // note: we have the following assumption: + // all objects in the Scene are not overlapped with other objects + // outside of the scene. + constructor: function(){ + // summary: a containter of other 3D objects + this.objects= []; + this.todos = []; + this.schedule = dojox.gfx3d.scheduler.zOrder; + this._draw = dojox.gfx3d.drawer.conservative; + }, + + setFill: function(fill){ + this.fillStyle = fill; + dojo.forEach(this.objects, function(item){ + item.setFill(fill); + }); + return this; + }, + + setStroke: function(stroke){ + this.strokeStyle = stroke; + dojo.forEach(this.objects, function(item){ + item.setStroke(stroke); + }); + return this; + }, + + render: function(camera, deep){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + if(deep){ + this.todos = this.objects; + } + dojo.forEach(this.todos, function(item){ item.render(m, deep); }); + }, + + draw: function(lighting){ + this.objects = this.schedule(this.objects); + this._draw(this.todos, this.objects, this.renderer); + }, + + addTodo: function(newObject){ + // FIXME: use indexOf? + if(dojo.every(this.todos, function(item){ return item != newObject; })){ + this.todos.push(newObject); + this.invalidate(); + } + }, + + invalidate: function(){ + this.parent.addTodo(this); + }, + + getZOrder: function(){ + var zOrder = 0; + dojo.forEach(this.objects, function(item){ zOrder += item.getZOrder(); }); + return (this.objects.length > 1) ? zOrder / this.objects.length : 0; + } +}); + + +dojo.declare("dojox.gfx3d.Edges", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic edge in 3D viewport + this.object = dojo.clone(dojox.gfx3d.defaultEdges); + }, + + setObject: function(newObject, /* String, optional */ style){ + // summary: setup the object + // newObject: Array of points || Object + // style: String, optional + this.object = dojox.gfx.makeParameters(this.object, (newObject instanceof Array) ? { points: newObject, style: style } : newObject); + return this; + }, + + getZOrder: function(){ + var zOrder = 0; + dojo.forEach(this.cache, function(item){ zOrder += item.z;} ); + return (this.cache.length > 1) ? zOrder / this.cache.length : 0; + }, + + render: function(camera){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + this.cache = dojo.map(this.object.points, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + }, + + draw: function(){ + var c = this.cache; + if(this.shape){ + this.shape.setShape("") + }else{ + this.shape = this.renderer.createPath(); + } + var p = this.shape.setAbsoluteMode("absolute"); + + if(this.object.style == "strip" || this.object.style == "loop"){ + p.moveTo(c[0].x, c[0].y); + dojo.forEach(c.slice(1), function(item){ + p.lineTo(item.x, item.y); + }); + if(this.object.style == "loop"){ + p.closePath(); + } + }else{ + for(var i = 0; i < this.cache.length; ){ + p.moveTo(c[i].x, c[i].y); + i ++; + p.lineTo(c[i].x, c[i].y); + i ++; + } + } + // FIXME: doe setFill make sense here? + p.setStroke(this.strokeStyle); + } +}); + +dojo.declare("dojox.gfx3d.Orbit", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic edge in 3D viewport + this.object = dojo.clone(dojox.gfx3d.defaultOrbit); + }, + + render: function(camera){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + var angles = [0, Math.PI/4, Math.PI/3]; + var center = dojox.gfx3d.matrix.multiplyPoint(m, this.object.center); + var marks = dojo.map(angles, function(item){ + return {x: this.center.x + this.radius * Math.cos(item), + y: this.center.y + this.radius * Math.sin(item), z: this.center.z}; + }, this.object); + + marks = dojo.map(marks, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + + var normal = dojox.gfx3d.vector.normalize(marks); + + marks = dojo.map(marks, function(item){ + return dojox.gfx3d.vector.substract(item, center); + }); + + // Use the algorithm here: + // http://www.3dsoftware.com/Math/PlaneCurves/EllipseAlgebra/ + // After we normalize the marks, the equation is: + // a x^2 + 2b xy + cy^2 + f = 0: let a = 1 + // so the final equation is: + // [ xy, y^2, 1] * [2b, c, f]' = [ -x^2 ]' + + var A = { + xx: marks[0].x * marks[0].y, xy: marks[0].y * marks[0].y, xz: 1, + yx: marks[1].x * marks[1].y, yy: marks[1].y * marks[1].y, yz: 1, + zx: marks[2].x * marks[2].y, zy: marks[2].y * marks[2].y, zz: 1, + dx: 0, dy: 0, dz: 0 + }; + var b = dojo.map(marks, function(item){ + return -Math.pow(item.x, 2); + }); + + // X is 2b, c, f + var X = dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),b[0], b[1], b[2]); + var theta = Math.atan2(X.x, 1 - X.y) / 2; + + // rotate the marks back to the canonical form + var probes = dojo.map(marks, function(item){ + return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-theta), item.x, item.y); + }); + + // we are solving the equation: Ax = b + // A = [x^2, y^2] X = [1/a^2, 1/b^2]', b = [1, 1]' + // so rx = Math.sqrt(1/ ( inv(A)[1:] * b ) ); + // so ry = Math.sqrt(1/ ( inv(A)[2:] * b ) ); + + var a = Math.pow(probes[0].x, 2); + var b = Math.pow(probes[0].y, 2); + var c = Math.pow(probes[1].x, 2); + var d = Math.pow(probes[1].y, 2); + + // the invert matrix is + // 1/(ad -bc) [ d, -b; -c, a]; + var rx = Math.sqrt( (a*d - b*c)/ (d-b) ); + var ry = Math.sqrt( (a*d - b*c)/ (a-c) ); + + this.cache = {cx: center.x, cy: center.y, rx: rx, ry: ry, theta: theta, normal: normal}; + }, + + draw: function(lighting){ + if(this.shape){ + this.shape.setShape(this.cache); + } else { + this.shape = this.renderer.createEllipse(this.cache); + } + this.shape.applyTransform(dojox.gfx.matrix.rotateAt(this.cache.theta, this.cache.cx, this.cache.cy)) + .setStroke(this.strokeStyle) + .setFill(this.toStdFill(lighting, this.cache.normal)); + } +}); + +dojo.declare("dojox.gfx3d.Path3d", dojox.gfx3d.Object, { + // This object is still very immature ! + constructor: function(){ + // summary: a generic line + // (this is a helper object, which is defined for convenience) + this.object = dojo.clone(dojox.gfx3d.defaultPath3d); + this.segments = []; + this.absolute = true; + this.last = {}; + this.path = ""; + }, + + _collectArgs: function(array, args){ + // summary: converts an array of arguments to plain numeric values + // array: Array: an output argument (array of numbers) + // args: Array: an input argument (can be values of Boolean, Number, dojox.gfx.Point, or an embedded array of them) + for(var i = 0; i < args.length; ++i){ + var t = args[i]; + if(typeof(t) == "boolean"){ + array.push(t ? 1 : 0); + }else if(typeof(t) == "number"){ + array.push(t); + }else if(t instanceof Array){ + this._collectArgs(array, t); + }else if("x" in t && "y" in t){ + array.push(t.x); + array.push(t.y); + } + } + }, + + // a dictionary, which maps segment type codes to a number of their argemnts + _validSegments: {m: 3, l: 3, z: 0}, + + _pushSegment: function(action, args){ + // summary: adds a segment + // action: String: valid SVG code for a segment's type + // args: Array: a list of parameters for this segment + var group = this._validSegments[action.toLowerCase()]; + if(typeof(group) == "number"){ + if(group){ + if(args.length >= group){ + var segment = {action: action, args: args.slice(0, args.length - args.length % group)}; + this.segments.push(segment); + } + }else{ + var segment = {action: action, args: []}; + this.segments.push(segment); + } + } + }, + + moveTo: function(){ + // summary: formes a move segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "M" : "m", args); + return this; // self + }, + lineTo: function(){ + // summary: formes a line segment + var args = []; + this._collectArgs(args, arguments); + this._pushSegment(this.absolute ? "L" : "l", args); + return this; // self + }, + + closePath: function(){ + // summary: closes a path + this._pushSegment("Z", []); + return this; // self + }, + + render: function(camera){ + // TODO: we need to get the ancestors' matrix + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + // iterate all the segments and convert them to 2D canvas + // TODO consider the relative mode + var path = "" + var _validSegments = this._validSegments; + dojo.forEach(this.segments, function(item){ + path += item.action; + for(var i = 0; i < item.args.length; i+= _validSegments[item.action.toLowerCase()] ){ + var pt = dojox.gfx3d.matrix.multiplyPoint(m, item.args[i], item.args[i+1], item.args[i+2]) + path += " " + pt.x + " " + pt.y; + } + }); + + this.cache = path; + }, + + _draw: function(){ + return this.parent.createPath(this.cache); + } +}); + +dojo.declare("dojox.gfx3d.Triangles", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic triangle + // (this is a helper object, which is defined for convenience) + this.object = dojo.clone(dojox.gfx3d.defaultTriangles); + }, + + setObject: function(newObject, /* String, optional */ style){ + // summary: setup the object + // newObject: Array of points || Object + // style: String, optional + if(newObject instanceof Array){ + this.object = dojox.gfx.makeParameters(this.object, { points: newObject, style: style } ); + } else { + this.object = dojox.gfx.makeParameters(this.object, newObject); + } + return this; + }, + render: function(camera){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + var c = dojo.map(this.object.points, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + this.cache = []; + var pool = c.slice(0, 2); + var center = c[0]; + if(this.object.style == "strip"){ + dojo.forEach(c.slice(2), function(item){ + pool.push(item); + pool.push(pool[0]); + this.cache.push(pool); + pool = pool.slice(1, 3); + }, this); + } else if(this.object.style == "fan"){ + dojo.forEach(c.slice(2), function(item){ + pool.push(item); + pool.push(center); + this.cache.push(pool); + pool = [center, item]; + }, this); + } else { + for(var i = 0; i < c.length; ){ + this.cache.push( [ c[i], c[i+1], c[i+2], c[i] ]); + i += 3; + } + } + }, + + draw: function(lighting){ + // use the BSP to schedule + this.cache = dojox.gfx3d.scheduler.bsp(this.cache, function(it){ return it; }); + if(this.shape){ + this.shape.clear(); + } else { + this.shape = this.renderer.createGroup(); + } + dojo.forEach(this.cache, function(item){ + this.shape.createPolyline(item) + .setStroke(this.strokeStyle) + .setFill(this.toStdFill(lighting, dojox.gfx3d.vector.normalize(item))); + }, this); + }, + + getZOrder: function(){ + var zOrder = 0; + dojo.forEach(this.cache, function(item){ + zOrder += (item[0].z + item[1].z + item[2].z) / 3; }); + return (this.cache.length > 1) ? zOrder / this.cache.length : 0; + } +}); + +dojo.declare("dojox.gfx3d.Quads", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic triangle + // (this is a helper object, which is defined for convenience) + this.object = dojo.clone(dojox.gfx3d.defaultQuads); + }, + + setObject: function(newObject, /* String, optional */ style){ + // summary: setup the object + // newObject: Array of points || Object + // style: String, optional + this.object = dojox.gfx.makeParameters(this.object, (newObject instanceof Array) ? { points: newObject, style: style } : newObject ); + return this; + }, + render: function(camera){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + var c = dojo.map(this.object.points, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + this.cache = []; + if(this.object.style == "strip"){ + var pool = c.slice(0, 2); + for(var i = 2; i < c.length; ){ + pool = pool.concat( [ c[i], c[i+1], pool[0] ] ); + this.cache.push(pool); + pool = pool.slice(2,4); + i += 2; + } + }else{ + for(var i = 0; i < c.length; ){ + this.cache.push( [c[i], c[i+1], c[i+2], c[i+3], c[i] ] ); + i += 4; + } + } + }, + + draw: function(lighting){ + // use the BSP to schedule + this.cache = dojox.gfx3d.scheduler.bsp(this.cache, function(it){ return it; }); + if(this.shape){ + this.shape.clear(); + }else{ + this.shape = this.renderer.createGroup(); + } + // using naive iteration to speed things up a bit by avoiding function call overhead + for(var x=0; x 1) ? zOrder / this.cache.length : 0; + } +}); + +dojo.declare("dojox.gfx3d.Polygon", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic triangle + // (this is a helper object, which is defined for convenience) + this.object = dojo.clone(dojox.gfx3d.defaultPolygon); + }, + + setObject: function(newObject){ + // summary: setup the object + // newObject: Array of points || Object + this.object = dojox.gfx.makeParameters(this.object, (newObject instanceof Array) ? {path: newObject} : newObject) + return this; + }, + + render: function(camera){ + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + this.cache = dojo.map(this.object.path, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + // add the first point to close the polyline + this.cache.push(this.cache[0]); + }, + + draw: function(lighting){ + if(this.shape){ + this.shape.setShape({points: this.cache}); + }else{ + this.shape = this.renderer.createPolyline({points: this.cache}); + } + + this.shape.setStroke(this.strokeStyle) + .setFill(this.toStdFill(lighting, dojox.gfx3d.matrix.normalize(this.cache))); + }, + + getZOrder: function(){ + var zOrder = 0; + // using naive iteration to speed things up a bit by avoiding function call overhead + for(var x=0; x 1) ? zOrder / this.cache.length : 0; + }, + + getOutline: function(){ + return this.cache.slice(0, 3); + } +}); + +dojo.declare("dojox.gfx3d.Cube", dojox.gfx3d.Object, { + constructor: function(){ + // summary: a generic triangle + // (this is a helper object, which is defined for convenience) + this.object = dojo.clone(dojox.gfx3d.defaultCube); + this.polygons = []; + }, + + setObject: function(newObject){ + // summary: setup the object + // newObject: Array of points || Object + this.object = dojox.gfx.makeParameters(this.object, newObject); + }, + + render: function(camera){ + // parse the top, bottom to get 6 polygons: + var a = this.object.top; + var g = this.object.bottom; + var b = {x: g.x, y: a.y, z: a.z}; + var c = {x: g.x, y: g.y, z: a.z}; + var d = {x: a.x, y: g.y, z: a.z}; + var e = {x: a.x, y: a.y, z: g.z}; + var f = {x: g.x, y: a.y, z: g.z}; + var h = {x: a.x, y: g.y, z: g.z}; + var polygons = [a, b, c, d, e, f, g, h]; + var m = dojox.gfx3d.matrix.multiply(camera, this.matrix); + var p = dojo.map(polygons, function(item){ + return dojox.gfx3d.matrix.multiplyPoint(m, item); + }); + a = p[0]; b = p[1]; c = p[2]; d = p[3]; e = p[4]; f = p[5]; g = p[6]; h = p[7]; + this.cache = [[a, b, c, d, a], [e, f, g, h, e], [a, d, h, e, a], [d, c, g, h, d], [c, b, f, g, c], [b, a, e, f, b]]; + }, + + draw: function(lighting){ + // use bsp to sort. + this.cache = dojox.gfx3d.scheduler.bsp(this.cache, function(it){ return it; }); + // only the last 3 polys are visible. + var cache = this.cache.slice(3); + + if(this.shape){ + this.shape.clear(); + }else{ + this.shape = this.renderer.createGroup(); + } + for(var x=0; x 0){ + centers = [c.top, c.center]; + normal = v.substract(c.center, c.top); + } + + var color = this.renderer.lighting[this.fillStyle.type](normal, this.fillStyle.finish, this.fillStyle.color), + d = Math.sqrt( Math.pow(c.center.x - c.top.x, 2) + Math.pow(c.center.y - c.top.y, 2) ); + + if(this.shape){ + this.shape.clear(); + }else{ + this.shape = this.renderer.createGroup(); + } + + this.shape.createPath("") + .moveTo(0, -c.rx) + .lineTo(d, -c.rx) + .lineTo(d, c.rx) + .lineTo(0, c.rx) + .arcTo(c.ry, c.rx, 0, true, true, 0, -c.rx) + .setFill(c.gradient).setStroke(this.strokeStyle) + .setTransform([m.translate(centers[0]), + m.rotate(Math.atan2(centers[1].y - centers[0].y, centers[1].x - centers[0].x))]); + + if(c.rx > 0 && c.ry > 0){ + this.shape.createEllipse({cx: centers[1].x, cy: centers[1].y, rx: c.rx, ry: c.ry}) + .setFill(color).setStroke(this.strokeStyle) + .applyTransform(m.rotateAt(c.theta, centers[1])); + } + } +}); + + +// the ultimate container of 3D world +dojo.declare("dojox.gfx3d.Viewport", dojox.gfx.Group, { + constructor: function(){ + // summary: a viewport/container for 3D objects, which knows + // the camera and lightings + + // matrix: dojox.gfx3d.matrix: world transform + // dimension: Object: the dimension of the canvas + this.dimension = null; + + // objects: Array: all 3d Objects + this.objects = []; + // todos: Array: all 3d Objects that needs to redraw + this.todos = []; + + // FIXME: memory leak? + this.renderer = this; + // Using zOrder as the default scheduler + this.schedule = dojox.gfx3d.scheduler.zOrder; + this.draw = dojox.gfx3d.drawer.conservative; + // deep: boolean, true means the whole viewport needs to re-render, redraw + this.deep = false; + + // lights: Array: an array of light objects + this.lights = []; + this.lighting = null; + }, + + setCameraTransform: function(matrix){ + // summary: sets a transformation matrix + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx.matrix.Matrix + // constructor for a list of acceptable arguments) + this.camera = dojox.gfx3d.matrix.clone(matrix ? dojox.gfx3d.matrix.normalize(matrix) : dojox.gfx3d.identity, true); + this.invalidate(); + return this; // self + }, + + applyCameraRightTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on right side + // (this.matrix * matrix) + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx3d.matrix.Matrix + // constructor for a list of acceptable arguments) + return matrix ? this.setCameraTransform([this.camera, matrix]) : this; // self + }, + + applyCameraLeftTransform: function(matrix){ + // summary: multiplies the existing matrix with an argument on left side + // (matrix * this.matrix) + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx3d.matrix.Matrix + // constructor for a list of acceptable arguments) + return matrix ? this.setCameraTransform([matrix, this.camera]) : this; // self + }, + + applyCameraTransform: function(matrix){ + // summary: a shortcut for dojox.gfx3d.Object.applyRightTransform + // matrix: dojox.gfx3d.matrix.Matrix: a matrix or a matrix-like object + // (see an argument of dojox.gfx3d.matrix.Matrix + // constructor for a list of acceptable arguments) + return this.applyCameraRightTransform(matrix); // self + }, + + setLights: function(/* Array || Object */lights, /* Color, optional */ ambient, + /* Color, optional */ specular){ + // summary: set the lights + // lights: Array: an array of light object + // or lights object + // ambient: Color: an ambient object + // specular: Color: an specular object + this.lights = (lights instanceof Array) ? {sources: lights, ambient: ambient, specular: specular} : lights; + var view = {x: 0, y: 0, z: 1}; + + this.lighting = new dojox.gfx3d.lighting.Model(view, this.lights.sources, + this.lights.ambient, this.lights.specular); + this.invalidate(); + return this; + }, + + addLights: function(lights){ + // summary: add new light/lights to the viewport. + // lights: Array || light object: light object(s) + return this.setLights(this.lights.sources.concat(lights)); + }, + + addTodo: function(newObject){ + // NOTE: Viewport implements almost the same addTodo, + // except calling invalidate, since invalidate is used as + // any modification needs to redraw the object itself, call invalidate. + // then call render. + if(dojo.every(this.todos, + function(item){ + return item != newObject; + } + )){ + this.todos.push(newObject); + } + }, + + invalidate: function(){ + this.deep = true; + this.todos = this.objects; + }, + + setDimensions: function(dim){ + if(dim){ + this.dimension = { + width: dojo.isString(dim.width) ? parseInt(dim.width) : dim.width, + height: dojo.isString(dim.height) ? parseInt(dim.height) : dim.height + }; + }else{ + this.dimension = null; + } + }, + + render: function(){ + // summary: iterate all children and call their render callback function. + if(!this.todos.length){ return; } + // console.debug("Viewport::render"); + var m = dojox.gfx3d.matrix; + + // Iterate the todos and call render to prepare the rendering: + for(var x=0; x 0, p is in the plus space, vice versa for minus space. + // n is the normal vector that is perpendicular the plate, defined as: + // n = ( b - a) crossProduct ( c - a ) + // + // in this implementation, n is declared as normal, ,a is declared as orient. + // + // obj: object: dojox.gfx3d.Object + this.plus = null; + this.minus = null; + this.object = obj; + + var o = outline(obj); + this.orient = o[0]; + this.normal = dojox.gfx3d.vector.normalize(o); + }, + + add: function(obj, outline){ + var epsilon = 0.5, o = outline(obj), v = dojox.gfx3d.vector, n = this.normal, a = this.orient; + + if(dojo.every(o, function(item){ return Math.floor(epsilon + v.dotProduct(n, v.substract(item, a))) <= 0; })){ + if(this.minus){ + this.minus.add(obj, outline); + } else { + this.minus = new dojox.gfx3d.scheduler.BinarySearchTree(obj, outline); + } + } else if(dojo.every(o, function(item){ return Math.floor(epsilon + v.dotProduct(n, v.substract(item, a))) >= 0; })){ + if(this.plus){ + this.plus.add(obj, outline); + } else { + this.plus = new dojox.gfx3d.scheduler.BinarySearchTree(obj, outline); + } + } else { + dojo.forEach(o, function(item){ console.debug(v.dotProduct(n, v.substract(item, a))); }); + throw "The case: polygon cross siblings' plate is not implemneted yet"; + } + }, + + iterate: function(outline){ + var epsilon = 0.5; + var v = dojox.gfx3d.vector; + var sorted = []; + var subs = null; + // FIXME: using Infinity here? + var view = {x: 0, y: 0, z: -10000}; + if(Math.floor( epsilon + v.dotProduct(this.normal, v.substract(view, this.orient))) <= 0){ + subs = [this.plus, this.minus]; + } else { + subs = [this.minus, this.plus]; + } + + if(subs[0]){ + sorted = sorted.concat(subs[0].iterate()); + } + sorted.push(this.object); + if(subs[1]){ + sorted = sorted.concat(subs[1].iterate()); + } + return sorted; + } + +}); + +dojo.mixin(dojox.gfx3d.drawer, { + conservative: function(todos, objects, viewport){ + console.debug('conservative draw'); + dojo.forEach(this.objects, function(item){ + item.destroy(); + }); + dojo.forEach(objects, function(item){ + item.draw(viewport.lighting); + }); + }, + chart: function(todos, objects, viewport){ + // NOTE: ondemand may require the todos' objects to use setShape + // to redraw themselves to maintain the z-order. + console.debug('chart draw'); + dojo.forEach(this.todos, function(item){ + item.draw(viewport.lighting); + }); + } + // More aggrasive optimization may re-order the DOM nodes using the order + // of objects, and only elements of todos call setShape. +}); + +} diff --git a/includes/js/dojox/gfx3d/tests/test_camerarotate.html b/includes/js/dojox/gfx3d/tests/test_camerarotate.html new file mode 100644 index 0000000..dcfa1a2 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_camerarotate.html @@ -0,0 +1,93 @@ + + +Camera rotate of dojox.gfx3d. + + + + + + + + +

            Camera rotate

            +

            The cube is in the center (0, 0, 0): The color of X, Y, Z axes are red, green, blue. The view renders all the objects + in each frame, the conservative drawer is used.

            +
            + +
            + +
            + +
            +
            + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_camerarotate_shaded.html b/includes/js/dojox/gfx3d/tests/test_camerarotate_shaded.html new file mode 100644 index 0000000..e9c0312 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_camerarotate_shaded.html @@ -0,0 +1,97 @@ + + + Camera rotate of dojox.gfx3d. + + + + + + + + +

            Camera rotate

            +

            The cube is in the center (0, 0, 0): The color of X, Y, Z axes are red, green, blue. The view renders all the objects + in each frame, the conservative drawer is used.

            +
            + +
            + +
            + +
            +
            + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_cube.html b/includes/js/dojox/gfx3d/tests/test_cube.html new file mode 100644 index 0000000..dcae739 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_cube.html @@ -0,0 +1,50 @@ + + +Cube of dojox.gfx3d. + + + + + + + +

            Cube Test

            +
            + +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_cylinder.html b/includes/js/dojox/gfx3d/tests/test_cylinder.html new file mode 100644 index 0000000..cd1d5c1 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_cylinder.html @@ -0,0 +1,66 @@ + + +Cylinder test of dojox.gfx3d. + + + + + + + + + +

            Cylinder Test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_drawer.html b/includes/js/dojox/gfx3d/tests/test_drawer.html new file mode 100644 index 0000000..3a9af1f --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_drawer.html @@ -0,0 +1,92 @@ + + +Pilot test of dojox.gfx3d. + + + + + + +

            Pilot Test

            +

            The color of X, Y, Z axes are red, green, blue. One cube is in the center (0, 0, 0), click the button to move the other one back + and forth, using this to test dojox.gfx3d.drawer.conservative

            + + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_edges.html b/includes/js/dojox/gfx3d/tests/test_edges.html new file mode 100644 index 0000000..07b78f0 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_edges.html @@ -0,0 +1,73 @@ + + +Edges test of dojox.gfx3d. + + + + + + +

            Edges Test

            +

            Test of the Edges, there are three modes

            +
              +
            • none, any two vertice pair form one edge, lime
            • +
            • strip, vertices are connected by edges. red
            • +
            • loop, the same as strip, close the path, blue
            • +
            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_matrix.html b/includes/js/dojox/gfx3d/tests/test_matrix.html new file mode 100644 index 0000000..9acf399 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_matrix.html @@ -0,0 +1,89 @@ + + +Dojo 3D Matrix + + + + + + +

            dojox.gfx3d.matrix test

            +

            Please check the debug console for test results.

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_orbit.html b/includes/js/dojox/gfx3d/tests/test_orbit.html new file mode 100644 index 0000000..cadc043 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_orbit.html @@ -0,0 +1,50 @@ + + +Orbit test of dojox.gfx3d. + + + + + + +

            Orbit Test

            +

            Test how orbit looks like in 3D

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_overlap.html b/includes/js/dojox/gfx3d/tests/test_overlap.html new file mode 100644 index 0000000..19f63d5 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_overlap.html @@ -0,0 +1,69 @@ + + +Test of dojox.gfx3d.scheduler + + + + + + +

            Scheduler Test

            +

            There are two schedulers available in dojox.gfx3d, zOrder and BSP. zOrder is much simpler, and it performs quite well in most cases, it may fail in some rare cases, for example: two triangles share the same two vertice, and have the same Z value of the third vertex, in this case, they have the same z-order. They are rendered in arbitary order. In this case, BSP is the rescure.

            +

            Current render: default

            +

             

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_polygon.html b/includes/js/dojox/gfx3d/tests/test_polygon.html new file mode 100644 index 0000000..ab9f174 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_polygon.html @@ -0,0 +1,44 @@ + + +Polygon test of dojox.gfx3d. + + + + + + +

            Polygon Test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_quads.html b/includes/js/dojox/gfx3d/tests/test_quads.html new file mode 100644 index 0000000..aff3b3b --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_quads.html @@ -0,0 +1,78 @@ + + +Quads test of dojox.gfx3d. + + + + + + +

            Quads Test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_rotate.html b/includes/js/dojox/gfx3d/tests/test_rotate.html new file mode 100644 index 0000000..53c212f --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_rotate.html @@ -0,0 +1,123 @@ + + +Rotate test of dojox.gfx3d. + + + + + + +

            Pilot Test

            +

            There are two drawers(well, the name is quite misleading, it means draw-er) in dojox.gfx3d, conservative and chart:

            +
              +
            • conservative drawer is a pessimist, it assumes that the movement, transformation of objects would take a big fat impact to the viewport, so it not only render the modified objects, but also reorder all the underlying 2D shapes and redraw them.
            • +
            • chart drawer is an optimist, it assumes the change of the objects does not take effect on the z-order, this is most likely true in chart application. It only render and then draw the modified objects.
            • +
            +

            The cube is in the center (0, 0, 0): The color of X, Y, Z axes are red, green, blue as the reference. The cube would rotate around X, Y, Z or their combination, it is up to you.

            +

            Current Drawer: Conservative

            +
            + +
            + +
            + +
            + +
            +
            + +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_scene.html b/includes/js/dojox/gfx3d/tests/test_scene.html new file mode 100644 index 0000000..231b289 --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_scene.html @@ -0,0 +1,66 @@ + + +Scene test of dojox.gfx3d. + + + + + + +

            Scene Test

            +

            Test the setTransform of the Scene. the lime cube and yellow polygon are grouped in one Scene, and they are moved in one shot.

            +

            Test Viewport.invalidate with Scene.

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_triangles.html b/includes/js/dojox/gfx3d/tests/test_triangles.html new file mode 100644 index 0000000..cc4e65b --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_triangles.html @@ -0,0 +1,82 @@ + + +Triangles test of dojox.gfx3d. + + + + + + +

            Path3d Test

            +
            +

            That's all Folks!

            + + diff --git a/includes/js/dojox/gfx3d/tests/test_vector.html b/includes/js/dojox/gfx3d/tests/test_vector.html new file mode 100644 index 0000000..371d57e --- /dev/null +++ b/includes/js/dojox/gfx3d/tests/test_vector.html @@ -0,0 +1,59 @@ + + +Dojo 3D Vector + + + + + + +

            dojox.gfx3d.vector test

            +

            Please check the debug console for test results.

            + + diff --git a/includes/js/dojox/gfx3d/vector.js b/includes/js/dojox/gfx3d/vector.js new file mode 100644 index 0000000..7225273 --- /dev/null +++ b/includes/js/dojox/gfx3d/vector.js @@ -0,0 +1,110 @@ +if(!dojo._hasResource["dojox.gfx3d.vector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.gfx3d.vector"] = true; +dojo.provide("dojox.gfx3d.vector"); + +dojo.mixin(dojox.gfx3d.vector, { + sum: function(){ + // summary: sum of the vectors + var v = {x: 0, y: 0, z:0}; + dojo.forEach(arguments, function(item){ v.x += item.x; v.y += item.y; v.z += item.z; }); + return v; + }, + + center: function(){ + // summary: center of the vectors + var l = arguments.length; + if(l == 0){ + return {x: 0, y: 0, z: 0}; + } + var v = dojox.gfx3d.vector.sum(arguments); + return {x: v.x/l, y: v.y/l, z: v.z/l}; + }, + + substract: function(/* Pointer */a, /* Pointer */b){ + return {x: a.x - b.x, y: a.y - b.y, z: a.z - b.z}; + }, + + _crossProduct: function(x, y, z, u, v, w){ + // summary: applies a cross product of two vectorss, (x, y, z) and (u, v, w) + // x: Number: an x coordinate of a point + // y: Number: a y coordinate of a point + // z: Number: a z coordinate of a point + // u: Number: an x coordinate of a point + // v: Number: a y coordinate of a point + // w: Number: a z coordinate of a point + return {x: y * w - z * v, y: z * u - x * w, z: x * v - y * u}; // Object + }, + + crossProduct: function(/* Number||Point */ a, /* Number||Point */ b, /* Number, optional */ c, /* Number, optional */ d, /* Number, optional */ e, /* Number, optional */ f){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Number: an x coordinate of a point + // b: Number: a y coordinate of a point + // c: Number: a z coordinate of a point + // d: Number: an x coordinate of a point + // e: Number: a y coordinate of a point + // f: Number: a z coordinate of a point + if(arguments.length == 6 && dojo.every(arguments, function(item){ return typeof item == "number"; })){ + return dojox.gfx3d.vector._crossProduct(a, b, c, d, e, f); // Object + } + // branch + // a: Object: a point + // b: Object: a point + // c: null + // d: null + // e: null + // f: null + return dojox.gfx3d.vector._crossProduct(a.x, a.y, a.z, b.x, b.y, b.z); // Object + }, + + _dotProduct: function(x, y, z, u, v, w){ + // summary: applies a cross product of two vectorss, (x, y, z) and (u, v, w) + // x: Number: an x coordinate of a point + // y: Number: a y coordinate of a point + // z: Number: a z coordinate of a point + // u: Number: an x coordinate of a point + // v: Number: a y coordinate of a point + // w: Number: a z coordinate of a point + return x * u + y * v + z * w; // Number + }, + dotProduct: function(/* Number||Point */ a, /* Number||Point */ b, /* Number, optional */ c, /* Number, optional */ d, /* Number, optional */ e, /* Number, optional */ f){ + // summary: applies a matrix to a point + // matrix: dojox.gfx3d.matrix.Matrix3D: a 3D matrix object to be applied + // a: Number: an x coordinate of a point + // b: Number: a y coordinate of a point + // c: Number: a z coordinate of a point + // d: Number: an x coordinate of a point + // e: Number: a y coordinate of a point + // f: Number: a z coordinate of a point + if(arguments.length == 6 && dojo.every(arguments, function(item){ return typeof item == "number"; })){ + return dojox.gfx3d.vector._dotProduct(a, b, c, d, e, f); // Object + } + // branch + // a: Object: a point + // b: Object: a point + // c: null + // d: null + // e: null + // f: null + return dojox.gfx3d.vector._dotProduct(a.x, a.y, a.z, b.x, b.y, b.z); // Object + }, + + normalize: function(/* Point||Array*/ a, /* Point */ b, /* Point */ c){ + // summary: find the normal of the implicit surface + // a: Object: a point + // b: Object: a point + // c: Object: a point + var l, m, n; + if(a instanceof Array){ + l = a[0]; m = a[1]; n = a[2]; + }else{ + l = a; m = b; n = c; + } + + var u = dojox.gfx3d.vector.substract(m, l); + var v = dojox.gfx3d.vector.substract(n, l); + return dojox.gfx3d.vector.crossProduct(u, v); + } +}); + +} diff --git a/includes/js/dojox/grid/Grid.js b/includes/js/dojox/grid/Grid.js new file mode 100644 index 0000000..309bb25 --- /dev/null +++ b/includes/js/dojox/grid/Grid.js @@ -0,0 +1,363 @@ +if(!dojo._hasResource["dojox.grid.Grid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid.Grid"] = true; +dojo.provide("dojox.grid.Grid"); +dojo.require("dojox.grid.VirtualGrid"); +dojo.require("dojox.grid._data.model"); +dojo.require("dojox.grid._data.editors"); +dojo.require("dojox.grid._data.dijitEditors"); + +// FIXME: +// we are at the wrong location! + +dojo.declare('dojox.Grid', dojox.VirtualGrid, { + // summary: + // A grid widget with virtual scrolling, cell editing, complex rows, + // sorting, fixed columns, sizeable columns, etc. + // description: + // Grid is a subclass of VirtualGrid, providing binding to a data + // store. + // example: + // define the grid structure: + // | var structure = [ // array of view objects + // | { cells: [// array of rows, a row is an array of cells + // | [ { name: "Alpha", width: 6 }, + // | { name: "Beta" }, + // | { name: "Gamma", get: formatFunction } + // | ] + // | ]} + // | ]; + // + // define a grid data model + // | var model = new dojox.grid.data.table(null, data); + // | + // |
            + // + + // model: + // string or object grid data model + model: 'dojox.grid.data.Table', + + // life cycle + postCreate: function(){ + if(this.model){ + var m = this.model; + if(dojo.isString(m)){ + m = dojo.getObject(m); + } + this.model = (dojo.isFunction(m)) ? new m() : m; + this._setModel(this.model); + } + this.inherited(arguments); + }, + + destroy: function(){ + this.setModel(null); + this.inherited(arguments); + }, + + // structure + _structureChanged: function() { + this.indexCellFields(); + this.inherited(arguments); + }, + + // model + _setModel: function(inModel){ + // if(!inModel){ return; } + this.model = inModel; + if(this.model){ + this.model.observer(this); + this.model.measure(); + this.indexCellFields(); + } + }, + + setModel: function(inModel){ + // summary: + // Set the grid's data model + // inModel: Object + // Model object, usually an instance of a dojox.grid.data.Model + // subclass + if(this.model){ + this.model.notObserver(this); + } + this._setModel(inModel); + }, + + + get: function(inRowIndex){ + // summary: data socket (called in cell's context) + return this.grid.model.getDatum(inRowIndex, this.fieldIndex); + }, + + // model modifications + modelAllChange: function(){ + this.rowCount = (this.model ? this.model.getRowCount() : 0); + this.updateRowCount(this.rowCount); + }, + + modelRowChange: function(inData, inRowIndex){ + this.updateRow(inRowIndex); + }, + + modelDatumChange: function(inDatum, inRowIndex, inFieldIndex){ + this.updateRow(inRowIndex); + }, + + modelFieldsChange: function() { + this.indexCellFields(); + this.render(); + }, + + // model insertion + modelInsertion: function(inRowIndex){ + this.updateRowCount(this.model.getRowCount()); + }, + + // model removal + modelRemoval: function(inKeys){ + this.updateRowCount(this.model.getRowCount()); + }, + + // cells + getCellName: function(inCell){ + var v = this.model.fields.values, i = inCell.fieldIndex; + return i>=0 && i 0 ? 1 : -1); + }, + + sort: function(){ + this.edit.apply(); + this.model.sort(this.getSortField()); + }, + + // row editing + addRow: function(inRowData, inIndex){ + this.edit.apply(); + var i = inIndex || -1; + if(i<0){ + i = this.selection.getFirstSelected() || 0; + } + if(i<0){ + i = 0; + } + this.model.insert(inRowData, i); + this.model.beginModifyRow(i); + // begin editing row + // FIXME: add to edit + for(var j=0, c; ((c=this.getCell(j)) && !c.editor); j++){} + if(c&&c.editor){ + this.edit.setEditCell(c, i); + this.focus.setFocusCell(c, i); + }else{ + this.focus.setFocusCell(this.getCell(0), i); + } + }, + + removeSelectedRows: function(){ + this.edit.apply(); + var s = this.selection.getSelected(); + if(s.length){ + this.model.remove(s); + this.selection.clear(); + } + }, + + //: protected + // editing + canEdit: function(inCell, inRowIndex){ + // summary: + // Determines if a given cell may be edited + // inCell: Object + // A grid cell + // inRowIndex: Integer + // Grid row index + // returns: Boolean + // True if given cell may be edited + return (this.model.canModify ? this.model.canModify(inRowIndex) : true); + }, + + doStartEdit: function(inCell, inRowIndex){ + this.model.beginModifyRow(inRowIndex); + this.onStartEdit(inCell, inRowIndex); + }, + + doApplyCellEdit: function(inValue, inRowIndex, inFieldIndex){ + this.model.setDatum(inValue, inRowIndex, inFieldIndex); + this.onApplyCellEdit(inValue, inRowIndex, inFieldIndex); + }, + + doCancelEdit: function(inRowIndex){ + this.model.cancelModifyRow(inRowIndex); + this.onCancelEdit.apply(this, arguments); + }, + + doApplyEdit: function(inRowIndex){ + this.model.endModifyRow(inRowIndex); + this.onApplyEdit(inRowIndex); + }, + + styleRowState: function(inRow){ + // summary: Perform row styling + if(this.model.getState){ + var states=this.model.getState(inRow.index), c=''; + for(var i=0, ss=["inflight", "error", "inserting"], s; s=ss[i]; i++){ + if(states[s]){ + c = ' dojoxGrid-row-' + s; + break; + } + } + inRow.customClasses += c; + } + }, + + onStyleRow: function(inRow){ + this.styleRowState(inRow); + this.inherited(arguments); + } + +}); + +dojox.Grid.markupFactory = function(props, node, ctor){ + // handle setting up a data model for a store if one + // isn't provided. There are some caveats: + // * we only really handle dojo.data sources well. They're the future + // so it's no big deal, but it's something to be aware of. + // * I'm pretty sure that colgroup introspection is missing some of + // the available settable properties. + // * No handling of cell formatting and content getting is done + var d = dojo; + var widthFromAttr = function(n){ + var w = d.attr(n, "width")||"auto"; + if((w != "auto")&&(w.substr(-2) != "em")){ + w = parseInt(w)+"px"; + } + return w; + } + if(!props.model && d.hasAttr(node, "store")){ + // if a model isn't specified and we point to a store, assume + // we're also folding the definition for a model up into the + // inline ctor for the Grid. This will then take properties + // like "query", "rowsPerPage", and "clientSort" from the grid + // definition. + var mNode = node.cloneNode(false); + d.attr(mNode, { + "jsId": null, + "dojoType": d.attr(node, "dataModelClass") || "dojox.grid.data.DojoData" + }); + props.model = d.parser.instantiate([mNode])[0]; + } + // if(!props.model){ console.debug("no model!"); } + // if a structure isn't referenced, do we have enough + // data to try to build one automatically? + if( !props.structure && + node.nodeName.toLowerCase() == "table"){ + + // try to discover a structure + props.structure = d.query("> colgroup", node).map(function(cg){ + var sv = d.attr(cg, "span"); + var v = { + noscroll: (d.attr(cg, "noscroll") == "true") ? true : false, + __span: (!!sv ? parseInt(sv) : 1), + cells: [] + }; + if(d.hasAttr(cg, "width")){ + v.width = widthFromAttr(cg); + } + return v; // for vendetta + }); + if(!props.structure.length){ + props.structure.push({ + __span: Infinity, + cells: [] // catch-all view + }); + } + // check to see if we're gonna have more than one view + + // for each tr in our th, create a row of cells + d.query("thead > tr", node).forEach(function(tr, tr_idx){ + var cellCount = 0; + var viewIdx = 0; + var lastViewIdx; + var cView = null; + d.query("> th", tr).map(function(th){ + // what view will this cell go into? + + // NOTE: + // to prevent extraneous iteration, we start counters over + // for each row, incrementing over the surface area of the + // structure that colgroup processing generates and + // creating cell objects for each to place into those + // cell groups. There's a lot of state-keepking logic + // here, but it is what it has to be. + if(!cView){ // current view book keeping + lastViewIdx = 0; + cView = props.structure[0]; + }else if(cellCount >= (lastViewIdx+cView.__span)){ + viewIdx++; + // move to allocating things into the next view + lastViewIdx += cView.__span; + lastView = cView; + cView = props.structure[viewIdx]; + } + + // actually define the cell from what markup hands us + var cell = { + name: d.trim(d.attr(th, "name")||th.innerHTML), + field: d.trim(d.attr(th, "field")||""), + colSpan: parseInt(d.attr(th, "colspan")||1) + }; + cellCount += cell.colSpan; + cell.field = cell.field||cell.name; + cell.width = widthFromAttr(th); + if(!cView.cells[tr_idx]){ + cView.cells[tr_idx] = []; + } + cView.cells[tr_idx].push(cell); + }); + }); + // console.debug(dojo.toJson(props.structure, true)); + } + return new dojox.Grid(props, node); +} + + +// alias us to the right location +dojox.grid.Grid = dojox.Grid; + +} diff --git a/includes/js/dojox/grid/README b/includes/js/dojox/grid/README new file mode 100644 index 0000000..f9dade3 --- /dev/null +++ b/includes/js/dojox/grid/README @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------- +dojox.grid +------------------------------------------------------------------------------- +Version 1.00 +Release date: 10/04/2007 +------------------------------------------------------------------------------- +Project state: +beta +------------------------------------------------------------------------------- +Credits + Scott J. Miles (sjmiles@activegrid.com) + Steve Orvell (sorvell@activegrid.com) +------------------------------------------------------------------------------- +Project description + +TurboGrid has been made available in Dojo and is now the dojox.grid! + +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core +Dijit Templated Widget +------------------------------------------------------------------------------- +Documentation + +None available for this version yet. + +See http://www.turboajax.com/products/turbogrid/ for legacy documentation. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/grid/* + +Install into the following directory structure: +/dojox/grid/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/grid/VirtualGrid.js b/includes/js/dojox/grid/VirtualGrid.js new file mode 100644 index 0000000..104054c --- /dev/null +++ b/includes/js/dojox/grid/VirtualGrid.js @@ -0,0 +1,779 @@ +if(!dojo._hasResource["dojox.grid.VirtualGrid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid.VirtualGrid"] = true; +dojo.provide("dojox.grid.VirtualGrid"); + +dojo.require("dojox.grid._grid.lib"); +dojo.require("dojox.grid._grid.scroller"); +dojo.require("dojox.grid._grid.view"); +dojo.require("dojox.grid._grid.views"); +dojo.require("dojox.grid._grid.layout"); +dojo.require("dojox.grid._grid.rows"); +dojo.require("dojox.grid._grid.focus"); +dojo.require("dojox.grid._grid.selection"); +dojo.require("dojox.grid._grid.edit"); +dojo.require("dojox.grid._grid.rowbar"); +dojo.require("dojox.grid._grid.publicEvents"); + +dojo.declare('dojox.VirtualGrid', + [ dijit._Widget, dijit._Templated ], + { + // summary: + // A grid widget with virtual scrolling, cell editing, complex rows, + // sorting, fixed columns, sizeable columns, etc. + // + // description: + // VirtualGrid provides the full set of grid features without any + // direct connection to a data store. + // + // The grid exposes a get function for the grid, or optionally + // individual columns, to populate cell contents. + // + // The grid is rendered based on its structure, an object describing + // column and cell layout. + // + // example: + // A quick sample: + // + // define a get function + // | function get(inRowIndex){ // called in cell context + // | return [this.index, inRowIndex].join(', '); + // | } + // + // define the grid structure: + // | var structure = [ // array of view objects + // | { cells: [// array of rows, a row is an array of cells + // | [ + // | { name: "Alpha", width: 6 }, + // | { name: "Beta" }, + // | { name: "Gamma", get: get }] + // | ]} + // | ]; + // + // |
            + + templateString:"
            \n\t
            \n\t
            \n\t\n
            \n", + + // classTag: String + // CSS class applied to the grid's domNode + classTag: 'dojoxGrid', + + get: function(inRowIndex){ + // summary: Default data getter. + // description: + // Provides data to display in a grid cell. Called in grid cell context. + // So this.cell.index is the column index. + // inRowIndex: Integer + // Row for which to provide data + // returns: + // Data to display for a given grid cell. + }, + + // settings + // rowCount: Integer + // Number of rows to display. + rowCount: 5, + + // keepRows: Integer + // Number of rows to keep in the rendering cache. + keepRows: 75, + + // rowsPerPage: Integer + // Number of rows to render at a time. + rowsPerPage: 25, + + // autoWidth: Boolean + // If autoWidth is true, grid width is automatically set to fit the data. + autoWidth: false, + + // autoHeight: Boolean + // If autoHeight is true, grid height is automatically set to fit the data. + autoHeight: false, + + // autoRender: Boolean + // If autoRender is true, grid will render itself after initialization. + autoRender: true, + + // defaultHeight: String + // default height of the grid, measured in any valid css unit. + defaultHeight: '15em', + + // structure: Object|String + // View layout defintion. Can be set to a layout object, or to the (string) name of a layout object. + structure: '', + + // elasticView: Integer + // Override defaults and make the indexed grid view elastic, thus filling available horizontal space. + elasticView: -1, + + // singleClickEdit: boolean + // Single-click starts editing. Default is double-click + singleClickEdit: false, + + // Used to store the last two clicks, to ensure double-clicking occurs based on the intended row + _click: null, + + // private + sortInfo: 0, + themeable: true, + + // initialization + buildRendering: function(){ + this.inherited(arguments); + // reset get from blank function (needed for markup parsing) to null, if not changed + if(this.get == dojox.VirtualGrid.prototype.get){ + this.get = null; + } + if(!this.domNode.getAttribute('tabIndex')){ + this.domNode.tabIndex = "0"; + } + this.createScroller(); + this.createLayout(); + this.createViews(); + this.createManagers(); + dojox.grid.initTextSizePoll(); + this.connect(dojox.grid, "textSizeChanged", "textSizeChanged"); + dojox.grid.funnelEvents(this.domNode, this, 'doKeyEvent', dojox.grid.keyEvents); + this.connect(this, "onShow", "renderOnIdle"); + }, + postCreate: function(){ + // replace stock styleChanged with one that triggers an update + this.styleChanged = this._styleChanged; + this.setStructure(this.structure); + this._click = []; + }, + + destroy: function(){ + this.domNode.onReveal = null; + this.domNode.onSizeChange = null; + this.edit.destroy(); + this.views.destroyViews(); + this.inherited(arguments); + }, + + styleChanged: function(){ + this.setStyledClass(this.domNode, ''); + }, + + _styleChanged: function(){ + this.styleChanged(); + this.update(); + }, + + textSizeChanged: function(){ + setTimeout(dojo.hitch(this, "_textSizeChanged"), 1); + }, + + _textSizeChanged: function(){ + if(this.domNode){ + this.views.forEach(function(v){ + v.content.update(); + }); + this.render(); + } + }, + + sizeChange: function(){ + dojox.grid.jobs.job(this.id + 'SizeChange', 50, dojo.hitch(this, "update")); + }, + + renderOnIdle: function() { + setTimeout(dojo.hitch(this, "render"), 1); + }, + + createManagers: function(){ + // summary: + // create grid managers for various tasks including rows, focus, selection, editing + + // row manager + this.rows = new dojox.grid.rows(this); + // focus manager + this.focus = new dojox.grid.focus(this); + // selection manager + this.selection = new dojox.grid.selection(this); + // edit manager + this.edit = new dojox.grid.edit(this); + }, + + createScroller: function(){ + // summary: Creates a new virtual scroller + this.scroller = new dojox.grid.scroller.columns(); + this.scroller._pageIdPrefix = this.id + '-'; + this.scroller.renderRow = dojo.hitch(this, "renderRow"); + this.scroller.removeRow = dojo.hitch(this, "rowRemoved"); + }, + + createLayout: function(){ + // summary: Creates a new Grid layout + this.layout = new dojox.grid.layout(this); + }, + + // views + createViews: function(){ + this.views = new dojox.grid.views(this); + this.views.createView = dojo.hitch(this, "createView"); + }, + + createView: function(inClass){ + if(dojo.isAIR){ + var obj = window; + var names = inClass.split('.'); + for(var i=0;i 0){ + }else if(this.domNode.clientHeight <= padBorder.h){ + if(this.domNode.parentNode == document.body){ + this.domNode.style.height = this.defaultHeight; + }else{ + this.fitTo = "parent"; + } + } + // if we are given dimensions, size the grid's domNode to those dimensions + if(this._sizeBox){ + dojo.contentBox(this.domNode, this._sizeBox); + }else if(this.fitTo == "parent"){ + var h = dojo._getContentBox(this.domNode.parentNode).h; + dojo.marginBox(this.domNode, { h: Math.max(0, h) }); + } + + var h = dojo._getContentBox(this.domNode).h; + if(h == 0 && !this.autoHeight){ + // We need to hide the header, since the Grid is essentially hidden. + this.viewsHeaderNode.style.display = "none"; + }else{ + // Otherwise, show the header and give it an appropriate height. + this.viewsHeaderNode.style.display = "block"; + } + + // NOTE: it is essential that width be applied before height + // Header height can only be calculated properly after view widths have been set. + // This is because flex column width is naturally 0 in Firefox. + // Therefore prior to width sizing flex columns with spaces are maximally wrapped + // and calculated to be too tall. + this.adaptWidth(); + this.adaptHeight(); + + // default row height (FIXME: use running average(?), remove magic #) + this.scroller.defaultRowHeight = this.rows.getDefaultHeightPx() + 1; + this.postresize(); + }, + + adaptWidth: function() { + // private: sets width and position for views and update grid width if necessary + var + w = this.autoWidth ? 0 : this.domNode.clientWidth || (this.domNode.offsetWidth - this._getPadBorder().w); + vw = this.views.arrange(1, w); + this.views.onEach("adaptWidth"); + if (this.autoWidth) + this.domNode.style.width = vw + "px"; + }, + + adaptHeight: function(){ + // private: measures and normalizes header height, then sets view heights, and then updates scroller + var vns = this.viewsHeaderNode.style, t = vns.display == "none" ? 0 : this.views.measureHeader(); + vns.height = t + 'px'; + // header heights are reset during measuring so must be normalized after measuring. + this.views.normalizeHeaderNodeHeight(); + // content extent + var h = (this.autoHeight ? -1 : Math.max(this.domNode.clientHeight - t, 0) || 0); + this.views.onEach('setSize', [0, h]); + this.views.onEach('adaptHeight'); + this.scroller.windowHeight = h; + }, + + // render + render: function(){ + // summary: + // Render the grid, headers, and views. Edit and scrolling states are reset. To retain edit and + // scrolling states, see Update. + + if(!this.domNode){return;} + + if(!this.hasLayout()) { + this.scroller.init(0, this.keepRows, this.rowsPerPage); + return; + } + // + this.update = this.defaultUpdate; + this.scroller.init(this.rowCount, this.keepRows, this.rowsPerPage); + this.prerender(); + this.setScrollTop(0); + this.postrender(); + }, + + prerender: function(){ + // if autoHeight, make sure scroller knows not to virtualize; everything must be rendered. + this.keepRows = this.autoHeight ? 0 : this.constructor.prototype.keepRows; + this.scroller.setKeepInfo(this.keepRows); + this.views.render(); + this._resize(); + }, + + postrender: function(){ + this.postresize(); + this.focus.initFocusView(); + // make rows unselectable + dojo.setSelectable(this.domNode, false); + }, + + postresize: function(){ + // views are position absolute, so they do not inflate the parent + if(this.autoHeight){ + this.viewsNode.style.height = this.views.measureContent() + 'px'; + } + }, + + renderRow: function(inRowIndex, inNodes){ + // summary: private, used internally to render rows + this.views.renderRow(inRowIndex, inNodes); + }, + + rowRemoved: function(inRowIndex){ + // summary: private, used internally to remove rows + this.views.rowRemoved(inRowIndex); + }, + + invalidated: null, + + updating: false, + + beginUpdate: function(){ + // summary: + // Use to make multiple changes to rows while queueing row updating. + // NOTE: not currently supporting nested begin/endUpdate calls + this.invalidated = []; + this.updating = true; + }, + + endUpdate: function(){ + // summary: + // Use after calling beginUpdate to render any changes made to rows. + this.updating = false; + var i = this.invalidated; + if(i.all){ + this.update(); + }else if(i.rowCount != undefined){ + this.updateRowCount(i.rowCount); + }else{ + for(r in i){ + this.updateRow(Number(r)); + } + } + this.invalidated = null; + }, + + // update + defaultUpdate: function(){ + // note: initial update calls render and subsequently this function. + if(!this.domNode){return;} + if(this.updating){ + this.invalidated.all = true; + return; + } + //this.edit.saveState(inRowIndex); + this.prerender(); + this.scroller.invalidateNodes(); + this.setScrollTop(this.scrollTop); + this.postrender(); + //this.edit.restoreState(inRowIndex); + }, + + update: function(){ + // summary: + // Update the grid, retaining edit and scrolling states. + this.render(); + }, + + updateRow: function(inRowIndex){ + // summary: + // Render a single row. + // inRowIndex: Integer + // Index of the row to render + inRowIndex = Number(inRowIndex); + if(this.updating){ + this.invalidated[inRowIndex]=true; + }else{ + this.views.updateRow(inRowIndex, this.rows.getHeight(inRowIndex)); + this.scroller.rowHeightChanged(inRowIndex); + } + }, + + updateRowCount: function(inRowCount){ + //summary: + // Change the number of rows. + // inRowCount: int + // Number of rows in the grid. + if(this.updating){ + this.invalidated.rowCount = inRowCount; + }else{ + this.rowCount = inRowCount; + if(this.layout.cells.length){ + this.scroller.updateRowCount(inRowCount); + this.setScrollTop(this.scrollTop); + } + this._resize(); + } + }, + + updateRowStyles: function(inRowIndex){ + // summary: + // Update the styles for a row after it's state has changed. + this.views.updateRowStyles(inRowIndex); + }, + + rowHeightChanged: function(inRowIndex){ + // summary: + // Update grid when the height of a row has changed. Row height is handled automatically as rows + // are rendered. Use this function only to update a row's height outside the normal rendering process. + // inRowIndex: Integer + // index of the row that has changed height + + this.views.renormalizeRow(inRowIndex); + this.scroller.rowHeightChanged(inRowIndex); + }, + + // fastScroll: Boolean + // flag modifies vertical scrolling behavior. Defaults to true but set to false for slower + // scroll performance but more immediate scrolling feedback + fastScroll: true, + + delayScroll: false, + + // scrollRedrawThreshold: int + // pixel distance a user must scroll vertically to trigger grid scrolling. + scrollRedrawThreshold: (dojo.isIE ? 100 : 50), + + // scroll methods + scrollTo: function(inTop){ + // summary: + // Vertically scroll the grid to a given pixel position + // inTop: Integer + // vertical position of the grid in pixels + if(!this.fastScroll){ + this.setScrollTop(inTop); + return; + } + var delta = Math.abs(this.lastScrollTop - inTop); + this.lastScrollTop = inTop; + if(delta > this.scrollRedrawThreshold || this.delayScroll){ + this.delayScroll = true; + this.scrollTop = inTop; + this.views.setScrollTop(inTop); + dojox.grid.jobs.job('dojoxGrid-scroll', 200, dojo.hitch(this, "finishScrollJob")); + }else{ + this.setScrollTop(inTop); + } + }, + + finishScrollJob: function(){ + this.delayScroll = false; + this.setScrollTop(this.scrollTop); + }, + + setScrollTop: function(inTop){ + this.scrollTop = this.views.setScrollTop(inTop); + this.scroller.scroll(this.scrollTop); + }, + + scrollToRow: function(inRowIndex){ + // summary: + // Scroll the grid to a specific row. + // inRowIndex: Integer + // grid row index + this.setScrollTop(this.scroller.findScrollTop(inRowIndex) + 1); + }, + + // styling (private, used internally to style individual parts of a row) + styleRowNode: function(inRowIndex, inRowNode){ + if(inRowNode){ + this.rows.styleRowNode(inRowIndex, inRowNode); + } + }, + + // cells + getCell: function(inIndex){ + // summary: + // Retrieves the cell object for a given grid column. + // inIndex: Integer + // Grid column index of cell to retrieve + // returns: + // a grid cell + return this.layout.cells[inIndex]; + }, + + setCellWidth: function(inIndex, inUnitWidth) { + this.getCell(inIndex).unitWidth = inUnitWidth; + }, + + getCellName: function(inCell){ + // summary: Returns the cell name of a passed cell + return "Cell " + inCell.index; // String + }, + + // sorting + canSort: function(inSortInfo){ + // summary: + // Determines if the grid can be sorted + // inSortInfo: Integer + // Sort information, 1-based index of column on which to sort, positive for an ascending sort + // and negative for a descending sort + // returns: Boolean + // True if grid can be sorted on the given column in the given direction + }, + + sort: function(){ + }, + + getSortAsc: function(inSortInfo){ + // summary: + // Returns true if grid is sorted in an ascending direction. + inSortInfo = inSortInfo == undefined ? this.sortInfo : inSortInfo; + return Boolean(inSortInfo > 0); // Boolean + }, + + getSortIndex: function(inSortInfo){ + // summary: + // Returns the index of the column on which the grid is sorted + inSortInfo = inSortInfo == undefined ? this.sortInfo : inSortInfo; + return Math.abs(inSortInfo) - 1; // Integer + }, + + setSortIndex: function(inIndex, inAsc){ + // summary: + // Sort the grid on a column in a specified direction + // inIndex: Integer + // Column index on which to sort. + // inAsc: Boolean + // If true, sort the grid in ascending order, otherwise in descending order + var si = inIndex +1; + if(inAsc != undefined){ + si *= (inAsc ? 1 : -1); + } else if(this.getSortIndex() == inIndex){ + si = -this.sortInfo; + } + this.setSortInfo(si); + }, + + setSortInfo: function(inSortInfo){ + if(this.canSort(inSortInfo)){ + this.sortInfo = inSortInfo; + this.sort(); + this.update(); + } + }, + + // DOM event handler + doKeyEvent: function(e){ + e.dispatch = 'do' + e.type; + this.onKeyEvent(e); + }, + + // event dispatch + //: protected + _dispatch: function(m, e){ + if(m in this){ + return this[m](e); + } + }, + + dispatchKeyEvent: function(e){ + this._dispatch(e.dispatch, e); + }, + + dispatchContentEvent: function(e){ + this.edit.dispatchEvent(e) || e.sourceView.dispatchContentEvent(e) || this._dispatch(e.dispatch, e); + }, + + dispatchHeaderEvent: function(e){ + e.sourceView.dispatchHeaderEvent(e) || this._dispatch('doheader' + e.type, e); + }, + + dokeydown: function(e){ + this.onKeyDown(e); + }, + + doclick: function(e){ + if(e.cellNode){ + this.onCellClick(e); + }else{ + this.onRowClick(e); + } + }, + + dodblclick: function(e){ + if(e.cellNode){ + this.onCellDblClick(e); + }else{ + this.onRowDblClick(e); + } + }, + + docontextmenu: function(e){ + if(e.cellNode){ + this.onCellContextMenu(e); + }else{ + this.onRowContextMenu(e); + } + }, + + doheaderclick: function(e){ + if(e.cellNode){ + this.onHeaderCellClick(e); + }else{ + this.onHeaderClick(e); + } + }, + + doheaderdblclick: function(e){ + if(e.cellNode){ + this.onHeaderCellDblClick(e); + }else{ + this.onHeaderDblClick(e); + } + }, + + doheadercontextmenu: function(e){ + if(e.cellNode){ + this.onHeaderCellContextMenu(e); + }else{ + this.onHeaderContextMenu(e); + } + }, + + // override to modify editing process + doStartEdit: function(inCell, inRowIndex){ + this.onStartEdit(inCell, inRowIndex); + }, + + doApplyCellEdit: function(inValue, inRowIndex, inFieldIndex){ + this.onApplyCellEdit(inValue, inRowIndex, inFieldIndex); + }, + + doCancelEdit: function(inRowIndex){ + this.onCancelEdit(inRowIndex); + }, + + doApplyEdit: function(inRowIndex){ + this.onApplyEdit(inRowIndex); + }, + + // row editing + addRow: function(){ + // summary: + // Add a row to the grid. + this.updateRowCount(this.rowCount+1); + }, + + removeSelectedRows: function(){ + // summary: + // Remove the selected rows from the grid. + this.updateRowCount(Math.max(0, this.rowCount - this.selection.getSelected().length)); + this.selection.clear(); + } + +}); + +dojo.mixin(dojox.VirtualGrid.prototype, dojox.grid.publicEvents); + +} diff --git a/includes/js/dojox/grid/_data/dijitEditors.js b/includes/js/dojox/grid/_data/dijitEditors.js new file mode 100644 index 0000000..695de44 --- /dev/null +++ b/includes/js/dojox/grid/_data/dijitEditors.js @@ -0,0 +1,170 @@ +if(!dojo._hasResource["dojox.grid._data.dijitEditors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._data.dijitEditors"] = true; +dojo.provide("dojox.grid._data.dijitEditors"); +dojo.require("dojox.grid._data.editors"); +dojo.require("dijit.form.DateTextBox"); +dojo.require("dijit.form.TimeTextBox"); +dojo.require("dijit.form.ComboBox"); +dojo.require("dojo.data.ItemFileReadStore"); +dojo.require("dijit.form.CheckBox"); +dojo.require("dijit.form.TextBox"); +dojo.require("dijit.form.NumberSpinner"); +dojo.require("dijit.form.NumberTextBox"); +dojo.require("dijit.form.CurrencyTextBox"); +dojo.require("dijit.form.Slider"); +dojo.require("dijit.Editor"); + +dojo.declare("dojox.grid.editors.Dijit", dojox.grid.editors.base, { + editorClass: "dijit.form.TextBox", + constructor: function(inCell){ + this.editor = null; + this.editorClass = dojo.getObject(this.cell.editorClass || this.editorClass); + }, + format: function(inDatum, inRowIndex){ + this.needFormatNode(inDatum, inRowIndex); + return "
            "; + }, + getValue: function(inRowIndex){ + return this.editor.getValue(); + }, + setValue: function(inRowIndex, inValue){ + if(this.editor&&this.editor.setValue){ + this.editor.setValue(inValue); + }else{ + this.inherited(arguments); + } + }, + getEditorProps: function(inDatum){ + return dojo.mixin({}, this.cell.editorProps||{}, { + constraints: dojo.mixin({}, this.cell.constraint) || {}, //TODO: really just for ValidationTextBoxes + value: inDatum + }); + }, + createEditor: function(inNode, inDatum, inRowIndex){ + return new this.editorClass(this.getEditorProps(inDatum), inNode); + + }, + attachEditor: function(inNode, inDatum, inRowIndex){ + inNode.appendChild(this.editor.domNode); + this.setValue(inRowIndex, inDatum); + }, + formatNode: function(inNode, inDatum, inRowIndex){ + if(!this.editorClass){ + return inDatum; + } + if(!this.editor){ + this.editor = this.createEditor.apply(this, arguments); + }else{ + this.attachEditor.apply(this, arguments); + } + this.sizeEditor.apply(this, arguments); + this.cell.grid.rowHeightChanged(inRowIndex); + this.focus(); + }, + sizeEditor: function(inNode, inDatum, inRowIndex){ + var + p = this.cell.getNode(inRowIndex), + box = dojo.contentBox(p); + dojo.marginBox(this.editor.domNode, {w: box.w}); + }, + focus: function(inRowIndex, inNode){ + if(this.editor){ + setTimeout(dojo.hitch(this.editor, function(){ + dojox.grid.fire(this, "focus"); + }), 0); + } + }, + _finish: function(inRowIndex){ + this.inherited(arguments); + dojox.grid.removeNode(this.editor.domNode); + } +}); + +dojo.declare("dojox.grid.editors.ComboBox", dojox.grid.editors.Dijit, { + editorClass: "dijit.form.ComboBox", + getEditorProps: function(inDatum){ + var items=[]; + dojo.forEach(this.cell.options, function(o){ + items.push({name: o, value: o}); + }); + var store = new dojo.data.ItemFileReadStore({data: {identifier:"name", items: items}}); + return dojo.mixin({}, this.cell.editorProps||{}, { + value: inDatum, + store: store + }); + }, + getValue: function(){ + var e = this.editor; + // make sure to apply the displayed value + e.setDisplayedValue(e.getDisplayedValue()); + return e.getValue(); + } +}); + +dojo.declare("dojox.grid.editors.DateTextBox", dojox.grid.editors.Dijit, { + editorClass: "dijit.form.DateTextBox", + setValue: function(inRowIndex, inValue){ + if(this.editor){ + this.editor.setValue(new Date(inValue)); + }else{ + this.inherited(arguments); + } + }, + getEditorProps: function(inDatum){ + return dojo.mixin(this.inherited(arguments), { + value: new Date(inDatum) + }); + } +}); + + +dojo.declare("dojox.grid.editors.CheckBox", dojox.grid.editors.Dijit, { + editorClass: "dijit.form.CheckBox", + getValue: function(){ + return this.editor.checked; + }, + setValue: function(inRowIndex, inValue){ + if(this.editor&&this.editor.setAttribute){ + this.editor.setAttribute("checked", inValue); + }else{ + this.inherited(arguments); + } + }, + sizeEditor: function(inNode, inDatum, inRowIndex){ + return; + } +}); + + +dojo.declare("dojox.grid.editors.Editor", dojox.grid.editors.Dijit, { + editorClass: "dijit.Editor", + getEditorProps: function(inDatum){ + return dojo.mixin({}, this.cell.editorProps||{}, { + height: this.cell.editorHeight || "100px" + }); + }, + createEditor: function(inNode, inDatum, inRowIndex){ + // editor needs its value set after creation + var editor = new this.editorClass(this.getEditorProps(inDatum), inNode); + dojo.connect(editor, 'onLoad', dojo.hitch(this, 'populateEditor')); + return editor; + }, + formatNode: function(inNode, inDatum, inRowIndex){ + this.content = inDatum; + this.inherited(arguments); + if(dojo.isMoz){ + // FIXME: seem to need to reopen the editor and display the toolbar + var e = this.editor; + e.open(); + if(this.cell.editorToolbar){ + dojo.place(e.toolbar.domNode, e.editingArea, "before"); + } + } + }, + populateEditor: function(){ + this.editor.setValue(this.content); + this.editor.placeCursorAtEnd(); + } +}); + +} diff --git a/includes/js/dojox/grid/_data/editors.js b/includes/js/dojox/grid/_data/editors.js new file mode 100644 index 0000000..48f76cc --- /dev/null +++ b/includes/js/dojox/grid/_data/editors.js @@ -0,0 +1,239 @@ +if(!dojo._hasResource["dojox.grid._data.editors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._data.editors"] = true; +dojo.provide("dojox.grid._data.editors"); +dojo.provide("dojox.grid.editors"); + +dojo.declare("dojox.grid.editors.Base", null, { + // summary: + // base grid editor class. Other grid editors should inherited from this class. + constructor: function(inCell){ + this.cell = inCell; + }, + //private + _valueProp: "value", + _formatPending: false, + format: function(inDatum, inRowIndex){ + // summary: + // formats the cell for editing + // inDatum: anything + // cell data to edit + // inRowIndex: int + // grid row index + // returns: string of html to place in grid cell + }, + //protected + needFormatNode: function(inDatum, inRowIndex){ + this._formatPending = true; + dojox.grid.whenIdle(this, "_formatNode", inDatum, inRowIndex); + }, + cancelFormatNode: function(){ + this._formatPending = false; + }, + //private + _formatNode: function(inDatum, inRowIndex){ + if(this._formatPending){ + this._formatPending = false; + // make cell selectable + dojo.setSelectable(this.cell.grid.domNode, true); + this.formatNode(this.getNode(inRowIndex), inDatum, inRowIndex); + } + }, + //protected + getNode: function(inRowIndex){ + return (this.cell.getNode(inRowIndex) || 0).firstChild || 0; + }, + formatNode: function(inNode, inDatum, inRowIndex){ + // summary: + // format the editing dom node. Use when editor is a widget. + // inNode: dom node + // dom node for the editor + // inDatum: anything + // cell data to edit + // inRowIndex: int + // grid row index + if(dojo.isIE){ + // IE sux bad + dojox.grid.whenIdle(this, "focus", inRowIndex, inNode); + }else{ + this.focus(inRowIndex, inNode); + } + }, + dispatchEvent: function(m, e){ + if(m in this){ + return this[m](e); + } + }, + //public + getValue: function(inRowIndex){ + // summary: + // returns value entered into editor + // inRowIndex: int + // grid row index + // returns: + // value of editor + return this.getNode(inRowIndex)[this._valueProp]; + }, + setValue: function(inRowIndex, inValue){ + // summary: + // set the value of the grid editor + // inRowIndex: int + // grid row index + // inValue: anything + // value of editor + var n = this.getNode(inRowIndex); + if(n){ + n[this._valueProp] = inValue + }; + }, + focus: function(inRowIndex, inNode){ + // summary: + // focus the grid editor + // inRowIndex: int + // grid row index + // inNode: dom node + // editor node + dojox.grid.focusSelectNode(inNode || this.getNode(inRowIndex)); + }, + save: function(inRowIndex){ + // summary: + // save editor state + // inRowIndex: int + // grid row index + this.value = this.value || this.getValue(inRowIndex); + //console.log("save", this.value, inCell.index, inRowIndex); + }, + restore: function(inRowIndex){ + // summary: + // restore editor state + // inRowIndex: int + // grid row index + this.setValue(inRowIndex, this.value); + //console.log("restore", this.value, inCell.index, inRowIndex); + }, + //protected + _finish: function(inRowIndex){ + // summary: + // called when editing is completed to clean up editor + // inRowIndex: int + // grid row index + dojo.setSelectable(this.cell.grid.domNode, false); + this.cancelFormatNode(this.cell); + }, + //public + apply: function(inRowIndex){ + // summary: + // apply edit from cell editor + // inRowIndex: int + // grid row index + this.cell.applyEdit(this.getValue(inRowIndex), inRowIndex); + this._finish(inRowIndex); + }, + cancel: function(inRowIndex){ + // summary: + // cancel cell edit + // inRowIndex: int + // grid row index + this.cell.cancelEdit(inRowIndex); + this._finish(inRowIndex); + } +}); +dojox.grid.editors.base = dojox.grid.editors.Base; // back-compat + +dojo.declare("dojox.grid.editors.Input", dojox.grid.editors.Base, { + // summary + // grid cell editor that provides a standard text input box + constructor: function(inCell){ + this.keyFilter = this.keyFilter || this.cell.keyFilter; + }, + // keyFilter: object + // optional regex for disallowing keypresses + keyFilter: null, + format: function(inDatum, inRowIndex){ + this.needFormatNode(inDatum, inRowIndex); + return ''; + }, + formatNode: function(inNode, inDatum, inRowIndex){ + this.inherited(arguments); + // FIXME: feels too specific for this interface + this.cell.registerOnBlur(inNode, inRowIndex); + }, + doKey: function(e){ + if(this.keyFilter){ + var key = String.fromCharCode(e.charCode); + if(key.search(this.keyFilter) == -1){ + dojo.stopEvent(e); + } + } + }, + _finish: function(inRowIndex){ + this.inherited(arguments); + var n = this.getNode(inRowIndex); + try{ + dojox.grid.fire(n, "blur"); + }catch(e){} + } +}); +dojox.grid.editors.input = dojox.grid.editors.Input; // back compat + +dojo.declare("dojox.grid.editors.Select", dojox.grid.editors.Input, { + // summary: + // grid cell editor that provides a standard select + // options: text of each item + // values: value for each item + // returnIndex: editor returns only the index of the selected option and not the value + constructor: function(inCell){ + this.options = this.options || this.cell.options; + this.values = this.values || this.cell.values || this.options; + }, + format: function(inDatum, inRowIndex){ + this.needFormatNode(inDatum, inRowIndex); + var h = [ ''); + return h.join(''); + }, + getValue: function(inRowIndex){ + var n = this.getNode(inRowIndex); + if(n){ + var i = n.selectedIndex, o = n.options[i]; + return this.cell.returnIndex ? i : o.value || o.innerHTML; + } + } +}); +dojox.grid.editors.select = dojox.grid.editors.Select; // back compat + +dojo.declare("dojox.grid.editors.AlwaysOn", dojox.grid.editors.Input, { + // summary: + // grid cell editor that is always on, regardless of grid editing state + // alwaysOn: boolean + // flag to use editor to format grid cell regardless of editing state. + alwaysOn: true, + _formatNode: function(inDatum, inRowIndex){ + this.formatNode(this.getNode(inRowIndex), inDatum, inRowIndex); + }, + applyStaticValue: function(inRowIndex){ + var e = this.cell.grid.edit; + e.applyCellEdit(this.getValue(inRowIndex), this.cell, inRowIndex); + e.start(this.cell, inRowIndex, true); + } +}); +dojox.grid.editors.alwaysOn = dojox.grid.editors.AlwaysOn; // back-compat + +dojo.declare("dojox.grid.editors.Bool", dojox.grid.editors.AlwaysOn, { + // summary: + // grid cell editor that provides a standard checkbox that is always on + _valueProp: "checked", + format: function(inDatum, inRowIndex){ + return ''; + }, + doclick: function(e){ + if(e.target.tagName == 'INPUT'){ + this.applyStaticValue(e.rowIndex); + } + } +}); +dojox.grid.editors.bool = dojox.grid.editors.Bool; // back-compat + +} diff --git a/includes/js/dojox/grid/_data/fields.js b/includes/js/dojox/grid/_data/fields.js new file mode 100644 index 0000000..230bede --- /dev/null +++ b/includes/js/dojox/grid/_data/fields.js @@ -0,0 +1,104 @@ +if(!dojo._hasResource["dojox.grid._data.fields"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._data.fields"] = true; +dojo.provide("dojox.grid._data.fields"); + +dojo.declare("dojox.grid.data.Mixer", null, { + // summary: + // basic collection class that provides a default value for items + + constructor: function(){ + this.defaultValue = {}; + this.values = []; + }, + count: function(){ + return this.values.length; + }, + clear: function(){ + this.values = []; + }, + build: function(inIndex){ + var result = dojo.mixin({owner: this}, this.defaultValue); + result.key = inIndex; + this.values[inIndex] = result; + return result; + }, + getDefault: function(){ + return this.defaultValue; + }, + setDefault: function(inField /*[, inField2, ... inFieldN] */){ + for(var i=0, a; (a = arguments[i]); i++){ + dojo.mixin(this.defaultValue, a); + } + }, + get: function(inIndex){ + return this.values[inIndex] || this.build(inIndex); + }, + _set: function(inIndex, inField /*[, inField2, ... inFieldN] */){ + // each field argument can be a single field object of an array of field objects + var v = this.get(inIndex); + for(var i=1; i= this.values.length){ + this.values[inIndex] = inProps; + }else{ + this.values.splice(inIndex, 0, inProps); + } + }, + remove: function(inIndex){ + this.values.splice(inIndex, 1); + }, + swap: function(inIndexA, inIndexB){ + dojox.grid.arraySwap(this.values, inIndexA, inIndexB); + }, + move: function(inFromIndex, inToIndex){ + dojox.grid.arrayMove(this.values, inFromIndex, inToIndex); + } +}); + +dojox.grid.data.compare = function(a, b){ + return (a > b ? 1 : (a == b ? 0 : -1)); +} + +dojo.declare('dojox.grid.data.Field', null, { + constructor: function(inName){ + this.name = inName; + this.compare = dojox.grid.data.compare; + }, + na: dojox.grid.na +}); + +dojo.declare('dojox.grid.data.Fields', dojox.grid.data.Mixer, { + constructor: function(inFieldClass){ + var fieldClass = inFieldClass ? inFieldClass : dojox.grid.data.Field; + this.defaultValue = new fieldClass(); + }, + indexOf: function(inKey){ + for(var i=0; i=0; i--){ + idx = inIndices[i]; + col = Math.abs(idx) - 1; + if(col >= 0){ + field = this.fields.get(col); + result = this.generateComparator(field.compare, field.key, idx > 0, result); + } + } + return result; + }, + sort: null, + dummy: 0 +}); + +dojo.declare("dojox.grid.data.Rows", dojox.grid.data.Model, { + // observer events + allChange: function(){ + this.notify("AllChange", arguments); + this.notify("Change", arguments); + }, + rowChange: function(){ + this.notify("RowChange", arguments); + }, + datumChange: function(){ + this.notify("DatumChange", arguments); + }, + // copyRow: function(inRowIndex); // abstract + // update + beginModifyRow: function(inRowIndex){ + if(!this.cache[inRowIndex]){ + this.cache[inRowIndex] = this.copyRow(inRowIndex); + } + }, + endModifyRow: function(inRowIndex){ + var cache = this.cache[inRowIndex]; + if(cache){ + var data = this.getRow(inRowIndex); + if(!dojox.grid.arrayCompare(cache, data)){ + this.update(cache, data, inRowIndex); + } + delete this.cache[inRowIndex]; + } + }, + cancelModifyRow: function(inRowIndex){ + var cache = this.cache[inRowIndex]; + if(cache){ + this.setRow(cache, inRowIndex); + delete this.cache[inRowIndex]; + } + } +}); + +dojo.declare("dojox.grid.data.Table", dojox.grid.data.Rows, { + // summary: + // Basic grid data model for static data in the form of an array of rows + // that are arrays of cell data + constructor: function(){ + this.cache = []; + }, + colCount: 0, // tables introduce cols + data: null, + cache: null, + // morphology + measure: function(){ + this.count = this.getRowCount(); + this.colCount = this.getColCount(); + this.allChange(); + //this.notify("Measure"); + }, + getRowCount: function(){ + return (this.data ? this.data.length : 0); + }, + getColCount: function(){ + return (this.data && this.data.length ? this.data[0].length : this.fields.count()); + }, + badIndex: function(inCaller, inDescriptor){ + console.debug('dojox.grid.data.Table: badIndex'); + }, + isGoodIndex: function(inRowIndex, inColIndex){ + return (inRowIndex >= 0 && inRowIndex < this.count && (arguments.length < 2 || (inColIndex >= 0 && inColIndex < this.colCount))); + }, + // access + getRow: function(inRowIndex){ + return this.data[inRowIndex]; + }, + copyRow: function(inRowIndex){ + return this.getRow(inRowIndex).slice(0); + }, + getDatum: function(inRowIndex, inColIndex){ + return this.data[inRowIndex][inColIndex]; + }, + get: function(){ + throw('Plain "get" no longer supported. Use "getRow" or "getDatum".'); + }, + setData: function(inData){ + this.data = (inData || []); + this.allChange(); + }, + setRow: function(inData, inRowIndex){ + this.data[inRowIndex] = inData; + this.rowChange(inData, inRowIndex); + this.change(); + }, + setDatum: function(inDatum, inRowIndex, inColIndex){ + this.data[inRowIndex][inColIndex] = inDatum; + this.datumChange(inDatum, inRowIndex, inColIndex); + }, + set: function(){ + throw('Plain "set" no longer supported. Use "setData", "setRow", or "setDatum".'); + }, + setRows: function(inData, inRowIndex){ + for(var i=0, l=inData.length, r=inRowIndex; i=0; i--){ + dojox.grid.arrayRemove(this.data, inKeys[i]); + } + this.count -= inKeys.length; + return true; + }, + // sort + sort: function(/* (+|-)column_index+1, ... */){ + this.data.sort(this.makeComparator(arguments)); + }, + swap: function(inIndexA, inIndexB){ + dojox.grid.arraySwap(this.data, inIndexA, inIndexB); + this.rowChange(this.getRow(inIndexA), inIndexA); + this.rowChange(this.getRow(inIndexB), inIndexB); + this.change(); + }, + dummy: 0 +}); + +dojo.declare("dojox.grid.data.Objects", dojox.grid.data.Table, { + constructor: function(inFields, inData, inKey){ + if(!inFields){ + this.autoAssignFields(); + } + }, + allChange: function(){ + this.notify("FieldsChange"); + this.inherited(arguments); + }, + autoAssignFields: function(){ + var d = this.data[0], i = 0, field; + for(var f in d){ + field = this.fields.get(i++); + if (!dojo.isString(field.key)){ + field.key = f; + } + } + }, + setData: function(inData){ + this.data = (inData || []); + this.autoAssignFields(); + this.allChange(); + }, + getDatum: function(inRowIndex, inColIndex){ + return this.data[inRowIndex][this.fields.get(inColIndex).key]; + } +}); + +dojo.declare("dojox.grid.data.Dynamic", dojox.grid.data.Table, { + // summary: + // Grid data model for dynamic data such as data retrieved from a server. + // Retrieves data automatically when requested and provides notification when data is received + constructor: function(){ + this.page = []; + this.pages = []; + }, + page: null, + pages: null, + rowsPerPage: 100, + requests: 0, + bop: -1, + eop: -1, + // data + clearData: function(){ + this.pages = []; + this.bop = this.eop = -1; + this.setData([]); + }, + getRowCount: function(){ + return this.count; + }, + getColCount: function(){ + return this.fields.count(); + }, + setRowCount: function(inCount){ + this.count = inCount; + this.change(); + }, + // paging + requestsPending: function(inBoolean){ + }, + rowToPage: function(inRowIndex){ + return (this.rowsPerPage ? Math.floor(inRowIndex / this.rowsPerPage) : inRowIndex); + }, + pageToRow: function(inPageIndex){ + return (this.rowsPerPage ? this.rowsPerPage * inPageIndex : inPageIndex); + }, + requestRows: function(inRowIndex, inCount){ + // summary: + // stub. Fill in to perform actual data row fetching logic. The + // returning logic must provide the data back to the system via + // setRow + }, + rowsProvided: function(inRowIndex, inCount){ + this.requests--; + if(this.requests == 0){ + this.requestsPending(false); + } + }, + requestPage: function(inPageIndex){ + var row = this.pageToRow(inPageIndex); + var count = Math.min(this.rowsPerPage, this.count - row); + if(count > 0){ + this.requests++; + this.requestsPending(true); + setTimeout(dojo.hitch(this, "requestRows", row, count), 1); + //this.requestRows(row, count); + } + }, + needPage: function(inPageIndex){ + if(!this.pages[inPageIndex]){ + this.pages[inPageIndex] = true; + this.requestPage(inPageIndex); + } + }, + preparePage: function(inRowIndex, inColIndex){ + if(inRowIndex < this.bop || inRowIndex >= this.eop){ + var pageIndex = this.rowToPage(inRowIndex); + this.needPage(pageIndex); + this.bop = pageIndex * this.rowsPerPage; + this.eop = this.bop + (this.rowsPerPage || this.count); + } + }, + isRowLoaded: function(inRowIndex){ + return Boolean(this.data[inRowIndex]); + }, + // removal + removePages: function(inRowIndexes){ + for(var i=0, r; ((r=inRowIndexes[i]) != undefined); i++){ + this.pages[this.rowToPage(r)] = false; + } + this.bop = this.eop =-1; + }, + remove: function(inRowIndexes){ + this.removePages(inRowIndexes); + dojox.grid.data.Table.prototype.remove.apply(this, arguments); + }, + // access + getRow: function(inRowIndex){ + var row = this.data[inRowIndex]; + if(!row){ + this.preparePage(inRowIndex); + } + return row; + }, + getDatum: function(inRowIndex, inColIndex){ + var row = this.getRow(inRowIndex); + return (row ? row[inColIndex] : this.fields.get(inColIndex).na); + }, + setDatum: function(inDatum, inRowIndex, inColIndex){ + var row = this.getRow(inRowIndex); + if(row){ + row[inColIndex] = inDatum; + this.datumChange(inDatum, inRowIndex, inColIndex); + }else{ + console.debug('[' + this.declaredClass + '] dojox.grid.data.dynamic.set: cannot set data on an non-loaded row'); + } + }, + // sort + canSort: function(){ + return false; + } +}); + +// FIXME: deprecated: (included for backward compatibility only) +dojox.grid.data.table = dojox.grid.data.Table; +dojox.grid.data.dynamic = dojox.grid.data.Dynamic; + +// we treat dojo.data stores as dynamic stores because no matter how they got +// here, they should always fill that contract +dojo.declare("dojox.grid.data.DojoData", dojox.grid.data.Dynamic, { + // summary: + // A grid data model for dynamic data retreived from a store which + // implements the dojo.data API set. Retrieves data automatically when + // requested and provides notification when data is received + // description: + // This store subclasses the Dynamic grid data object in order to + // provide paginated data access support, notification and view + // updates for stores which support those features, and simple + // field/column mapping for all dojo.data stores. + constructor: function(inFields, inData, args){ + this.count = 1; + this._rowIdentities = {}; + this._currentlyProcessing = []; + if(args){ + dojo.mixin(this, args); + } + if(this.store){ + var f = this.store.getFeatures(); + this._canNotify = f['dojo.data.api.Notification']; + this._canWrite = f['dojo.data.api.Write']; + this._canIdentify = f['dojo.data.api.Identity']; + if(this._canNotify){ + dojo.connect(this.store, "onSet", this, "_storeDatumChange"); + dojo.connect(this.store, "onDelete", this, "_storeDatumDelete"); + dojo.connect(this.store, "onNew", this, "_storeDatumNew"); + } + if(this._canWrite) { + dojo.connect(this.store, "revert", this, "refresh"); + } + } + }, + markupFactory: function(args, node){ + return new dojox.grid.data.DojoData(null, null, args); + }, + query: { name: "*" }, // default, stupid query + store: null, + _currentlyProcessing: null, + _canNotify: false, + _canWrite: false, + _canIdentify: false, + _rowIdentities: {}, + clientSort: false, + sortFields: null, + queryOptions: null, + + // data + setData: function(inData){ + this.store = inData; + this.data = []; + this.allChange(); + }, + setRowCount: function(inCount){ + //console.debug("inCount:", inCount); + this.count = inCount; + this.allChange(); + }, + beginReturn: function(inCount){ + if(this.count != inCount){ + // this.setRowCount(0); + // this.clear(); + // console.debug(this.count, inCount); + this.setRowCount(inCount); + } + }, + _setupFields: function(dataItem){ + // abort if we already have setup fields + if(this.fields._nameMaps){ + return; + } + // set up field/index mappings + var m = {}; + //console.debug("setting up fields", m); + var fields = dojo.map(this.store.getAttributes(dataItem), + function(item, idx){ + m[item] = idx; + m[idx+".idx"] = item; + // name == display name, key = property name + return { name: item, key: item }; + }, + this + ); + this.fields._nameMaps = m; + // console.debug("new fields:", fields); + this.fields.set(fields); + this.notify("FieldsChange"); + }, + _getRowFromItem: function(item){ + // gets us the row object (and row index) of an item + }, + _createRow: function(item){ + var row = {}; + row.__dojo_data_item = item; + dojo.forEach(this.fields.values, function(a){ + value = this.store.getValue(item, a.name); + row[a.name] = (value === undefined || value === null)?"":value; + }, this); + return row; + }, + processRows: function(items, request){ + // console.debug(arguments); + if(!items || items.length == 0){ return; } + this._setupFields(items[0]); + dojo.forEach(items, function(item, idx){ + var row = this._createRow(item); + this._setRowId(item, request.start, idx); + this.setRow(row, request.start+idx); + }, this); + // FIXME: + // Q: scott, steve, how the hell do we actually get this to update + // the visible UI for these rows? + // A: the goal is that Grid automatically updates to reflect changes + // in model. In this case, setRow -> rowChanged -> (observed by) Grid -> modelRowChange -> updateRow + }, + // request data + requestRows: function(inRowIndex, inCount){ + var row = inRowIndex || 0; + var params = { + start: row, + count: this.rowsPerPage, + query: this.query, + sort: this.sortFields, + queryOptions: this.queryOptions, + onBegin: dojo.hitch(this, "beginReturn"), + onComplete: dojo.hitch(this, "processRows"), // add to deferred? + onError: dojo.hitch(this, "processError") + }; + this.store.fetch(params); + }, + getDatum: function(inRowIndex, inColIndex){ + //console.debug("getDatum", inRowIndex, inColIndex); + var row = this.getRow(inRowIndex); + var field = this.fields.values[inColIndex]; + return row && field ? row[field.name] : field ? field.na : '?'; + //var idx = row && this.fields._nameMaps[inColIndex+".idx"]; + //return (row ? row[idx] : this.fields.get(inColIndex).na); + }, + setDatum: function(inDatum, inRowIndex, inColIndex){ + var n = this.fields._nameMaps[inColIndex+".idx"]; + // console.debug("setDatum:", "n:"+n, inDatum, inRowIndex, inColIndex); + if(n){ + this.data[inRowIndex][n] = inDatum; + this.datumChange(inDatum, inRowIndex, inColIndex); + } + }, + // modification, update and store eventing + copyRow: function(inRowIndex){ + var row = {}; + var backstop = {}; + var src = this.getRow(inRowIndex); + for(var x in src){ + if(src[x] != backstop[x]){ + row[x] = src[x]; + } + } + return row; + }, + _attrCompare: function(cache, data){ + dojo.forEach(this.fields.values, function(a){ + if(cache[a.name] != data[a.name]){ return false; } + }, this); + return true; + }, + endModifyRow: function(inRowIndex){ + var cache = this.cache[inRowIndex]; + if(cache){ + var data = this.getRow(inRowIndex); + if(!this._attrCompare(cache, data)){ + this.update(cache, data, inRowIndex); + } + delete this.cache[inRowIndex]; + } + }, + cancelModifyRow: function(inRowIndex){ + // console.debug("cancelModifyRow", arguments); + var cache = this.cache[inRowIndex]; + if(cache){ + this.setRow(cache, inRowIndex); + delete this.cache[inRowIndex]; + } + }, + _setRowId: function(item, offset, idx){ + // FIXME: where else do we need to keep this in sync? + //Handle stores that implement identity and try to handle those that do not. + if (this._canIdentify) { + this._rowIdentities[this.store.getIdentity(item)] = {rowId: offset+idx, item: item}; + }else{ + var identity = dojo.toJson(this.query) + ":start:" + offset + ":idx:" + idx + ":sort:" + dojo.toJson(this.sortFields); + this._rowIdentities[identity] = {rowId: offset+idx, item: item}; + } + }, + _getRowId: function(item, isNotItem){ + // summary: + // Function determine the row index for a particular item + // item: + // The store item to examine to determine row index. + // isNotItem: + // Boolean flag to indicate if the item passed is a store item or not. + var rowId = null; + //Handle identity and nonidentity capable stores. + if(this._canIdentify && !isNotItem){ + rowId = this._rowIdentities[this.store.getIdentity(item)].rowId; + }else{ + //Not efficient, but without identity support, + //not a better way to do it. Basically, do our best to locate it + //This may or may not work, but best we can do here. + var id; + for(id in this._rowIdentities){ + if(this._rowIdentities[id].item === item){ + rowId = this._rowIdentities[id].rowId; + break; + } + } + } + return rowId; + }, + _storeDatumChange: function(item, attr, oldVal, newVal){ + // the store has changed some data under us, need to update the display + var rowId = this._getRowId(item); + var row = this.getRow(rowId); + if(row){ + row[attr] = newVal; + var colId = this.fields._nameMaps[attr]; + this.notify("DatumChange", [ newVal, rowId, colId ]); + } + }, + _storeDatumDelete: function(item){ + if(dojo.indexOf(this._currentlyProcessing, item) != -1) + return; + // the store has deleted some item under us, need to remove that item from + // the view if possible. It may be the deleted item isn't even in the grid. + var rowId = this._getRowId(item, true); + if(rowId != null){ + this._removeItems([rowId]); + } + }, + _storeDatumNew: function(item){ + if(this._disableNew){ + return; + } + // the store has added some item under us, need to add it to the view. + this._insertItem(item, this.data.length); + }, + insert: function(item, index){ + // Push the given item back to the store + this._disableNew = true; + var i = this.store.newItem(item); + this._disableNew = false; + this._insertItem(i, index); + }, + _insertItem: function(storeItem, index){ + // Set up our fields if we haven't already + if(!this.fields._nameMaps){ + this._setupFields(storeItem); + } + var row = this._createRow(storeItem); + for(var i in this._rowIdentities){ //increment all the remaining row ids up one + var rowIdentity = this._rowIdentities[i]; + if(rowIdentity.rowId >= index){ + rowIdentity.rowId++; + } + } + this._setRowId(storeItem, 0, index); + dojox.grid.data.Dynamic.prototype.insert.apply(this, [row, index]); + }, + datumChange: function(value, rowIdx, colIdx){ + if(this._canWrite){ + // we're chaning some data, which means we need to write back + var row = this.getRow(rowIdx); + var field = this.fields._nameMaps[colIdx+".idx"]; + this.store.setValue(row.__dojo_data_item, field, value); + // we don't need to call DatumChange, an eventing store will tell + // us about the row change events + }else{ + // we can't write back, so just go ahead and change our local copy + // of the data + this.notify("DatumChange", arguments); + } + }, + insertion: function(/* index */){ + console.debug("Insertion", arguments); + this.notify("Insertion", arguments); + this.notify("Change", arguments); + }, + removal: function(/* keys */){ + console.debug("Removal", arguments); + this.notify("Removal", arguments); + this.notify("Change", arguments); + }, + remove: function(inRowIndexes){ + // summary: + // Function to remove a set of items from the store based on the row index. + // inRowIndexes: + // An array of row indexes from the grid to remove from the store. + /* Call delete on the store */ + for(var i=inRowIndexes.length-1; i>=0; i--){ + // Need to find the item, then remove each from the data store + var item = this.data[inRowIndexes[i]].__dojo_data_item; + this._currentlyProcessing.push(item); + this.store.deleteItem(item); + } + /* Remove from internal data structure and the view */ + this._removeItems(inRowIndexes); + this._currentlyProcessing = []; + }, + _removeItems: function(inRowIndexes /*array*/){ + // summary: + // Function to remove a set of items from the store based on the row index. + // inRowIndexes: + // An array of row indexes from the grid to remove from the store. + dojox.grid.data.Dynamic.prototype.remove.apply(this, arguments); + // Rebuild _rowIdentities + this._rowIdentities = {}; + for (var i = 0; i < this.data.length; i++){ + this._setRowId(this.data[i].__dojo_data_item, 0, i); + } + }, + canSort: function(){ + // Q: Return true and re-issue the queries? + // A: Return true only. Re-issue the query in 'sort'. + // Note, above are original comments :) + return true; + }, + sort: function(colIndex){ + var col = Math.abs(colIndex) - 1; + this.sortFields = [{'attribute': this.fields.values[col].name, 'descending': (colIndex>0)}]; + + // Since we're relying on the data store to sort, we have to refresh our data. + this.refresh(); + }, + refresh: function(){ + // summary: + // Function to cause the model to re-query the store and rebuild the current viewport. + this.clearData(true); + this.requestRows(); + }, + clearData: function(/* boolean */ keepStore){ + this._rowIdentities = {}; + this.pages = []; + this.bop = this.eop = -1; + this.count = 0; + this.setData((keepStore?this.store:[])); + }, + processError: function(error, request){ + // summary: + // Hook function to trap error messages from the store and emit them. + // Intended for connecting to and handling the error object or at least reporting it. + // + // error: + // The error object returned by the store when a problem occurred. + // request: + // The request object that caused the error. + console.log(error); + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/Grid.css b/includes/js/dojox/grid/_grid/Grid.css new file mode 100644 index 0000000..655be54 --- /dev/null +++ b/includes/js/dojox/grid/_grid/Grid.css @@ -0,0 +1,201 @@ +.dojoxGrid { + position: relative; + background-color: #EBEADB; + font-family: Geneva, Arial, Helvetica, sans-serif; + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} +.dojoxGrid table { + padding: 0; +} +.dojoxGrid td { + -moz-outline: none; +} +.dojoxGrid-master-header { + position: relative; +} +.dojoxGrid-master-view { + position: relative; +} +.dojoxGrid-view { + position: absolute; + overflow: hidden; +} +.dojoxGrid-header { + position: absolute; + overflow: hidden; +} +.dojoxGrid-header { + background-color: #E8E1CF; +} +.dojoxGrid-header table { + text-align: center; +} +.dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} +.dojoxGrid-header .dojoxGrid-cell { + border: 1px solid; + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x; + padding-bottom: 2px; +} +.dojoxGrid-header .dojoxGrid-cell-over { + background-image: none; + background-color: white; + border-bottom-color: #FEBE47; + margin-bottom: 0; + padding-bottom: 0; + border-bottom-width: 3px; +} +.dojoxGrid-sort-down { + background: url(images/grid_sort_down.gif) left no-repeat; + padding-left:16px; + margin-left:4px; +} +.dojoxGrid-sort-up { + background: url(images/grid_sort_up.gif) left no-repeat; + padding-left:16px; + margin-left:4px; +} +.dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: white; + width: 100%; +} +.dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} +.dojoxGrid-rowbar { + border: 1px solid; + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + border-top: none; + background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x; +} +.dojoxGrid-rowbar-inner { + border-top: 1px solid #F6F4EB; +} +.dojoxGrid-rowbar-over { + background-image: none; + background-color: white; + border-top-color: #FEBE47; + border-bottom-color: #FEBE47; +} +.dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + + background-position: center; + background-repeat: no-repeat; +} +.dojoxGrid-row { + position: relative; + width: 9000em; +} +.dojoxGrid-row { + + border: 1px solid #E8E4D8; + border-color: #F8F7F1; + + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} +.dojoxGrid-row-over { + border-top-color: #FEBE47; + border-bottom-color: #FEBE47; + + + +} +.dojoxGrid-row-odd { + background-color: #FFFDF3; + +} +.dojoxGrid-row-selected { + background-color: #D9E8F9; +} +.dojoxGrid-row-table { + table-layout: fixed; + width: 0; +} +.dojoxGrid-invisible { + visibility: hidden; +} +.Xdojo-ie .dojoxGrid-invisible { + display: none; +} +.dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} +.dojoxGrid-cell { + border: 1px solid; + border-color: #EBEADB; + border-right-color: #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} +.dojoxGrid-cell-focus { + border: 1px dashed blue; +} +.dojoxGrid-cell-over { + border: 1px dotted #FEBE47; +} +.dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted green; +} +.dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} +.dojoxGrid-row-editing td { + background-color: #F4FFF4; +} +.dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.dojoxGrid-row-error td { + background-color: #F8B8B6; +} +.dojoxGrid-input, .dojoxGrid-select, .dojoxGrid-textarea { + margin: 0; + padding: 0; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} +.gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} +.dijit_a11y .dojoxGrid-sort-down, .dijit_a11y .dojoxGrid-sort-up { + margin-left: 0; + padding-left: 0; +} diff --git a/includes/js/dojox/grid/_grid/Grid.css.commented.css b/includes/js/dojox/grid/_grid/Grid.css.commented.css new file mode 100644 index 0000000..227ffa3 --- /dev/null +++ b/includes/js/dojox/grid/_grid/Grid.css.commented.css @@ -0,0 +1,258 @@ +.dojoxGrid { + position: relative; + background-color: #EBEADB; + font-family: Geneva, Arial, Helvetica, sans-serif; + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} + +.dojoxGrid table { + padding: 0; +} + +.dojoxGrid td { + -moz-outline: none; +} + +/* master header */ + +.dojoxGrid-master-header { + position: relative; +} + +/* master view */ + +.dojoxGrid-master-view { + position: relative; +} + +/* views */ + +.dojoxGrid-view { + position: absolute; + overflow: hidden; +} + +/* header */ + +.dojoxGrid-header { + position: absolute; + overflow: hidden; +} + +.dojoxGrid-header { + background-color: #E8E1CF; +} + +.dojoxGrid-header table { + text-align: center; +} + +.dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} + +.dojoxGrid-header .dojoxGrid-cell { + border: 1px solid; + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x; + padding-bottom: 2px; +} + +.dojoxGrid-header .dojoxGrid-cell-over { + background-image: none; + background-color: white; + border-bottom-color: #FEBE47; + margin-bottom: 0; + padding-bottom: 0; + border-bottom-width: 3px; +} + +.dojoxGrid-sort-down { + background: url(images/grid_sort_down.gif) left no-repeat; + padding-left:16px; + margin-left:4px; +} + +.dojoxGrid-sort-up { + background: url(images/grid_sort_up.gif) left no-repeat; + padding-left:16px; + margin-left:4px; +} + +/* content */ + +.dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: white; + width: 100%; +} + +.dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} + +/* rowbar */ + +.dojoxGrid-rowbar { + border: 1px solid; + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + border-top: none; + background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x; +} + +.dojoxGrid-rowbar-inner { + border-top: 1px solid #F6F4EB; +} + +.dojoxGrid-rowbar-over { + background-image: none; + background-color: white; + border-top-color: #FEBE47; + border-bottom-color: #FEBE47; +} + +.dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + /*background-image: url(images/grid_green_dot.gif);*/ + background-position: center; + background-repeat: no-repeat; +} + +/* rows */ + +.dojoxGrid-row { + position: relative; + width: 9000em; +} + +.dojoxGrid-row { + /*border: 1px solid #E8E4D8;*/ + border: 1px solid #E8E4D8; + border-color: #F8F7F1; + /*padding: 0 0 1px 0;*/ + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} + +.dojoxGrid-row-over { + border-top-color: #FEBE47; + border-bottom-color: #FEBE47; + /*border-bottom-width: 2px; + padding-bottom: 0;*/ + /*background-color: #FFDD9D;*/ + /*background-color: #FDFDFD;*/ +} + +.dojoxGrid-row-odd { + background-color: #FFFDF3; + /*background-color: #F9F7E8;*/ +} + +.dojoxGrid-row-selected { + background-color: #D9E8F9; +} + +.dojoxGrid-row-table { + table-layout: fixed; + width: 0; +} + +.dojoxGrid-invisible { + visibility: hidden; +} + +.Xdojo-ie .dojoxGrid-invisible { + display: none; +} + +.dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} + +/* cells */ + +.dojoxGrid-cell { + border: 1px solid; + border-color: #EBEADB; + border-right-color: #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} + +.dojoxGrid-cell-focus { + border: 1px dashed blue; +} + +.dojoxGrid-cell-over { + border: 1px dotted #FEBE47; +} + +.dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted green; +} + +.dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} + +/* editing */ + +.dojoxGrid-row-editing td { + background-color: #F4FFF4; +} + +.dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.dojoxGrid-row-error td { + background-color: #F8B8B6; +} + +.dojoxGrid-input, .dojoxGrid-select, .dojoxGrid-textarea { + margin: 0; + padding: 0; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} + +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} + +.gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} +.dijit_a11y .dojoxGrid-sort-down, .dijit_a11y .dojoxGrid-sort-up { + margin-left: 0; + padding-left: 0; +} diff --git a/includes/js/dojox/grid/_grid/Grid_rtl.css b/includes/js/dojox/grid/_grid/Grid_rtl.css new file mode 100644 index 0000000..88ab215 --- /dev/null +++ b/includes/js/dojox/grid/_grid/Grid_rtl.css @@ -0,0 +1,8 @@ +.dijitRtl .dojoxGrid-header table { +} +.dj_ie .dijitRtl .dojoxGrid-header table { + float:none; +} +.dijitRtl .dojoxGrid-content { + float:left; +} diff --git a/includes/js/dojox/grid/_grid/Grid_rtl.css.commented.css b/includes/js/dojox/grid/_grid/Grid_rtl.css.commented.css new file mode 100644 index 0000000..c240b4c --- /dev/null +++ b/includes/js/dojox/grid/_grid/Grid_rtl.css.commented.css @@ -0,0 +1,10 @@ +.dijitRtl .dojoxGrid-header table { +} + +.dj_ie .dijitRtl .dojoxGrid-header table { + float:none; +} + +.dijitRtl .dojoxGrid-content { + float:left; +} diff --git a/includes/js/dojox/grid/_grid/builder.js b/includes/js/dojox/grid/_grid/builder.js new file mode 100644 index 0000000..dccf7e2 --- /dev/null +++ b/includes/js/dojox/grid/_grid/builder.js @@ -0,0 +1,522 @@ +if(!dojo._hasResource["dojox.grid._grid.builder"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.builder"] = true; +dojo.provide("dojox.grid._grid.builder"); +dojo.require("dojox.grid._grid.drag"); + +dojo.declare("dojox.grid.Builder", + null, + { + // summary: + // Base class to produce html for grid content. + // Also provide event decoration, providing grid related information inside the event object + // passed to grid events. + constructor: function(inView){ + this.view = inView; + this.grid = inView.grid; + }, + + view: null, + // boilerplate HTML + _table: '', + + // generate starting tags for a cell + generateCellMarkup: function(inCell, inMoreStyles, inMoreClasses, isHeader){ + var result = [], html; + if (isHeader){ + html = [ '' : ''); + for(var i=0, cell, m, cc, cs; (cell=row[i]); i++){ + m = cell.markup, cc = cell.customClasses = [], cs = cell.customStyles = []; + // content (format can fill in cc and cs as side-effects) + m[5] = cell.format(inDataIndex); + // classes + m[1] = cc.join(' '); + // styles + m[3] = cs.join(';'); + // in-place concat + html.push.apply(html, m); + } + html.push(''); + } + html.push('
            '); + // result[4] => td postfix + result.push(html.join('')); + // SLOT: result[5] => content + result.push(''); + // result[6] => td closes + result.push(''); + return result; // Array + }, + + // cell finding + isCellNode: function(inNode){ + return Boolean(inNode && inNode.getAttribute && inNode.getAttribute("idx")); + }, + + getCellNodeIndex: function(inCellNode){ + return inCellNode ? Number(inCellNode.getAttribute("idx")) : -1; + }, + + getCellNode: function(inRowNode, inCellIndex){ + for(var i=0, row; row=dojox.grid.getTr(inRowNode.firstChild, i); i++){ + for(var j=0, cell; cell=row.cells[j]; j++){ + if(this.getCellNodeIndex(cell) == inCellIndex){ + return cell; + } + } + } + }, + + findCellTarget: function(inSourceNode, inTopNode){ + var n = inSourceNode; + while(n && (!this.isCellNode(n) || (dojox.grid.gridViewTag in n.offsetParent.parentNode && n.offsetParent.parentNode[dojox.grid.gridViewTag] != this.view.id)) && (n!=inTopNode)){ + n = n.parentNode; + } + return n!=inTopNode ? n : null + }, + + // event decoration + baseDecorateEvent: function(e){ + e.dispatch = 'do' + e.type; + e.grid = this.grid; + e.sourceView = this.view; + e.cellNode = this.findCellTarget(e.target, e.rowNode); + e.cellIndex = this.getCellNodeIndex(e.cellNode); + e.cell = (e.cellIndex >= 0 ? this.grid.getCell(e.cellIndex) : null); + }, + + // event dispatch + findTarget: function(inSource, inTag){ + var n = inSource; + while(n && (n!=this.domNode) && (!(inTag in n) || (dojox.grid.gridViewTag in n && n[dojox.grid.gridViewTag] != this.view.id))){ + n = n.parentNode; + } + return (n != this.domNode) ? n : null; + }, + + findRowTarget: function(inSource){ + return this.findTarget(inSource, dojox.grid.rowIndexTag); + }, + + isIntraNodeEvent: function(e){ + try{ + return (e.cellNode && e.relatedTarget && dojo.isDescendant(e.relatedTarget, e.cellNode)); + }catch(x){ + // e.relatedTarget has permission problem in FF if it's an input: https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + return false; + } + }, + + isIntraRowEvent: function(e){ + try{ + var row = e.relatedTarget && this.findRowTarget(e.relatedTarget); + return !row && (e.rowIndex==-1) || row && (e.rowIndex==row.gridRowIndex); + }catch(x){ + // e.relatedTarget on INPUT has permission problem in FF: https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + return false; + } + }, + + dispatchEvent: function(e){ + if(e.dispatch in this){ + return this[e.dispatch](e); + } + }, + + // dispatched event handlers + domouseover: function(e){ + if(e.cellNode && (e.cellNode!=this.lastOverCellNode)){ + this.lastOverCellNode = e.cellNode; + this.grid.onMouseOver(e); + } + this.grid.onMouseOverRow(e); + }, + + domouseout: function(e){ + if(e.cellNode && (e.cellNode==this.lastOverCellNode) && !this.isIntraNodeEvent(e, this.lastOverCellNode)){ + this.lastOverCellNode = null; + this.grid.onMouseOut(e); + if(!this.isIntraRowEvent(e)){ + this.grid.onMouseOutRow(e); + } + } + }, + + domousedown: function(e){ + if (e.cellNode) + this.grid.onMouseDown(e); + this.grid.onMouseDownRow(e) + } + +}); + +dojo.declare("dojox.grid.contentBuilder", + dojox.grid.Builder, + { + // summary: + // Produces html for grid data content. Owned by grid and used internally + // for rendering data. Override to implement custom rendering. + update: function(){ + this.prepareHtml(); + }, + + // cache html for rendering data rows + prepareHtml: function(){ + var defaultGet=this.grid.get, rows=this.view.structure.rows; + for(var j=0, row; (row=rows[j]); j++){ + for(var i=0, cell; (cell=row[i]); i++){ + cell.get = cell.get || (cell.value == undefined) && defaultGet; + cell.markup = this.generateCellMarkup(cell, cell.cellStyles, cell.cellClasses, false); + } + } + }, + + // time critical: generate html using cache and data source + generateHtml: function(inDataIndex, inRowIndex){ + var + html = [ this._table ], + v = this.view, + obr = v.onBeforeRow, + rows = v.structure.rows; + + obr && obr(inRowIndex, rows); + for(var j=0, row; (row=rows[j]); j++){ + if(row.hidden || row.header){ + continue; + } + html.push(!row.invisible ? '
            '); + return html.join(''); // String + }, + + decorateEvent: function(e){ + e.rowNode = this.findRowTarget(e.target); + if(!e.rowNode){return false}; + e.rowIndex = e.rowNode[dojox.grid.rowIndexTag]; + this.baseDecorateEvent(e); + e.cell = this.grid.getCell(e.cellIndex); + return true; // Boolean + } + +}); + +dojo.declare("dojox.grid.headerBuilder", + dojox.grid.Builder, + { + // summary: + // Produces html for grid header content. Owned by grid and used internally + // for rendering data. Override to implement custom rendering. + + bogusClickTime: 0, + overResizeWidth: 4, + minColWidth: 1, + + // FIXME: isn't this getting mixed from dojox.grid.Builder, -1 character? + _table: ''); + dojox.grid.fire(this.view, "onBeforeRow", [-1, rows]); + for(var j=0, row; (row=rows[j]); j++){ + if(row.hidden){ + continue; + } + html.push(!row.invisible ? '' : ''); + for(var i=0, cell, markup; (cell=row[i]); i++){ + cell.customClasses = []; + cell.customStyles = []; + markup = this.generateCellMarkup(cell, cell.headerStyles, cell.headerClasses, true); + // content + markup[5] = (inValue != undefined ? inValue : inGetValue(cell)); + // styles + markup[3] = cell.customStyles.join(';'); + // classes + markup[1] = cell.customClasses.join(' '); //(cell.customClasses ? ' ' + cell.customClasses : ''); + html.push(markup.join('')); + } + html.push(''); + } + html.push('
            '); + return html.join(''); + }, + + // event helpers + getCellX: function(e){ + var x = e.layerX; + if(dojo.isMoz){ + var n = dojox.grid.ascendDom(e.target, dojox.grid.makeNotTagName("th")); + x -= (n && n.offsetLeft) || 0; + var t = e.sourceView.getScrollbarWidth(); + if(!dojo._isBodyLtr() && e.sourceView.headerNode.scrollLeft < t) + x -= t; + //x -= getProp(ascendDom(e.target, mkNotTagName("td")), "offsetLeft") || 0; + } + var n = dojox.grid.ascendDom(e.target, function(){ + if(!n || n == e.cellNode){ + return false; + } + // Mozilla 1.8 (FF 1.5) has a bug that makes offsetLeft = -parent border width + // when parent has border, overflow: hidden, and is positioned + // handle this problem here ... not a general solution! + x += (n.offsetLeft < 0 ? 0 : n.offsetLeft); + return true; + }); + return x; + }, + + // event decoration + decorateEvent: function(e){ + this.baseDecorateEvent(e); + e.rowIndex = -1; + e.cellX = this.getCellX(e); + return true; + }, + + // event handlers + // resizing + prepareResize: function(e, mod){ + var i = dojox.grid.getTdIndex(e.cellNode); + e.cellNode = (i ? e.cellNode.parentNode.cells[i+mod] : null); + e.cellIndex = (e.cellNode ? this.getCellNodeIndex(e.cellNode) : -1); + return Boolean(e.cellNode); + }, + + canResize: function(e){ + if(!e.cellNode || e.cellNode.colSpan > 1){ + return false; + } + var cell = this.grid.getCell(e.cellIndex); + return !cell.noresize && !cell.isFlex(); + }, + + overLeftResizeArea: function(e){ + if(dojo._isBodyLtr()){ + return (e.cellIndex>0) && (e.cellX < this.overResizeWidth) && this.prepareResize(e, -1); + } + return t = e.cellNode && (e.cellX < this.overResizeWidth); + }, + + overRightResizeArea: function(e){ + if(dojo._isBodyLtr()){ + return e.cellNode && (e.cellX >= e.cellNode.offsetWidth - this.overResizeWidth); + } + return (e.cellIndex>0) && (e.cellX >= e.cellNode.offsetWidth - this.overResizeWidth) && this.prepareResize(e, -1); + }, + + domousemove: function(e){ + //console.log(e.cellIndex, e.cellX, e.cellNode.offsetWidth); + var c = (this.overRightResizeArea(e) ? 'e-resize' : (this.overLeftResizeArea(e) ? 'w-resize' : '')); + if(c && !this.canResize(e)){ + c = 'not-allowed'; + } + e.sourceView.headerNode.style.cursor = c || ''; //'default'; + if (c) + dojo.stopEvent(e); + }, + + domousedown: function(e){ + if(!dojox.grid.drag.dragging){ + if((this.overRightResizeArea(e) || this.overLeftResizeArea(e)) && this.canResize(e)){ + this.beginColumnResize(e); + }else{ + this.grid.onMouseDown(e); + this.grid.onMouseOverRow(e); + } + //else{ + // this.beginMoveColumn(e); + //} + } + }, + + doclick: function(e) { + if (new Date().getTime() < this.bogusClickTime) { + dojo.stopEvent(e); + return true; + } + }, + + // column resizing + beginColumnResize: function(e){ + dojo.stopEvent(e); + var spanners = [], nodes = this.tableMap.findOverlappingNodes(e.cellNode); + for(var i=0, cell; (cell=nodes[i]); i++){ + spanners.push({ node: cell, index: this.getCellNodeIndex(cell), width: cell.offsetWidth }); + //console.log("spanner: " + this.getCellNodeIndex(cell)); + } + var drag = { + scrollLeft: e.sourceView.headerNode.scrollLeft, + view: e.sourceView, + node: e.cellNode, + index: e.cellIndex, + w: e.cellNode.clientWidth, + spanners: spanners + }; + //console.log(drag.index, drag.w); + dojox.grid.drag.start(e.cellNode, dojo.hitch(this, 'doResizeColumn', drag), dojo.hitch(this, 'endResizeColumn', drag), e); + }, + + doResizeColumn: function(inDrag, inEvent){ + var isLtr = dojo._isBodyLtr(); + if(isLtr){ + var w = inDrag.w + inEvent.deltaX; + }else{ + var w = inDrag.w - inEvent.deltaX; + } + if(w >= this.minColWidth){ + for(var i=0, s, sw; (s=inDrag.spanners[i]); i++){ + if(isLtr){ + sw = s.width + inEvent.deltaX; + }else{ + sw = s.width - inEvent.deltaX; + } + s.node.style.width = sw + 'px'; + inDrag.view.setColWidth(s.index, sw); + //console.log('setColWidth', '#' + s.index, sw + 'px'); + } + inDrag.node.style.width = w + 'px'; + inDrag.view.setColWidth(inDrag.index, w); + if(!isLtr){ + inDrag.view.headerNode.scrollLeft = (inDrag.scrollLeft - inEvent.deltaX); + } + } + if(inDrag.view.flexCells && !inDrag.view.testFlexCells()){ + var t = dojox.grid.findTable(inDrag.node); + t && (t.style.width = ''); + } + }, + + endResizeColumn: function(inDrag){ + this.bogusClickTime = new Date().getTime() + 30; + setTimeout(dojo.hitch(inDrag.view, "update"), 50); + } + +}); + +dojo.declare("dojox.grid.tableMap", + null, + { + // summary: + // Maps an html table into a structure parsable for information about cell row and col spanning. + // Used by headerBuilder + constructor: function(inRows){ + this.mapRows(inRows); + }, + + map: null, + + mapRows: function(inRows){ + // summary: Map table topography + + //console.log('mapRows'); + // # of rows + var rowCount = inRows.length; + if(!rowCount){ + return; + } + // map which columns and rows fill which cells + this.map = [ ]; + for(var j=0, row; (row=inRows[j]); j++){ + this.map[j] = []; + } + for(var j=0, row; (row=inRows[j]); j++){ + for(var i=0, x=0, cell, colSpan, rowSpan; (cell=row[i]); i++){ + while (this.map[j][x]){x++}; + this.map[j][x] = { c: i, r: j }; + rowSpan = cell.rowSpan || 1; + colSpan = cell.colSpan || 1; + for(var y=0; y dgdrag.hysteresis; +} + +dgdrag.mousemove = function(inEvent){ + inEvent = dojo.fixEvent(inEvent); + dojo.stopEvent(inEvent); + dgdrag.calcDelta(inEvent); + if((!dgdrag.started)&&(dgdrag.hasMoved(inEvent))){ + dgdrag.events.start(inEvent); + dgdrag.started = true; + } + if(dgdrag.started){ + dgdrag.events.drag(inEvent); + } +} + +dgdrag.mouseup = function(inEvent){ + //console.debug("dojox.grid.drag.mouseup"); + dojo.stopEvent(dojo.fixEvent(inEvent)); + dgdrag.end(); +} + +dgdrag.click = function(inEvent){ + dojo.stopEvent(dojo.fixEvent(inEvent)); + //dgdrag.end(); +} + +})(); +// end closure + +} diff --git a/includes/js/dojox/grid/_grid/edit.js b/includes/js/dojox/grid/_grid/edit.js new file mode 100644 index 0000000..d918423 --- /dev/null +++ b/includes/js/dojox/grid/_grid/edit.js @@ -0,0 +1,238 @@ +if(!dojo._hasResource["dojox.grid._grid.edit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.edit"] = true; +dojo.provide("dojox.grid._grid.edit"); + +dojo.declare("dojox.grid.edit", null, { + // summary: + // Controls grid cell editing process. Owned by grid and used internally for editing. + constructor: function(inGrid){ + // inGrid: dojox.Grid + // The dojox.Grid this editor should be attached to + this.grid = inGrid; + this.connections = []; + if(dojo.isIE){ + this.connections.push(dojo.connect(document.body, "onfocus", dojo.hitch(this, "_boomerangFocus"))); + } + }, + + info: {}, + + destroy: function(){ + dojo.forEach(this.connections,dojo.disconnect); + }, + + cellFocus: function(inCell, inRowIndex){ + // summary: + // Invoke editing when cell is focused + // inCell: cell object + // Grid cell object + // inRowIndex: Integer + // Grid row index + if(this.grid.singleClickEdit || this.isEditRow(inRowIndex)){ + // if same row or quick editing, edit + this.setEditCell(inCell, inRowIndex); + }else{ + // otherwise, apply any pending row edits + this.apply(); + } + // if dynamic or static editing... + if(this.isEditing() || (inCell && (inCell.editor||0).alwaysOn)){ + // let the editor focus itself as needed + this._focusEditor(inCell, inRowIndex); + } + }, + + rowClick: function(e){ + if(this.isEditing() && !this.isEditRow(e.rowIndex)){ + this.apply(); + } + }, + + styleRow: function(inRow){ + if(inRow.index == this.info.rowIndex){ + inRow.customClasses += ' dojoxGrid-row-editing'; + } + }, + + dispatchEvent: function(e){ + var c = e.cell, ed = c && c.editor; + return ed && ed.dispatchEvent(e.dispatch, e); + }, + + // Editing + isEditing: function(){ + // summary: + // Indicates editing state of the grid. + // returns: Boolean + // True if grid is actively editing + return this.info.rowIndex !== undefined; + }, + + isEditCell: function(inRowIndex, inCellIndex){ + // summary: + // Indicates if the given cell is being edited. + // inRowIndex: Integer + // Grid row index + // inCellIndex: Integer + // Grid cell index + // returns: Boolean + // True if given cell is being edited + return (this.info.rowIndex === inRowIndex) && (this.info.cell.index == inCellIndex); + }, + + isEditRow: function(inRowIndex){ + // summary: + // Indicates if the given row is being edited. + // inRowIndex: Integer + // Grid row index + // returns: Boolean + // True if given row is being edited + return this.info.rowIndex === inRowIndex; + }, + + setEditCell: function(inCell, inRowIndex){ + // summary: + // Set the given cell to be edited + // inRowIndex: Integer + // Grid row index + // inCell: Object + // Grid cell object + if(!this.isEditCell(inRowIndex, inCell.index) && this.grid.canEdit(inCell, inRowIndex)){ + this.start(inCell, inRowIndex, this.isEditRow(inRowIndex) || inCell.editor); + } + }, + + _focusEditor: function(inCell, inRowIndex){ + dojox.grid.fire(inCell.editor, "focus", [inRowIndex]); + }, + + focusEditor: function(){ + if(this.isEditing()){ + this._focusEditor(this.info.cell, this.info.rowIndex); + } + }, + + // implement fix for focus boomerang effect on IE + _boomerangWindow: 500, + _shouldCatchBoomerang: function(){ + return this._catchBoomerang > new Date().getTime(); + }, + _boomerangFocus: function(){ + //console.log("_boomerangFocus"); + if(this._shouldCatchBoomerang()){ + // make sure we don't utterly lose focus + this.grid.focus.focusGrid(); + // let the editor focus itself as needed + this.focusEditor(); + // only catch once + this._catchBoomerang = 0; + } + }, + _doCatchBoomerang: function(){ + // give ourselves a few ms to boomerang IE focus effects + if(dojo.isIE){this._catchBoomerang = new Date().getTime() + this._boomerangWindow;} + }, + // end boomerang fix API + + start: function(inCell, inRowIndex, inEditing){ + this.grid.beginUpdate(); + this.editorApply(); + if(this.isEditing() && !this.isEditRow(inRowIndex)){ + this.applyRowEdit(); + this.grid.updateRow(inRowIndex); + } + if(inEditing){ + this.info = { cell: inCell, rowIndex: inRowIndex }; + this.grid.doStartEdit(inCell, inRowIndex); + this.grid.updateRow(inRowIndex); + }else{ + this.info = {}; + } + this.grid.endUpdate(); + // make sure we don't utterly lose focus + this.grid.focus.focusGrid(); + // let the editor focus itself as needed + this._focusEditor(inCell, inRowIndex); + // give ourselves a few ms to boomerang IE focus effects + this._doCatchBoomerang(); + }, + + _editorDo: function(inMethod){ + var c = this.info.cell + //c && c.editor && c.editor[inMethod](c, this.info.rowIndex); + c && c.editor && c.editor[inMethod](this.info.rowIndex); + }, + + editorApply: function(){ + this._editorDo("apply"); + }, + + editorCancel: function(){ + this._editorDo("cancel"); + }, + + applyCellEdit: function(inValue, inCell, inRowIndex){ + if(this.grid.canEdit(inCell, inRowIndex)){ + this.grid.doApplyCellEdit(inValue, inRowIndex, inCell.fieldIndex); + } + }, + + applyRowEdit: function(){ + this.grid.doApplyEdit(this.info.rowIndex); + }, + + apply: function(){ + // summary: + // Apply a grid edit + if(this.isEditing()){ + this.grid.beginUpdate(); + this.editorApply(); + this.applyRowEdit(); + this.info = {}; + this.grid.endUpdate(); + this.grid.focus.focusGrid(); + this._doCatchBoomerang(); + } + }, + + cancel: function(){ + // summary: + // Cancel a grid edit + if(this.isEditing()){ + this.grid.beginUpdate(); + this.editorCancel(); + this.info = {}; + this.grid.endUpdate(); + this.grid.focus.focusGrid(); + this._doCatchBoomerang(); + } + }, + + save: function(inRowIndex, inView){ + // summary: + // Save the grid editing state + // inRowIndex: Integer + // Grid row index + // inView: Object + // Grid view + var c = this.info.cell; + if(this.isEditRow(inRowIndex) && (!inView || c.view==inView) && c.editor){ + c.editor.save(c, this.info.rowIndex); + } + }, + + restore: function(inView, inRowIndex){ + // summary: + // Restores the grid editing state + // inRowIndex: Integer + // Grid row index + // inView: Object + // Grid view + var c = this.info.cell; + if(this.isEditRow(inRowIndex) && c.view == inView && c.editor){ + c.editor.restore(c, this.info.rowIndex); + } + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/focus.js b/includes/js/dojox/grid/_grid/focus.js new file mode 100644 index 0000000..8761042 --- /dev/null +++ b/includes/js/dojox/grid/_grid/focus.js @@ -0,0 +1,207 @@ +if(!dojo._hasResource["dojox.grid._grid.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.focus"] = true; +dojo.provide("dojox.grid._grid.focus"); + +// focus management +dojo.declare("dojox.grid.focus", null, { + // summary: + // Controls grid cell focus. Owned by grid and used internally for focusing. + // Note: grid cell actually receives keyboard input only when cell is being edited. + constructor: function(inGrid){ + this.grid = inGrid; + this.cell = null; + this.rowIndex = -1; + dojo.connect(this.grid.domNode, "onfocus", this, "doFocus"); + }, + tabbingOut: false, + focusClass: "dojoxGrid-cell-focus", + focusView: null, + initFocusView: function(){ + this.focusView = this.grid.views.getFirstScrollingView(); + }, + isFocusCell: function(inCell, inRowIndex){ + // summary: + // states if the given cell is focused + // inCell: object + // grid cell object + // inRowIndex: int + // grid row index + // returns: + // true of the given grid cell is focused + return (this.cell == inCell) && (this.rowIndex == inRowIndex); + }, + isLastFocusCell: function(){ + return (this.rowIndex == this.grid.rowCount-1) && (this.cell.index == this.grid.layout.cellCount-1); + }, + isFirstFocusCell: function(){ + return (this.rowIndex == 0) && (this.cell.index == 0); + }, + isNoFocusCell: function(){ + return (this.rowIndex < 0) || !this.cell; + }, + _focusifyCellNode: function(inBork){ + var n = this.cell && this.cell.getNode(this.rowIndex); + if(n){ + dojo.toggleClass(n, this.focusClass, inBork); + if (inBork){ + this.scrollIntoView(); + try{ + if(!this.grid.edit.isEditing()) + dojox.grid.fire(n, "focus"); + }catch(e){} + } + } + }, + scrollIntoView: function() { + if(!this.cell){ + return; + } + var + c = this.cell, + s = c.view.scrollboxNode, + sr = { + w: s.clientWidth, + l: s.scrollLeft, + t: s.scrollTop, + h: s.clientHeight + }, + n = c.getNode(this.rowIndex), + r = c.view.getRowNode(this.rowIndex), + rt = this.grid.scroller.findScrollTop(this.rowIndex); + // place cell within horizontal view + if(n.offsetLeft + n.offsetWidth > sr.l + sr.w){ + s.scrollLeft = n.offsetLeft + n.offsetWidth - sr.w; + }else if(n.offsetLeft < sr.l){ + s.scrollLeft = n.offsetLeft; + } + // place cell within vertical view + if(rt + r.offsetHeight > sr.t + sr.h){ + this.grid.setScrollTop(rt + r.offsetHeight - sr.h); + }else if(rt < sr.t){ + this.grid.setScrollTop(rt); + } + }, + styleRow: function(inRow){ + return; + }, + setFocusIndex: function(inRowIndex, inCellIndex){ + // summary: + // focuses the given grid cell + // inRowIndex: int + // grid row index + // inCellIndex: int + // grid cell index + this.setFocusCell(this.grid.getCell(inCellIndex), inRowIndex); + }, + setFocusCell: function(inCell, inRowIndex){ + // summary: + // focuses the given grid cell + // inCell: object + // grid cell object + // inRowIndex: int + // grid row index + if(inCell && !this.isFocusCell(inCell, inRowIndex)){ + this.tabbingOut = false; + this.focusGridView(); + this._focusifyCellNode(false); + this.cell = inCell; + this.rowIndex = inRowIndex; + this._focusifyCellNode(true); + } + // even if this cell isFocusCell, the document focus may need to be rejiggered + // call opera on delay to prevent keypress from altering focus + if(dojo.isOpera){ + setTimeout(dojo.hitch(this.grid, 'onCellFocus', this.cell, this.rowIndex), 1); + }else{ + this.grid.onCellFocus(this.cell, this.rowIndex); + } + }, + next: function(){ + // summary: + // focus next grid cell + var row=this.rowIndex, col=this.cell.index+1, cc=this.grid.layout.cellCount-1, rc=this.grid.rowCount-1; + if(col > cc){ + col = 0; + row++; + } + if(row > rc){ + col = cc; + row = rc; + } + this.setFocusIndex(row, col); + }, + previous: function(){ + // summary: + // focus previous grid cell + var row=(this.rowIndex || 0), col=(this.cell.index || 0) - 1; + if(col < 0){ + col = this.grid.layout.cellCount-1; + row--; + } + if(row < 0){ + row = 0; + col = 0; + } + this.setFocusIndex(row, col); + }, + move: function(inRowDelta, inColDelta) { + // summary: + // focus grid cell based on position relative to current focus + // inRowDelta: int + // vertical distance from current focus + // inColDelta: int + // horizontal distance from current focus + var + rc = this.grid.rowCount-1, + cc = this.grid.layout.cellCount-1, + r = this.rowIndex, + i = this.cell.index, + row = Math.min(rc, Math.max(0, r+inRowDelta)), + col = Math.min(cc, Math.max(0, i+inColDelta)); + this.setFocusIndex(row, col); + if(inRowDelta){ + this.grid.updateRow(r); + } + }, + previousKey: function(e){ + if(this.isFirstFocusCell()){ + this.tabOut(this.grid.domNode); + }else{ + dojo.stopEvent(e); + this.previous(); + } + }, + nextKey: function(e) { + if(this.isLastFocusCell()){ + this.tabOut(this.grid.lastFocusNode); + }else{ + dojo.stopEvent(e); + this.next(); + } + }, + tabOut: function(inFocusNode){ + this.tabbingOut = true; + inFocusNode.focus(); + }, + focusGridView: function(){ + dojox.grid.fire(this.focusView, "focus"); + }, + focusGrid: function(inSkipFocusCell){ + this.focusGridView(); + this._focusifyCellNode(true); + }, + doFocus: function(e){ + // trap focus only for grid dom node + if(e && e.target != e.currentTarget){ + return; + } + // do not focus for scrolling if grid is about to blur + if(!this.tabbingOut && this.isNoFocusCell()){ + // establish our virtual-focus, if necessary + this.setFocusIndex(0, 0); + } + this.tabbingOut = false; + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/images/grid_dx_gradient.gif b/includes/js/dojox/grid/_grid/images/grid_dx_gradient.gif new file mode 100644 index 0000000000000000000000000000000000000000..57f67baaf24b58bb0e7dc5c6aa29271fe8f3b557 GIT binary patch literal 267 zcmZ?wbhEHbjEB<5wG8q|kKzxu40~1FJf1_j;Z=?o;H30Vo2=f2{ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/_grid/images/grid_sort_up.gif b/includes/js/dojox/grid/_grid/images/grid_sort_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..9452da05432568afaa2a657c42603c1bfd0e45d7 GIT binary patch literal 48 wcmZ?wbhEHbWM^PuXkcUjg8%>jEB<5wG8q|kKzxu40~32sBIoMUeB2Dy0P*e#QUCw| literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/_grid/images/tabEnabled_rotated.png b/includes/js/dojox/grid/_grid/images/tabEnabled_rotated.png new file mode 100644 index 0000000000000000000000000000000000000000..e326abd1f06398927fd139638c0c270dfd052081 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^(m>42!2~4V8bAI5q*Og!978x}Cja^W-=3KVNXj4j r+b^wfI%(CP-{19xnYS{2^<`l&%dUftDnm{r-UW|-Gm;? literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/_grid/images/tabHover_rotated.png b/includes/js/dojox/grid/_grid/images/tabHover_rotated.png new file mode 100644 index 0000000000000000000000000000000000000000..1a30e108e85ec69a62c60017084461a28fc92480 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^(m>42!2~4V8bAI5qzpY>978x}Cja^T{r>g&|0NV2 z{0D)<87c=F4xHGep(Xk6|NrwJ-oKAmW6NTGHJgJWl+k*fmdwHHK+O!Eu6{1-oD!M< Dd*Ueq literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/_grid/layout.js b/includes/js/dojox/grid/_grid/layout.js new file mode 100644 index 0000000..128f486 --- /dev/null +++ b/includes/js/dojox/grid/_grid/layout.js @@ -0,0 +1,75 @@ +if(!dojo._hasResource["dojox.grid._grid.layout"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.layout"] = true; +dojo.provide("dojox.grid._grid.layout"); +dojo.require("dojox.grid._grid.cell"); + +dojo.declare("dojox.grid.layout", null, { + // summary: + // Controls grid cell layout. Owned by grid and used internally. + constructor: function(inGrid){ + this.grid = inGrid; + }, + // flat array of grid cells + cells: [], + // structured array of grid cells + structure: null, + // default cell width + defaultWidth: '6em', + // methods + setStructure: function(inStructure){ + this.fieldIndex = 0; + this.cells = []; + var s = this.structure = []; + for(var i=0, viewDef, rows; (viewDef=inStructure[i]); i++){ + s.push(this.addViewDef(viewDef)); + } + this.cellCount = this.cells.length; + }, + addViewDef: function(inDef){ + this._defaultCellProps = inDef.defaultCell || {}; + return dojo.mixin({}, inDef, {rows: this.addRowsDef(inDef.rows || inDef.cells)}); + }, + addRowsDef: function(inDef){ + var result = []; + for(var i=0, row; inDef && (row=inDef[i]); i++){ + result.push(this.addRowDef(i, row)); + } + return result; + }, + addRowDef: function(inRowIndex, inDef){ + var result = []; + for(var i=0, def, cell; (def=inDef[i]); i++){ + cell = this.addCellDef(inRowIndex, i, def); + result.push(cell); + this.cells.push(cell); + } + return result; + }, + addCellDef: function(inRowIndex, inCellIndex, inDef){ + var w = 0; + if(inDef.colSpan > 1){ + w = 0; + }else if(!isNaN(inDef.width)){ + w = inDef.width + "em"; + }else{ + w = inDef.width || this.defaultWidth; + } + // fieldIndex progresses linearly from the last indexed field + // FIXME: support generating fieldIndex based a text field name (probably in Grid) + var fieldIndex = inDef.field != undefined ? inDef.field : (inDef.get ? -1 : this.fieldIndex); + if((inDef.field != undefined) || !inDef.get){ + this.fieldIndex = (inDef.field > -1 ? inDef.field : this.fieldIndex) + 1; + } + return new dojox.grid.cell( + dojo.mixin({}, this._defaultCellProps, inDef, { + grid: this.grid, + subrow: inRowIndex, + layoutIndex: inCellIndex, + index: this.cells.length, + fieldIndex: fieldIndex, + unitWidth: w + })); + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/lib.js b/includes/js/dojox/grid/_grid/lib.js new file mode 100644 index 0000000..3644dbc --- /dev/null +++ b/includes/js/dojox/grid/_grid/lib.js @@ -0,0 +1,254 @@ +if(!dojo._hasResource["dojox.grid._grid.lib"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.lib"] = true; +dojo.provide("dojox.grid._grid.lib"); +// summary: grid utility library +dojo.mixin(dojox.grid,{ + + na: '...', + + nop: function(){ + // summary: a null function? + }, + + getTdIndex: function(td){ + return td.cellIndex >=0 ? td.cellIndex : dojo.indexOf(td.parentNode.cells, td); + }, + + getTrIndex: function(tr){ + return tr.rowIndex >=0 ? tr.rowIndex : dojo.indexOf(tr.parentNode.childNodes, tr); + }, + + getTr: function(rowOwner, index){ + return rowOwner && ((rowOwner.rows||0)[index] || rowOwner.childNodes[index]); + }, + + getTd: function(rowOwner, rowIndex, cellIndex){ + return (dojox.grid.getTr(inTable, rowIndex)||0)[cellIndex]; + }, + + findTable: function(node){ + for (var n=node; n && n.tagName!='TABLE'; n=n.parentNode); + return n; + }, + + ascendDom: function(inNode, inWhile){ + for (var n=inNode; n && inWhile(n); n=n.parentNode); + return n; + }, + + makeNotTagName: function(inTagName){ + var name = inTagName.toUpperCase(); + return function(node){ return node.tagName != name; }; + }, + + fire: function(ob, ev, args){ + var fn = ob && ev && ob[ev]; + return fn && (args ? fn.apply(ob, args) : ob[ev]()); + }, + + // from lib.js + setStyleText: function(inNode, inStyleText){ + if(inNode.style.cssText == undefined){ + inNode.setAttribute("style", inStyleText); + }else{ + inNode.style.cssText = inStyleText; + } + }, + + getStyleText: function(inNode, inStyleText){ + return (inNode.style.cssText == undefined ? inNode.getAttribute("style") : inNode.style.cssText); + }, + + setStyle: function(inElement, inStyle, inValue){ + if(inElement && inElement.style[inStyle] != inValue){ + inElement.style[inStyle] = inValue; + } + }, + + setStyleHeightPx: function(inElement, inHeight){ + if(inHeight >= 0){ + dojox.grid.setStyle(inElement, 'height', inHeight + 'px'); + } + }, + + mouseEvents: [ 'mouseover', 'mouseout', /*'mousemove',*/ 'mousedown', 'mouseup', 'click', 'dblclick', 'contextmenu' ], + + keyEvents: [ 'keyup', 'keydown', 'keypress' ], + + funnelEvents: function(inNode, inObject, inMethod, inEvents){ + var evts = (inEvents ? inEvents : dojox.grid.mouseEvents.concat(dojox.grid.keyEvents)); + for (var i=0, l=evts.length; i'; + }, + renderHeader: function(){ + }, + resize: function(){ + this.adaptHeight(); + }, + adaptWidth: function(){ + }, + // styling + doStyleRowNode: function(inRowIndex, inRowNode){ + var n = [ "dojoxGrid-rowbar" ]; + if(this.grid.rows.isOver(inRowIndex)){ + n.push("dojoxGrid-rowbar-over"); + } + if(this.grid.selection.isSelected(inRowIndex)){ + n.push("dojoxGrid-rowbar-selected"); + } + inRowNode.className = n.join(" "); + }, + // event handlers + domouseover: function(e){ + this.grid.onMouseOverRow(e); + }, + domouseout: function(e){ + if(!this.isIntraRowEvent(e)){ + this.grid.onMouseOutRow(e); + } + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/rows.js b/includes/js/dojox/grid/_grid/rows.js new file mode 100644 index 0000000..37ecbcb --- /dev/null +++ b/includes/js/dojox/grid/_grid/rows.js @@ -0,0 +1,66 @@ +if(!dojo._hasResource["dojox.grid._grid.rows"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.rows"] = true; +dojo.provide("dojox.grid._grid.rows"); + +dojo.declare("dojox.grid.rows", null, { + // Stores information about grid rows. Owned by grid and used internally. + constructor: function(inGrid){ + this.grid = inGrid; + }, + linesToEms: 2, + defaultRowHeight: 1, // lines + overRow: -2, + // metrics + getHeight: function(inRowIndex){ + return ''; + }, + getDefaultHeightPx: function(){ + // summmary: + // retrieves the default row height + // returns: int, default row height + return 32; + //return Math.round(this.defaultRowHeight * this.linesToEms * this.grid.contentPixelToEmRatio); + }, + // styles + prepareStylingRow: function(inRowIndex, inRowNode){ + return { + index: inRowIndex, + node: inRowNode, + odd: Boolean(inRowIndex&1), + selected: this.grid.selection.isSelected(inRowIndex), + over: this.isOver(inRowIndex), + customStyles: "", + customClasses: "dojoxGrid-row" + } + }, + styleRowNode: function(inRowIndex, inRowNode){ + var row = this.prepareStylingRow(inRowIndex, inRowNode); + this.grid.onStyleRow(row); + this.applyStyles(row); + }, + applyStyles: function(inRow){ + with(inRow){ + node.className = customClasses; + var h = node.style.height; + dojox.grid.setStyleText(node, customStyles + ';' + (node._style||'')); + node.style.height = h; + } + }, + updateStyles: function(inRowIndex){ + this.grid.updateRowStyles(inRowIndex); + }, + // states and events + setOverRow: function(inRowIndex){ + var last = this.overRow; + this.overRow = inRowIndex; + if((last!=this.overRow)&&(last >=0)){ + this.updateStyles(last); + } + this.updateStyles(this.overRow); + }, + isOver: function(inRowIndex){ + return (this.overRow == inRowIndex); + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/scroller.js b/includes/js/dojox/grid/_grid/scroller.js new file mode 100644 index 0000000..d331367 --- /dev/null +++ b/includes/js/dojox/grid/_grid/scroller.js @@ -0,0 +1,489 @@ +if(!dojo._hasResource['dojox.grid._grid.scroller']){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource['dojox.grid._grid.scroller'] = true; +dojo.provide('dojox.grid._grid.scroller'); + +dojo.declare('dojox.grid.scroller.base', null, { + // summary: + // virtual scrollbox, abstract class + // Content must in /rows/ + // Rows are managed in contiguous sets called /pages/ + // There are a fixed # of rows per page + // The minimum rendered unit is a page + constructor: function(){ + this.pageHeights = []; + this.stack = []; + }, + // specified + rowCount: 0, // total number of rows to manage + defaultRowHeight: 10, // default height of a row + keepRows: 100, // maximum number of rows that should exist at one time + contentNode: null, // node to contain pages + scrollboxNode: null, // node that controls scrolling + // calculated + defaultPageHeight: 0, // default height of a page + keepPages: 10, // maximum number of pages that should exists at one time + pageCount: 0, + windowHeight: 0, + firstVisibleRow: 0, + lastVisibleRow: 0, + // private + page: 0, + pageTop: 0, + // init + init: function(inRowCount, inKeepRows, inRowsPerPage){ + switch(arguments.length){ + case 3: this.rowsPerPage = inRowsPerPage; + case 2: this.keepRows = inKeepRows; + case 1: this.rowCount = inRowCount; + } + this.defaultPageHeight = this.defaultRowHeight * this.rowsPerPage; + //this.defaultPageHeight = this.defaultRowHeight * Math.min(this.rowsPerPage, this.rowCount); + this.pageCount = Math.ceil(this.rowCount / this.rowsPerPage); + this.setKeepInfo(this.keepRows); + this.invalidate(); + if(this.scrollboxNode){ + this.scrollboxNode.scrollTop = 0; + this.scroll(0); + this.scrollboxNode.onscroll = dojo.hitch(this, 'onscroll'); + } + }, + setKeepInfo: function(inKeepRows){ + this.keepRows = inKeepRows; + this.keepPages = !this.keepRows ? this.keepRows : Math.max(Math.ceil(this.keepRows / this.rowsPerPage), 2); + }, + // updating + invalidate: function(){ + this.invalidateNodes(); + this.pageHeights = []; + this.height = (this.pageCount ? (this.pageCount - 1)* this.defaultPageHeight + this.calcLastPageHeight() : 0); + this.resize(); + }, + updateRowCount: function(inRowCount){ + this.invalidateNodes(); + this.rowCount = inRowCount; + // update page count, adjust document height + oldPageCount = this.pageCount; + this.pageCount = Math.ceil(this.rowCount / this.rowsPerPage); + if(this.pageCount < oldPageCount){ + for(var i=oldPageCount-1; i>=this.pageCount; i--){ + this.height -= this.getPageHeight(i); + delete this.pageHeights[i] + } + }else if(this.pageCount > oldPageCount){ + this.height += this.defaultPageHeight * (this.pageCount - oldPageCount - 1) + this.calcLastPageHeight(); + } + this.resize(); + }, + // abstract interface + pageExists: function(inPageIndex){ + }, + measurePage: function(inPageIndex){ + }, + positionPage: function(inPageIndex, inPos){ + }, + repositionPages: function(inPageIndex){ + }, + installPage: function(inPageIndex){ + }, + preparePage: function(inPageIndex, inPos, inReuseNode){ + }, + renderPage: function(inPageIndex){ + }, + removePage: function(inPageIndex){ + }, + pacify: function(inShouldPacify){ + }, + // pacification + pacifying: false, + pacifyTicks: 200, + setPacifying: function(inPacifying){ + if(this.pacifying != inPacifying){ + this.pacifying = inPacifying; + this.pacify(this.pacifying); + } + }, + startPacify: function(){ + this.startPacifyTicks = new Date().getTime(); + }, + doPacify: function(){ + var result = (new Date().getTime() - this.startPacifyTicks) > this.pacifyTicks; + this.setPacifying(true); + this.startPacify(); + return result; + }, + endPacify: function(){ + this.setPacifying(false); + }, + // default sizing implementation + resize: function(){ + if(this.scrollboxNode){ + this.windowHeight = this.scrollboxNode.clientHeight; + } + dojox.grid.setStyleHeightPx(this.contentNode, this.height); + }, + calcLastPageHeight: function(){ + if(!this.pageCount){ + return 0; + } + var lastPage = this.pageCount - 1; + var lastPageHeight = ((this.rowCount % this.rowsPerPage)||(this.rowsPerPage)) * this.defaultRowHeight; + this.pageHeights[lastPage] = lastPageHeight; + return lastPageHeight; + }, + updateContentHeight: function(inDh){ + this.height += inDh; + this.resize(); + }, + updatePageHeight: function(inPageIndex){ + if(this.pageExists(inPageIndex)){ + var oh = this.getPageHeight(inPageIndex); + var h = (this.measurePage(inPageIndex))||(oh); + this.pageHeights[inPageIndex] = h; + if((h)&&(oh != h)){ + this.updateContentHeight(h - oh) + this.repositionPages(inPageIndex); + } + } + }, + rowHeightChanged: function(inRowIndex){ + this.updatePageHeight(Math.floor(inRowIndex / this.rowsPerPage)); + }, + // scroller core + invalidateNodes: function(){ + while(this.stack.length){ + this.destroyPage(this.popPage()); + } + }, + createPageNode: function(){ + var p = document.createElement('div'); + p.style.position = 'absolute'; + //p.style.width = '100%'; + p.style[dojo._isBodyLtr() ? "left" : "right"] = '0'; + return p; + }, + getPageHeight: function(inPageIndex){ + var ph = this.pageHeights[inPageIndex]; + return (ph !== undefined ? ph : this.defaultPageHeight); + }, + // FIXME: this is not a stack, it's a FIFO list + pushPage: function(inPageIndex){ + return this.stack.push(inPageIndex); + }, + popPage: function(){ + return this.stack.shift(); + }, + findPage: function(inTop){ + var i = 0, h = 0; + for(var ph = 0; i= inTop){ + break; + } + } + this.page = i; + this.pageTop = h; + }, + buildPage: function(inPageIndex, inReuseNode, inPos){ + this.preparePage(inPageIndex, inReuseNode); + this.positionPage(inPageIndex, inPos); + // order of operations is key below + this.installPage(inPageIndex); + this.renderPage(inPageIndex); + // order of operations is key above + this.pushPage(inPageIndex); + }, + needPage: function(inPageIndex, inPos){ + var h = this.getPageHeight(inPageIndex), oh = h; + if(!this.pageExists(inPageIndex)){ + this.buildPage(inPageIndex, this.keepPages&&(this.stack.length >= this.keepPages), inPos); + h = this.measurePage(inPageIndex) || h; + this.pageHeights[inPageIndex] = h; + if(h && (oh != h)){ + this.updateContentHeight(h - oh) + } + }else{ + this.positionPage(inPageIndex, inPos); + } + return h; + }, + onscroll: function(){ + this.scroll(this.scrollboxNode.scrollTop); + }, + scroll: function(inTop){ + this.startPacify(); + this.findPage(inTop); + var h = this.height; + var b = this.getScrollBottom(inTop); + for(var p=this.page, y=this.pageTop; (p= 0 ? inTop + this.windowHeight : -1); + }, + // events + processNodeEvent: function(e, inNode){ + var t = e.target; + while(t && (t != inNode) && t.parentNode && (t.parentNode.parentNode != inNode)){ + t = t.parentNode; + } + if(!t || !t.parentNode || (t.parentNode.parentNode != inNode)){ + return false; + } + var page = t.parentNode; + e.topRowIndex = page.pageIndex * this.rowsPerPage; + e.rowIndex = e.topRowIndex + dojox.grid.indexInParent(t); + e.rowTarget = t; + return true; + }, + processEvent: function(e){ + return this.processNodeEvent(e, this.contentNode); + }, + dummy: 0 +}); + +dojo.declare('dojox.grid.scroller', dojox.grid.scroller.base, { + // summary: + // virtual scroller class, makes no assumption about shape of items being scrolled + constructor: function(){ + this.pageNodes = []; + }, + // virtual rendering interface + renderRow: function(inRowIndex, inPageNode){ + }, + removeRow: function(inRowIndex){ + }, + // page node operations + getDefaultNodes: function(){ + return this.pageNodes; + }, + getDefaultPageNode: function(inPageIndex){ + return this.getDefaultNodes()[inPageIndex]; + }, + positionPageNode: function(inNode, inPos){ + inNode.style.top = inPos + 'px'; + }, + getPageNodePosition: function(inNode){ + return inNode.offsetTop; + }, + repositionPageNodes: function(inPageIndex, inNodes){ + var last = 0; + for(var i=0; i=0 && inBottom>inScrollBottom; i--, row--){ + inBottom -= rows[i].offsetHeight; + } + return row + 1; + }, + getLastVisibleRow: function(inPage, inBottom, inScrollBottom){ + if(!this.pageExists(inPage)){ + return 0; + } + return this.getLastVisibleRowNodes(inPage, inBottom, inScrollBottom, this.getDefaultNodes()); + }, + findTopRowForNodes: function(inScrollTop, inNodes){ + var rows = dojox.grid.divkids(inNodes[this.page]); + for(var i=0,l=rows.length,t=this.pageTop,h; i= inScrollTop){ + this.offset = h - (t - inScrollTop); + return i + this.page * this.rowsPerPage; + } + } + return -1; + }, + findScrollTopForNodes: function(inRow, inNodes){ + var rowPage = Math.floor(inRow / this.rowsPerPage); + var t = 0; + for(var i=0; i= inIndex){ + this.selectedIndex++; + } + }, + + remove: function(inIndex){ + this.selected.splice(inIndex, 1); + if(this.selectedIndex >= inIndex){ + this.selectedIndex--; + } + }, + + unselectAll: function(inExcept){ + for(var i in this.selected){ + if((i!=inExcept)&&(this.selected[i]===true)){ + this.deselect(i); + } + } + }, + + shiftSelect: function(inFrom, inTo){ + var s = (inFrom >= 0 ? inFrom : inTo), e = inTo; + if(s > e){ + e = s; + s = inTo; + } + for(var i=s; i<=e; i++){ + this.addToSelection(i); + } + }, + + clickSelect: function(inIndex, inCtrlKey, inShiftKey){ + this.beginUpdate(); + if(!this.multiSelect){ + this.select(inIndex); + }else{ + var lastSelected = this.selectedIndex; + if(!inCtrlKey){ + this.unselectAll(inIndex); + } + if(inShiftKey){ + this.shiftSelect(lastSelected, inIndex); + }else if(inCtrlKey){ + this.toggleSelect(inIndex); + }else{ + this.addToSelection(inIndex) + } + } + this.endUpdate(); + }, + + clickSelectEvent: function(e){ + this.clickSelect(e.rowIndex, e.ctrlKey, e.shiftKey); + }, + + clear: function(){ + this.beginUpdate(); + this.unselectAll(); + this.endUpdate(); + } + +}); + +} diff --git a/includes/js/dojox/grid/_grid/soriaGrid.css b/includes/js/dojox/grid/_grid/soriaGrid.css new file mode 100644 index 0000000..f244030 --- /dev/null +++ b/includes/js/dojox/grid/_grid/soriaGrid.css @@ -0,0 +1,212 @@ +.soria .dojoxGrid { + position: relative; + background-color: #e9e9e9; + font-size: 0.85em; + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} +.soria .dojoxGrid table { + padding: 0; +} +.soria .dojoxGrid td { + -moz-outline: none; +} +.soria .dojoxGrid-master-header { + position: relative; +} +.soria .dojoxGrid-master-view { + position: relative; +} +.soria .dojoxGrid-view { + position: absolute; + overflow: hidden; +} +.soria .dojoxGrid-header { + position: absolute; + overflow: hidden; +} +.soria .dojoxGrid-header { + background-color: #e9e9e9; +} +.soria .dojoxGrid-header table { + text-align: center; +} +.soria .dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} +.soria .dojoxGrid-header .dojoxGrid-cell { + border: 1px solid transparent; + + border-color: white #ACA899 #919191 white; + background: url(../../../dijit/themes/soria/images/titleBar.png) #e9e9e9 repeat-x top; + padding-bottom: 2px; + color: #000 !important; +} +.soria .dojoxGrid-header .dojoxGrid-cell-over { + background: url(../../../dijit/themes/soria/images/titleBarActive.png) #e9e9e9 repeat-x top; +} +.soria .dojoxGrid-sort-down { + background: url(images/grid_sort_down.gif) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} +.soria .dojoxGrid-sort-up { + background: url(images/grid_sort_up.gif) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} +.soria .gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} +.soria .dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: #fefefe; + width: 100%; +} +.soria .dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} +.soria .dojoxGrid-rowbar { + border: none; + + background: url(images/titleBar.png) #e9e9e9 repeat-y right; + border-right: 1px solid #cccccc; + padding: 0px; +} +.soria .dojoxGrid-rowbar-inner { + border: none; + border-bottom: 1px solid #cccccc; +} +.soria .dojoxGrid-rowbar-over { + background: url(images/titleBarActive.png) #e9e9e9 repeat-y right; +} +.soria .dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + background: url(../../../dijit/themes/soria/images/titleBar.png) #dddddd repeat-x top; + border-right: 1px solid #cccccc; + background-position: center; + background-repeat: no-repeat; +} +.soria .dojoxGrid-row { + position: relative; + width: 9000em; +} +.soria .dojoxGrid-row { + border: none; + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} +.soria .dojoxGrid-row-over { + border-top-color: #cccccc; + border-bottom-color: #cccccc; +} +.soria .dojoxGrid-row-over .dojoxGrid-cell { + background-color: #60a1ea; + color:#fff; +} +.soria .dojoxGrid-row-odd { + background-color: #f2f5f9; + +} +.soria .dojoxGrid-row-selected { + background-color: #aec7e3; +} +.soria .dojoxGrid-row-table { + table-layout: fixed; + width: 0; + border-collapse: collapse; +} +.soria .dojoxGrid-invisible { + visibility: hidden; +} +.soria .Xdojo-ie .dojoxGrid-invisible { + display: none; +} +.soria .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} +.soria .dojoxGrid-cell { + border: 1px dotted #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} +.dj_ie6 .soria .dojoxGrid-cell { + border: 1px solid white; + border-right: 1px solid #D5CDB5; +} +.soria .dojoxGrid-cell-focus { + border: 1px dotted #a6a6a6; +} +.soria .dojoxGrid-cell-over { + border: 1px dotted #a6a6a6; +} +.soria .dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted #595959; +} +.soria .dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} +.soria .dojoxGrid-row-editing td { + + background-color: #60a1ea; + +} +.soria .dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.soria .dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.soria .dojoxGrid-row-error td { + background-color: #F8B8B6; +} +.soria .dojoxGrid-input, +.soria .dojoxGrid-select, +.soria .dojoxGrid-textarea { + margin: 0; + padding: 0px; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} +.dijit_a11y .dojoxGrid-rowbar-selected { + border-top: 1px solid white; + border-bottom: 1px dashed black; + border-top: 0; + background: none; +} +.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner { + border: 0; + border-top: 1px solid white; +} +.dijit_a11y .dojoxGrid-row-selected { + border-bottom: 1px dashed black; +} diff --git a/includes/js/dojox/grid/_grid/soriaGrid.css.commented.css b/includes/js/dojox/grid/_grid/soriaGrid.css.commented.css new file mode 100644 index 0000000..06263ad --- /dev/null +++ b/includes/js/dojox/grid/_grid/soriaGrid.css.commented.css @@ -0,0 +1,276 @@ +.soria .dojoxGrid { + position: relative; + background-color: #e9e9e9; + font-size: 0.85em; /* inherit font-family from dojo.css */ + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} + +.soria .dojoxGrid table { + padding: 0; +} + +.soria .dojoxGrid td { + -moz-outline: none; +} + +/* master header */ + +.soria .dojoxGrid-master-header { + position: relative; +} + +/* master view */ + +.soria .dojoxGrid-master-view { + position: relative; +} + +/* views */ + +.soria .dojoxGrid-view { + position: absolute; + overflow: hidden; +} + +/* header */ + +.soria .dojoxGrid-header { + position: absolute; + overflow: hidden; +} + +.soria .dojoxGrid-header { + background-color: #e9e9e9; +} + +.soria .dojoxGrid-header table { + text-align: center; +} + +.soria .dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} + +.soria .dojoxGrid-header .dojoxGrid-cell { + border: 1px solid transparent; + /* border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; */ + border-color: white #ACA899 #919191 white; + background: url(../../../dijit/themes/soria/images/titleBar.png) #e9e9e9 repeat-x top; + padding-bottom: 2px; + color: #000 !important; +} + +.soria .dojoxGrid-header .dojoxGrid-cell-over { + background: url(../../../dijit/themes/soria/images/titleBarActive.png) #e9e9e9 repeat-x top; +} + +.soria .dojoxGrid-sort-down { + background: url(images/grid_sort_down.gif) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} + +.soria .dojoxGrid-sort-up { + background: url(images/grid_sort_up.gif) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} + +.soria .gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} + +/* content */ + +.soria .dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: #fefefe; + width: 100%; +} + +.soria .dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} + +/* rowbar */ + +.soria .dojoxGrid-rowbar { + border: none; + /* + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + */ + background: url(images/titleBar.png) #e9e9e9 repeat-y right; + border-right: 1px solid #cccccc; + padding: 0px; +} + +.soria .dojoxGrid-rowbar-inner { + border: none; + border-bottom: 1px solid #cccccc; +} + +.soria .dojoxGrid-rowbar-over { + background: url(images/titleBarActive.png) #e9e9e9 repeat-y right; +} + +.soria .dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + background: url(../../../dijit/themes/soria/images/titleBar.png) #dddddd repeat-x top; + border-right: 1px solid #cccccc; + background-position: center; + background-repeat: no-repeat; +} + +/* rows */ + +.soria .dojoxGrid-row { + position: relative; + width: 9000em; +} + +.soria .dojoxGrid-row { + border: none; + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} + +.soria .dojoxGrid-row-over { + border-top-color: #cccccc; + border-bottom-color: #cccccc; +} + +.soria .dojoxGrid-row-over .dojoxGrid-cell { + background-color: #60a1ea; + color:#fff; +} + +.soria .dojoxGrid-row-odd { + background-color: #f2f5f9; + /*background-color: #F9F7E8;*/ +} + +.soria .dojoxGrid-row-selected { + background-color: #aec7e3; +} + +.soria .dojoxGrid-row-table { + table-layout: fixed; + width: 0; + border-collapse: collapse; +} + +.soria .dojoxGrid-invisible { + visibility: hidden; +} + +.soria .Xdojo-ie .dojoxGrid-invisible { + display: none; +} + +.soria .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} + +/* cells */ + +.soria .dojoxGrid-cell { + border: 1px dotted #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} + +.dj_ie6 .soria .dojoxGrid-cell { + border: 1px solid white; + border-right: 1px solid #D5CDB5; +} + +.soria .dojoxGrid-cell-focus { + border: 1px dotted #a6a6a6; +} + +.soria .dojoxGrid-cell-over { + border: 1px dotted #a6a6a6; +} + +.soria .dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted #595959; +} + +.soria .dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} + +/* editing */ + +/* FIXME: these colors are off! */ +.soria .dojoxGrid-row-editing td { + /* background-color: #F4FFF4; */ + background-color: #60a1ea; + /* padding: 0px 3px 0px 3px; */ +} + +.soria .dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.soria .dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.soria .dojoxGrid-row-error td { + background-color: #F8B8B6; +} + +.soria .dojoxGrid-input, +.soria .dojoxGrid-select, +.soria .dojoxGrid-textarea { + margin: 0; + padding: 0px; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} + +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} + +.dijit_a11y .dojoxGrid-rowbar-selected { + border-top: 1px solid white; + border-bottom: 1px dashed black; + border-top: 0; + background: none; +} + +.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner { + border: 0; + border-top: 1px solid white; +} + +.dijit_a11y .dojoxGrid-row-selected { + border-bottom: 1px dashed black; +} diff --git a/includes/js/dojox/grid/_grid/tundraGrid.css b/includes/js/dojox/grid/_grid/tundraGrid.css new file mode 100644 index 0000000..d7b7a5f --- /dev/null +++ b/includes/js/dojox/grid/_grid/tundraGrid.css @@ -0,0 +1,215 @@ +.tundra .dojoxGrid { + position: relative; + background-color: #e9e9e9; + font-size: 0.85em; + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} +.tundra .dojoxGrid table { + padding: 0; +} +.tundra .dojoxGrid td { + -moz-outline: none; +} +.tundra .dojoxGrid-master-header { + position: relative; +} +.tundra .dojoxGrid-master-view { + position: relative; +} +.tundra .dojoxGrid-view { + position: absolute; + overflow: hidden; +} +.tundra .dojoxGrid-header { + position: absolute; + overflow: hidden; +} +.tundra .dojoxGrid-header { + background-color: #e9e9e9; +} +.tundra .dojoxGrid-header table { + text-align: center; +} +.tundra .dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} +.tundra .dojoxGrid-header .dojoxGrid-cell { + border: 1px solid transparent; + + border-color: white #ACA899 #919191 white; + background: url(../../../dijit/themes/tundra/images/tabEnabled.png) #e9e9e9 repeat-x top; + padding-bottom: 2px; + color: #000 !important; +} +.tundra .dojoxGrid-header .dojoxGrid-cell-over { + background: url(../../../dijit/themes/tundra/images/tabHover.png) #e9e9e9 repeat-x top; + color: #000 !important; +} +.tundra .dojoxGrid-sort-down { + background: url(../../../dijit/themes/tundra/images/arrowDown.png) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} +.tundra .dojoxGrid-sort-up { + background: url(../../../dijit/themes/tundra/images/arrowUp.png) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} +.tundra .gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} +.tundra .dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: #fefefe; + width: 100%; +} +.tundra .dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} +.tundra .dojoxGrid-rowbar { + border: none; + + background: url(images/tabEnabled_rotated.png) #e9e9e9 repeat-y right; + border-right: 1px solid #cccccc; + padding: 0px; +} +.tundra .dojoxGrid-rowbar-inner { + border: none; + border-bottom: 1px solid #cccccc; +} +.tundra .dojoxGrid-rowbar-over { + background: url(images/tabHover_rotated.png) #e9e9e9 repeat-y right; +} +.tundra .dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + background: url(../../../dijit/themes/tundra/images/tabDisabled.png) #dddddd repeat-x top; + border-right: 1px solid #cccccc; + background-position: center; + background-repeat: no-repeat; +} +.tundra .dojoxGrid-row { + position: relative; + width: 9000em; +} +.tundra .dojoxGrid-row { + border: none; + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} +.tundra .dojoxGrid-row-over { + border-top-color: #cccccc; + border-bottom-color: #cccccc; +} +.tundra .dojoxGrid-row-over .dojoxGrid-cell { + background-color: #60a1ea; + color:#fff; + +} +.tundra .dojoxGrid-row-odd { + background-color: #f2f5f9; + +} +.tundra .dojoxGrid-row-selected { + background-color: #aec7e3; + +} +.tundra .dojoxGrid-row-table { + table-layout: fixed; + width: 0; + border-collapse: collapse; +} +.tundra .dojoxGrid-invisible { + visibility: hidden; +} +.tundra .Xdojo-ie .dojoxGrid-invisible { + display: none; +} +.tundra .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} +.tundra .dojoxGrid-cell { + border: 1px dotted #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} +.dj_ie6 .tundra .dojoxGrid-cell { + border: 1px solid white; + border-right: 1px solid #D5CDB5; +} +.tundra .dojoxGrid-cell-focus { + border: 1px dotted #a6a6a6; +} +.tundra .dojoxGrid-cell-over { + border: 1px dotted #a6a6a6; +} +.tundra .dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted #595959; +} +.tundra .dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} +.tundra .dojoxGrid-row-editing td { + + background-color: #60a1ea; + +} +.tundra .dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.tundra .dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.tundra .dojoxGrid-row-error td { + background-color: #F8B8B6; +} +.tundra .dojoxGrid-input, +.tundra .dojoxGrid-select, +.tundra .dojoxGrid-textarea { + margin: 0; + padding: 0px; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} +.dijit_a11y .dojoxGrid-rowbar-selected { + border-top: 1px solid white; + border-bottom: 1px dashed black; + border-top: 0; + background: none; +} +.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner { + border: 0; + border-top: 1px solid white; +} +.dijit_a11y .dojoxGrid-row-selected { + border-bottom: 1px dashed black; +} diff --git a/includes/js/dojox/grid/_grid/tundraGrid.css.commented.css b/includes/js/dojox/grid/_grid/tundraGrid.css.commented.css new file mode 100644 index 0000000..a282f58 --- /dev/null +++ b/includes/js/dojox/grid/_grid/tundraGrid.css.commented.css @@ -0,0 +1,281 @@ +.tundra .dojoxGrid { + position: relative; + background-color: #e9e9e9; + font-size: 0.85em; /* inherit font-family from dojo.css */ + -moz-outline-style: none; + outline: none; + overflow: hidden; + height: 0; +} + +.tundra .dojoxGrid table { + padding: 0; +} + +.tundra .dojoxGrid td { + -moz-outline: none; +} + +/* master header */ + +.tundra .dojoxGrid-master-header { + position: relative; +} + +/* master view */ + +.tundra .dojoxGrid-master-view { + position: relative; +} + +/* views */ + +.tundra .dojoxGrid-view { + position: absolute; + overflow: hidden; +} + +/* header */ + +.tundra .dojoxGrid-header { + position: absolute; + overflow: hidden; +} + +.tundra .dojoxGrid-header { + background-color: #e9e9e9; +} + +.tundra .dojoxGrid-header table { + text-align: center; +} + +.tundra .dojoxGrid-header .dojoxGrid-cell-content { + text-align: center; +} + +.tundra .dojoxGrid-header .dojoxGrid-cell { + border: 1px solid transparent; + /* border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; */ + border-color: white #ACA899 #919191 white; + background: url(../../../dijit/themes/tundra/images/tabEnabled.png) #e9e9e9 repeat-x top; + padding-bottom: 2px; + color: #000 !important; +} + +.tundra .dojoxGrid-header .dojoxGrid-cell-over { + background: url(../../../dijit/themes/tundra/images/tabHover.png) #e9e9e9 repeat-x top; + color: #000 !important; +} + +.tundra .dojoxGrid-sort-down { + background: url(../../../dijit/themes/tundra/images/arrowDown.png) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} + +.tundra .dojoxGrid-sort-up { + background: url(../../../dijit/themes/tundra/images/arrowUp.png) right no-repeat; + padding-left: 0px; + margin-left: 0px; +} + +.tundra .gridArrowButtonChar { + display:none !important; +} +.dijit_a11y .gridArrowButtonChar { + display:inline !important; +} + +/* content */ + +.tundra .dojoxGrid-scrollbox { + position: relative; + overflow: scroll; + background-color: #fefefe; + width: 100%; +} + +.tundra .dojoxGrid-content { + position: relative; + overflow: hidden; + -moz-outline-style: none; + outline: none; +} + +/* rowbar */ + +.tundra .dojoxGrid-rowbar { + border: none; + /* + border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB; + */ + background: url(images/tabEnabled_rotated.png) #e9e9e9 repeat-y right; + border-right: 1px solid #cccccc; + padding: 0px; +} + +.tundra .dojoxGrid-rowbar-inner { + border: none; + border-bottom: 1px solid #cccccc; +} + +.tundra .dojoxGrid-rowbar-over { + background: url(images/tabHover_rotated.png) #e9e9e9 repeat-y right; +} + +.tundra .dojoxGrid-rowbar-selected { + background-color: #D9E8F9; + background-image: none; + background: url(../../../dijit/themes/tundra/images/tabDisabled.png) #dddddd repeat-x top; + border-right: 1px solid #cccccc; + background-position: center; + background-repeat: no-repeat; +} + +/* rows */ + +.tundra .dojoxGrid-row { + position: relative; + width: 9000em; +} + +.tundra .dojoxGrid-row { + border: none; + border-left: none; + border-right: none; + background-color: white; + border-top: none; +} + +.tundra .dojoxGrid-row-over { + border-top-color: #cccccc; + border-bottom-color: #cccccc; +} + +.tundra .dojoxGrid-row-over .dojoxGrid-cell { + background-color: #60a1ea; + color:#fff; + /*background: url(../../../dijit/themes/tundra/images/tabEnabled.png) #e9e9e9 repeat-x top;*/ +} + +.tundra .dojoxGrid-row-odd { + background-color: #f2f5f9; + /*background-color: #F9F7E8;*/ +} + +.tundra .dojoxGrid-row-selected { + background-color: #aec7e3; + /* + background: url(../../../dijit/themes/tundra/images/tabDisabled.png) #dddddd repeat-x top; + */ +} + +.tundra .dojoxGrid-row-table { + table-layout: fixed; + width: 0; + border-collapse: collapse; +} + +.tundra .dojoxGrid-invisible { + visibility: hidden; +} + +.tundra .Xdojo-ie .dojoxGrid-invisible { + display: none; +} + +.tundra .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td { + border-top-width: 0; + border-bottom-width: 0; + padding-top: 0; + padding-bottom: 0; + height: 0; + overflow: hidden; +} + +/* cells */ + +.tundra .dojoxGrid-cell { + border: 1px dotted #D5CDB5; + padding: 3px 3px 3px 3px; + text-align: left; + overflow: hidden; +} + +.dj_ie6 .tundra .dojoxGrid-cell { + border: 1px solid white; + border-right: 1px solid #D5CDB5; +} + +.tundra .dojoxGrid-cell-focus { + border: 1px dotted #a6a6a6; +} + +.tundra .dojoxGrid-cell-over { + border: 1px dotted #a6a6a6; +} + +.tundra .dojoxGrid-cell-focus.dojoxGrid-cell-over { + border: 1px dotted #595959; +} + +.tundra .dojoxGrid-cell-clip { + width: 100%; + overflow: hidden; + white-space:nowrap; + text-overflow: ellipsis; +} + +/* editing */ + +/* FIXME: these colors are off! */ +.tundra .dojoxGrid-row-editing td { + /* background-color: #F4FFF4; */ + background-color: #60a1ea; + /* padding: 0px 3px 0px 3px; */ +} + +.tundra .dojoxGrid-row-inserting td { + background-color: #F4FFF4; +} +.tundra .dojoxGrid-row-inflight td { + background-color: #F2F7B7; +} +.tundra .dojoxGrid-row-error td { + background-color: #F8B8B6; +} + +.tundra .dojoxGrid-input, +.tundra .dojoxGrid-select, +.tundra .dojoxGrid-textarea { + margin: 0; + padding: 0px; + border-style: none; + width: 100%; + font-size: 100%; + font-family: inherit; +} + +.dojoxGrid-hidden-focus { + position: absolute; + left: -1000px; + top: -1000px; + height: 0px, width: 0px; +} + +.dijit_a11y .dojoxGrid-rowbar-selected { + border-top: 1px solid white; + border-bottom: 1px dashed black; + border-top: 0; + background: none; +} + +.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner { + border: 0; + border-top: 1px solid white; +} + +.dijit_a11y .dojoxGrid-row-selected { + border-bottom: 1px dashed black; +} diff --git a/includes/js/dojox/grid/_grid/view.js b/includes/js/dojox/grid/_grid/view.js new file mode 100644 index 0000000..7f669cd --- /dev/null +++ b/includes/js/dojox/grid/_grid/view.js @@ -0,0 +1,336 @@ +if(!dojo._hasResource["dojox.grid._grid.view"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.view"] = true; +dojo.provide("dojox.grid._grid.view"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); +dojo.require("dojox.grid._grid.builder"); + +dojo.declare('dojox.GridView', + [dijit._Widget, dijit._Templated], + { + // summary: + // A collection of grid columns. A grid is comprised of a set of views that stack horizontally. + // Grid creates views automatically based on grid's layout structure. + // Users should typically not need to access individual views directly. + // + // defaultWidth: String + // Default widget of the view + defaultWidth: "18em", + + // viewWidth: String + // Width for the view, in valid css unit + viewWidth: "", + + templateString:"
            \n\t
            \n\t\t
            \n\t\t\t
            \n\t\t
            \n\t
            \n\t\n\t\n\t
            \n\t\t
            \n\t
            \n
            \n", + + themeable: false, + classTag: 'dojoxGrid', + marginBottom: 0, + rowPad: 2, + + postMixInProperties: function(){ + this.rowNodes = []; + }, + + postCreate: function(){ + this.connect(this.scrollboxNode,"onscroll","doscroll"); + dojox.grid.funnelEvents(this.contentNode, this, "doContentEvent", [ 'mouseover', 'mouseout', 'click', 'dblclick', 'contextmenu', 'mousedown' ]); + dojox.grid.funnelEvents(this.headerNode, this, "doHeaderEvent", [ 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'click', 'contextmenu' ]); + this.content = new dojox.grid.contentBuilder(this); + this.header = new dojox.grid.headerBuilder(this); + //BiDi: in RTL case, style width='9000em' causes scrolling problem in head node + if(!dojo._isBodyLtr()){ + this.headerNodeContainer.style.width = ""; + } + }, + + destroy: function(){ + dojox.grid.removeNode(this.headerNode); + this.inherited("destroy", arguments); + }, + + // focus + focus: function(){ + if(dojo.isSafari || dojo.isOpera){ + this.hiddenFocusNode.focus(); + }else{ + this.scrollboxNode.focus(); + } + }, + + setStructure: function(inStructure){ + var vs = this.structure = inStructure; + // FIXME: similar logic is duplicated in layout + if(vs.width && !isNaN(vs.width)){ + this.viewWidth = vs.width + 'em'; + }else{ + this.viewWidth = vs.width || this.viewWidth; //|| this.defaultWidth; + } + this.onBeforeRow = vs.onBeforeRow; + this.noscroll = vs.noscroll; + if(this.noscroll){ + this.scrollboxNode.style.overflow = "hidden"; + } + // bookkeeping + this.testFlexCells(); + // accomodate new structure + this.updateStructure(); + }, + + testFlexCells: function(){ + // FIXME: cheater, this function does double duty as initializer and tester + this.flexCells = false; + for(var j=0, row; (row=this.structure.rows[j]); j++){ + for(var i=0, cell; (cell=row[i]); i++){ + cell.view = this; + this.flexCells = this.flexCells || cell.isFlex(); + } + } + return this.flexCells; + }, + + updateStructure: function(){ + // header builder needs to update table map + this.header.update(); + // content builder needs to update markup cache + this.content.update(); + }, + + getScrollbarWidth: function(){ + return (this.noscroll ? 0 : dojox.grid.getScrollbarWidth()); // Integer + }, + + getColumnsWidth: function(){ + return this.headerContentNode.firstChild.offsetWidth; // Integer + }, + + getWidth: function(){ + return this.viewWidth || (this.getColumnsWidth()+this.getScrollbarWidth()) +'px'; // String + }, + + getContentWidth: function(){ + return Math.max(0, dojo._getContentBox(this.domNode).w - this.getScrollbarWidth()) + 'px'; // String + }, + + render: function(){ + this.scrollboxNode.style.height = ''; + this.renderHeader(); + }, + + renderHeader: function(){ + this.headerContentNode.innerHTML = this.header.generateHtml(this._getHeaderContent); + }, + + // note: not called in 'view' context + _getHeaderContent: function(inCell){ + var n = inCell.name || inCell.grid.getCellName(inCell); + if(inCell.index != inCell.grid.getSortIndex()){ + return n; + } + return [ '
            ', inCell.grid.sortInfo > 0 ? '▼' : '▲', '
            ', n, '
            ' ].join(''); + }, + + resize: function(){ + this.adaptHeight(); + this.adaptWidth(); + }, + + hasScrollbar: function(){ + return (this.scrollboxNode.clientHeight != this.scrollboxNode.offsetHeight); // Boolean + }, + + adaptHeight: function(){ + if(!this.grid.autoHeight){ + var h = this.domNode.clientHeight; + if(!this.hasScrollbar()){ // no scrollbar is rendered + h -= dojox.grid.getScrollbarWidth(); + } + dojox.grid.setStyleHeightPx(this.scrollboxNode, h); + } + }, + + adaptWidth: function(){ + if(this.flexCells){ + // the view content width + this.contentWidth = this.getContentWidth(); + this.headerContentNode.firstChild.style.width = this.contentWidth; + } + // FIXME: it should be easier to get w from this.scrollboxNode.clientWidth, + // but clientWidth seemingly does not include scrollbar width in some cases + var w = this.scrollboxNode.offsetWidth - this.getScrollbarWidth(); + w = Math.max(w, this.getColumnsWidth()) + 'px'; + with(this.contentNode){ + style.width = ''; + offsetWidth; + style.width = w; + } + }, + + setSize: function(w, h){ + with(this.domNode.style){ + if(w){ + width = w; + } + height = (h >= 0 ? h + 'px' : ''); + } + with(this.headerNode.style){ + if(w){ + width = w; + } + } + }, + + renderRow: function(inRowIndex, inHeightPx){ + var rowNode = this.createRowNode(inRowIndex); + this.buildRow(inRowIndex, rowNode, inHeightPx); + this.grid.edit.restore(this, inRowIndex); + return rowNode; + }, + + createRowNode: function(inRowIndex){ + var node = document.createElement("div"); + node.className = this.classTag + '-row'; + node[dojox.grid.gridViewTag] = this.id; + node[dojox.grid.rowIndexTag] = inRowIndex; + this.rowNodes[inRowIndex] = node; + return node; + }, + + buildRow: function(inRowIndex, inRowNode){ + this.buildRowContent(inRowIndex, inRowNode); + this.styleRow(inRowIndex, inRowNode); + }, + + buildRowContent: function(inRowIndex, inRowNode){ + inRowNode.innerHTML = this.content.generateHtml(inRowIndex, inRowIndex); + if(this.flexCells){ + // FIXME: accessing firstChild here breaks encapsulation + inRowNode.firstChild.style.width = this.contentWidth; + } + }, + + rowRemoved:function(inRowIndex){ + this.grid.edit.save(this, inRowIndex); + delete this.rowNodes[inRowIndex]; + }, + + getRowNode: function(inRowIndex){ + return this.rowNodes[inRowIndex]; + }, + + getCellNode: function(inRowIndex, inCellIndex){ + var row = this.getRowNode(inRowIndex); + if(row){ + return this.content.getCellNode(row, inCellIndex); + } + }, + + // styling + styleRow: function(inRowIndex, inRowNode){ + inRowNode._style = dojox.grid.getStyleText(inRowNode); + this.styleRowNode(inRowIndex, inRowNode); + }, + + styleRowNode: function(inRowIndex, inRowNode){ + if(inRowNode){ + this.doStyleRowNode(inRowIndex, inRowNode); + } + }, + + doStyleRowNode: function(inRowIndex, inRowNode){ + this.grid.styleRowNode(inRowIndex, inRowNode); + }, + + // updating + updateRow: function(inRowIndex, inHeightPx, inPageNode){ + var rowNode = this.getRowNode(inRowIndex); + if(rowNode){ + rowNode.style.height = ''; + this.buildRow(inRowIndex, rowNode); + } + return rowNode; + }, + + updateRowStyles: function(inRowIndex){ + this.styleRowNode(inRowIndex, this.getRowNode(inRowIndex)); + }, + + // scrolling + lastTop: 0, + firstScroll:0, + + doscroll: function(inEvent){ + //var s = dojo.marginBox(this.headerContentNode.firstChild); + var isLtr = dojo._isBodyLtr(); + if(this.firstScroll < 2){ + if((!isLtr && this.firstScroll == 1) || (isLtr && this.firstScroll == 0)){ + var s = dojo.marginBox(this.headerNodeContainer); + if(dojo.isIE){ + this.headerNodeContainer.style.width = s.w + this.getScrollbarWidth() + 'px'; + }else if(dojo.isMoz){ + //TODO currently only for FF, not sure for safari and opera + this.headerNodeContainer.style.width = s.w - this.getScrollbarWidth() + 'px'; + //this.headerNodeContainer.style.width = s.w + 'px'; + //set scroll to right in FF + if(isLtr){ + this.scrollboxNode.scrollLeft = this.scrollboxNode.scrollWidth - this.scrollboxNode.clientWidth; + }else{ + this.scrollboxNode.scrollLeft = this.scrollboxNode.clientWidth - this.scrollboxNode.scrollWidth; + } + } + } + this.firstScroll++; + } + this.headerNode.scrollLeft = this.scrollboxNode.scrollLeft; + // 'lastTop' is a semaphore to prevent feedback-loop with setScrollTop below + var top = this.scrollboxNode.scrollTop; + if(top != this.lastTop){ + this.grid.scrollTo(top); + } + }, + + setScrollTop: function(inTop){ + // 'lastTop' is a semaphore to prevent feedback-loop with doScroll above + this.lastTop = inTop; + this.scrollboxNode.scrollTop = inTop; + return this.scrollboxNode.scrollTop; + }, + + // event handlers (direct from DOM) + doContentEvent: function(e){ + if(this.content.decorateEvent(e)){ + this.grid.onContentEvent(e); + } + }, + + doHeaderEvent: function(e){ + if(this.header.decorateEvent(e)){ + this.grid.onHeaderEvent(e); + } + }, + + // event dispatch(from Grid) + dispatchContentEvent: function(e){ + return this.content.dispatchEvent(e); + }, + + dispatchHeaderEvent: function(e){ + return this.header.dispatchEvent(e); + }, + + // column resizing + setColWidth: function(inIndex, inWidth){ + this.grid.setCellWidth(inIndex, inWidth + 'px'); + }, + + update: function(){ + var left = this.scrollboxNode.scrollLeft; + this.content.update(); + this.grid.update(); + this.scrollboxNode.scrollLeft = left; + this.headerNode.scrollLeft = left; + } +}); + +} diff --git a/includes/js/dojox/grid/_grid/views.js b/includes/js/dojox/grid/_grid/views.js new file mode 100644 index 0000000..d13bbb7 --- /dev/null +++ b/includes/js/dojox/grid/_grid/views.js @@ -0,0 +1,277 @@ +if(!dojo._hasResource["dojox.grid._grid.views"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid._grid.views"] = true; +dojo.provide("dojox.grid._grid.views"); + +dojo.declare('dojox.grid.views', null, { + // summary: + // A collection of grid views. Owned by grid and used internally for managing grid views. + // description: + // Grid creates views automatically based on grid's layout structure. + // Users should typically not need to access individual views or the views collection directly. + constructor: function(inGrid){ + this.grid = inGrid; + }, + + defaultWidth: 200, + + views: [], + + // operations + resize: function(){ + this.onEach("resize"); + }, + + render: function(){ + this.onEach("render"); + }, + + // views + addView: function(inView){ + inView.idx = this.views.length; + this.views.push(inView); + }, + + destroyViews: function(){ + for (var i=0, v; v=this.views[i]; i++) + v.destroy(); + this.views = []; + }, + + getContentNodes: function(){ + var nodes = []; + for(var i=0, v; v=this.views[i]; i++){ + nodes.push(v.contentNode); + } + return nodes; + }, + + forEach: function(inCallback){ + for(var i=0, v; v=this.views[i]; i++){ + inCallback(v, i); + } + }, + + onEach: function(inMethod, inArgs){ + inArgs = inArgs || []; + for(var i=0, v; v=this.views[i]; i++){ + if(inMethod in v){ + v[inMethod].apply(v, inArgs); + } + } + }, + + // layout + normalizeHeaderNodeHeight: function(){ + var rowNodes = []; + for(var i=0, v; (v=this.views[i]); i++){ + if(v.headerContentNode.firstChild){ + rowNodes.push(v.headerContentNode) + }; + } + this.normalizeRowNodeHeights(rowNodes); + }, + + normalizeRowNodeHeights: function(inRowNodes){ + var h = 0; + for(var i=0, n, o; (n=inRowNodes[i]); i++){ + h = Math.max(h, (n.firstChild.clientHeight)||(n.firstChild.offsetHeight)); + } + h = (h >= 0 ? h : 0); + // + var hpx = h + 'px'; + for(var i=0, n; (n=inRowNodes[i]); i++){ + if(n.firstChild.clientHeight!=h){ + n.firstChild.style.height = hpx; + } + } + // + //console.log('normalizeRowNodeHeights ', h); + // + // querying the height here seems to help scroller measure the page on IE + if(inRowNodes&&inRowNodes[0]){ + inRowNodes[0].parentNode.offsetHeight; + } + }, + + resetHeaderNodeHeight: function(){ + for(var i=0, v, n; (v=this.views[i]); i++){ + n = v.headerContentNode.firstChild; + if(n) + n.style.height = ""; + } + }, + + renormalizeRow: function(inRowIndex){ + var rowNodes = []; + for(var i=0, v, n; (v=this.views[i])&&(n=v.getRowNode(inRowIndex)); i++){ + n.firstChild.style.height = ''; + rowNodes.push(n); + } + this.normalizeRowNodeHeights(rowNodes); + }, + + getViewWidth: function(inIndex){ + return this.views[inIndex].getWidth() || this.defaultWidth; + }, + + // must be called after view widths are properly set or height can be miscalculated + // if there are flex columns + measureHeader: function(){ + // need to reset view header heights so they are properly measured. + this.resetHeaderNodeHeight(); + this.forEach(function(inView){ + inView.headerContentNode.style.height = ''; + }); + var h = 0; + // calculate maximum view header height + this.forEach(function(inView){ + h = Math.max(inView.headerNode.offsetHeight, h); + }); + return h; + }, + + measureContent: function(){ + var h = 0; + this.forEach(function(inView) { + h = Math.max(inView.domNode.offsetHeight, h); + }); + return h; + }, + + findClient: function(inAutoWidth){ + // try to use user defined client + var c = this.grid.elasticView || -1; + // attempt to find implicit client + if(c < 0){ + for(var i=1, v; (v=this.views[i]); i++){ + if(v.viewWidth){ + for(i=1; (v=this.views[i]); i++){ + if(!v.viewWidth){ + c = i; + break; + } + } + break; + } + } + } + // client is in the middle by default + if(c < 0){ + c = Math.floor(this.views.length / 2); + } + return c; + }, + + arrange: function(l, w){ + var i, v, vw, len = this.views.length; + // find the client + var c = (w <= 0 ? len : this.findClient()); + // layout views + var setPosition = function(v, l){ + with(v.domNode.style){ + if(!dojo._isBodyLtr()){ + right = l + 'px'; + }else{ + left = l + 'px'; + } + top = 0 + 'px'; + } + with(v.headerNode.style){ + if(!dojo._isBodyLtr()){ + right = l + 'px'; + }else{ + left = l + 'px'; + } + top = 0; + } + } + // for views left of the client + //BiDi TODO: The left and right should not appear in BIDI environment. Should be replaced with + //leading and tailing concept. + for(i=0; (v=this.views[i])&&(i +
            +
            +
            +
            +
            + + +
            +
            +
            +
            \ No newline at end of file diff --git a/includes/js/dojox/grid/resources/VirtualGrid.html b/includes/js/dojox/grid/resources/VirtualGrid.html new file mode 100644 index 0000000..7253108 --- /dev/null +++ b/includes/js/dojox/grid/resources/VirtualGrid.html @@ -0,0 +1,5 @@ +
            +
            +
            + +
            diff --git a/includes/js/dojox/grid/tests/databaseModel.js b/includes/js/dojox/grid/tests/databaseModel.js new file mode 100644 index 0000000..3c879eb --- /dev/null +++ b/includes/js/dojox/grid/tests/databaseModel.js @@ -0,0 +1,337 @@ +if(!dojo._hasResource["dojox.grid.tests.databaseModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid.tests.databaseModel"] = true; +dojo.provide("dojox.grid.tests.databaseModel"); +dojo.require("dojox.grid._data.model"); + +// Provides a sparse array that is also traversable inorder +// with basic Array: +// - iterating by index is slow for large sparse arrays +// - for...in iteration is in order of element creation +// maintains a secondary index for interating +// over sparse elements inorder +dojo.declare("dojox.grid.Sparse", null, { + constructor: function() { + this.clear(); + }, + clear: function() { + this.indices = []; + this.values = []; + }, + length: function() { + return this.indices.length; + }, + set: function(inIndex, inValue) { + for (var i=0,l=this.indices.length; i= inIndex) + break; + } + if (this.indices[i] != inIndex) + this.indices.splice(i, 0, inIndex); + this.values[inIndex] = inValue; + }, + get: function(inIndex) { + return this.values[inIndex]; + }, + remove: function(inIndex) { + for (var i=0,l=this.indices.length; i=0) && ((k=inRowIndexes[i])!=undefined); i--) + this.setState(k, inState, inValue); + }, + clearStateForIndexes: function(inRowIndexes, inState) { + for (var i=inRowIndexes.length-1, k; (i>=0) && ((k=inRowIndexes[i])!=undefined); i--) + this.clearState(k, inState); + }, + //$ Return boolean stating whether or not an operation is in progress that may change row indexing. + isAddRemoving: function() { + return Boolean(this.states['inserting'].length() || this.states['removing'].length()); + }, + isInflight: function() { + return Boolean(this.states['inflight'].length()); + }, + //$ Return boolean stating if the model is currently undergoing any type of edit. + isEditing: function() { + for (var i=0, r={}, s; (s=this.stateNames[i]); i++) + if (this.states[s].length()) + return true; + }, + //$ Return true if ok to modify the given row. Override as needed, using model editing state information. + canModify: function(inRowIndex) { + return !this.getState(inRowIndex).inflight && !(this.isInflight() && this.isAddRemoving()); + }, + // server send / receive + getSendParams: function(inParams) { + var p = { + database: this.database || '', + table: this.table || '' + } + return dojo.mixin(p, inParams || {}); + }, + send: function(inAsync, inParams, inCallbacks) { + //console.log('send', inParams.command); + var p = this.getSendParams(inParams); + var d = dojo.xhrPost({ + url: this.server, + content: p, + handleAs: 'json-comment-filtered', + contentType: "application/x-www-form-urlencoded; charset=utf-8", + sync: !inAsync + }); + d.addCallbacks(dojo.hitch(this, "receive", inCallbacks), dojo.hitch(this, "receiveError", inCallbacks)); + return d; + }, + _callback: function(cb, eb, data) { + try{ cb && cb(data); } + catch(e){ eb && eb(data, e); } + }, + receive: function(inCallbacks, inData) { + inCallbacks && this._callback(inCallbacks.callback, inCallbacks.errback, inData); + }, + receiveError: function(inCallbacks, inErr) { + this._callback(inCallbacks.errback, null, inErr) + }, + encodeRow: function(inParams, inRow, inPrefix) { + for (var i=0, l=inRow.length; i < l; i++) + inParams['_' + (inPrefix ? inPrefix : '') + i] = (inRow[i] ? inRow[i] : ''); + }, + measure: function() { + this.send(true, { command: 'info' }, { callback: dojo.hitch(this, this.callbacks.info) }); + }, + fetchRowCount: function(inCallbacks) { + this.send(true, { command: 'count' }, inCallbacks); + }, + // server commits + commitEdit: function(inOldData, inNewData, inRowIndex, inCallbacks) { + this.setState(inRowIndex, "inflight", true); + var params = {command: 'update'}; + this.encodeRow(params, inOldData, 'o'); + this.encodeRow(params, inNewData); + this.send(true, params, inCallbacks); + }, + commitInsert: function(inRowIndex, inNewData, inCallbacks) { + this.setState(inRowIndex, "inflight", true); + var params = {command: 'insert'}; + this.encodeRow(params, inNewData); + this.send(true, params, inCallbacks); + }, + // NOTE: supported only in tables with pk + commitDelete: function(inRows, inCallbacks) { + var params = { + command: 'delete', + count: inRows.length + } + var pk = this.getPkIndex(); + if (pk < 0) + return; + for (var i=0; i < inRows.length; i++) { + params['_' + i] = inRows[i][pk]; + } + this.send(true, params, inCallbacks); + }, + getUpdateCallbacks: function(inRowIndex) { + return { + callback: dojo.hitch(this, this.callbacks.update, inRowIndex), + errback: dojo.hitch(this, this.callbacks.updateError, inRowIndex) + }; + }, + // primary key from fields + getPkIndex: function() { + for (var i=0, l=this.fields.count(), f; (iRD-X_Gd3fpOlgqcBT)F-9+MQ>&?!UPG;KiMXFYi8jb^pohN6+3oe*X69i+9gn zy?^og{mVBWUcLSJ`rXGj?>@cz@cI46FK@s6`|#<@$Io9sfBE+1D-eDE`tAF-??1l( z`0?W>5d8Z2>(}q!zyJIJqCfxs{{8n4h=AZf!zdUH0a}KD;!hSv28RC(Iv`6xd4ho> zgMpPp#v@=sBQuwj%Z3RHojI78_*4QS6r0-x)VMet4lp>eGRQd02v}HnkeN%Ip+RHf zqEm&k&+jyh|OnF={K5FfeG%<-wd8Nb_A}GZz J#>2s24FHH{swDsb literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/tests/images/flatScreen.gif b/includes/js/dojox/grid/tests/images/flatScreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..05edd7251d92fa3979e8f83ae82f32f9b3d8ca35 GIT binary patch literal 824 zcmb`^X-|>?0KoA_v_mYjW0jdDQ+B+*&#FOxS9zyI0M;P?u>gvNR7M zL{#L~6!9QIeFRkS5wQRPDXs@lL}M-&&F|3v1N`3nFQq1*I-MH=gaAe?Kocz*U^icG z>zjgk({Q)c`eS~6KyF)cI$0BzC5J<$RxN0C?0z9AmEj5Wu5t6otb-1kN0mz-$UTMS z@5vn;jYjjC%v`eDW)+IYc3uOuuf2=g)WKWS>qK*owocAZgMlr!m`z4Hv)k=<3n05r zr{&9RR*QLKW22>wZG+*aRu+lMrqQ`3<1gc{pC2iGRMx<#NCbXge&52->-D{pa2=5` zGc(gW1%Fp6tDEQ?iS_FwOrdd1Mq_RL7Yc(<=b+xF95&-(VO1p6JVRC2wPHGhAXeYMPaJmR@c0% z#YAB-@%f+X8$LHS#$!Gp!@bC@lr}0Q97(_+(b+6Ehuh6T(}=-2{DHxt;lbcOI_mD& zI5;5&Q9|VYO!*8ntAO@T#bv3~ngy*UP8b-SVKkX7R&#V=RZR2>9nlo{*wHi_wpny*Z40V?j!{G z9$F#xKGLQ=_dBq!wb*GG@7STVhrKB^$w;Ah3PF+o)_Lv&Y#Qzi3Uwu*^5~7iSG)Eu VJV}Wc3=RHqpBRuFIIRD-X_Gd3fpOlgqcBT)F-9+MQ>&?!UPG;KiMXFYi8jb^pohN6+3oe*X5!i?>f- zynFWQ{fpP{U%vV9>g~tZ?>@eH_vzh-&+k8edHdzxhfiNVe*XIT%eOCIf$00!Z{NRt z|MC6Dj~_pQ;MdPzzkdJz{pSx5{rUIz@4tUQ1O)#XM!{$Z&@2QLf3h$#F#KoG0oee` z6AT;~46Gb79svs)nYpA~HY_;U%)!LOrxFn1c$i&Kor}Za0E1I2kF3+2h=qj*nYqNB zW(7QSTHMUZki^7sL8;A+Q{18@;-wNBZ-=Gh1dqUCH{K5EmSqWy$!xt+Qu@mZJ~|z{ NEGWe-#>2s24FChRu^<2d literal 0 HcmV?d00001 diff --git a/includes/js/dojox/grid/tests/support/books.xml b/includes/js/dojox/grid/tests/support/books.xml new file mode 100644 index 0000000..4c330e6 --- /dev/null +++ b/includes/js/dojox/grid/tests/support/books.xml @@ -0,0 +1,103 @@ + + + + 1 + Title of 1 + Author of 1 + + + 2 + Title of 2 + Author of 2 + + + 3 + Title of 3 + Author of 3 + + + 4 + Title of 4 + Author of 4 + + + 5 + Title of 5 + Author of 5 + + + 6 + Title of 6 + Author of 6 + + + 7 + Title of 7 + Author of 7 + + + 8 + Title of 8 + Author of 8 + + + 9 + Title of 9 + Author of 9 + + + 10 + Title of 10 + Author of 10 + + + 11 + Title of 11 + Author of 11 + + + 12 + Title of 12 + Author of 12 + + + 13 + Title of 13 + Author of 13 + + + 14 + Title of 14 + Author of 14 + + + 15 + Title of 15 + Author of 15 + + + 16 + Title of 16 + Author of 16 + + + 17 + Title of 17 + Author of 17 + + + 18 + Title of 18 + Author of 18 + + + 19 + Title of 19 + Author of 19 + + + 20 + Title of 20 + Author of 20 + + diff --git a/includes/js/dojox/grid/tests/support/data.php b/includes/js/dojox/grid/tests/support/data.php new file mode 100644 index 0000000..1beb6f0 --- /dev/null +++ b/includes/js/dojox/grid/tests/support/data.php @@ -0,0 +1,379 @@ +encode($inData) . ' */'; + } + + function error($inMessage) { + $inMessage = str_replace('"', '\\"', $inMessage); + error_log($inMessage); + //echo '/* ({error: true, message: "' . $inMessage . '"}) */'; + echoJson(array('error' => true, 'message' => $inMessage)); + exit; + } + + + function getArray($inResult, $inArray="true") { + $o = Array(); + while ($row = ($inArray ? mysql_fetch_row($inResult) : mysql_fetch_object($inResult))) + $o[] = $row; + return $o; + } + + // connect to DB + mysql_connect($dbserver, $dbuser, $dbpassword); + + // select DB + $database = getPostString("database"); + $database = ($database ? $database : $db); + if (!mysql_select_db($database)) + error('failed to select db: ' . mysql_error()); + + // select table + $table = getPostString("table"); + $table = ($table ? $table : $dbtable); + + // cache + $colCache = NULL; + $pkCache = NULL; + + // set UTF8 output (MySql > 4.0) + mysql_query("SET NAMES UTF8"); + + // server, database, table meta data + function getDatabases() { + $result = mysql_query("SHOW DATABASES"); + $output = Array(); + while ($row = mysql_fetch_row($result)) { + $r = strtolower($row[0]); + if ($r != 'mysql' && $r != 'information_schema') + $output[] = $row[0]; + } + return $output; + } + + function getTables() { + global $database; + $result = mysql_query("SHOW TABLES FROM $database"); + $output = Array(); + while ($row = mysql_fetch_row($result)) + $output[] = $row[0]; + return $output; + } + + function getColumns() { + global $table, $colCache; + if (!$colCache) { + $result = mysql_query("SHOW COLUMNS FROM `$table`"); + return getArray($result, false); + $colCache = getArray($result, false); + } + return $colCache; + } + + // returns object: $this->name, $this->index + function getPk() { + global $pkCache; + if (!$pkCache) { + $k = ''; + $columns = getColumns(); + for ($i=0; $i < count($columns); $i++) { + $c = $columns[$i]; + if ($c->Key == 'PRI') { + $k = $c->Field; + break; + } + } + $pkCache->index = $i; + $pkCache->name = $k; + } + return $pkCache; + } + + function getTableInfo() { + global $table, $database; + $c = getColumns(); + $r = rowcount(); + return array("count" => $r, "columns" => $c, "database" => $database, "table" => $table); + } + + function getOldPostPkValue() { + $pk = getPk(); + return getPostString('_o' . $pk->index); + } + + function getNewPostPkValue() { + $pk = getPk(); + return getPostString('_' . $pk->index); + } + + function getPostColumns() { + $columns = getColumns(); + for ($i=0, $a=array(), $p; (($p=getPostString("_".$i)) != ''); $i++) { + $r = new stdClass(); + $r->name = $columns[$i]->Field; + $r->value = $p; + $a[] = $r; + } + return $a; + } + + function getOrderBy() { + $ob = getPostString("orderby"); + if (is_numeric($ob)) { + $columns = getColumns(); + $ob = $columns[intval($ob)-1]->Field; + } + return $ob; + } + + function getWhere() { + $w = getPostString("where"); + return ($w ? " WHERE $w" : ""); + } + + // basic operations + function rowcount() { + global $table; + $query = "SELECT COUNT(*) FROM `$table`" . getWhere(); + $result = mysql_query($query); + if (!$result) + error("failed to perform query: $query. " . mysql_error()); + if ($row = mysql_fetch_row($result)) + return $row[0]; + else + return 0; + } + + function select($inQuery = '') { + global $table; + // built limit clause + $lim = (int)getPostString("limit"); + $off = (int)getPostString("offset"); + $limit = ($lim || $off ? " LIMIT $off, $lim" : ""); + // build order by clause + $desc = (boolean)getPostString("desc"); + $ob = getOrderBy(); + $orderby = ($ob ? " ORDER BY `" . $ob . "`" . ($desc ? " DESC" : "") : ""); + // build query + $query = ($inQuery ? $inQuery : "SELECT * FROM `$table`" . getWhere() . $orderby . $limit); + // execute query + if (!$result = mysql_query($query)) + error("failed to perform query: $query. " . mysql_error()); + // fetch each result row + return getArray($result); + } + + function reflectRow() { + global $table; + $pk = getPk(); + $key = getNewPostPkValue(); + $where = "`$pk->name`=\"$key\""; + return select("SELECT * FROM `$table` WHERE $where LIMIT 1"); + } + + function update() { + // build set clause + for ($i=0, $set = array(), $cols = getPostColumns(), $v; ($v=$cols[$i]); $i++) + $set[] = "`$v->name` = '$v->value'"; + $set = implode(', ', $set); + // our table + global $table; + // build query + $pk = getPk(); + $pkValue = getOldPostPkValue(); + $query = "UPDATE `$table` SET $set WHERE `$pk->name` = '$pkValue' LIMIT 1"; + // execute query + if (!mysql_query($query)) + error("failed to perform query: [$query]. " . + "MySql says: [" . mysql_error() ."]"); + else { + return reflectRow(); + } + } + + function insert() { + global $table; + // build values clause + for ($i=0, $values = array(), $cols = getPostColumns(), $v; ($v=$cols[$i]); $i++) + $values[] = $v->value; + $values = '"' . implode('", "', $values) . '"'; + // build query + $query = "INSERT INTO `$table` VALUES($values)"; + // execute query + if (!mysql_query($query)) + error("failed to perform query: [$query]. " . + "MySql says: [" . mysql_error() ."]"); + else { + return reflectRow(); + } + } + + function delete() { + global $table; + // build query + $n = getPostString("count"); + $pk = getPk(); + for ($i = 0, $deleted=array(); $i < $n; $i++) { + $key = getPostString("_$i"); + array_push($deleted, $key); + $query = "DELETE FROM `$table` WHERE `$pk->name`=\"$key\" LIMIT 1"; + // execute query + if (!mysql_query($query) || mysql_affected_rows() != 1) + error("failed to perform query: [$query]. " . + "Affected rows: " . mysql_affected_rows() .". " . + "MySql says: [" . mysql_error() ."]"); + } + return $deleted; + } + + // find (full text search) + function findData($inFindCol, $inFind, $inOrderBy, $inFullText) { + global $table; + $where = ($inFullText ? "WHERE MATCH(`$inFindCol`) AGAINST ('$inFind')" : "WHERE $inFindCol LIKE '$inFind'"); + $query = "SELECT * FROM $table $where $inOrderBy"; + $result = mysql_query($query); + // return rows + return getArray($result); + } + + // binary search through sorted data, supports start point ($inFindFrom) and direction ($inFindForward) + function findRow($inData, $inFindFrom=-1, $inFindForward) { + $b = -1; + $l = count($inData); + if (!$inData) + return $b; + if (!$inFindFrom==-1 || $l < 2) + $b = 0; + else { + // binary search + $t = $l-1; + $b = 0; + while ($b <= $t) { + $p = floor(($b+$t)/2); + $d = $inData[$p][0]; + if ($d < $inFindFrom) + $b = $p + 1; + else if ($d > $inFindFrom) + $t = $p - 1; + else { + $b = $p; + break; + } + } + if ($inFindFrom == $inData[$b][0]) { + // add or subtract 1 + $b = ($inFindForward ? ($b+1 > $l-1 ? 0 : $b+1) : ($b-1 < 0 ? $l-1 : $b-1) ); + } + else if (!$inFindForward) + // subtract 1 + $b = ($b-1 < 0 ? $l-1 : $b-1); + } + return $inData[$b][0]; + } + + function buildFindWhere($inFindData, $inKey, $inCol) { + $o = Array(); + foreach($inFindData as $row) + $o[] = $inCol . "='" . $row[$inKey] . "'"; + return (count($o) ? ' WHERE ' . implode(' OR ', $o) : ''); + } + + function find($inFindCol, $inFind='', $inOb='', $inFindFrom=0, $inFindForward=true, $inFullText=true) { + global $table; + // build order by clause + $desc = (boolean)getPostString("desc"); + if (!$inOb) + $inOb = getOrderBy(); + if ($inOb) + $inOb = "`" . $inOb . "`" ; + $orderby = ($inOb ? " ORDER BY $inOb " . ($desc ? " DESC" : "") : ""); + // update inputs from post + if (!$inFind) + $inFind = getPostString('findText'); + if (!$inFindCol) + $inFindCol = getPostString('findCol'); + if (empty($inFindFrom)) + $inFindFrom = getPostString('findFrom'); + $ff = getPostString('findForward'); + if ($ff) + $inFindForward = (strtolower($ff) == 'true' ? true : false); + $ft = getPostString('findFullText'); + if ($ft) + $inFullText = (strtolower($ft) == 'true' ? true : false); + + // get find data + $f = findData($inFindCol, $inFind, $orderby, $inFullText); + $pk = getPk(); + + // execute query + $where = buildFindWhere($f, $pk->index, 'f'); + $query = "SELECT Row, f FROM (SELECT @row := @row + 1 AS Row, $pk->name as f FROM `$table` $orderby) AS tempTable $where"; + mysql_query('SET @row = -1;'); + if (!$result = mysql_query($query)) + error("failed to perform query: $query. " . mysql_error()); + + // return row number + return findRow(getArray($result), $inFindFrom, $inFindForward); + } + + // our command list + $cmds = array( + "count" => "rowcount", + "select" => "select", + "update" => "update", + "insert" => "insert", + "delete" => "delete", + "find" => "find", + "databases" => "getDatabases", + "tables" => "getTables", + "columns" => "getColumns", + "info" => "getTableInfo" + ); + + // process input params + $cmd = @$_POST["command"]; + + //$cmd="select"; + + // dispatch command + $func = @$cmds[$cmd]; + if (function_exists($func)) + echoJson(call_user_func($func)); + else + error("bad command"); +?> diff --git a/includes/js/dojox/grid/tests/support/geography.xml b/includes/js/dojox/grid/tests/support/geography.xml new file mode 100644 index 0000000..070a8c1 --- /dev/null +++ b/includes/js/dojox/grid/tests/support/geography.xml @@ -0,0 +1,51 @@ + + + + geography.opml + 2006-11-10 + 2006-11-13 + Magellan, Ferdinand + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/grid/tests/support/json.php b/includes/js/dojox/grid/tests/support/json.php new file mode 100644 index 0000000..84e3dfa --- /dev/null +++ b/includes/js/dojox/grid/tests/support/json.php @@ -0,0 +1,794 @@ + +* @author Matt Knapp +* @author Brett Stimmerman +* @copyright 2005 Michal Migurski +* @license http://www.opensource.org/licenses/bsd-license.php +* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 +*/ + +/** +* Marker constant for Services_JSON::decode(), used to flag stack state +*/ +define('SERVICES_JSON_SLICE', 1); + +/** +* Marker constant for Services_JSON::decode(), used to flag stack state +*/ +define('SERVICES_JSON_IN_STR', 2); + +/** +* Marker constant for Services_JSON::decode(), used to flag stack state +*/ +define('SERVICES_JSON_IN_ARR', 4); + +/** +* Marker constant for Services_JSON::decode(), used to flag stack state +*/ +define('SERVICES_JSON_IN_OBJ', 8); + +/** +* Marker constant for Services_JSON::decode(), used to flag stack state +*/ +define('SERVICES_JSON_IN_CMT', 16); + +/** +* Behavior switch for Services_JSON::decode() +*/ +define('SERVICES_JSON_LOOSE_TYPE', 10); + +/** +* Behavior switch for Services_JSON::decode() +*/ +define('SERVICES_JSON_STRICT_TYPE', 11); + +/** +* Encodings +*/ +define('SERVICES_JSON_ISO_8859_1', 'iso-8859-1'); +define('SERVICES_JSON_UTF_8', 'utf-8'); + +/** +* Converts to and from JSON format. +* +* Brief example of use: +* +* +* // create a new instance of Services_JSON +* $json = new Services_JSON(); +* +* // convert a complexe value to JSON notation, and send it to the browser +* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); +* $output = $json->encode($value); +* +* print($output); +* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] +* +* // accept incoming POST data, assumed to be in JSON notation +* $input = file_get_contents('php://input', 1000000); +* $value = $json->decode($input); +* +*/ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + //>> SJM2005 + * @param string $encoding Strings are input/output in this encoding + * @param int $encode Encode input is expected in this character encoding + //<< SJM2005 + * + * @param int $use object behavior: when encoding or decoding, + * be loose or strict about object/array usage + * + * possible values: + * - SERVICES_JSON_STRICT_TYPE: strict typing, default. + * "{...}" syntax creates objects in decode(). + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays in decode(). + */ + function Services_JSON($encoding = SERVICES_JSON_UTF_8, $use = SERVICES_JSON_STRICT_TYPE) + { + //>> SJM2005 + $this->encoding = $encoding; + //<< SJM2005 + + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return string JSON string representation of input var + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + //>> SJM2005 + if ($this->encoding == SERVICES_JSON_UTF_8) + ; + else if ($this->encoding == SERVICES_JSON_ISO_8859_1) + $var = utf8_encode($var); + else if (!function_exists('mb_convert_encoding')) + die('Requested encoding requires mb_strings extension.'); + else + $var = mb_convert_encoding($var, "utf-8", $this->encoding); + //<< SJM2005 + + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($var), + array_values($var))) + . '}'; + } + + // treat it like a regular array + return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; + + case 'object': + $vars = get_object_vars($var); + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars))) + . '}'; + + default: + return ''; + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + return $this->encode(strval($name)) . ':' . $this->encode($value); + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + //echo ' matching single escaped unicode character from ' . substr($chrs, $c, 6); + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + //>> SJM2005 + if ($this->encoding == SERVICES_JSON_UTF_8) + return $utf8; + if ($this->encoding == SERVICES_JSON_ISO_8859_1) + return utf8_decode($utf8); + else if (!function_exists('mb_convert_encoding')) + die('Requested encoding requires mb_strings extension.'); + else + return mb_convert_encoding($utf8, $this->encoding, SERVICES_JSON_UTF_8); + //<< SJM2005 + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + //>> SAO2006 + /*} elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + (($chrs{$c - 1} != '\\') || + ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) {*/ + } elseif ($chrs{$c} == $top['delim'] && + $top['what'] == SERVICES_JSON_IN_STR) { + //print("Found potential end of string at {$c}\n"); + // verify quote is not escaped: it has no or an even number of \\ before it. + for ($i=0; ($chrs{$c - ($i+1)} == '\\'); $i++); + /*$i = 0; + while ( $chrs{$c - ($i+1)} == '\\') + $i++;*/ + //print("Found {$i} \ before delim\n"); + if ($i % 2 != 0) + { + //print("delim escaped, not end of string\n"); + continue; + } + //>> SAO2006 + // found a quote, we're in a string, and it's not escaped + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + +} + + /*function hex($s) + { + $l = strlen($s); + for ($i=0; $i < $l; $i++) + //echo '['.(ord($s{$i})).']'; + echo '['.bin2hex($s{$i}).']'; + } + + //$d = '["hello world\\""]'; + $d = '["\\\\\\"hello world,\\\\\\""]'; + //$d = '["\\\\", "\\\\"]'; + hex($d); + $test = new Services_JSON(); + echo('
            ');
            +	print_r($d . "\n");
            +	print_r($test->decode($d));
            +	echo('
            '); + */ +?> \ No newline at end of file diff --git a/includes/js/dojox/grid/tests/support/movies.csv b/includes/js/dojox/grid/tests/support/movies.csv new file mode 100644 index 0000000..baf71eb --- /dev/null +++ b/includes/js/dojox/grid/tests/support/movies.csv @@ -0,0 +1,9 @@ +Title, Year, Producer +City of God, 2002, Katia Lund +Rain,, Christine Jeffs +2001: A Space Odyssey, , Stanley Kubrick +"This is a ""fake"" movie title", 1957, Sidney Lumet +Alien, 1979 , Ridley Scott +"The Sequel to ""Dances With Wolves.""", 1982, Ridley Scott +"Caine Mutiny, The", 1954, "Dymtryk ""the King"", Edward" + diff --git a/includes/js/dojox/grid/tests/support/test_data.js b/includes/js/dojox/grid/tests/support/test_data.js new file mode 100644 index 0000000..4707380 --- /dev/null +++ b/includes/js/dojox/grid/tests/support/test_data.js @@ -0,0 +1,30 @@ +// example sample data and code +(function(){ + // some sample data + // global var "data" + data = [ + [ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ], + [ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ], + [ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ], + [ "note", false, "read", 'However the reserved characters', 15.63, 0, true ], + [ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ], + [ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ], + [ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ] + ]; + var rows = 100; + for(var i=0, l=data.length; i{text}', {href: inData[0], text: inData[1] }); +}; + +formatImage = function(inData, inRowIndex) { + if (!inData[0] || !inData[1]) + return ' '; + var o = { + href: inData[0], + src: inData[1].Url, + width: inData[1].Width, + height: inData[1].Height + } + return turbo.supplant('', o); +}; + +formatDate = function(inDatum, inRowIndex) { + if (inDatum == '') + return ' '; + var d = new Date(inDatum * 1000); + return turbo.printf('%s/%s/%s', d.getMonth(), d.getDate(), d.getFullYear()); +}; + +formatDimensions = function(inData, inRowIndex) { + if (!inData[0] || !inData[1]) + return ' '; + return inData[0] + ' x ' + inData[1]; +} diff --git a/includes/js/dojox/grid/tests/test_change_structure.html b/includes/js/dojox/grid/tests/test_change_structure.html new file mode 100644 index 0000000..4ecfa71 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_change_structure.html @@ -0,0 +1,124 @@ + + + + dojox.Grid Change Structure Example + + + + + + + +
            dojox.VirtualGrid Change Structure Example
            +

            + +

            +
            + + + diff --git a/includes/js/dojox/grid/tests/test_custom_sort.html b/includes/js/dojox/grid/tests/test_custom_sort.html new file mode 100644 index 0000000..51b0cf3 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_custom_sort.html @@ -0,0 +1,86 @@ + + + + Custom Sort Test - dojox.Grid + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Custom Sort Test
            +
            +Column 3's data field has a custom sorter that sorts by the 2nd letter in the string. +

            +
            + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_edit.html b/includes/js/dojox/grid/tests/test_dojo_data_edit.html new file mode 100644 index 0000000..7c9bc5c --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_edit.html @@ -0,0 +1,124 @@ + + + + Test dojox.Grid Editing with DojoData model + + + + + + + + +

            + dojox.Grid Basic Editing test +

            +
            +     +     +     + +     + +     + + +     + +     +   +
            + + + + +
            +
            + + +
            +
            + + + + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_empty.html b/includes/js/dojox/grid/tests/test_dojo_data_empty.html new file mode 100644 index 0000000..3096491 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_empty.html @@ -0,0 +1,63 @@ + + + +dojox.Grid with Dojo.Data via binding + + + + + + + +
            dojox.Grid using initially-empty Dojo.Data write stores and then adding an item. Item should show up correctly (no "?"s) when added.
            +
            + + +
            +
            + + + \ No newline at end of file diff --git a/includes/js/dojox/grid/tests/test_dojo_data_model.html b/includes/js/dojox/grid/tests/test_dojo_data_model.html new file mode 100644 index 0000000..fb8e200 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_model.html @@ -0,0 +1,84 @@ + + + + dojox.Grid with Dojo.Data via binding + + + + + + + +
            dojox.Grid using Dojo.Data stores via simple binding
            + + + + +
            +
            + + + + + +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html b/includes/js/dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html new file mode 100644 index 0000000..8a9048a --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html @@ -0,0 +1,57 @@ + + + + dojox.Grid with Dojo.Data via binding + + + + + + + +
            dojox.Grid using Dojo.Data stores where a query returns no results. No errors should be reported in Firebug and the grid should be empty
            +
            + + + + +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_model_multiStores.html b/includes/js/dojox/grid/tests/test_dojo_data_model_multiStores.html new file mode 100644 index 0000000..46554e3 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_model_multiStores.html @@ -0,0 +1,291 @@ + + + + dojox.Grid with Dojo.Data via binding. Multiple Store implementations. + + + + + + + + +

            dojox.Grid using Dojo.Data stores via simple binding with multiple store implementations.

            +

            + This page demonstrates the Grid can display data accessed by dojo.data implementing Datastores. + Each of the datastores used stores data in a different format, and as this test and demonstration + page shows, the logic for rendering the data is virtually identical. You define your source store, + you define the model for accessing the data, which is ij this case the dojox.grid.data.DojoData model + and then you define the layout, which maps the data attribute names to columns in the grid. You can + even perform cusomization of what is displayed, as demonstrated in the dojox.data.FlickrStore layout. + The image url is displayed as a clickable link that opens a new page. +

            +

            + The choice of stores used were ones that did not require back end services to function for sake of + simplicity. There is no reason that dojox.data.QueryReadStore could not be used with grid as well, + it just requires a back end service to send it the query results. +

            +

            Stores used:

            +
              +
            • dojo.data.ItemFileReadStore
            • +
            • dojox.data.CvsStore
            • +
            • dojox.data.XmlStore
            • +
            • dojox.data.FlickrStore
            • +
            • dojox.data.OpmlStore
            • +
            • dojox.data.HtmlTableStore
            • +
            + +

            dojo.data.ItemFileReadStore:

            + Displays a list of countries through ItemFileReadStore format. + + + + +
            +
            + + +

            dojox.data.CsvStore:

            + Displays a list of movies that were stored in CSV format. + + + + +
            + +
            + +

            dojox.data.XmlStore:

            + Displays a list of books that were stored in XML format. + + + + +
            +
            + + +

            dojox.data.FlickrStore:

            + Displays Flickr imformation on 3DNY (Dojo Developer Days, New York) from the flickr public photo feed, accessed via the FlickrStore dojo.data implementation. + + + + +
            +
            + + +

            dojox.data.OpmlStore:

            + Scans an Opml based document for all items of type 'country' + + + + +
            +
            + + +

            dojox.data.HtmlStore:

            + Loads the grid from an HTML Table. + + + + +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_model_processError.html b/includes/js/dojox/grid/tests/test_dojo_data_model_processError.html new file mode 100644 index 0000000..4130043 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_model_processError.html @@ -0,0 +1,65 @@ + + + + dojox.Grid with Dojo.Data model with trapping of data store errors. + + + + + + + + +

            dojox.Grid using Dojo.Data stores via simple binding

            + +

            dojox.data.CsvStore:

            . + This grid does not load data. The data store references a non-existent URL on purpose. It should trigger a failure that we catch and display in an alert + + + + + + +
            +
            + + + + diff --git a/includes/js/dojox/grid/tests/test_dojo_data_notification.html b/includes/js/dojox/grid/tests/test_dojo_data_notification.html new file mode 100644 index 0000000..f44c987 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_dojo_data_notification.html @@ -0,0 +1,114 @@ + + + + dojox.Grid with Dojo.Data via binding + + + + + + + +

            dojox.Grid using Dojo.Data stores via simple binding

            + +
            +

            Update some of the types

            + + + + + + + +
            +
            + +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_edit.html b/includes/js/dojox/grid/tests/test_edit.html new file mode 100644 index 0000000..7ae1fdb --- /dev/null +++ b/includes/js/dojox/grid/tests/test_edit.html @@ -0,0 +1,149 @@ + + + + +Test dojox.Grid Editing + + + + + + + + + + + + + + + + + + + + + + + + + + +

            + dojox.Grid Basic Editing test +

            +
            +     + +     + +     + +     +   +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_edit_canEdit.html b/includes/js/dojox/grid/tests/test_edit_canEdit.html new file mode 100644 index 0000000..ed4e919 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_edit_canEdit.html @@ -0,0 +1,156 @@ + + + + +Test dojox.Grid Editing + + + + + + + + + + + + + + + + + + + + + + + + + + +

            + dojox.Grid Basic Editing test +

            +
            +     + +     + +     + +     +   +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_edit_dijit.html b/includes/js/dojox/grid/tests/test_edit_dijit.html new file mode 100644 index 0000000..484c7e5 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_edit_dijit.html @@ -0,0 +1,137 @@ + + + + + Test dojox.Grid Editing + + + + + + +

            dojox.Grid Basic Editing test

            +
            +
            + + + + + + + + +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_events.html b/includes/js/dojox/grid/tests/test_events.html new file mode 100644 index 0000000..8ea61a4 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_events.html @@ -0,0 +1,174 @@ + + + + Test dojox.Grid Events + + + + + + + +

            dojox.Grid Event Tracking

            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_expand.html b/includes/js/dojox/grid/tests/test_expand.html new file mode 100644 index 0000000..220c2a8 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_expand.html @@ -0,0 +1,107 @@ + + + + Test dojox.Grid Expand Rows + + + + + + + +
            dojox.Grid Expand Row Example
            + +
            + + + diff --git a/includes/js/dojox/grid/tests/test_grid.html b/includes/js/dojox/grid/tests/test_grid.html new file mode 100644 index 0000000..59d18dc --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid.html @@ -0,0 +1,69 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Basic Test
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_dlg.html b/includes/js/dojox/grid/tests/test_grid_dlg.html new file mode 100644 index 0000000..7479e15 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_dlg.html @@ -0,0 +1,88 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Basic Test
            + +
            + + + +
            +
            + + + diff --git a/includes/js/dojox/grid/tests/test_grid_headerHeight.html b/includes/js/dojox/grid/tests/test_grid_headerHeight.html new file mode 100644 index 0000000..b9960c4 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_headerHeight.html @@ -0,0 +1,84 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Basic Test
            +
            +

            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_layout.html b/includes/js/dojox/grid/tests/test_grid_layout.html new file mode 100644 index 0000000..148025d --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_layout.html @@ -0,0 +1,112 @@ + + + + dojox.Grid in Layout Demo + + + + + + + + + + +
            +
            + top bar +
            +
            + bottom bar +
            +
            +
            + Left side +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_layout_LayoutContainer.html b/includes/js/dojox/grid/tests/test_grid_layout_LayoutContainer.html new file mode 100644 index 0000000..4cf12ac --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_layout_LayoutContainer.html @@ -0,0 +1,87 @@ + + + + dojox.Grid in Layout Demo + + + + + + + + + + +
            + +
            + top bar +
            +
            + bottom bar +
            + +
            + + +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_layout_borderContainer.html b/includes/js/dojox/grid/tests/test_grid_layout_borderContainer.html new file mode 100644 index 0000000..8f0d8d7 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_layout_borderContainer.html @@ -0,0 +1,98 @@ + + + + Test dojox.Grid Editing + + + + + + + + +
            + +
            + +
            + + + + + + + + +
            +
            + +
            +
            +
            + +
            + + + diff --git a/includes/js/dojox/grid/tests/test_grid_object_model_change.html b/includes/js/dojox/grid/tests/test_grid_object_model_change.html new file mode 100644 index 0000000..54c6808 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_object_model_change.html @@ -0,0 +1,86 @@ + + + + Test dojox.grid.data.Objects model change + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.grid.data.Objects model change
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_programmatic.html b/includes/js/dojox/grid/tests/test_grid_programmatic.html new file mode 100644 index 0000000..fe0794f --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_programmatic.html @@ -0,0 +1,65 @@ + + + + Test dojox.Grid Programmatic Instantiation + + + + + + + + +
            dojox.Grid Programmatic Instantiation Test
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_programmatic_layout.html b/includes/js/dojox/grid/tests/test_grid_programmatic_layout.html new file mode 100644 index 0000000..b55d975 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_programmatic_layout.html @@ -0,0 +1,74 @@ + + + + Test dojox.Grid Programmatic Instantiation + + + + + + + + +
            dojox.Grid Programmatic Instantiation Test
            +
            +
            + ... stuff ... +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_rtl.html b/includes/js/dojox/grid/tests/test_grid_rtl.html new file mode 100644 index 0000000..c1b253d --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_rtl.html @@ -0,0 +1,71 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Basic Test
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_grid_themes.html b/includes/js/dojox/grid/tests/test_grid_themes.html new file mode 100644 index 0000000..e0f80f6 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_themes.html @@ -0,0 +1,118 @@ + + + + dojox.Grid themes + + + + + + + +
            dojox.grid.Grid structure from markup (tundra theme)
            + + + + + + + + + + + + + + +
            Title of MovieYear
            Producer
            + + + +
            Locked views specified with tables and colgroups (soria theme)
            + + + + + + + + + + + + + + + +
            Country/Continent NamePopulationLand MassTime ZoneType
            + +
            A "regular" Grid from markup (no table defintion, nihilo theme)
            + + + + +
            +
            + + + diff --git a/includes/js/dojox/grid/tests/test_grid_tooltip_menu.html b/includes/js/dojox/grid/tests/test_grid_tooltip_menu.html new file mode 100644 index 0000000..52c7726 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_grid_tooltip_menu.html @@ -0,0 +1,161 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + +
            dojox.Grid Basic Test
            +

            +    +   
            + Note: when the grid menu is disabled, the document's dijit context menu should be shown over the grid. +

            +
            + + diff --git a/includes/js/dojox/grid/tests/test_keyboard.html b/includes/js/dojox/grid/tests/test_keyboard.html new file mode 100644 index 0000000..69d4046 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_keyboard.html @@ -0,0 +1,90 @@ + + + + Test dojox.Grid Basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Basic Test
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_markup.html b/includes/js/dojox/grid/tests/test_markup.html new file mode 100644 index 0000000..7c57710 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_markup.html @@ -0,0 +1,112 @@ + + + + dojox.Grid with Dojo.Data via binding + + + + + + +
            dojox.grid.Grid structure from markup
            + + + + + + + + + + + + + +
            Title of MovieYear
            Producer
            + + + + +
            Locked views specified with tables and colgroups
            + + + + + + + + + + + + + +
            Country/Continent NamePopulationLand MassTime ZoneType
            + +
            A "regular" Grid from markup (no table defintion)
            + + + +
            +
            + + + diff --git a/includes/js/dojox/grid/tests/test_mysql_edit.html b/includes/js/dojox/grid/tests/test_mysql_edit.html new file mode 100644 index 0000000..dd6a762 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_mysql_edit.html @@ -0,0 +1,155 @@ + + + + dojox.Grid Test: Mysql Table Editing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

            dojox.Grid Test: Mysql Table Editing

            +
            +    +    +    +    + +

            +
            +
            +

            Note: This test requires MySql and PHP and works with the database table available in support/testtbl.sql.

            + + diff --git a/includes/js/dojox/grid/tests/test_sizing.html b/includes/js/dojox/grid/tests/test_sizing.html new file mode 100644 index 0000000..fdd0897 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing.html @@ -0,0 +1,175 @@ + + + + dojox.Grid Sizing Example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Sizing Test
            + Grid width:   + and height:   +

            +   +   + +

            +
            + +

            Grid fits to a sized container by default:

            +
            +
            +
            + +

            Grid is essentially hidden (height of zero) when parent container is unsized + (nothing, including the header, should be displayed):

            +
            +
            +
            + +

            Grid is autoHeight and autoWidth via markup

            +
            + + diff --git a/includes/js/dojox/grid/tests/test_sizing_100rows.html b/includes/js/dojox/grid/tests/test_sizing_100rows.html new file mode 100644 index 0000000..4ea1aa3 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing_100rows.html @@ -0,0 +1,168 @@ + + + + dojox.Grid Sizing Example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            dojox.Grid Sizing Test
            + Grid width:   + and height:   +

            +   +   + +

            +
            + +

            Grid fits to a sized container by default:

            +
            +
            +
            + +

            Grid is essentially hidden (height of zero) when parent container is unsized + (nothing, including the header, should be displayed):

            +
            +
            +
            + +

            Grid is autoHeight and autoWidth via markup

            +
            + + diff --git a/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html b/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html new file mode 100644 index 0000000..d6809df --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html @@ -0,0 +1,113 @@ + + + + dojox.Grid Sizing Example + + + + + + + + +
            dojox.Grid Sizing Test w/ the experimental dojox.layout.ResizeHandle
            + +

            While this test should work, dojox.layout.ResizeHandle is experimental.

            + +
            +
            +
            +
            + +

            Grid fits to a sized container by default:

            +
            +
            +
            +
            + +

            I am here to take up

            + +

            space

            + +

            as much as needed.

            + + + diff --git a/includes/js/dojox/grid/tests/test_styling.html b/includes/js/dojox/grid/tests/test_styling.html new file mode 100644 index 0000000..5671f50 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_styling.html @@ -0,0 +1,131 @@ + + + + dojox.Grid Styling Test + + + + + + + + +
            dojox.Grid Styling Example
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_subgrid.html b/includes/js/dojox/grid/tests/test_subgrid.html new file mode 100644 index 0000000..4e5b8cd --- /dev/null +++ b/includes/js/dojox/grid/tests/test_subgrid.html @@ -0,0 +1,179 @@ + + + +dojox.Grid Subgrid Test + + + + + + + + + +
            dojox.Grid showing sub-grid.
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_tundra_edit.html b/includes/js/dojox/grid/tests/test_tundra_edit.html new file mode 100644 index 0000000..0aa2eeb --- /dev/null +++ b/includes/js/dojox/grid/tests/test_tundra_edit.html @@ -0,0 +1,139 @@ + + + + Test dojox.Grid Editing + + + + + + +

            dojox.Grid Basic Editing test

            +
            +
            + + + + + + + + +
            +
            +
            +
            +
            + + diff --git a/includes/js/dojox/grid/tests/test_yahoo_images.html b/includes/js/dojox/grid/tests/test_yahoo_images.html new file mode 100644 index 0000000..fbab070 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_yahoo_images.html @@ -0,0 +1,148 @@ + + + + dojox.Grid - Image Search Test + + + + + + + + +
            dojox.Grid - Image Search Test
            + + +
            +
            +
            +
            +
            +
            +
            +
            +
            +

            +

            Note: requires PHP for proxy.

            + + diff --git a/includes/js/dojox/grid/tests/test_yahoo_search.html b/includes/js/dojox/grid/tests/test_yahoo_search.html new file mode 100644 index 0000000..063c289 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_yahoo_search.html @@ -0,0 +1,141 @@ + + + + dojox.Grid - Yahoo Search Test + + + + + + + + +
            dojox.Grid - Yahoo Search Test
            +
            +    + +
            +   +

            +
            +
            +
            +
            +
            +
            +
            +
            +
            +

            +

            Note: requires PHP for proxy.

            + + diff --git a/includes/js/dojox/grid/tests/yahooSearch.js b/includes/js/dojox/grid/tests/yahooSearch.js new file mode 100644 index 0000000..1d57a8e --- /dev/null +++ b/includes/js/dojox/grid/tests/yahooSearch.js @@ -0,0 +1,137 @@ +dojo.require("dojo.io.script") +dojo.require("dojox.rpc.Service"); + +// model that works with Yahoo Search API +dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.Dynamic, { + constructor: function(inFields, inData, inSearchNode){ + this.rowsPerPage = 20; + this.searchNode = inSearchNode; + this.fieldNames = dojo.map(inFields, "return item.name;"); + this.yahoo = new dojox.rpc.Service( + dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd") + ); + }, + // server send / receive + send: function(inAsync, inParams, inOnReceive, inOnError){ + var d = this.yahoo.imageSearch( + dojo.mixin({ + results: this.rowsPerPage, + query: this.getQuery() + }, inParams) + ); + d.addCallbacks( + dojo.hitch(this, "receive", inOnReceive, inOnError), + dojo.hitch(this, "error", inOnError) + ); + this.onSend(inParams); + return d; + }, + receive: function(inOnReceive, inOnError, inData){ + try{ + inData = inData.ResultSet; + inOnReceive(inData); + this.onReceive(inData); + }catch(e){ + if(inOnError){ + inOnError(inData); + } + } + }, + error: function(inOnError, inErr) { + var m = 'io error: ' + inErr.message; + alert(m); + if (inOnError) + inOnError(m); + }, + encodeParam: function(inName, inValue) { + return dojo.string.substitute('&${0}=${1}', [inName, inValue]); + }, + getQuery: function(){ + return dojo.byId(this.searchNode).value.replace(/ /g, '+'); + }, + fetchRowCount: function(inCallback){ + this.send(true, inCallback); + }, + // request data + requestRows: function(inRowIndex, inCount){ + inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex); + var params = { + start: inRowIndex + 1 + } + this.send(true, params, dojo.hitch(this, this.processRows)); + }, + // server callbacks + processRows: function(inData){ + for(var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i${text}', + { href: inData, text: text } + ); +}; + +formatImage = function(inData, inRowIndex){ + if(!inData){ return ' '; } + var info = getCellData(this, inRowIndex, this.extraField); + var o = { + href: inData, + src: info.Url, + width: info.Width, + height: info.Height + } + return dojo.string.substitute( + '', o); +}; + +formatDate = function(inDatum, inRowIndex){ + if(!inDatum){ return ' '; } + var d = new Date(inDatum * 1000); + return dojo.string.substitute( + "${0}/${1}/${2}", + [ d.getMonth()+1, d.getDate(), d.getFullYear() ] + ); +}; + +formatDimensions = function(inData, inRowIndex){ + if(!inData){ return ' '; } + var w = inData, h = getCellData(this, inRowIndex, this.extraField); + return w + ' x ' + h; +} diff --git a/includes/js/dojox/help/README b/includes/js/dojox/help/README new file mode 100644 index 0000000..00a69a8 --- /dev/null +++ b/includes/js/dojox/help/README @@ -0,0 +1,35 @@ +------------------------------------------------------------------------------- +dojox.help +------------------------------------------------------------------------------- +Version 0.0 +Release date: 3/13/2008 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Neil Roberts (pottedmeat@dojotoolkit.org) + Wolfram Kriesing (wolfram@kriesing.de) +------------------------------------------------------------------------------- +Project description + +Provide functionality for quick access to available documentation while +working in the browser. +------------------------------------------------------------------------------- +Dependencies: + +dojo +dojox.rpc +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/help/* + +Install into the following directory structure: +/dojox/help/ + +...which should be at the same level as your Dojo checkout. + +And run: dojo.require("dojox.help.console") in your console +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/help/_base.js b/includes/js/dojox/help/_base.js new file mode 100644 index 0000000..109f3ca --- /dev/null +++ b/includes/js/dojox/help/_base.js @@ -0,0 +1,473 @@ +if(!dojo._hasResource["dojox.help._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.help._base"] = true; +dojo.provide("dojox.help._base"); +dojo.require("dojox.rpc.Service"); +dojo.require("dojo.io.script"); + +dojo.experimental("dojox.help"); +console.warn("Script causes side effects (on numbers, strings, and booleans). Call dojox.help.noConflict() if you plan on executing code."); + +dojox.help = { + // summary: + // Adds the help function to all variables. + locate: function(/*String*/ searchFor, /*String|Object|String[]|Object[]*/ searchIn, /*Number*/ maxResults){ + // summary: + // Search for dojo functionality that has something to do with the given string. + // description: + // Search for locally available data; variable names and any cached + // documentation results for matches containing our search parameter + // searchFor + // The string to search for. + // searchIn: + // The namespaces to search in. Defaults to dojox.help._namespaces + // maxResults: + // The maximum number of results. + maxResults = maxResults || 20; + var namespaces = []; + var roots = {}; + var root; + if(searchIn){ + if(!dojo.isArray(searchIn)){ + searchIn = [searchIn]; + } + for(var i = 0, namespace; namespace = searchIn[i]; i++){ + root = namespace; + if(dojo.isString(namespace)){ + namespace = dojo.getObject(namespace); + if(!namespace){ + continue; + } + }else if(dojo.isObject(namespace)){ + root = namespace.__name__; + }else{ + continue; + } + // Add to a list of namespace objects (in object form) + namespaces.push(namespace); + if(root){ + root = root.split(".")[0]; + if(!roots[root] && dojo.indexOf(dojox.help._namespaces, root) == -1){ + // Refresh anything that's not part of our global namespace list + dojox.help.refresh(root); + } + roots[root] = true; + } + } + } + if(!namespaces.length){ + namespaces.push({ __name__: "window" }); + dojo.forEach(dojox.help._namespaces, function(item){ roots[item] = true; }); + } + + var found = []; + out: + for(var i = 0, namespace; namespace = namespaces[i]; i++){ + var name = namespace.__name__ || ""; + var shorter = dojo.some(namespaces, function(item){ + // Return true if we find a namespace below + // the current namespace + item = item.__name__ || ""; + return (name.indexOf(item + ".") == 0); + }); + if(name && !shorter){ + root = name.split(".")[0]; + var names = []; + if(name == "window"){ + for(root in dojox.help._names){ + if(dojo.isArray(dojox.help._names[root])){ + names = names.concat(dojox.help._names[root]); + } + } + }else{ + names = dojox.help._names[root]; + } + for(var j = 0, variable; variable = names[j]; j++){ + if((name == "window" || variable.indexOf(name + ".") == 0) && variable.toLowerCase().indexOf(searchFor) != -1){ + if(variable.slice(-10) == ".prototype"){ continue; } + var obj = dojo.getObject(variable); + if(obj){ + found.push([variable, obj]); + if(found.length == maxResults){ + break out; + } + } + } + } + } + } + + dojox.help._displayLocated(found); + if(!+dojo.isFF){ + return ""; + } + }, + refresh: function(/*String?*/ namespace, /*Boolean?*/ recursive){ + // summary: + // Useful if you reset some values, and want to restore their + // help function + // namespace: + // The string-representation of a namespace. + // recursive: + // Whether to recurse through the namespace. + if(arguments.length < 2){ + recursive = true; + } + dojox.help._recurse(namespace, recursive); + }, + noConflict: function(/*Object?*/ item){ + // summary: + // Use this function when you want to resolve the problems + // created by including a dojox.help package. + // item: + // If you pass an item, only that item will be cleaned + if(arguments.length){ + return dojox.help._noConflict(item); + }else{ + while(dojox.help._overrides.length){ + var override = dojox.help._overrides.pop(); + var parent = override[0]; + var key = override[1]; + var child = parent[key]; + parent[key] = dojox.help._noConflict(child); + } + } + }, + init: function(/*String[]*/ namespaces, /*Boolen?*/ noConflict){ + // summary: + // Should be called by one of the implementations. Runs startup code + // namespaces: + // Any namespaces to add to the default (dojox.help._namespaces) + // noConflict: + // Whether to start in noConflict mode + if(namespaces){ + dojox.help._namespaces.concat(namespaces); + } + dojo.addOnLoad(function(){ + dojo.require = (function(require){ + return function(){ + dojox.help.noConflict(); + require.apply(dojo, arguments); + if(dojox.help._timer){ + clearTimeout(dojox.help._timer); + } + dojox.help._timer = setTimeout(function(){ + dojo.addOnLoad(function(){ + dojox.help.refresh(); + dojox.help._timer = false; + }); + }, 500); + } + })(dojo.require); + + dojox.help._recurse(); + }); + }, + _noConflict: function(item){ + if(item instanceof String){ + return item.toString(); + }else if(item instanceof Number){ + return +item; + }else if(item instanceof Boolean){ + return (item == true); + }else if(dojo.isObject(item)){ + delete item.__name__; + delete item.help; + } + return item; + }, + _namespaces: ["dojo", "dojox", "dijit", "djConfig"], + _rpc: new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc", "documentation.smd")), + _attributes: ["summary", "type", "returns", "parameters"], + _clean: function(self){ + var obj = {}; + for(var i = 0, attribute; attribute = dojox.help._attributes[i]; i++){ + var value = self["__" + attribute + "__"]; + if(value){ + obj[attribute] = value; + } + } + return obj; + }, + _displayLocated: function(located){ + // summary: + // Stub function to be overridden in one of the dojox.help packages + throw new Error("_displayLocated should be overridden in one of the dojox.help packages"); + }, + _displayHelp: function(loading, obj){ + // summary: + // Stub function to be overridden in one of the dojox.help packages + throw new Error("_displayHelp should be overridden in one of the dojox.help packages"); + }, + _addVersion: function(obj){ + if(obj.name){ + obj.version = [dojo.version.major, dojo.version.minor, dojo.version.patch].join("."); + var parts = obj.name.split("."); + if(parts[0] == "dojo" || parts[0] == "dijit" || parts[0] == "dojox"){ + obj.project = parts[0]; + } + } + return obj; + }, + _stripPrototype: function(original){ + var name = original.replace(/\.prototype(\.|$)/g, "."); + var search = name; + if(name.slice(-1) == "."){ + search = name = name.slice(0, -1); + }else{ + name = original; + } + return [search, name]; + }, + _help: function(){ + var name = this.__name__; + var search = dojox.help._stripPrototype(name)[0]; + var attributes = []; + for(var i = 0, attribute; attribute = dojox.help._attributes[i]; i++){ + if(!this["__" + attribute + "__"]){ + attributes.push(attribute); + } + } + + dojox.help._displayHelp(true, { name: this.__name__ }); + + if(!attributes.length || this.__searched__){ + dojox.help._displayHelp(false, dojox.help._clean(this)); + }else{ + this.__searched__ = true; + dojox.help._rpc.get(dojox.help._addVersion({ + name: search, + exact: true, + attributes: attributes + })).addCallback(this, function(data){ + if(this.toString === dojox.help._toString){ + this.toString(data); + } + if(data && data.length){ + data = data[0]; + for(var i = 0, attribute; attribute = dojox.help._attributes[i]; i++){ + if(data[attribute]){ + this["__" + attribute + "__"] = data[attribute]; + } + } + dojox.help._displayHelp(false, dojox.help._clean(this)); + }else{ + dojox.help._displayHelp(false, false); + } + }); + } + if(!+dojo.isFF){ + return ""; + } + }, + _parse: function(data){ + delete this.__searching__; + if(data && data.length){ + var parameters = data[0].parameters; + + if(parameters){ + var signature = ["function ", this.__name__, "("]; + this.__parameters__ = parameters; + for(var i = 0, parameter; parameter = parameters[i]; i++){ + if(i){ + signature.push(", "); + } + signature.push(parameter.name); + if(parameter.types){ + var types = []; + for(var j = 0, type; type = parameter.types[j]; j++){ + types.push(type.title); + } + if(types.length){ + signature.push(": "); + signature.push(types.join("|")); + } + } + if(parameter.repeating){ + signature.push("..."); + } + if(parameter.optional){ + signature.push("?"); + } + } + signature.push(")"); + + this.__source__ = this.__source__.replace(/function[^\(]*\([^\)]*\)/, signature.join("")); + } + + if(this.__output__){ + delete this.__output__; + console.log(this); + } + }else{ + dojox.help._displayHelp(false, false); + } + }, + _toStrings: {}, + _toString: function(data){ + if(!this.__source__){ + return this.__name__; + } + + var first = (!this.__parameters__); + this.__parameters__ = []; + + if(data){ + dojox.help._parse.call(this, data); + }else if(first){ + this.__searching__ = true; + dojox.help._toStrings[dojox.help._stripPrototype(this.__name__)[0]] = this; + if(dojox.help._toStringTimer){ + clearTimeout(dojox.help._toStringTimer); + } + dojox.help._toStringTimer = setTimeout(function(){ dojox.help.__toString(); }, 50); + } + + if(!first || !this.__searching__){ + return this.__source__; + } + + var message = "function Loading info for " + this.__name__ + "... (watch console for result) {}"; + + if(!+dojo.isFF){ + this.__output__ = true; + return message; + } + + return { + toString: dojo.hitch(this, function(){ + // Detect if this was called by Firebug + this.__output__ = true; + return message; + }) + }; + }, + __toString: function(){ + if(dojox.help._toStringTimer){ + clearTimeout(dojox.help._toStringTimer); + } + + var names = []; + dojox.help.noConflict(dojox.help._toStrings); + for(var name in dojox.help._toStrings){ + names.push(name); + } + while(names.length){ + dojox.help._rpc.batch(dojox.help._addVersion({ + names: names.splice(-50, 50), + exact: true, + attributes: ["parameters"] + })).addCallback(this, function(datas){ + for(var i = 0, data; data = datas[i]; i++){ + fn = dojox.help._toStrings[data.name]; + if(fn){ + dojox.help._parse.call(fn, [data]); + delete dojox.help._toStrings[data.name]; + } + } + }); + } + }, + _overrides: [], + _recursions: [], + _names: {}, + _recurse: function(/*String?*/ namespace, /*Boolean?*/ recursive){ + if(arguments.length < 2){ + recursive = true; + } + + var items = []; + + if(namespace && dojo.isString(namespace)){ + dojox.help.__recurse(dojo.getObject(namespace), namespace, namespace, items, recursive); + }else{ + for(var i = 0, namespace; namespace = dojox.help._namespaces[i]; i++){ + if(window[namespace]){ + dojox.help._recursions.push([window[namespace], namespace, namespace]); + window[namespace].__name__ = namespace; + if(!window[namespace].help){ + window[namespace].help = dojox.help._help; + } + } + } + } + + while(dojox.help._recursions.length){ + var recursion = dojox.help._recursions.shift(); + dojox.help.__recurse(recursion[0], recursion[1], recursion[2], items, recursive); + } + + for(var i = 0, item; item = items[i]; i++){ + delete item.__seen__; + } + }, + __recurse: function(namespace, root, name, items, recursive){ + for(var key in namespace){ + if(key.match(/([^\w_.$]|__[\w_.$]+__)/)){ + continue; + } + + var item = namespace[key]; + if(typeof item == "undefined" + || item === document + || item === window + || item === dojox.help._toString + || item === dojox.help._help + || item === null + || (+dojo.isIE && item.tagName) + || item.__seen__ + ) { + continue; + } + + var isFunction = dojo.isFunction(item); + var isObject = dojo.isObject(item) && !dojo.isArray(item) && !item.nodeType; + + var itemName = (name) ? (name + "." + key) : key; + + if(itemName == "dojo._blockAsync"){ + continue; + } + + if(!item.__name__){ + var parent = null; + if(dojo.isString(item)){ + parent = String; + }else if(typeof item == "number"){ + parent = Number; + }else if(typeof item == "boolean"){ + parent = Boolean; + } + if(parent){ + item = namespace[key] = new parent(item); + } + } + + item.__seen__ = true; + item.__name__ = itemName; + (dojox.help._names[root] = dojox.help._names[root] || []).push(itemName); + items.push(item); + if(!isFunction){ + dojox.help._overrides.push([namespace, key]); + } + + if((isFunction || isObject) && recursive){ + dojox.help._recursions.push([item, root, itemName]); + } + + if(isFunction){ + if(!item.__source__){ + item.__source__ = item.toString().replace(/^function\b ?/, "function " + itemName); + } + if(item.toString === Function.prototype.toString){ + item.toString = dojox.help._toString; + } + } + + if(!item.help){ + item.help = dojox.help._help; + } + } + } +}; + +} diff --git a/includes/js/dojox/help/console.js b/includes/js/dojox/help/console.js new file mode 100644 index 0000000..8474a5a --- /dev/null +++ b/includes/js/dojox/help/console.js @@ -0,0 +1,80 @@ +if(!dojo._hasResource["dojox.help.console"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.help.console"] = true; +dojo.provide("dojox.help.console"); +dojo.require("dojox.help._base"); + +dojo.mixin(dojox.help, { + _plainText: function(str){ + return str.replace(/(<[^>]*>|&[^;]{2,6};)/g, ''); + }, + _displayLocated: function(located){ + var obj = {}; + dojo.forEach(located, function(item){ obj[item[0]] = (+dojo.isFF) ? { toString: function(){ return "Click to view"; }, item: item[1] } : item[1]; }); + console.dir(obj); + }, + _displayHelp: function(loading, obj){ + if(loading){ + var message = "Help for: " + obj.name; + console.log(message); + var underline = ""; + for(var i = 0; i < message.length; i++){ + underline += "="; + } + console.log(underline); + }else if(!obj){ + console.log("No documentation for this object"); + }else{ + var anything = false; + for(var attribute in obj){ + var value = obj[attribute]; + if(attribute == "returns" && obj.type != "Function" && obj.type != "Constructor"){ + continue; + } + if(value && (!dojo.isArray(value) || value.length)){ + anything = true; + console.info(attribute.toUpperCase()); + value = dojo.isString(value) ? dojox.help._plainText(value) : value; + if(attribute == "returns"){ + var returns = dojo.map(value.types || [], "return item.title;").join("|"); + if(value.summary){ + if(returns){ + returns += ": "; + } + returns += dojox.help._plainText(value.summary); + } + console.log(returns || "Uknown"); + }else if(attribute == "parameters"){ + for(var j = 0, parameter; parameter = value[j]; j++){ + var type = dojo.map(parameter.types, "return item.title").join("|"); + console.log((type) ? (parameter.name + ": " + type) : parameter.name); + var summary = ""; + if(parameter.optional){ + summary += "Optional. "; + } + if(parameter.repating){ + summary += "Repeating. "; + } + summary += dojox.help._plainText(parameter.summary); + if(summary){ + summary = " - " + summary; + for(var k = 0; k < parameter.name.length; k++){ + summary = " " + summary; + } + console.log(summary); + } + } + }else{ + console.log(value); + } + } + } + if(!anything){ + console.log("No documentation for this object"); + } + } + } +}); + +dojox.help.init(); + +} diff --git a/includes/js/dojox/help/demos/demo_Console.html b/includes/js/dojox/help/demos/demo_Console.html new file mode 100644 index 0000000..564bb08 --- /dev/null +++ b/includes/js/dojox/help/demos/demo_Console.html @@ -0,0 +1,33 @@ + + + Simple demo of dojox.help.console + + + + +

            You'll want to open up Firebug for this

            +

            Click each of the items below to run the command: +

              +
            • dojo.require("dojox.help.console");
            • +
            • dojox.help.locate("xhr", dojo); searches variable names in the dojo namespaces for "xhr".
            • +
            • dojo.query.help(); displays help for dojo.byId
            • +
            • dojo.connect loads and displays the function signature for dojo.connect
            • +
            • dojo.isBrowser shows an example of a "conflict". It's using the Boolean object rather than the boolean generic.
            • +
            • dojox.help.noConflict(); fixes this conflict (click on dojo.isBrowser again).
            • +
            • dojox.help.refresh(); parses the page again
            • +
            • dojo.isBrowser and the conflict is back again!
            • +
            +

            + + \ No newline at end of file diff --git a/includes/js/dojox/highlight.js b/includes/js/dojox/highlight.js new file mode 100644 index 0000000..04e8d8d --- /dev/null +++ b/includes/js/dojox/highlight.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.highlight"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight"] = true; +dojo.provide("dojox.highlight"); +dojo.require("dojox.highlight._base"); + +} diff --git a/includes/js/dojox/highlight/README b/includes/js/dojox/highlight/README new file mode 100644 index 0000000..cdaed12 --- /dev/null +++ b/includes/js/dojox/highlight/README @@ -0,0 +1,31 @@ +------------------------------------------------------------------------------- +dojox.highlight +------------------------------------------------------------------------------- +Version 1.0 +Release date: 11/25/2007 +------------------------------------------------------------------------------- +Project state: +beta +------------------------------------------------------------------------------- +Credits + Ivan Sagalaev (softwaremaniacs.org) Author + Peter Higgins (dante) Dojo port +------------------------------------------------------------------------------- +Project description + +A syntax highlighting engine for the Dojo Toolkit +------------------------------------------------------------------------------- +Dependencies: + +dojo base only. +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + +simply get the dojox/highlight folder (and dojox/highlight.js) from the +dojox SVN repository, and include in your page via + +dojo.require("dojox.highlight"); + diff --git a/includes/js/dojox/highlight/_base.js b/includes/js/dojox/highlight/_base.js new file mode 100644 index 0000000..46b5267 --- /dev/null +++ b/includes/js/dojox/highlight/_base.js @@ -0,0 +1,406 @@ +if(!dojo._hasResource["dojox.highlight._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight._base"] = true; +dojo.provide("dojox.highlight._base"); + +// +// dojox.highlight - syntax highlighting with language auto-detection +// released under CLA by the Dojo Toolkit +// orig BSD release available from: http://softwaremaniacs.org/soft/highlight/ +// + +(function(){ + var dh = dojox.highlight, + C_NUMBER_RE = '\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)'; + + // constants + + dh.constants = { + IDENT_RE: '[a-zA-Z][a-zA-Z0-9_]*', + UNDERSCORE_IDENT_RE: '[a-zA-Z_][a-zA-Z0-9_]*', + NUMBER_RE: '\\b\\d+(\\.\\d+)?', + C_NUMBER_RE: C_NUMBER_RE, + // Common modes + APOS_STRING_MODE: { + className: 'string', + begin: '\'', end: '\'', + illegal: '\\n', + contains: ['escape'], + relevance: 0 + }, + QUOTE_STRING_MODE: { + className: 'string', + begin: '"', + end: '"', + illegal: '\\n', + contains: ['escape'], + relevance: 0 + }, + BACKSLASH_ESCAPE: { + className: 'escape', + begin: '\\\\.', end: '^', + relevance: 0 + }, + C_LINE_COMMENT_MODE: { + className: 'comment', + begin: '//', end: '$', + relevance: 0 + }, + C_BLOCK_COMMENT_MODE: { + className: 'comment', + begin: '/\\*', end: '\\*/' + }, + HASH_COMMENT_MODE: { + className: 'comment', + begin: '#', end: '$' + }, + C_NUMBER_MODE: { + className: 'number', + begin: C_NUMBER_RE, end: '^', + relevance: 0 + } + }; + + // utilities + + function esc(value){ + return value.replace(/&/gm, '&').replace(//gm, '>'); + } + + function verifyText(block){ + return dojo.every(block.childNodes, function(node){ + return node.nodeType == 3 || String(node.nodeName).toLowerCase() == 'br'; + }); + } + + function blockText(block){ + var result = []; + dojo.forEach(block.childNodes, function(node){ + if(node.nodeType == 3){ + result.push(node.nodeValue); + }else if(String(node.nodeName).toLowerCase() == 'br'){ + result.push("\n"); + }else{ + throw 'Complex markup'; + } + }); + return result.join(""); + } + + function buildKeywordGroups(mode){ + if(!mode.keywordGroups){ + for(var key in mode.keywords){ + var kw = mode.keywords[key]; + if(kw instanceof Object){ // dojo.isObject? + mode.keywordGroups = mode.keywords; + }else{ + mode.keywordGroups = {keyword: mode.keywords}; + } + break; + } + } + } + + function buildKeywords(lang){ + if(lang.defaultMode && lang.modes){ + buildKeywordGroups(lang.defaultMode); + dojo.forEach(lang.modes, buildKeywordGroups); + } + } + + // main object + + var Highlighter = function(langName, textBlock){ + // initialize the state + this.langName = langName; + this.lang = dh.languages[langName]; + this.modes = [this.lang.defaultMode]; + this.relevance = 0; + this.keywordCount = 0; + this.result = []; + + // build resources lazily + if(!this.lang.defaultMode.illegalRe){ + this.buildRes(); + buildKeywords(this.lang); + } + + // run the algorithm + try{ + this.highlight(textBlock); + this.result = this.result.join(""); + }catch(e){ + if(e == 'Illegal'){ + this.relevance = 0; + this.keywordCount = 0; + this.result = esc(textBlock); + }else{ + throw e; + } + } + }; + + dojo.extend(Highlighter, { + buildRes: function(){ + dojo.forEach(this.lang.modes, function(mode){ + if(mode.begin){ + mode.beginRe = this.langRe('^' + mode.begin); + } + if(mode.end){ + mode.endRe = this.langRe('^' + mode.end); + } + if(mode.illegal){ + mode.illegalRe = this.langRe('^(?:' + mode.illegal + ')'); + } + }, this); + this.lang.defaultMode.illegalRe = this.langRe('^(?:' + this.lang.defaultMode.illegal + ')'); + }, + + subMode: function(lexeme){ + var classes = this.modes[this.modes.length - 1].contains; + if(classes){ + var modes = this.lang.modes; + for(var i = 0; i < classes.length; ++i){ + var className = classes[i]; + for(var j = 0; j < modes.length; ++j){ + var mode = modes[j]; + if(mode.className == className && mode.beginRe.test(lexeme)){ return mode; } + } + } + } + return null; + }, + + endOfMode: function(lexeme){ + for(var i = this.modes.length - 1; i >= 0; --i){ + var mode = this.modes[i]; + if(mode.end && mode.endRe.test(lexeme)){ return this.modes.length - i; } + if(!mode.endsWithParent){ break; } + } + return 0; + }, + + isIllegal: function(lexeme){ + var illegalRe = this.modes[this.modes.length - 1].illegalRe; + return illegalRe && illegalRe.test(lexeme); + }, + + + langRe: function(value, global){ + var mode = 'm' + (this.lang.case_insensitive ? 'i' : '') + (global ? 'g' : ''); + return new RegExp(value, mode); + }, + + buildTerminators: function(){ + var mode = this.modes[this.modes.length - 1], + terminators = {}; + if(mode.contains){ + dojo.forEach(this.lang.modes, function(lmode){ + if(dojo.indexOf(mode.contains, lmode.className) >= 0){ + terminators[lmode.begin] = 1; + } + }); + } + for(var i = this.modes.length - 1; i >= 0; --i){ + var m = this.modes[i]; + if(m.end){ terminators[m.end] = 1; } + if(!m.endsWithParent){ break; } + } + if(mode.illegal){ terminators[mode.illegal] = 1; } + var t = []; + for(i in terminators){ t.push(i); } + mode.terminatorsRe = this.langRe("(" + t.join("|") + ")"); + }, + + eatModeChunk: function(value, index){ + var mode = this.modes[this.modes.length - 1]; + + // create terminators lazily + if(!mode.terminatorsRe){ + this.buildTerminators(); + } + + value = value.substr(index); + var match = mode.terminatorsRe.exec(value); + if(!match){ + return { + buffer: value, + lexeme: "", + end: true + }; + } + return { + buffer: match.index ? value.substr(0, match.index) : "", + lexeme: match[0], + end: false + }; + }, + + keywordMatch: function(mode, match){ + var matchStr = match[0]; + if(this.lang.case_insensitive){ matchStr = matchStr.toLowerCase(); } + for(var className in mode.keywordGroups){ + if(matchStr in mode.keywordGroups[className]){ return className; } + } + return ""; + }, + + buildLexemes: function(mode){ + var lexemes = {}; + dojo.forEach(mode.lexems, function(lexeme){ + lexemes[lexeme] = 1; + }); + var t = []; + for(var i in lexemes){ t.push(i); } + mode.lexemsRe = this.langRe("(" + t.join("|") + ")", true); + }, + + processKeywords: function(buffer){ + var mode = this.modes[this.modes.length - 1]; + if(!mode.keywords || !mode.lexems){ + return esc(buffer); + } + + // create lexemes lazily + if(!mode.lexemsRe){ + this.buildLexemes(mode); + } + + mode.lexemsRe.lastIndex = 0; + var result = [], lastIndex = 0, + match = mode.lexemsRe.exec(buffer); + while(match){ + result.push(esc(buffer.substr(lastIndex, match.index - lastIndex))); + var keywordM = this.keywordMatch(mode, match); + if(keywordM){ + ++this.keywordCount; + result.push('' + esc(match[0]) + ''); + }else{ + result.push(esc(match[0])); + } + lastIndex = mode.lexemsRe.lastIndex; + match = mode.lexemsRe.exec(buffer); + } + result.push(esc(buffer.substr(lastIndex, buffer.length - lastIndex))); + return result.join(""); + }, + + processModeInfo: function(buffer, lexeme, end) { + var mode = this.modes[this.modes.length - 1]; + if(end){ + this.result.push(this.processKeywords(mode.buffer + buffer)); + return; + } + if(this.isIllegal(lexeme)){ throw 'Illegal'; } + var newMode = this.subMode(lexeme); + if(newMode){ + mode.buffer += buffer; + this.result.push(this.processKeywords(mode.buffer)); + if(newMode.excludeBegin){ + this.result.push(lexeme + ''); + newMode.buffer = ''; + }else{ + this.result.push(''); + newMode.buffer = lexeme; + } + this.modes.push(newMode); + this.relevance += typeof newMode.relevance == "number" ? newMode.relevance : 1; + return; + } + var endLevel = this.endOfMode(lexeme); + if(endLevel){ + mode.buffer += buffer; + if(mode.excludeEnd){ + this.result.push(this.processKeywords(mode.buffer) + '' + lexeme); + }else{ + this.result.push(this.processKeywords(mode.buffer + lexeme) + ''); + } + while(endLevel > 1){ + this.result.push(''); + --endLevel; + this.modes.pop(); + } + this.modes.pop(); + this.modes[this.modes.length - 1].buffer = ''; + return; + } + }, + + highlight: function(value){ + var index = 0; + this.lang.defaultMode.buffer = ''; + do{ + var modeInfo = this.eatModeChunk(value, index); + this.processModeInfo(modeInfo.buffer, modeInfo.lexeme, modeInfo.end); + index += modeInfo.buffer.length + modeInfo.lexeme.length; + }while(!modeInfo.end); + if(this.modes.length > 1){ + throw 'Illegal'; + } + } + }); + + // more utilities + + function replaceText(node, className, text){ + if(String(node.tagName).toLowerCase() == "code" && String(node.parentNode.tagName).toLowerCase() == "pre"){ + // See these 4 lines? This is IE's notion of "node.innerHTML = text". Love this browser :-/ + var container = document.createElement('div'), + environment = node.parentNode.parentNode; + container.innerHTML = '
            ' + text + '
            '; + environment.replaceChild(container.firstChild, node.parentNode); + }else{ + node.className = className; + node.innerHTML = text; + } + } + + function highlightLanguage(block, lang){ + var highlight = new Highlighter(lang, blockText(block)); + replaceText(block, block.className, highlight.result); + } + + function highlightAuto(block){ + var result = "", langName = "", bestRelevance = 2, + textBlock = blockText(block); + for(var key in dh.languages){ + if(!dh.languages[key].defaultMode){ continue; } // skip internal members + var highlight = new Highlighter(key, textBlock), + relevance = highlight.keywordCount + highlight.relevance; + if(!result || relevance > relevanceMax){ + relevanceMax = relevance; + result = highlight.result; + langName = highlight.langName; + } + } + if(result){ + replaceText(block, langName, result); + } + } + + // the public API + + dh.init = function(/* DomNode */ block){ + // summary: the main (only required) public API. highlight a node. + if(dojo.hasClass(block,"no-highlight")){ return; } + if(!verifyText(block)){ return; } + + var classes = block.className.split(/\s+/), + flag = dojo.some(classes, function(className){ + if(className.charAt(0) != "_" && dh.languages[className]){ + highlightLanguage(block, className); + return true; // stop iterations + } + return false; // continue iterations + }); + if(!flag){ + highlightAuto(block); + } + }; + + // pseudo object for markup creation + dh.Code = function(params, node){ + dh.init(node); + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/_all.js b/includes/js/dojox/highlight/languages/_all.js new file mode 100644 index 0000000..5097046 --- /dev/null +++ b/includes/js/dojox/highlight/languages/_all.js @@ -0,0 +1,11 @@ +if(!dojo._hasResource["dojox.highlight.languages._all"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages._all"] = true; +dojo.provide("dojox.highlight.languages._all"); + +/* groups of similar languages */ +dojo.require("dojox.highlight.languages._static"); +dojo.require("dojox.highlight.languages._dynamic"); +dojo.require("dojox.highlight.languages._www"); + + +} diff --git a/includes/js/dojox/highlight/languages/_dynamic.js b/includes/js/dojox/highlight/languages/_dynamic.js new file mode 100644 index 0000000..a3b510b --- /dev/null +++ b/includes/js/dojox/highlight/languages/_dynamic.js @@ -0,0 +1,11 @@ +if(!dojo._hasResource["dojox.highlight.languages._dynamic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages._dynamic"] = true; +dojo.provide("dojox.highlight.languages._dynamic"); + +/* common scripted languages */ +dojo.require("dojox.highlight.languages.python"); +// dojo.require("dojox.highlight.languages.perl"); +// dojo.require("dojox.highlight.languages.php"); +// dojo.require("dojox.highlight.languages.ruby"); + +} diff --git a/includes/js/dojox/highlight/languages/_static.js b/includes/js/dojox/highlight/languages/_static.js new file mode 100644 index 0000000..85212b4 --- /dev/null +++ b/includes/js/dojox/highlight/languages/_static.js @@ -0,0 +1,10 @@ +if(!dojo._hasResource["dojox.highlight.languages._static"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages._static"] = true; +dojo.provide("dojox.highlight.languages._static"); + +/* common static languages */ +dojo.require("dojox.highlight.languages.cpp") +// dojo.require("dojox.highlight.languages.java"); +dojo.require("dojox.highlight.languages.delphi"); + +} diff --git a/includes/js/dojox/highlight/languages/_www.js b/includes/js/dojox/highlight/languages/_www.js new file mode 100644 index 0000000..a04f073 --- /dev/null +++ b/includes/js/dojox/highlight/languages/_www.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.highlight.languages._www"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages._www"] = true; +dojo.provide("dojox.highlight.languages._www"); + +/* common web-centric languages */ +dojo.require("dojox.highlight.languages.xml"); +dojo.require("dojox.highlight.languages.html"); +dojo.require("dojox.highlight.languages.css"); +dojo.require("dojox.highlight.languages.django"); +dojo.require("dojox.highlight.languages.javascript"); + +} diff --git a/includes/js/dojox/highlight/languages/cpp.js b/includes/js/dojox/highlight/languages/cpp.js new file mode 100644 index 0000000..1e9edf2 --- /dev/null +++ b/includes/js/dojox/highlight/languages/cpp.js @@ -0,0 +1,53 @@ +if(!dojo._hasResource["dojox.highlight.languages.cpp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.cpp"] = true; +dojo.provide("dojox.highlight.languages.cpp"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.cpp = { + // summary: C++ highlight definitions + defaultMode: { + lexems: [dhc.UNDERSCORE_IDENT_RE], + illegal: '', + contains: ['attribute', 'template_comment', 'template_tag', 'variable'] + }, + x.XML_ATTR, + h.HTML_ATTR, + { + className: 'value', + begin: '"', end: '"', + contains: ['template_comment', 'template_tag', 'variable'] + }, + h.HTML_VALUE, + { + className: 'template_comment', + begin: '\\{\\%\\s*comment\\s*\\%\\}', + end: '\\{\\%\\s*endcomment\\s*\\%\\}' + }, + { + className: 'template_comment', + begin: '\\{#', end: '#\\}' + }, + { + className: 'template_tag', + begin: '\\{\\%', end: '\\%\\}', + lexems: [dhc.IDENT_RE], + keywords: { + 'comment': 1, 'endcomment': 1, 'load': 1, + 'templatetag': 1, 'ifchanged': 1, 'endifchanged': 1, + 'if': 1, 'endif': 1, 'firstof': 1, 'for': 1, + 'endfor': 1, 'in': 1, 'ifnotequal': 1, + 'endifnotequal': 1, 'widthratio': 1, 'extends': 1, + 'include': 1, 'spaceless': 1, 'endspaceless': 1, + 'regroup': 1, 'by': 1, 'as': 1, 'ifequal': 1, + 'endifequal': 1, 'ssi': 1, 'now': 1, 'with': 1, + 'cycle': 1, 'url': 1, 'filter': 1, 'endfilter': 1, + 'debug': 1, 'block': 1, 'endblock': 1, 'else': 1 + }, + contains: ['filter'] + }, + { + className: 'variable', + begin: '\\{\\{', end: '\\}\\}', + contains: ['filter'] + }, + { + className: 'filter', + begin: '\\|[A-Za-z]+\\:?', end: '^', excludeEnd: true, + lexems: [dhc.IDENT_RE], + keywords: { + 'truncatewords': 1, 'removetags': 1, 'linebreaksbr': 1, + 'yesno': 1, 'get_digit': 1, 'timesince': 1, 'random': 1, + 'striptags': 1, 'filesizeformat': 1, 'escape': 1, + 'linebreaks': 1, 'length_is': 1, 'ljust': 1, 'rjust': 1, + 'cut': 1, 'urlize': 1, 'fix_ampersands': 1, 'title': 1, + 'floatformat': 1, 'capfirst': 1, 'pprint': 1, + 'divisibleby': 1, 'add': 1, 'make_list': 1, + 'unordered_list': 1, 'urlencode': 1, 'timeuntil': 1, + 'urlizetrunc': 1, 'wordcount': 1, 'stringformat': 1, + 'linenumbers': 1, 'slice': 1, 'date': 1, 'dictsort': 1, + 'dictsortreversed': 1, 'default_if_none': 1, + 'pluralize': 1, 'lower': 1, 'join': 1, 'center': 1, + 'default': 1, 'truncatewords_html': 1, 'upper': 1, + 'length': 1, 'phone2numeric': 1, 'wordwrap': 1, 'time': 1, + 'addslashes': 1, 'slugify': 1, 'first': 1 + }, + contains: ['argument'] + }, + { + className: 'argument', + begin: '"', end: '"' + } + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/html.js b/includes/js/dojox/highlight/languages/html.js new file mode 100644 index 0000000..0a6cc46 --- /dev/null +++ b/includes/js/dojox/highlight/languages/html.js @@ -0,0 +1,70 @@ +if(!dojo._hasResource["dojox.highlight.languages.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.html"] = true; +dojo.provide("dojox.highlight.languages.html"); + +dojo.require("dojox.highlight._base"); +dojo.require("dojox.highlight.languages.xml"); + +(function(){ + var HTML_TAGS = { + 'code': 1, 'kbd': 1, 'font': 1, 'noscript': 1, 'style': 1, 'img': 1, + 'title': 1, 'menu': 1, 'tt': 1, 'tr': 1, 'param': 1, 'li': 1, 'tfoot': 1, + 'th': 1, 'input': 1, 'td': 1, 'dl': 1, 'blockquote': 1, 'fieldset': 1, + 'big': 1, 'dd': 1, 'abbr': 1, 'optgroup': 1, 'dt': 1, 'button': 1, + 'isindex': 1, 'p': 1, 'small': 1, 'div': 1, 'dir': 1, 'em': 1, 'frame': 1, + 'meta': 1, 'sub': 1, 'bdo': 1, 'label': 1, 'acronym': 1, 'sup': 1, + 'body': 1, 'xml': 1, 'basefont': 1, 'base': 1, 'br': 1, 'address': 1, + 'strong': 1, 'legend': 1, 'ol': 1, 'script': 1, 'caption': 1, 's': 1, + 'col': 1, 'h2': 1, 'h3': 1, 'h1': 1, 'h6': 1, 'h4': 1, 'h5': 1, 'table': 1, + 'select': 1, 'noframes': 1, 'span': 1, 'area': 1, 'dfn': 1, 'strike': 1, + 'cite': 1, 'thead': 1, 'head': 1, 'option': 1, 'form': 1, 'hr': 1, + 'var': 1, 'link': 1, 'b': 1, 'colgroup': 1, 'ul': 1, 'applet': 1, 'del': 1, + 'iframe': 1, 'pre': 1, 'frameset': 1, 'ins': 1, 'tbody': 1, 'html': 1, + 'samp': 1, 'map': 1, 'object': 1, 'a': 1, 'xmlns': 1, 'center': 1, + 'textarea': 1, 'i': 1, 'q': 1, 'u': 1 + }; + var HTML_DOCTYPE = { + className: 'doctype', + begin: '', + relevance: 10 + }; + var HTML_ATTR = { + className: 'attribute', + begin: ' [a-zA-Z]+', end: '^' + }; + var HTML_VALUE = { + className: 'value', + begin: '[a-zA-Z0-9]+', end: '^' + }; + + var dh = dojox.highlight, dhc = dh.constants, dhl = dh.languages, x = dhl.xml; + dhl.html = { + defaultMode: { + contains: ['tag', 'comment', 'doctype'] + }, + case_insensitive: true, + modes: [ + x.XML_COMMENT, + HTML_DOCTYPE, + { + className: 'tag', + lexems: [dhc.IDENT_RE], + keywords: HTML_TAGS, + begin: '<[A-Za-z/]', end: '>', + contains: ['attribute'], + illegal: '[\\+\\.]' + }, + x.XML_ATTR, + HTML_ATTR, + x.XML_VALUE, + HTML_VALUE + ], + // exporting constants + HTML_TAGS: HTML_TAGS, + HTML_DOCTYPE: HTML_DOCTYPE, + HTML_ATTR: HTML_ATTR, + HTML_VALUE: HTML_VALUE + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/javascript.js b/includes/js/dojox/highlight/languages/javascript.js new file mode 100644 index 0000000..587cb07 --- /dev/null +++ b/includes/js/dojox/highlight/languages/javascript.js @@ -0,0 +1,55 @@ +if(!dojo._hasResource["dojox.highlight.languages.javascript"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.javascript"] = true; +dojo.provide("dojox.highlight.languages.javascript"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.javascript = { + defaultMode: { + lexems: [dhc.UNDERSCORE_IDENT_RE], + contains: ['string', 'comment', 'number', 'regexp', 'function'], + keywords: { + 'keyword': { + 'in': 1, 'if': 1, 'for': 1, 'while': 1, 'finally': 1, 'var': 1, + 'new': 1, 'function': 1, 'do': 1, 'return': 1, 'void': 1, + 'else': 1, 'break': 1, 'catch': 1, 'instanceof': 1, 'with': 1, + 'throw': 1, 'case': 1, 'default': 1, 'try': 1, 'this': 1, + 'switch': 1, 'continue': 1, 'typeof': 1, 'delete': 1 + }, + 'literal': {'true': 1, 'false': 1, 'null': 1} + } + }, + modes: [ + dhc.C_LINE_COMMENT_MODE, + dhc.C_BLOCK_COMMENT_MODE, + dhc.C_NUMBER_MODE, + dhc.APOS_STRING_MODE, + dhc.QUOTE_STRING_MODE, + dhc.BACKSLASH_ESCAPE, + { + className: 'regexp', + begin: '/.*?[^\\\\/]/[gim]*', end: '^' + }, + { + className: 'function', + begin: 'function\\b', end: '{', + lexems: [dhc.UNDERSCORE_IDENT_RE], + keywords: {'function': 1}, + contains: ['title', 'params'] + }, + { + className: 'title', + begin: dhc.UNDERSCORE_IDENT_RE, end: '^' + }, + { + className: 'params', + begin: '\\(', end: '\\)', + contains: ['string', 'comment'] + } + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/pygments/_html.js b/includes/js/dojox/highlight/languages/pygments/_html.js new file mode 100644 index 0000000..64b3bfa --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/_html.js @@ -0,0 +1,25 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments._html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments._html"] = true; +dojo.provide("dojox.highlight.languages.pygments._html"); + +// html-related constants + +dojox.highlight.languages.pygments._html.tags = { + "code": 1, "kbd": 1, "font": 1, "noscript": 1, "style": 1, "img": 1, + "title": 1, "menu": 1, "tt": 1, "tr": 1, "param": 1, "li": 1, "tfoot": 1, + "th": 1, "input": 1, "td": 1, "dl": 1, "blockquote": 1, "fieldset": 1, + "big": 1, "dd": 1, "abbr": 1, "optgroup": 1, "dt": 1, "button": 1, + "isindex": 1, "p": 1, "small": 1, "div": 1, "dir": 1, "em": 1, "frame": 1, + "meta": 1, "sub": 1, "bdo": 1, "label": 1, "acronym": 1, "sup": 1, + "body": 1, "xml": 1, "basefont": 1, "base": 1, "br": 1, "address": 1, + "strong": 1, "legend": 1, "ol": 1, "script": 1, "caption": 1, "s": 1, + "col": 1, "h2": 1, "h3": 1, "h1": 1, "h6": 1, "h4": 1, "h5": 1, "table": 1, + "select": 1, "noframes": 1, "span": 1, "area": 1, "dfn": 1, "strike": 1, + "cite": 1, "thead": 1, "head": 1, "option": 1, "form": 1, "hr": 1, + "var": 1, "link": 1, "b": 1, "colgroup": 1, "ul": 1, "applet": 1, "del": 1, + "iframe": 1, "pre": 1, "frameset": 1, "ins": 1, "tbody": 1, "html": 1, + "samp": 1, "map": 1, "object": 1, "a": 1, "xmlns": 1, "center": 1, + "textarea": 1, "i": 1, "q": 1, "u": 1 +}; + +} diff --git a/includes/js/dojox/highlight/languages/pygments/_www.js b/includes/js/dojox/highlight/languages/pygments/_www.js new file mode 100644 index 0000000..648ed6e --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/_www.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments._www"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments._www"] = true; +dojo.provide("dojox.highlight.languages.pygments._www"); + +/* common web-centric languages */ +dojo.require("dojox.highlight.languages.pygments.xml"); +dojo.require("dojox.highlight.languages.pygments.html"); +dojo.require("dojox.highlight.languages.pygments.css"); +//dojo.require("dojox.highlight.languages.pygments.django"); +dojo.require("dojox.highlight.languages.pygments.javascript"); + +} diff --git a/includes/js/dojox/highlight/languages/pygments/css.js b/includes/js/dojox/highlight/languages/pygments/css.js new file mode 100644 index 0000000..bfb0680 --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/css.js @@ -0,0 +1,211 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments.css"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments.css"] = true; +dojo.provide("dojox.highlight.languages.pygments.css"); + +dojo.require("dojox.highlight._base"); +dojo.require("dojox.highlight.languages.pygments._html"); + +(function(){ + var dh = dojox.highlight, dhl = dh.languages; + dhl.css = { + defaultMode: { + lexems: ["\\b[a-zA-Z0-9]+\\b", "\\b@media\b"], + keywords: { + "keyword": { + "@media": 1 + }, + "name tag": dhl.pygments._html.tags + }, + contains: [ + "comment", + "string single", "string double", + "punctuation", + "name decorator", "name class", "name function", + "_content" + ] + }, + modes: [ + // comments + { + className: "comment", + begin: "/\\*", end: "\\*/", + relevance: 0 + }, + { + className: "comment preproc", + begin: "@[a-z][a-zA-Z]*", end: "^" + }, + { + className: "comment preproc", + begin: "\\!important\\b", end: "^" + }, + + // numbers + { + className: "number", + begin: "\\#[a-fA-F0-9]{3}\\b", end: "^", + relevance: 0 + }, + { + className: "number", + begin: "\\#[a-fA-F0-9]{6}\\b", end: "^", + relevance: 0 + }, + { + className: "number", + begin: "[\\.\\-]?[0-9]*[\\.]?[0-9]+(em|px|\\%|pt|pc|in|mm|cm|ex)", end: "^", + relevance: 0 + }, + { + className: "number", + begin: "\\-?[0-9]+", end: "^", + relevance: 0 + }, + + // strings + { + className: "string single", + begin: "'", end: "'", + illegal: "\\n", + relevance: 0 + }, + { + className: "string double", + begin: '"', + end: '"', + illegal: "\\n", + relevance: 0 + }, + + // operators + { + className: "operator", + begin: "[~\\^\\*!%&\\[\\]\\(\\)<>\\|+=@:;,./?-]", end: "^", + relevance: 0 + }, + + // punctuations + { + className: "punctuation", + begin: "[\\[\\]();]+", end: "^", + relevance: 0 + }, + + // names + { + className: "name decorator", + begin: "\\:[a-zA-Z0-9_\\-]+\\b", end: "^" + }, + { + className: "name class", + begin: "\\.[a-zA-Z0-9_\\-]+\\b", end: "^" + }, + { + className: "name function", + begin: "\\#[a-zA-Z0-9_\\-]+\\b", end: "^" + }, + { + className: "_content", + begin: "\\{", end: "\\}", + lexems: ["\\b[a-zA-Z\\-]+\\b"], + keywords: { + "keyword": { + "azimuth": 1, "background-attachment": 1, "background-color": 1, + "background-image": 1, "background-position": 1, "background-repeat": 1, + "background": 1, "border-bottom-color": 1, "border-bottom-style": 1, + "border-bottom-width": 1, "border-left-color": 1, "border-left-style": 1, + "border-left-width": 1, "border-right": 1, "border-right-color": 1, + "border-right-style": 1, "border-right-width": 1, "border-top-color": 1, + "border-top-style": 1, "border-top-width": 1, "border-bottom": 1, + "border-collapse": 1, "border-left": 1, "border-width": 1, "border-color": 1, + "border-spacing": 1, "border-style": 1, "border-top": 1, "border": 1, "caption-side": 1, + "clear": 1, "clip": 1, "color": 1, "content": 1, "counter-increment": 1, "counter-reset": 1, + "cue-after": 1, "cue-before": 1, "cue": 1, "cursor": 1, "direction": 1, "display": 1, + "elevation": 1, "empty-cells": 1, "float": 1, "font-family": 1, "font-size": 1, + "font-size-adjust": 1, "font-stretch": 1, "font-style": 1, "font-variant": 1, + "font-weight": 1, "font": 1, "height": 1, "letter-spacing": 1, "line-height": 1, + "list-style-type": 1, "list-style-image": 1, "list-style-position": 1, + "list-style": 1, "margin-bottom": 1, "margin-left": 1, "margin-right": 1, + "margin-top": 1, "margin": 1, "marker-offset": 1, "marks": 1, "max-height": 1, "max-width": 1, + "min-height": 1, "min-width": 1, "opacity": 1, "orphans": 1, "outline": 1, "outline-color": 1, + "outline-style": 1, "outline-width": 1, "overflow": 1, "padding-bottom": 1, + "padding-left": 1, "padding-right": 1, "padding-top": 1, "padding": 1, "page": 1, + "page-break-after": 1, "page-break-before": 1, "page-break-inside": 1, + "pause-after": 1, "pause-before": 1, "pause": 1, "pitch": 1, "pitch-range": 1, + "play-during": 1, "position": 1, "quotes": 1, "richness": 1, "right": 1, "size": 1, + "speak-header": 1, "speak-numeral": 1, "speak-punctuation": 1, "speak": 1, + "speech-rate": 1, "stress": 1, "table-layout": 1, "text-align": 1, "text-decoration": 1, + "text-indent": 1, "text-shadow": 1, "text-transform": 1, "top": 1, "unicode-bidi": 1, + "vertical-align": 1, "visibility": 1, "voice-family": 1, "volume": 1, "white-space": 1, + "widows": 1, "width": 1, "word-spacing": 1, "z-index": 1, "bottom": 1, "left": 1, + "above": 1, "absolute": 1, "always": 1, "armenian": 1, "aural": 1, "auto": 1, "avoid": 1, "baseline": 1, + "behind": 1, "below": 1, "bidi-override": 1, "blink": 1, "block": 1, "bold": 1, "bolder": 1, "both": 1, + "capitalize": 1, "center-left": 1, "center-right": 1, "center": 1, "circle": 1, + "cjk-ideographic": 1, "close-quote": 1, "collapse": 1, "condensed": 1, "continuous": 1, + "crop": 1, "crosshair": 1, "cross": 1, "cursive": 1, "dashed": 1, "decimal-leading-zero": 1, + "decimal": 1, "default": 1, "digits": 1, "disc": 1, "dotted": 1, "double": 1, "e-resize": 1, "embed": 1, + "extra-condensed": 1, "extra-expanded": 1, "expanded": 1, "fantasy": 1, "far-left": 1, + "far-right": 1, "faster": 1, "fast": 1, "fixed": 1, "georgian": 1, "groove": 1, "hebrew": 1, "help": 1, + "hidden": 1, "hide": 1, "higher": 1, "high": 1, "hiragana-iroha": 1, "hiragana": 1, "icon": 1, + "inherit": 1, "inline-table": 1, "inline": 1, "inset": 1, "inside": 1, "invert": 1, "italic": 1, + "justify": 1, "katakana-iroha": 1, "katakana": 1, "landscape": 1, "larger": 1, "large": 1, + "left-side": 1, "leftwards": 1, "level": 1, "lighter": 1, "line-through": 1, "list-item": 1, + "loud": 1, "lower-alpha": 1, "lower-greek": 1, "lower-roman": 1, "lowercase": 1, "ltr": 1, + "lower": 1, "low": 1, "medium": 1, "message-box": 1, "middle": 1, "mix": 1, "monospace": 1, + "n-resize": 1, "narrower": 1, "ne-resize": 1, "no-close-quote": 1, "no-open-quote": 1, + "no-repeat": 1, "none": 1, "normal": 1, "nowrap": 1, "nw-resize": 1, "oblique": 1, "once": 1, + "open-quote": 1, "outset": 1, "outside": 1, "overline": 1, "pointer": 1, "portrait": 1, "px": 1, + "relative": 1, "repeat-x": 1, "repeat-y": 1, "repeat": 1, "rgb": 1, "ridge": 1, "right-side": 1, + "rightwards": 1, "s-resize": 1, "sans-serif": 1, "scroll": 1, "se-resize": 1, + "semi-condensed": 1, "semi-expanded": 1, "separate": 1, "serif": 1, "show": 1, "silent": 1, + "slow": 1, "slower": 1, "small-caps": 1, "small-caption": 1, "smaller": 1, "soft": 1, "solid": 1, + "spell-out": 1, "square": 1, "static": 1, "status-bar": 1, "super": 1, "sw-resize": 1, + "table-caption": 1, "table-cell": 1, "table-column": 1, "table-column-group": 1, + "table-footer-group": 1, "table-header-group": 1, "table-row": 1, + "table-row-group": 1, "text": 1, "text-bottom": 1, "text-top": 1, "thick": 1, "thin": 1, + "transparent": 1, "ultra-condensed": 1, "ultra-expanded": 1, "underline": 1, + "upper-alpha": 1, "upper-latin": 1, "upper-roman": 1, "uppercase": 1, "url": 1, + "visible": 1, "w-resize": 1, "wait": 1, "wider": 1, "x-fast": 1, "x-high": 1, "x-large": 1, "x-loud": 1, + "x-low": 1, "x-small": 1, "x-soft": 1, "xx-large": 1, "xx-small": 1, "yes": 1 + }, + "name builtin": { + "indigo": 1, "gold": 1, "firebrick": 1, "indianred": 1, "yellow": 1, "darkolivegreen": 1, + "darkseagreen": 1, "mediumvioletred": 1, "mediumorchid": 1, "chartreuse": 1, + "mediumslateblue": 1, "black": 1, "springgreen": 1, "crimson": 1, "lightsalmon": 1, "brown": 1, + "turquoise": 1, "olivedrab": 1, "cyan": 1, "silver": 1, "skyblue": 1, "gray": 1, "darkturquoise": 1, + "goldenrod": 1, "darkgreen": 1, "darkviolet": 1, "darkgray": 1, "lightpink": 1, "teal": 1, + "darkmagenta": 1, "lightgoldenrodyellow": 1, "lavender": 1, "yellowgreen": 1, "thistle": 1, + "violet": 1, "navy": 1, "orchid": 1, "blue": 1, "ghostwhite": 1, "honeydew": 1, "cornflowerblue": 1, + "darkblue": 1, "darkkhaki": 1, "mediumpurple": 1, "cornsilk": 1, "red": 1, "bisque": 1, "slategray": 1, + "darkcyan": 1, "khaki": 1, "wheat": 1, "deepskyblue": 1, "darkred": 1, "steelblue": 1, "aliceblue": 1, + "gainsboro": 1, "mediumturquoise": 1, "floralwhite": 1, "coral": 1, "purple": 1, "lightgrey": 1, + "lightcyan": 1, "darksalmon": 1, "beige": 1, "azure": 1, "lightsteelblue": 1, "oldlace": 1, + "greenyellow": 1, "royalblue": 1, "lightseagreen": 1, "mistyrose": 1, "sienna": 1, + "lightcoral": 1, "orangered": 1, "navajowhite": 1, "lime": 1, "palegreen": 1, "burlywood": 1, + "seashell": 1, "mediumspringgreen": 1, "fuchsia": 1, "papayawhip": 1, "blanchedalmond": 1, + "peru": 1, "aquamarine": 1, "white": 1, "darkslategray": 1, "ivory": 1, "dodgerblue": 1, + "lemonchiffon": 1, "chocolate": 1, "orange": 1, "forestgreen": 1, "slateblue": 1, "olive": 1, + "mintcream": 1, "antiquewhite": 1, "darkorange": 1, "cadetblue": 1, "moccasin": 1, + "limegreen": 1, "saddlebrown": 1, "darkslateblue": 1, "lightskyblue": 1, "deeppink": 1, + "plum": 1, "aqua": 1, "darkgoldenrod": 1, "maroon": 1, "sandybrown": 1, "magenta": 1, "tan": 1, + "rosybrown": 1, "pink": 1, "lightblue": 1, "palevioletred": 1, "mediumseagreen": 1, + "dimgray": 1, "powderblue": 1, "seagreen": 1, "snow": 1, "mediumblue": 1, "midnightblue": 1, + "paleturquoise": 1, "palegoldenrod": 1, "whitesmoke": 1, "darkorchid": 1, "salmon": 1, + "lightslategray": 1, "lawngreen": 1, "lightgreen": 1, "tomato": 1, "hotpink": 1, + "lightyellow": 1, "lavenderblush": 1, "linen": 1, "mediumaquamarine": 1, "green": 1, + "blueviolet": 1, "peachpuff": 1 + } + }, + contains: [ + "comment", "comment preproc", + "number", + "string single", "string double", + "punctuation", + "name decorator", "name class", "name function" + ] + } + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/pygments/html.js b/includes/js/dojox/highlight/languages/pygments/html.js new file mode 100644 index 0000000..e0e7475 --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/html.js @@ -0,0 +1,101 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments.html"] = true; +dojo.provide("dojox.highlight.languages.pygments.html"); + +dojo.require("dojox.highlight._base"); +dojo.require("dojox.highlight.languages.pygments._html"); + +(function(){ + var dh = dojox.highlight, dhl = dh.languages, tags = [], + ht = dhl.pygments._html.tags; + + for(var key in ht){ + tags.push(key); + } + tags = "\\b(" + tags.join("|") + ")\\b"; + + dhl.html = { + case_insensitive: true, + defaultMode: { + contains: [ + "name entity", + "comment", "comment preproc", + "_script", "_style", "_tag" + ] + }, + modes: [ + // comments + { + className: "comment", + begin: "" + }, + { + className: "comment preproc", + begin: "\\<\\!\\[CDATA\\[", end: "\\]\\]\\>" + }, + { + className: "comment preproc", + begin: "\\<\\!", end: "\\>" + }, + + // strings + { + className: "string", + begin: "'", end: "'", + illegal: "\\n", + relevance: 0 + }, + { + className: "string", + begin: '"', + end: '"', + illegal: "\\n", + relevance: 0 + }, + + // names + { + className: "name entity", + begin: "\\&[a-z]+;", end: "^" + }, + { + className: "name tag", + begin: tags, end: "^", + relevance: 5 + }, + { + className: "name attribute", + begin: "\\b[a-z0-9_\\:\\-]+\\s*=", end: "^", + relevance: 0 + }, + + { + className: "_script", + begin: "\\", + relevance: 5 + }, + { + className: "_style", + begin: "\\", + relevance: 5 + }, + + { + className: "_tag", + begin: "\\<(?!/)", end: "\\>", + contains: ["name tag", "name attribute", "string", "_value"] + }, + { + className: "_tag", + begin: "\\", + contains: ["name tag"] + }, + { + className: "_value", + begin: "[^\\s\\>]+", end: "^" + } + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/pygments/javascript.js b/includes/js/dojox/highlight/languages/pygments/javascript.js new file mode 100644 index 0000000..d6c0a6b --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/javascript.js @@ -0,0 +1,152 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments.javascript"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments.javascript"] = true; +dojo.provide("dojox.highlight.languages.pygments.javascript"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.javascript = { + defaultMode: { + lexems: ["\\b[a-zA-Z]+"], + keywords: { + "keyword": { + "for": 1, "in": 1, "while": 1, "do": 1, "break": 1, "return": 1, + "continue": 1, "if": 1, "else": 1, "throw": 1, "try": 1, + "catch": 1, "var": 1, "with": 1, "const": 1, "label": 1, + "function": 1, "new": 1, "typeof": 1, "instanceof": 1 + }, + "keyword constant": { + "true": 1, "false": 1, "null": 1, "NaN": 1, "Infinity": 1, "undefined": 1 + }, + "name builtin": { + "Array": 1, "Boolean": 1, "Date": 1, "Error": 1, "Function": 1, "Math": 1, + "netscape": 1, "Number": 1, "Object": 1, "Packages": 1, "RegExp": 1, + "String": 1, "sun": 1, "decodeURI": 1, "decodeURIComponent": 1, + "encodeURI": 1, "encodeURIComponent": 1, "Error": 1, "eval": 1, + "isFinite": 1, "isNaN": 1, "parseFloat": 1, "parseInt": 1, "document": 1, + "window": 1 + }, + "name builtin pseudo": { + "this": 1 + } + }, + contains: [ + "comment single", "comment multiline", + "number integer", "number oct", "number hex", "number float", + "string single", "string double", "string regex", + "operator", + "punctuation", + //"name variable", + "_function" + ] + }, + modes: [ + // comments + { + className: "comment single", + begin: "//", end: "$", + relevance: 0 + }, + { + className: "comment multiline", + begin: "/\\*", end: "\\*/" + }, + + // numbers + { + className: "number integer", + begin: "0|([1-9][0-9]*)", end: "^", + relevance: 0 + }, + { + className: "number oct", + begin: "0[0-9]+", end: "^", + relevance: 0 + }, + { + className: "number hex", + begin: "0x[0-9a-fA-F]+", end: "^", + relevance: 0 + }, + { + className: "number float", + begin: "([1-9][0-9]*\\.[0-9]*([eE][\\+-]?[0-9]+)?)|(\\.[0-9]+([eE][\\+-]?[0-9]+)?)|([0-9]+[eE][\\+-]?[0-9]+)", end: "^", + relevance: 0 + }, + + // strings + { + className: "string single", + begin: "'", end: "'", + illegal: "\\n", + contains: ["string escape"], + relevance: 0 + }, + { + className: "string double", + begin: '"', + end: '"', + illegal: "\\n", + contains: ["string escape"], + relevance: 0 + }, + { + className: "string escape", + begin: "\\\\.", end: "^", + relevance: 0 + }, + { + className: "string regex", + begin: "/.*?[^\\\\/]/[gim]*", end: "^" + }, + + // operators + { + className: "operator", + begin: "\\|\\||&&|\\+\\+|--|-=|\\+=|/=|\\*=|==|[-\\+\\*/=\\?:~\\^]", end: "^", + relevance: 0 + }, + + // punctuations + { + className: "punctuation", + begin: "[{}\\(\\)\\[\\]\\.;]", end: "^", + relevance: 0 + }, + + // functions + { + className: "_function", + begin: "function\\b", end: "{", + lexems: [dhc.UNDERSCORE_IDENT_RE], + keywords: { + keyword: { + "function": 1 + } + }, + contains: ["name function", "_params"], + relevance: 5 + }, + { + className: "name function", + begin: dhc.UNDERSCORE_IDENT_RE, end: '^' + }, + { + className: "_params", + begin: "\\(", end: "\\)", + contains: ["comment single", "comment multiline"] + } + /* + // names + { + className: "name variable", + begin: "\\b[$a-zA-Z_][$a-zA-Z0-9_]*", end: "^", + relevance: 0 + } + */ + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/pygments/xml.js b/includes/js/dojox/highlight/languages/pygments/xml.js new file mode 100644 index 0000000..5eb4832 --- /dev/null +++ b/includes/js/dojox/highlight/languages/pygments/xml.js @@ -0,0 +1,79 @@ +if(!dojo._hasResource["dojox.highlight.languages.pygments.xml"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.pygments.xml"] = true; +dojo.provide("dojox.highlight.languages.pygments.xml"); + +dojo.require("dojox.highlight._base"); +dojox.highlight.languages.pygments.xml = {a: 1}; +dojox.highlight.languages.xml = { + defaultMode: { + contains: [ + "name entity", + "comment", "comment preproc", + "_tag" + ] + }, + modes: [ + // comments + { + className: "comment", + begin: "" + }, + { + className: "comment preproc", + begin: "\\<\\!\\[CDATA\\[", end: "\\]\\]\\>" + }, + { + className: "comment preproc", + begin: "\\<\\!", end: "\\>" + }, + { + className: "comment preproc", + begin: "\\<\\?", end: "\\?\\>", + relevance: 5 + }, + + // strings + { + className: "string", + begin: "'", end: "'", + illegal: "\\n", + relevance: 0 + }, + { + className: "string", + begin: '"', + end: '"', + illegal: "\\n", + relevance: 0 + }, + + // names + { + className: "name entity", + begin: "\\&[a-z]+;", end: "^" + }, + { + className: "name tag", + begin: "\\b[a-z0-9_\\:\\-]+\\b", end: "^" + }, + { + className: "name attribute", + begin: "\\b[a-z0-9_\\:\\-]+=", end: "^", + relevance: 0 + }, + + + { + className: "_tag", + begin: "\\<", end: "\\>", + contains: ["name tag", "name attribute", "string"] + }, + { + className: "_tag", + begin: "\\", + contains: ["name tag"] + } + ] +}; + +} diff --git a/includes/js/dojox/highlight/languages/python.js b/includes/js/dojox/highlight/languages/python.js new file mode 100644 index 0000000..eaffd1f --- /dev/null +++ b/includes/js/dojox/highlight/languages/python.js @@ -0,0 +1,102 @@ +if(!dojo._hasResource["dojox.highlight.languages.python"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.python"] = true; +dojo.provide("dojox.highlight.languages.python"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.python = { + // summary: Python highlight definitions + defaultMode: { + lexems: [dhc.UNDERSCORE_IDENT_RE], + illegal: '()', + contains: ['comment', 'string', 'function', 'class', 'number', 'decorator'], + keywords: {'and': 1, 'elif': 1, 'is': 1, 'global': 1, 'as': 1, 'in': 1, 'if': 1, + 'from': 1, 'raise': 1, 'for': 1, 'except': 1, 'finally': 1, 'print': 1, + 'import': 1, 'pass': 1, 'None': 1, 'return': 1, 'exec': 1, 'else': 1, + 'break': 1, 'not': 1, 'with': 1, 'class': 1, 'assert': 1, 'yield': 1, + 'try': 1, 'while': 1, 'continue': 1, 'del': 1, 'or': 1, 'def': 1, 'lambda': 1} + }, + modes: [ + { + className: 'function', + lexems: [dhc.UNDERSCORE_IDENT_RE], + begin: '\\bdef ', end: ':', + illegal: '$', + keywords: {'def': 1}, + contains: ['title', 'params'], + relevance: 10 + }, + { + className: 'class', + lexems: [dhc.UNDERSCORE_IDENT_RE], + begin: '\\bclass ', end: ':', + illegal: '[${]', + keywords: {'class': 1}, + contains: ['title', 'params',], + relevance: 10 + }, + { + className: 'title', + begin: dhc.UNDERSCORE_IDENT_RE, end: '^' + }, + { + className: 'params', + begin: '\\(', end: '\\)', + contains: ['string'] + }, + dhc.HASH_COMMENT_MODE, + dhc.C_NUMBER_MODE, + { + className: 'string', + begin: '\'\'\'', end: '\'\'\'', + relevance: 10 + }, + { + className: 'string', + begin: '"""', end: '"""', + relevance: 10 + }, + dhc.APOS_STRING_MODE, + dhc.QUOTE_STRING_MODE, + dhc.BACKSLASH_ESCAPE, + { + className: 'string', + begin: 'r\'', end: '\'', + relevance: 10 + }, + { + className: 'string', + begin: 'r"', end: '"', + relevance: 10 + }, + { + className: 'string', + begin: 'u\'', end: '(^|[^\\\\])\'', + relevance: 10 + }, + { + className: 'string', + begin: 'u"', end: '(^|[^\\\\])"', + relevance: 10 + }, + { + className: 'string', + begin: 'ur\'', end: '\'', + relevance: 10 + }, + { + className: 'string', + begin: 'ur"', end: '"', + relevance: 10 + }, + { + className: 'decorator', + begin: '@', end: '$' + } + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/sql.js b/includes/js/dojox/highlight/languages/sql.js new file mode 100644 index 0000000..0e1ca9c --- /dev/null +++ b/includes/js/dojox/highlight/languages/sql.js @@ -0,0 +1,101 @@ +if(!dojo._hasResource["dojox.highlight.languages.sql"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.sql"] = true; +dojo.provide("dojox.highlight.languages.sql"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var SQL_KEYWORDS = { + 'all': 1, 'partial': 1, 'global': 1, 'month': 1, + 'current_timestamp': 1, 'using': 1, 'go': 1, 'revoke': 1, + 'smallint': 1, 'indicator': 1, 'end-exec': 1, 'disconnect': 1, + 'zone': 1, 'with': 1, 'character': 1, 'assertion': 1, 'to': 1, + 'add': 1, 'current_user': 1, 'usage': 1, 'input': 1, 'local': 1, + 'alter': 1, 'match': 1, 'collate': 1, 'real': 1, 'then': 1, + 'rollback': 1, 'get': 1, 'read': 1, 'timestamp': 1, 'session_user': 1, + 'not': 1, 'integer': 1, 'bit': 1, 'unique': 1, 'day': 1, 'minute': 1, + 'desc': 1, 'insert': 1, 'execute': 1, 'like': 1, 'level': 1, + 'decimal': 1, 'drop': 1, 'continue': 1, 'isolation': 1, 'found': 1, + 'where': 1, 'constraints': 1, 'domain': 1, 'right': 1, 'national': 1, + 'some': 1, 'module': 1, 'transaction': 1, 'relative': 1, 'second': 1, + 'connect': 1, 'escape': 1, 'close': 1, 'system_user': 1, 'for': 1, + 'deferred': 1, 'section': 1, 'cast': 1, 'current': 1, 'sqlstate': 1, + 'allocate': 1, 'intersect': 1, 'deallocate': 1, 'numeric': 1, + 'public': 1, 'preserve': 1, 'full': 1, 'goto': 1, 'initially': 1, + 'asc': 1, 'no': 1, 'key': 1, 'output': 1, 'collation': 1, 'group': 1, + 'by': 1, 'union': 1, 'session': 1, 'both': 1, 'last': 1, 'language': 1, + 'constraint': 1, 'column': 1, 'of': 1, 'space': 1, 'foreign': 1, + 'deferrable': 1, 'prior': 1, 'connection': 1, 'unknown': 1, + 'action': 1, 'commit': 1, 'view': 1, 'or': 1, 'first': 1, 'into': 1, + 'float': 1, 'year': 1, 'primary': 1, 'cascaded': 1, 'except': 1, + 'restrict': 1, 'set': 1, 'references': 1, 'names': 1, 'table': 1, + 'outer': 1, 'open': 1, 'select': 1, 'size': 1, 'are': 1, 'rows': 1, + 'from': 1, 'prepare': 1, 'distinct': 1, 'leading': 1, 'create': 1, + 'only': 1, 'next': 1, 'inner': 1, 'authorization': 1, 'schema': 1, + 'corresponding': 1, 'option': 1, 'declare': 1, 'precision': 1, + 'immediate': 1, 'else': 1, 'timezone_minute': 1, 'external': 1, + 'varying': 1, 'translation': 1, 'true': 1, 'case': 1, 'exception': 1, + 'join': 1, 'hour': 1, 'default': 1, 'double': 1, 'scroll': 1, + 'value': 1, 'cursor': 1, 'descriptor': 1, 'values': 1, 'dec': 1, + 'fetch': 1, 'procedure': 1, 'delete': 1, 'and': 1, 'false': 1, + 'int': 1, 'is': 1, 'describe': 1, 'char': 1, 'as': 1, 'at': 1, 'in': 1, + 'varchar': 1, 'null': 1, 'trailing': 1, 'any': 1, 'absolute': 1, + 'current_time': 1, 'end': 1, 'grant': 1, 'privileges': 1, 'when': 1, + 'cross': 1, 'check': 1, 'write': 1, 'current_date': 1, 'pad': 1, + 'begin': 1, 'temporary': 1, 'exec': 1, 'time': 1, 'update': 1, + 'catalog': 1, 'user': 1, 'sql': 1, 'date': 1, 'on': 1, 'identity': 1, + 'timezone_hour': 1, 'natural': 1, 'whenever': 1, 'interval': 1, + 'work': 1, 'order': 1, 'cascade': 1, 'diagnostics': 1, 'nchar': 1, + 'having': 1, 'left': 1 + }; + + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.sql = { + // summary: SQL highlight definitions + case_insensitive: true, + defaultMode: { + lexems: [dhc.IDENT_RE], + contains: ['string', 'number', 'comment'], + keywords: { + 'keyword': SQL_KEYWORDS, + 'aggregate': {'count': 1, 'sum': 1, 'min': 1, 'max': 1, 'avg': 1} + } + }, + modes: [ + dhc.C_NUMBER_MODE, + dhc.C_BLOCK_COMMENT_MODE, + { + className: 'comment', + begin: '--', end: '$' + }, + { + className: 'string', + begin: '\'', end: '\'', + contains: ['escape', 'squote'], + relevance: 0 + }, + { + className: 'squote', + begin: '\'\'', end: '^' + }, + { + className: 'string', + begin: '"', end: '"', + contains: [ 'escape', 'dquote'], + relevance: 0 + }, + { + className: 'dquote', + begin: '""', end: '^' + }, + { + className: 'string', + begin: '`', end: '`', + contains: ['escape'] + }, + dhc.BACKSLASH_ESCAPE + ] + }; +})(); + +} diff --git a/includes/js/dojox/highlight/languages/xml.js b/includes/js/dojox/highlight/languages/xml.js new file mode 100644 index 0000000..67dd81d --- /dev/null +++ b/includes/js/dojox/highlight/languages/xml.js @@ -0,0 +1,69 @@ +if(!dojo._hasResource["dojox.highlight.languages.xml"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.highlight.languages.xml"] = true; +dojo.provide("dojox.highlight.languages.xml"); + +dojo.require("dojox.highlight._base"); + +(function(){ + var XML_COMMENT = { + className: 'comment', + begin: '' + }; + + var XML_ATTR = { + className: 'attribute', + begin: ' [a-zA-Z-]+=', end: '^', + contains: ['value'] + }; + + var XML_VALUE = { + className: 'value', + begin: '"', end: '"' + }; + + var dh = dojox.highlight, dhc = dh.constants; + dh.languages.xml = { + defaultMode: { + contains: ['pi', 'comment', 'cdata', 'tag'] + }, + case_insensitive: true, + modes: [ + { + className: 'pi', + begin: '<\\?', end: '\\?>', + relevance: 10 + }, + XML_COMMENT, + { + className: 'cdata', + begin: '<\\!\\[CDATA\\[', end: '\\]\\]>' + }, + { + className: 'tag', + begin: '', + contains: ['title', 'tag_internal'], + relevance: 1.5 + }, + { + className: 'title', + begin: '[A-Za-z:_][A-Za-z0-9\\._:-]+', end: '^', + relevance: 0 + }, + { + className: 'tag_internal', + begin: '^', endsWithParent: true, + contains: ['attribute'], + relevance: 0, + illegal: '[\\+\\.]' + }, + XML_ATTR, + XML_VALUE + ], + // exporting constants + XML_COMMENT: XML_COMMENT, + XML_ATTR: XML_ATTR, + XML_VALUE: XML_VALUE + }; +})(); + +} diff --git a/includes/js/dojox/highlight/resources/highlight.css b/includes/js/dojox/highlight/resources/highlight.css new file mode 100644 index 0000000..45a61a3 --- /dev/null +++ b/includes/js/dojox/highlight/resources/highlight.css @@ -0,0 +1,51 @@ + +.string, +.function .title, +.class .title, +.tag .attribute .value, +.css .rules .value, +.preprocessor, +.ruby .symbol, +.ruby .instancevar, +.ruby .class .parent, +.built_in, +.sql .aggregate, +.django .template_tag, +.django .variable, +.smalltalk .class { + color: #800; +} +.comment, +.java .annotation, +.template_comment { + color: #888; +} +.number, +.regexp, +.javascript .literal, +.smalltalk .symbol, +.smalltalk .char { + color: #080; +} +.javadoc, +.ruby .string, +.python .decorator, +.django .filter .argument, +.smalltalk .localvars, +.smalltalk .array, +.css .attr_selector, +.xml .pi { + color: #88F; +} +.keyword, +.css .id, +.phpdoc, +.function .title, +.class .title, +.vbscript .built_in, +.sql .aggregate, +.rsl .built_in, +.smalltalk .class, +.xml .tag .title { + font-weight: bold; +} diff --git a/includes/js/dojox/highlight/resources/highlight.css.commented.css b/includes/js/dojox/highlight/resources/highlight.css.commented.css new file mode 100644 index 0000000..eddef1f --- /dev/null +++ b/includes/js/dojox/highlight/resources/highlight.css.commented.css @@ -0,0 +1,58 @@ +/* +You can use this file as is or as a starting point for you own styling +*/ + +.string, +.function .title, +.class .title, +.tag .attribute .value, +.css .rules .value, +.preprocessor, +.ruby .symbol, +.ruby .instancevar, +.ruby .class .parent, +.built_in, +.sql .aggregate, +.django .template_tag, +.django .variable, +.smalltalk .class { + color: #800; +} + +.comment, +.java .annotation, +.template_comment { + color: #888; +} + +.number, +.regexp, +.javascript .literal, +.smalltalk .symbol, +.smalltalk .char { + color: #080; +} + +.javadoc, +.ruby .string, +.python .decorator, +.django .filter .argument, +.smalltalk .localvars, +.smalltalk .array, +.css .attr_selector, +.xml .pi { + color: #88F; +} + +.keyword, +.css .id, +.phpdoc, +.function .title, +.class .title, +.vbscript .built_in, +.sql .aggregate, +.rsl .built_in, +.smalltalk .class, +.xml .tag .title { + font-weight: bold; +} diff --git a/includes/js/dojox/highlight/resources/pygments/autumn.css b/includes/js/dojox/highlight/resources/pygments/autumn.css new file mode 100644 index 0000000..b1846f4 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/autumn.css @@ -0,0 +1,22 @@ + +code .comment {color: #aaa; font-style: italic} +code .comment.preproc {color: #4c8317; font-style: normal} +code .comment.special {color: #00a} +code .keyword {color: #00a} +code .keyword.type {color: #0aa} +code .operator.word {color: #00a} +code .name.builtin {color: #0aa} +code .name.function {color: #0a0} +code .name.class {color: #0a0; text-decoration: underline} +code .name.namespace {color: #0aa; text-decoration: underline} +code .name.exception {color: #D2413A; font-weight: bold} +code .name.variable {color: #a00} +code .name.constant {color: #a00} +code .name.entity {color: #800; font-weight: bold} +code .name.attribute {color: #1e90ff} +code .name.tag {color: #1e90ff; font-weight: bold} +code .name.decorator {color: #888} +code .string {color: #a50} +code .string.regex {color: #099} +code .string.symbol {color: #00a} +code .number {color: #099} diff --git a/includes/js/dojox/highlight/resources/pygments/autumn.css.commented.css b/includes/js/dojox/highlight/resources/pygments/autumn.css.commented.css new file mode 100644 index 0000000..3deb7c4 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/autumn.css.commented.css @@ -0,0 +1,28 @@ +/* Pygments autumn style */ + +code .comment {color: #aaa; font-style: italic} +code .comment.preproc {color: #4c8317; font-style: normal} +code .comment.special {color: #00a} + +code .keyword {color: #00a} +code .keyword.type {color: #0aa} + +code .operator.word {color: #00a} + +code .name.builtin {color: #0aa} +code .name.function {color: #0a0} +code .name.class {color: #0a0; text-decoration: underline} +code .name.namespace {color: #0aa; text-decoration: underline} +code .name.exception {color: #D2413A; font-weight: bold} +code .name.variable {color: #a00} +code .name.constant {color: #a00} +code .name.entity {color: #800; font-weight: bold} +code .name.attribute {color: #1e90ff} +code .name.tag {color: #1e90ff; font-weight: bold} +code .name.decorator {color: #888} + +code .string {color: #a50} +code .string.regex {color: #099} +code .string.symbol {color: #00a} + +code .number {color: #099} diff --git a/includes/js/dojox/highlight/resources/pygments/borland.css b/includes/js/dojox/highlight/resources/pygments/borland.css new file mode 100644 index 0000000..85fb11f --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/borland.css @@ -0,0 +1,11 @@ + +code .comment {color: #080; font-style: italic} +code .comment.preproc {color: #008080; font-style: normal} +code .comment.special {font-weight: bold; font-style: normal} +code .keyword {color: #000080; font-weight: bold} +code .operator.word {font-weight: bold} +code .name.attribute {color: #f00} +code .name.tag {color: #000080; font-weight: bold} +code .string {color: #00f} +code .string.char {color: #800080} +code .number {color: #00f} diff --git a/includes/js/dojox/highlight/resources/pygments/borland.css.commented.css b/includes/js/dojox/highlight/resources/pygments/borland.css.commented.css new file mode 100644 index 0000000..9fb9d19 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/borland.css.commented.css @@ -0,0 +1,17 @@ +/* Pygments borland style */ + +code .comment {color: #080; font-style: italic} +code .comment.preproc {color: #008080; font-style: normal} +code .comment.special {font-weight: bold; font-style: normal} + +code .keyword {color: #000080; font-weight: bold} + +code .operator.word {font-weight: bold} + +code .name.attribute {color: #f00} +code .name.tag {color: #000080; font-weight: bold} + +code .string {color: #00f} +code .string.char {color: #800080} + +code .number {color: #00f} diff --git a/includes/js/dojox/highlight/resources/pygments/colorful.css b/includes/js/dojox/highlight/resources/pygments/colorful.css new file mode 100644 index 0000000..06de503 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/colorful.css @@ -0,0 +1,37 @@ + +code .comment {color: #888} +code .comment.preproc {color: #579} +code .comment.special {color: #c00; font-weight: bold} +code .keyword {color: #080; font-weight: bold} +code .keyword.pseudo {color: #038} +code .keyword.type {color: #339} +code .operator {color: #333} +code .operator.word {color: #000; font-weight: bold} +code .name.builtin {color: #007020} +code .name.function {color: #06b; font-weight: bold} +code .name.class {color: #b06; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #f00; font-weight: bold} +code .name.variable {color: #963} +code .name.variable.instance {color: #33b} +code .name.variable.class {color: #369} +code .name.variable.global {color: #d70; font-weight: bold} +code .name.constant {color: #036; font-weight: bold} +code .name.label {color: #970; font-weight: bold} +code .name.entity {color: #800; font-weight: bold} +code .name.attribute {color: #00c} +code .name.tag {color: #070} +code .name.decorator {color: #555; font-weight: bold} +code .string {background-color: #fff0f0} +code .string.char {color: #04d; background-color: transparent} +code .string.doc {color: #d42; background-color: transparent} +code .string.interpol {background-color: #eee} +code .string.escape {color: #666; font-weight: bold} +code .string.regex {color: #000; background-color: #fff0f0} +code .string.symbol {color: #a60; background-color: transparent} +code .string.other {color: #d20} +code .number {color: #60e} +code .number.integer {color: #00d} +code .number.float {color: #60e} +code .number.hex {color: #058} +code .number.oct {color: #40e} diff --git a/includes/js/dojox/highlight/resources/pygments/colorful.css.commented.css b/includes/js/dojox/highlight/resources/pygments/colorful.css.commented.css new file mode 100644 index 0000000..d63728a --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/colorful.css.commented.css @@ -0,0 +1,43 @@ +/* Pygments colorful style */ + +code .comment {color: #888} +code .comment.preproc {color: #579} +code .comment.special {color: #c00; font-weight: bold} + +code .keyword {color: #080; font-weight: bold} +code .keyword.pseudo {color: #038} +code .keyword.type {color: #339} + +code .operator {color: #333} +code .operator.word {color: #000; font-weight: bold} + +code .name.builtin {color: #007020} +code .name.function {color: #06b; font-weight: bold} +code .name.class {color: #b06; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #f00; font-weight: bold} +code .name.variable {color: #963} +code .name.variable.instance {color: #33b} +code .name.variable.class {color: #369} +code .name.variable.global {color: #d70; font-weight: bold} +code .name.constant {color: #036; font-weight: bold} +code .name.label {color: #970; font-weight: bold} +code .name.entity {color: #800; font-weight: bold} +code .name.attribute {color: #00c} +code .name.tag {color: #070} +code .name.decorator {color: #555; font-weight: bold} + +code .string {background-color: #fff0f0} +code .string.char {color: #04d; background-color: transparent} +code .string.doc {color: #d42; background-color: transparent} +code .string.interpol {background-color: #eee} +code .string.escape {color: #666; font-weight: bold} +code .string.regex {color: #000; background-color: #fff0f0} +code .string.symbol {color: #a60; background-color: transparent} +code .string.other {color: #d20} + +code .number {color: #60e} +code .number.integer {color: #00d} +code .number.float {color: #60e} +code .number.hex {color: #058} +code .number.oct {color: #40e} diff --git a/includes/js/dojox/highlight/resources/pygments/default.css b/includes/js/dojox/highlight/resources/pygments/default.css new file mode 100644 index 0000000..f0b5f05 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/default.css @@ -0,0 +1,28 @@ + +code {background-color: #f8f8f8} +code .comment {color: #408080; font-style: italic} +code .comment.preproc {color: #bc7a00; font-style: normal} +code .keyword {color: #008000; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .operator {color: #666} +code .operator.word {color: #a2f} +code .name.builtin {color: #008000} +code .name.function {color: #00f} +code .name.class {color: #00f; font-weight: bold} +code .name.namespace {color: #00f; font-weight: bold} +code .name.exception {color: #d2413a; font-weight: bold} +code .name.variable {color: #19177c} +code .name.constant {color: #800} +code .name.label {color: #a0a000} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #7d9029} +code .name.tag {color: #008000; font-weight: bold} +code .name.decorator {color: #a2f} +code .string {color: #ba2121} +code .string.doc {font-style: italic} +code .string.interpol {color: #b68; font-weight: bold} +code .string.escape {color: #b62; font-weight: bold} +code .string.regex {color: #b68} +code .string.symbol {color: #19177c} +code .string.other {color: #008000} +code .number {color: #666} diff --git a/includes/js/dojox/highlight/resources/pygments/default.css.commented.css b/includes/js/dojox/highlight/resources/pygments/default.css.commented.css new file mode 100644 index 0000000..9c13e30 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/default.css.commented.css @@ -0,0 +1,35 @@ +/* Pygments default style */ + +code {background-color: #f8f8f8} + +code .comment {color: #408080; font-style: italic} +code .comment.preproc {color: #bc7a00; font-style: normal} + +code .keyword {color: #008000; font-weight: bold} +code .keyword.pseudo {font-weight: normal} + +code .operator {color: #666} +code .operator.word {color: #a2f} + +code .name.builtin {color: #008000} +code .name.function {color: #00f} +code .name.class {color: #00f; font-weight: bold} +code .name.namespace {color: #00f; font-weight: bold} +code .name.exception {color: #d2413a; font-weight: bold} +code .name.variable {color: #19177c} +code .name.constant {color: #800} +code .name.label {color: #a0a000} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #7d9029} +code .name.tag {color: #008000; font-weight: bold} +code .name.decorator {color: #a2f} + +code .string {color: #ba2121} +code .string.doc {font-style: italic} +code .string.interpol {color: #b68; font-weight: bold} +code .string.escape {color: #b62; font-weight: bold} +code .string.regex {color: #b68} +code .string.symbol {color: #19177c} +code .string.other {color: #008000} + +code .number {color: #666} diff --git a/includes/js/dojox/highlight/resources/pygments/emacs.css b/includes/js/dojox/highlight/resources/pygments/emacs.css new file mode 100644 index 0000000..8c815ed --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/emacs.css @@ -0,0 +1,29 @@ + +code {background-color: #f8f8f8} +code .comment {color: #080; font-style: italic} +code .comment.preproc {font-style: normal} +code .comment.special {font-style: normal; font-weight: bold} +code .keyword {color: #a2f; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .operator {color: #666} +code .operator.word {color: #a2f; font-weight: bold} +code .name.builtin {color: #a2f} +code .name.function {color: #00a000} +code .name.class {color: #00f} +code .name.namespace {color: #00f; font-weight: bold} +code .name.exception {color: #d2413a; font-weight: bold} +code .name.variable {color: #b8860b} +code .name.constant {color: #800} +code .name.label {color: #a0a000} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #b44} +code .name.tag {color: #008000; font-weight: bold} +code .name.decorator {color: #a2f} +code .string {color: #b44} +code .string.doc {font-style: italic} +code .string.interpol {color: #b68; font-weight: bold} +code .string.escape {color: #b62; font-weight: bold} +code .string.regex {color: #b68} +code .string.symbol {color: #b8860b} +code .string.other {color: #008000} +code .number {color: #666} diff --git a/includes/js/dojox/highlight/resources/pygments/emacs.css.commented.css b/includes/js/dojox/highlight/resources/pygments/emacs.css.commented.css new file mode 100644 index 0000000..ed391e1 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/emacs.css.commented.css @@ -0,0 +1,36 @@ +/* Pygments emacs style */ + +code {background-color: #f8f8f8} + +code .comment {color: #080; font-style: italic} +code .comment.preproc {font-style: normal} +code .comment.special {font-style: normal; font-weight: bold} + +code .keyword {color: #a2f; font-weight: bold} +code .keyword.pseudo {font-weight: normal} + +code .operator {color: #666} +code .operator.word {color: #a2f; font-weight: bold} + +code .name.builtin {color: #a2f} +code .name.function {color: #00a000} +code .name.class {color: #00f} +code .name.namespace {color: #00f; font-weight: bold} +code .name.exception {color: #d2413a; font-weight: bold} +code .name.variable {color: #b8860b} +code .name.constant {color: #800} +code .name.label {color: #a0a000} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #b44} +code .name.tag {color: #008000; font-weight: bold} +code .name.decorator {color: #a2f} + +code .string {color: #b44} +code .string.doc {font-style: italic} +code .string.interpol {color: #b68; font-weight: bold} +code .string.escape {color: #b62; font-weight: bold} +code .string.regex {color: #b68} +code .string.symbol {color: #b8860b} +code .string.other {color: #008000} + +code .number {color: #666} diff --git a/includes/js/dojox/highlight/resources/pygments/friendly.css b/includes/js/dojox/highlight/resources/pygments/friendly.css new file mode 100644 index 0000000..c4d392a --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/friendly.css @@ -0,0 +1,29 @@ + +code {background-color: #f8f8f8} +code .comment {color: #60a0b0; font-style: italic} +code .comment.preproc {color: #007020; font-style: normal} +code .comment.special {background-color: #fff0f0; font-style: normal} +code .keyword {color: #007020; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .operator {color: #666} +code .operator.word {color: #007020; font-weight: bold} +code .name.builtin {color: #007020} +code .name.function {color: #06287e} +code .name.class {color: #0e84b5; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #007020} +code .name.variable {color: #bb60d5} +code .name.constant {color: #60add5} +code .name.label {color: #002070; font-weight: bold} +code .name.entity {color: #d55537; font-weight: bold} +code .name.attribute {color: #4070a0} +code .name.tag {color: #062873; font-weight: bold} +code .name.decorator {color: #555; font-weight: bold} +code .string {color: #4070a0} +code .string.doc {font-style: italic} +code .string.interpol {color: #70a0d0; font-style: italic} +code .string.escape {color: #4070a0; font-weight: bold} +code .string.regex {color: #235388} +code .string.symbol {color: #517918} +code .string.other {color: #c65d09} +code .number {color: #40a070} diff --git a/includes/js/dojox/highlight/resources/pygments/friendly.css.commented.css b/includes/js/dojox/highlight/resources/pygments/friendly.css.commented.css new file mode 100644 index 0000000..7a1c36f --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/friendly.css.commented.css @@ -0,0 +1,36 @@ +/* Pygments friendly style */ + +code {background-color: #f8f8f8} + +code .comment {color: #60a0b0; font-style: italic} +code .comment.preproc {color: #007020; font-style: normal} +code .comment.special {background-color: #fff0f0; font-style: normal} + +code .keyword {color: #007020; font-weight: bold} +code .keyword.pseudo {font-weight: normal} + +code .operator {color: #666} +code .operator.word {color: #007020; font-weight: bold} + +code .name.builtin {color: #007020} +code .name.function {color: #06287e} +code .name.class {color: #0e84b5; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #007020} +code .name.variable {color: #bb60d5} +code .name.constant {color: #60add5} +code .name.label {color: #002070; font-weight: bold} +code .name.entity {color: #d55537; font-weight: bold} +code .name.attribute {color: #4070a0} +code .name.tag {color: #062873; font-weight: bold} +code .name.decorator {color: #555; font-weight: bold} + +code .string {color: #4070a0} +code .string.doc {font-style: italic} +code .string.interpol {color: #70a0d0; font-style: italic} +code .string.escape {color: #4070a0; font-weight: bold} +code .string.regex {color: #235388} +code .string.symbol {color: #517918} +code .string.other {color: #c65d09} + +code .number {color: #40a070} diff --git a/includes/js/dojox/highlight/resources/pygments/fruity.css b/includes/js/dojox/highlight/resources/pygments/fruity.css new file mode 100644 index 0000000..019fa02 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/fruity.css @@ -0,0 +1,14 @@ + +code {background-color: #111; color: #fff} +code .comment {color: #080; background-color: #0f140f; font-style: italic} +code .comment.preproc {color: #ff0007; font-weight: bold} +code .keyword {color: #fb660a; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #cdcaa9; font-weight: bold} +code .name.function {color: #ff0086; font-weight: bold} +code .name.variable {color: #fb660a} +code .name.constant {color: #0086d2} +code .name.attribute {color: #ff0086; font-weight: bold} +code .name.tag {color: #fb660a; font-weight: bold} +code .string {color: #0086d2} +code .number {color: #0086f7; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/fruity.css.commented.css b/includes/js/dojox/highlight/resources/pygments/fruity.css.commented.css new file mode 100644 index 0000000..adf0b59 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/fruity.css.commented.css @@ -0,0 +1,20 @@ +/* Pygments fruity style */ + +code {background-color: #111; color: #fff} + +code .comment {color: #080; background-color: #0f140f; font-style: italic} +code .comment.preproc {color: #ff0007; font-weight: bold} + +code .keyword {color: #fb660a; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #cdcaa9; font-weight: bold} + +code .name.function {color: #ff0086; font-weight: bold} +code .name.variable {color: #fb660a} +code .name.constant {color: #0086d2} +code .name.attribute {color: #ff0086; font-weight: bold} +code .name.tag {color: #fb660a; font-weight: bold} + +code .string {color: #0086d2} + +code .number {color: #0086f7; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/manni.css b/includes/js/dojox/highlight/resources/pygments/manni.css new file mode 100644 index 0000000..0cbf7e6 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/manni.css @@ -0,0 +1,30 @@ + +code {background-color: #f0f3f3} +code .comment {color: #09f; font-style: italic} +code .comment.preproc {color: #099; font-style: normal} +code .comment.special {font-weight: bold} +code .keyword {color: #069; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #078} +code .operator {color: #555} +code .operator.word {color: #000; font-weight: bold} +code .name.builtin {color: #366} +code .name.function {color: #c0f} +code .name.class {color: #0a8; font-weight: bold} +code .name.namespace {color: #0cf; font-weight: bold} +code .name.exception {color: #c00; font-weight: bold} +code .name.variable {color: #033} +code .name.constant {color: #360} +code .name.label {color: #99f} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #309} +code .name.tag {color: #309; font-weight: bold} +code .name.decorator {color: #99f} +code .string {color: #c30} +code .string.doc {font-style: italic} +code .string.interpol {color: #a00} +code .string.escape {color: #c30; font-weight: bold} +code .string.regex {color: #3aa} +code .string.symbol {color: #fc3} +code .string.other {color: #c30} +code .number {color: #f60} diff --git a/includes/js/dojox/highlight/resources/pygments/manni.css.commented.css b/includes/js/dojox/highlight/resources/pygments/manni.css.commented.css new file mode 100644 index 0000000..d9ba41a --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/manni.css.commented.css @@ -0,0 +1,37 @@ +/* Pygments manni style */ + +code {background-color: #f0f3f3} + +code .comment {color: #09f; font-style: italic} +code .comment.preproc {color: #099; font-style: normal} +code .comment.special {font-weight: bold} + +code .keyword {color: #069; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #078} + +code .operator {color: #555} +code .operator.word {color: #000; font-weight: bold} + +code .name.builtin {color: #366} +code .name.function {color: #c0f} +code .name.class {color: #0a8; font-weight: bold} +code .name.namespace {color: #0cf; font-weight: bold} +code .name.exception {color: #c00; font-weight: bold} +code .name.variable {color: #033} +code .name.constant {color: #360} +code .name.label {color: #99f} +code .name.entity {color: #999; font-weight: bold} +code .name.attribute {color: #309} +code .name.tag {color: #309; font-weight: bold} +code .name.decorator {color: #99f} + +code .string {color: #c30} +code .string.doc {font-style: italic} +code .string.interpol {color: #a00} +code .string.escape {color: #c30; font-weight: bold} +code .string.regex {color: #3aa} +code .string.symbol {color: #fc3} +code .string.other {color: #c30} + +code .number {color: #f60} diff --git a/includes/js/dojox/highlight/resources/pygments/murphy.css b/includes/js/dojox/highlight/resources/pygments/murphy.css new file mode 100644 index 0000000..971b505 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/murphy.css @@ -0,0 +1,37 @@ + +code .comment {color: #666; font-style: italic} +code .comment.preproc {color: #579; font-style: normal} +code .comment.special {color: #c00; font-weight: bold} +code .keyword {color: #289; font-weight: bold} +code .keyword.pseudo {color: #08f} +code .keyword.type {color: #66f} +code .operator {color: #333} +code .operator.word {color: #000; font-weight: bold} +code .name.builtin {color: #072} +code .name.function {color: #5ed; font-weight: bold} +code .name.class {color: #e9e; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #f00; font-weight: bold} +code .name.variable {color: #036} +code .name.variable.instance {color: #aaf} +code .name.variable.class {color: #ccf} +code .name.variable.global {color: #f84} +code .name.constant {color: #5ed; font-weight: bold} +code .name.label {color: #970; font-weight: bold} +code .name.entity {color: #800} +code .name.attribute {color: #007} +code .name.tag {color: #070} +code .name.decorator {color: #555; font-weight: bold} +code .string {background-color: #e0e0ff} +code .string.char {color: #88f; background-color: transparent} +code .string.doc {color: #d42; background-color: transparent} +code .string.interpol {background-color: #eee} +code .string.escape {color: #666; font-weight: bold} +code .string.regex {color: #000; background-color: #e0e0ff} +code .string.symbol {color: #fc8; background-color: transparent} +code .string.other {color: #f88} +code .number {color: #60e; font-weight: bold} +code .number.integer {color: #66f; font-weight: bold} +code .number.float {color: #60e; font-weight: bold} +code .number.hex {color: #058; font-weight: bold} +code .number.oct {color: #40e; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/murphy.css.commented.css b/includes/js/dojox/highlight/resources/pygments/murphy.css.commented.css new file mode 100644 index 0000000..bea43b5 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/murphy.css.commented.css @@ -0,0 +1,43 @@ +/* Pygments murphy style */ + +code .comment {color: #666; font-style: italic} +code .comment.preproc {color: #579; font-style: normal} +code .comment.special {color: #c00; font-weight: bold} + +code .keyword {color: #289; font-weight: bold} +code .keyword.pseudo {color: #08f} +code .keyword.type {color: #66f} + +code .operator {color: #333} +code .operator.word {color: #000; font-weight: bold} + +code .name.builtin {color: #072} +code .name.function {color: #5ed; font-weight: bold} +code .name.class {color: #e9e; font-weight: bold} +code .name.namespace {color: #0e84b5; font-weight: bold} +code .name.exception {color: #f00; font-weight: bold} +code .name.variable {color: #036} +code .name.variable.instance {color: #aaf} +code .name.variable.class {color: #ccf} +code .name.variable.global {color: #f84} +code .name.constant {color: #5ed; font-weight: bold} +code .name.label {color: #970; font-weight: bold} +code .name.entity {color: #800} +code .name.attribute {color: #007} +code .name.tag {color: #070} +code .name.decorator {color: #555; font-weight: bold} + +code .string {background-color: #e0e0ff} +code .string.char {color: #88f; background-color: transparent} +code .string.doc {color: #d42; background-color: transparent} +code .string.interpol {background-color: #eee} +code .string.escape {color: #666; font-weight: bold} +code .string.regex {color: #000; background-color: #e0e0ff} +code .string.symbol {color: #fc8; background-color: transparent} +code .string.other {color: #f88} + +code .number {color: #60e; font-weight: bold} +code .number.integer {color: #66f; font-weight: bold} +code .number.float {color: #60e; font-weight: bold} +code .number.hex {color: #058; font-weight: bold} +code .number.oct {color: #40e; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/native.css b/includes/js/dojox/highlight/resources/pygments/native.css new file mode 100644 index 0000000..47c361d --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/native.css @@ -0,0 +1,21 @@ + +code {background-color: #202020; color: #d0d0d0} +code .comment {color: #999; font-style: italic} +code .comment.preproc {color: #cd2828; font-style: normal; font-weight: bold} +code .comment.special {color: #e50808; font-style: normal; font-weight: bold; background-color: #520000} +code .keyword {color: #6ab825; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .operator.word {color: #6ab825; font-weight: bold} +code .name.builtin {color: #24909d} +code .name.function {color: #40ffff} +code .name.class {color: #447fcf; text-decoration: underline} +code .name.namespace {color: #447fcf; text-decoration: underline} +code .name.exception {color: #bbb} +code .name.variable {color: #40ffff} +code .name.constant {color: #40ffff} +code .name.attribute {color: #bbb} +code .name.tag {color: #6ab825; font-weight: bold} +code .name.decorator {color: #ffa500} +code .string {color: #ed9d13} +code .string.other {color: #ffa500} +code .number {color: #3677a9} diff --git a/includes/js/dojox/highlight/resources/pygments/native.css.commented.css b/includes/js/dojox/highlight/resources/pygments/native.css.commented.css new file mode 100644 index 0000000..6d3306c --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/native.css.commented.css @@ -0,0 +1,28 @@ +/* Pygments native style */ + +code {background-color: #202020; color: #d0d0d0} + +code .comment {color: #999; font-style: italic} +code .comment.preproc {color: #cd2828; font-style: normal; font-weight: bold} +code .comment.special {color: #e50808; font-style: normal; font-weight: bold; background-color: #520000} + +code .keyword {color: #6ab825; font-weight: bold} +code .keyword.pseudo {font-weight: normal} + +code .operator.word {color: #6ab825; font-weight: bold} + +code .name.builtin {color: #24909d} +code .name.function {color: #40ffff} +code .name.class {color: #447fcf; text-decoration: underline} +code .name.namespace {color: #447fcf; text-decoration: underline} +code .name.exception {color: #bbb} +code .name.variable {color: #40ffff} +code .name.constant {color: #40ffff} +code .name.attribute {color: #bbb} +code .name.tag {color: #6ab825; font-weight: bold} +code .name.decorator {color: #ffa500} + +code .string {color: #ed9d13} +code .string.other {color: #ffa500} + +code .number {color: #3677a9} diff --git a/includes/js/dojox/highlight/resources/pygments/pastie.css b/includes/js/dojox/highlight/resources/pygments/pastie.css new file mode 100644 index 0000000..d5e20e3 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/pastie.css @@ -0,0 +1,30 @@ + +code .comment {color: #888} +code .comment.preproc {color: #c00; font-weight: bold} +code .comment.special {color: #c00; font-weight: bold; background-color: #fff0f0} +code .keyword {color: #008800; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #888} +code .operator.word {color: #080} +code .name.builtin {color: #038} +code .name.function {color: #06b; font-weight: bold} +code .name.class {color: #b06; font-weight: bold} +code .name.namespace {color: #b06; font-weight: bold} +code .name.exception {color: #b06; font-weight: bold} +code .name.variable {color: #369} +code .name.variable.class {color: #369} +code .name.variable.instance {color: #33b} +code .name.variable.global {color: #d70} +code .name.constant {color: #036; font-weight: bold} +code .name.label {color: #369; font-style: italic} +code .name.attribute {color: #369} +code .name.tag {color: #b06; font-weight: bold} +code .name.decorator {color: #555} +code .name.property {color: #369; font-weight: bold} +code .string {color: #d20; background-color: #fff0f0} +code .string.interpol {color: #33b} +code .string.escape {color: #04d} +code .string.regex {color: #080; background-color: #fff0f0} +code .string.symbol {color: #a60} +code .string.other {color: #2b2; background-color: #f0fff0} +code .number {color: #00d; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/pastie.css.commented.css b/includes/js/dojox/highlight/resources/pygments/pastie.css.commented.css new file mode 100644 index 0000000..5b11cae --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/pastie.css.commented.css @@ -0,0 +1,36 @@ +/* Pygments pastie style */ + +code .comment {color: #888} +code .comment.preproc {color: #c00; font-weight: bold} +code .comment.special {color: #c00; font-weight: bold; background-color: #fff0f0} + +code .keyword {color: #008800; font-weight: bold} +code .keyword.pseudo {font-weight: normal} +code .keyword.type {color: #888} + +code .operator.word {color: #080} + +code .name.builtin {color: #038} +code .name.function {color: #06b; font-weight: bold} +code .name.class {color: #b06; font-weight: bold} +code .name.namespace {color: #b06; font-weight: bold} +code .name.exception {color: #b06; font-weight: bold} +code .name.variable {color: #369} +code .name.variable.class {color: #369} +code .name.variable.instance {color: #33b} +code .name.variable.global {color: #d70} +code .name.constant {color: #036; font-weight: bold} +code .name.label {color: #369; font-style: italic} +code .name.attribute {color: #369} +code .name.tag {color: #b06; font-weight: bold} +code .name.decorator {color: #555} +code .name.property {color: #369; font-weight: bold} + +code .string {color: #d20; background-color: #fff0f0} +code .string.interpol {color: #33b} +code .string.escape {color: #04d} +code .string.regex {color: #080; background-color: #fff0f0} +code .string.symbol {color: #a60} +code .string.other {color: #2b2; background-color: #f0fff0} + +code .number {color: #00d; font-weight: bold} diff --git a/includes/js/dojox/highlight/resources/pygments/perldoc.css b/includes/js/dojox/highlight/resources/pygments/perldoc.css new file mode 100644 index 0000000..e9253e6 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/perldoc.css @@ -0,0 +1,23 @@ + +code {background-color: #eed} +code .comment {color: #228b22} +code .comment.preproc {color: #1e889b} +code .comment.special {color: #8b008b; font-weight: bold} +code .keyword {color: #8b008b; font-weight: bold} +code .keyword.type {color: #a7a7a7} +code .operator.word {color: #8b008b} +code .name.builtin {color: #658b00} +code .name.function {color: #008b45} +code .name.class {color: #008b45; font-weight: bold} +code .name.namespace {color: #008b45; text-decoration: underline} +code .name.exception {color: #008b45; font-weight: bold} +code .name.variable {color: #00688b} +code .name.constant {color: #00688b} +code .name.attribute {color: #658b00} +code .name.tag {color: #8b008b; font-weight: bold} +code .name.decorator {color: #707a7c} +code .string {color: #cd5555} +code .string.regex {color: #1c7e71} +code .string.other {color: #cb6c20} +code .string.heredoc {color: #1c7e71; font-style: italic} +code .number {color: #b452cd} diff --git a/includes/js/dojox/highlight/resources/pygments/perldoc.css.commented.css b/includes/js/dojox/highlight/resources/pygments/perldoc.css.commented.css new file mode 100644 index 0000000..2a56e2f --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/perldoc.css.commented.css @@ -0,0 +1,30 @@ +/* Pygments perldoc style */ + +code {background-color: #eed} + +code .comment {color: #228b22} +code .comment.preproc {color: #1e889b} +code .comment.special {color: #8b008b; font-weight: bold} + +code .keyword {color: #8b008b; font-weight: bold} +code .keyword.type {color: #a7a7a7} + +code .operator.word {color: #8b008b} + +code .name.builtin {color: #658b00} +code .name.function {color: #008b45} +code .name.class {color: #008b45; font-weight: bold} +code .name.namespace {color: #008b45; text-decoration: underline} +code .name.exception {color: #008b45; font-weight: bold} +code .name.variable {color: #00688b} +code .name.constant {color: #00688b} +code .name.attribute {color: #658b00} +code .name.tag {color: #8b008b; font-weight: bold} +code .name.decorator {color: #707a7c} + +code .string {color: #cd5555} +code .string.regex {color: #1c7e71} +code .string.other {color: #cb6c20} +code .string.heredoc {color: #1c7e71; font-style: italic} + +code .number {color: #b452cd} diff --git a/includes/js/dojox/highlight/resources/pygments/trac.css b/includes/js/dojox/highlight/resources/pygments/trac.css new file mode 100644 index 0000000..2085719 --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/trac.css @@ -0,0 +1,20 @@ + +code .comment {color: #998; font-style: italic} +code .comment.preproc {color: #999; font-style: normal; font-weight: bold} +code .comment.special {color: #999; font-weight: bold} +code .keyword {font-weight: bold} +code .keyword.type {color: #458} +code .operator {font-weight: bold} +code .name.builtin {color: #999} +code .name.function {color: #900; font-weight: bold} +code .name.class {color: #458; font-weight: bold} +code .name.namespace {color: #555} +code .name.exception {color: #900; font-weight: bold} +code .name.variable {color: #008080} +code .name.constant {color: #008080} +code .name.entity {color: #800080} +code .name.attribute {color: #008080} +code .name.tag {color: #000080} +code .string {color: #b84} +code .string.regex {color: #808000} +code .number {color: #099} diff --git a/includes/js/dojox/highlight/resources/pygments/trac.css.commented.css b/includes/js/dojox/highlight/resources/pygments/trac.css.commented.css new file mode 100644 index 0000000..127b1fb --- /dev/null +++ b/includes/js/dojox/highlight/resources/pygments/trac.css.commented.css @@ -0,0 +1,26 @@ +/* Pygments trac style */ + +code .comment {color: #998; font-style: italic} +code .comment.preproc {color: #999; font-style: normal; font-weight: bold} +code .comment.special {color: #999; font-weight: bold} + +code .keyword {font-weight: bold} +code .keyword.type {color: #458} + +code .operator {font-weight: bold} + +code .name.builtin {color: #999} +code .name.function {color: #900; font-weight: bold} +code .name.class {color: #458; font-weight: bold} +code .name.namespace {color: #555} +code .name.exception {color: #900; font-weight: bold} +code .name.variable {color: #008080} +code .name.constant {color: #008080} +code .name.entity {color: #800080} +code .name.attribute {color: #008080} +code .name.tag {color: #000080} + +code .string {color: #b84} +code .string.regex {color: #808000} + +code .number {color: #099} diff --git a/includes/js/dojox/highlight/tests/test_highlight.html b/includes/js/dojox/highlight/tests/test_highlight.html new file mode 100644 index 0000000..93b1534 --- /dev/null +++ b/includes/js/dojox/highlight/tests/test_highlight.html @@ -0,0 +1,327 @@ + + + dojox.highlight - syntax highlighting | The Dojo Toolkit + + + + + + + + + +

            dojox.highlight

            + +

            client-side syntax highlighting for a number of languages.

            + +

            NOTE: All languages listed here have working language definitions, though +not all exist in the release or dojo subversion. The missing packs are not publically available. +based on +

            + +

            Examples:

            + +

            Some Python code:

            + +
            @requires_authorization
            +def somefunc(param1, param2):
            +  '''A docstring'''
            +  if param1 > param2: # interesting
            +    print 'Gre\'ater'
            +    print ''
            +  return param2 - param1 + 1
            +  
            +class SomeClass:
            pass +
            + + + + +

            A chunk of PHP:

            + +
            
            +$opAr = array (    "-a|--append", // a or append toggle, nothing extra
            +        "-i|--input:", // i or input with next input being needed
            +        "-l|--list:",           // l with input needed
            +		//"--foo",     // broken
            +        "-f:",           // f with no input
            +        "--wot:"      // wot with input, no short
            +        );
            +
            +
            +$op = bgetop($opAr);
            +if (is_array($op)) { print_r($op); }
            +
            +/* here is the code: */
            +
            +function bgetop($opAr=array(),$unknown=true) {
            +
            +$argv = $_SERVER['argv'];
            +$argc = $_SERVER['argc'];
            +$argPos = 1; // zero is program running
            +
            +// foreach arg
            +while ($argPos<$argc) {
            +    $arg = $argv[$argPos];
            +    if ($arg{0}=="-") {
            +        if ($arg{1}=="-") {
            +        $var = substr($arg,2,strlen($arg));
            +        } else { $var = $arg{1}; }
            +        foreach ($opAr as $opk => $opv) {
            +            if (!isset($return[$var])) {
            +            if (strpos($opv,$arg) !== FALSE) {
            +                // this is where the -f -foo fix needs to be,
            +                // the partial string exists in this record,
            +                // but we need to determine if it's accurate
            +                // somehow (i'm thinking: eregi?)
            +                if ($accurate=1) {
            +                    // we foudn the key
            +                    if (strpos($opv,':') !== FALSE) {
            +                        // next value is the one to use,
            +                        // then skip it in the parser.
            +                        if (isset($argv[$argPos+1])) {
            +                            $return[$var] = $argv[++$argPos];
            +                            } else {
            +                            $return[$var] = FALSE;     
            +                            }
            +                        } else {
            +                        // just set the toggle
            +                        $return[$var] = TRUE;
            +                        }
            +                    // don't check this opAr value again
            +                    unset($opAr[$opk]);
            +                    }
            +                } // if accurate
            +            } // !isset already
            +            } // foreach opAr    
            +    } else { // we weren't expecting a non-hyphened argument, possibly just a filename, or whatnot
            +        if ($unknown) { $return['unknown'][]=$arg; }
            +    }
            +    $argPos++;
            +} // while argPos < argc
            +
            +if (is_array($return)) {
            +return $return;
            +} else { return 0; }
            +
            +} // end function bgetop
            +
            +
            + +

            A custom XML document:

            + +
            <?xml version="1.0"?>
            +<response value="ok">
            +  <text>Ok</text>
            +  <comment/>
            +  <ns:description><![CDATA[ 
            +  CDATA is <not> magical. 
            +  ]]></ns:description>
            +</response>
            +
            + +

            Some HTML code:

            + +
            <head>
            +  <title>Title</title>
            +<body>
            +  <p class="something">Something</p>
            +  <p class=something>Something</p>
            +  <!-- comment -->
            +  <p class>Something</p>
            +  <p class="something" title="p">Something</p>
            +</body>
            +
            + +

            HTML with Django templates:

            + +
            {% if articles|length %}
            +{% for article in articles %}
            +
            +{# Striped table #}
            +<tr class="{% cycle odd,even %}">
            +  <td>{{ article|default:"Hi... "|escape }}</td>
            +  <td>{{ article.date|date:"d.m.Y" }}</td>
            +</tr>
            +  
            +{% endfor %}
            +{% endif %}
            +
            +{% comment %}
            +Comments may be long and
            +multiline.
            +{% endcomment %}
            +
            + +

            Some CSS code:

            + +
            body, 
            +html {
            +  font: Tahoma, Arial, san-serif;
            +}
            +
            +#content {
            +  width: 100%; /* css comment */
            +  height: 100%
            +}
            +
            +p[lang=ru] {
            +  color: red;
            +}
            +
            + +

            Explicit Python highlight:

            + +
            for x in [1, 2, 3]:
            +  count(x)
            +
            + +

            Disabled highlighting:

            + +
            <div id="contents">
            +  <p>Hello, World!
            +</div>
            +
            + +

            Normal dojo-looking code

            + +
            
            +dojo.provide("some.object");
            +dojo.declare("some.object",null,{
            +	param: "value",
            +	_myMethod: function(/* Event */e){
            +		this.inherited(arguments);
            +	},
            +	// comments
            +	_another: function(){
            +		dojo.addClass("foo","hovered");
            +	}
            +});
            +dojo.addOnLoad(function(){
            +	//
            +	// comments with <HTML> inline
            +	var d = dojo;
            +	d.mixin(d,{
            +		foo: function(e){
            +			d.bar(e);
            +		},
            +		bar: function(e){
            +			alert(e);
            +		}
            +	});
            +});
            +
            + +

            Lazy, xhr'd code:

            + +
            + +
            + +

            Text with inlined JavaScript code: dojo.forEach(a, function(x){ console.log(x); }); — that was the inlined sample.

            + +
            + +

            Markuped code (python), no language was specified:

            + +
            @requires_authorization
            +def somefunc(param1, param2):
            +  '''A docstring'''
            +  if param1 > param2: # interesting
            +    print 'Gre\'ater'
            +    print ''
            +  return param2 - param1 + 1
            +  
            +class SomeClass:
            pass +
            + +

            Markuped code, "python" was specified:

            + +
            @requires_authorization
            +def somefunc(param1, param2):
            +  '''A docstring'''
            +  if param1 > param2: # interesting
            +    print 'Gre\'ater'
            +    print ''
            +  return param2 - param1 + 1
            +  
            +class SomeClass:
            pass +
            + + + diff --git a/includes/js/dojox/highlight/tests/test_pygments.html b/includes/js/dojox/highlight/tests/test_pygments.html new file mode 100644 index 0000000..6bdced6 --- /dev/null +++ b/includes/js/dojox/highlight/tests/test_pygments.html @@ -0,0 +1,142 @@ + + + + dojox.highlight.pygments - syntax highlighting | The Dojo Toolkit + + + + + + + + + + + +

            Test Pygments-based highlighting

            + +

            Current theme from the pygments set: + +

            + +

            Javascript:

            + +
            function initHighlight(block) {
            +  if (block.className.search(/\bno\-highlight\b/) != -1)
            +    return false;
            +  try {
            +    blockText(block);
            +  } catch (e) {
            +    if (e == 'Complex markup')
            +      return;
            +  }//try
            +  var classes = block.className.split(/\s+/);
            +  for (var i = 0; i < classes.length; i++) {
            +    if (LANGUAGES[classes[i]]) {
            +      highlightLanguage(block, classes[i]);
            +      return;
            +    }//if
            +  }//for
            +  highlightAuto(block);
            +}//initHighlight
            + +

            Some CSS code:

            + +
            body, 
            +html {
            +  font: Tahoma, Arial, sans-serif;
            +}
            +
            +#content {
            +  width: 100%; /* test comment */
            +  height: 100%
            +}
            +
            +p[lang=ru] {
            +  color: red;
            +}
            +
            + +

            Some HTML code:

            + +
            <head>
            +  <title>Title</title>
            +<body>
            +  <p class="something">Something</p>
            +  <p class=something>Something</p>
            +  <!-- comment -->
            +  <p class>Something</p>
            +  <p class="something" title="p">Something</p>
            +</body>
            +
            + +

            A custom XML document:

            + +
            <?xml version="1.0"?>
            +<response value="ok">
            +  <text>Ok</text>
            +  <comment/>
            +  <ns:description><![CDATA[ 
            +  CDATA is <not> magical. 
            +  ]]></ns:description>
            +</response>
            +
            + + + diff --git a/includes/js/dojox/image/Gallery.js b/includes/js/dojox/image/Gallery.js new file mode 100644 index 0000000..d29ae22 --- /dev/null +++ b/includes/js/dojox/image/Gallery.js @@ -0,0 +1,182 @@ +if(!dojo._hasResource["dojox.image.Gallery"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.Gallery"] = true; +dojo.provide("dojox.image.Gallery"); +dojo.experimental("dojox.image.Gallery"); +// +// dojox.image.Gallery courtesy Shane O Sullivan, licensed under a Dojo CLA +// @author Copyright 2007 Shane O Sullivan (shaneosullivan1@gmail.com) +// +// For a sample usage, see http://www.skynet.ie/~sos/photos.php +// +// TODO: Make public, document params and privitize non-API conformant methods. +// document topics. + +dojo.require("dojo.fx"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); +dojo.require("dojox.image.ThumbnailPicker"); +dojo.require("dojox.image.SlideShow"); + +dojo.declare("dojox.image.Gallery", + [dijit._Widget, dijit._Templated], + { + // summary: + // Gallery widget that wraps a dojox.image.ThumbnailPicker and dojox.image.SlideShow widget + // + // imageHeight: Number + // Maximum height of an image in the SlideShow widget + imageHeight: 375, + + // imageWidth: Number + // Maximum width of an image in the SlideShow widget + imageWidth: 500, + + // pageSize: Number + // The number of records to retrieve from the data store per request. + pageSize: dojox.image.SlideShow.prototype.pageSize, + + // autoLoad: Boolean + // If true, images are loaded before the user views them. If false, an + // image is loaded when the user displays it. + autoLoad: true, + + // linkAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // URL to link to from an image, if any. + linkAttr: "link", + + // imageThumbAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // URL to the thumbnail image. + imageThumbAttr: "imageUrlThumb", + + // imageLargeAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // URL to the image. + imageLargeAttr: "imageUrl", + + // titleAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // title of the picture, if any. + titleAttr: "title", + + // slideshowInterval: Integer + // time in seconds, between image changes in the slide show. + slideshowInterval: 3, + + templateString:"
            \n\t
            \n\t
            \n
            \n", + + postCreate: function(){ + // summary: Initializes the widget, creates the ThumbnailPicker and SlideShow widgets + this.widgetid = this.id; + this.inherited(arguments) + + this.thumbPicker = new dojox.image.ThumbnailPicker({ + linkAttr: this.linkAttr, + imageLargeAttr: this.imageLargeAttr, + titleAttr: this.titleAttr, + useLoadNotifier: true, + size: this.imageWidth + }, this.thumbPickerNode); + + + this.slideShow = new dojox.image.SlideShow({ + imageHeight: this.imageHeight, + imageWidth: this.imageWidth, + autoLoad: this.autoLoad, + linkAttr: this.linkAttr, + imageLargeAttr: this.imageLargeAttr, + titleAttr: this.titleAttr, + slideshowInterval: this.slideshowInterval, + pageSize: this.pageSize + }, this.slideShowNode); + + var _this = this; + //When an image is shown in the Slideshow, make sure it is visible + //in the ThumbnailPicker + dojo.subscribe(this.slideShow.getShowTopicName(), function(packet){ + //if(packet.index < _this.thumbPicker._thumbIndex + // || packet.index > _this.thumbPicker._thumbIndex + _this.thumbPicker.numberThumbs -1){ + //if(!_this.thumbPicker.isVisible(packet.index)){ + //var index = packet.index - (packet.index % _this.thumbPicker.numberThumbs); + _this.thumbPicker._showThumbs(packet.index); + //} + }); + //When the user clicks a thumbnail, show that image + dojo.subscribe(this.thumbPicker.getClickTopicName(), function(evt){ + _this.slideShow.showImage(evt.index); + }); + //When the ThumbnailPicker moves to show a new set of pictures, + //make the Slideshow start loading those pictures first. + dojo.subscribe(this.thumbPicker.getShowTopicName(), function(evt){ + _this.slideShow.moveImageLoadingPointer(evt.index); + }); + //When an image finished loading in the slideshow, update the loading + //notification in the ThumbnailPicker + dojo.subscribe(this.slideShow.getLoadTopicName(), function(index){ + _this.thumbPicker.markImageLoaded(index); + }); + this._centerChildren(); + }, + + setDataStore: function(dataStore, request, /*optional*/paramNames){ + // summary: Sets the data store and request objects to read data from. + // dataStore: + // An implementation of the dojo.data.api.Read API. This accesses the image + // data. + // request: + // An implementation of the dojo.data.api.Request API. This specifies the + // query and paging information to be used by the data store + // paramNames: + // An object defining the names of the item attributes to fetch from the + // data store. The four attributes allowed are 'linkAttr', 'imageLargeAttr', + // 'imageThumbAttr' and 'titleAttr' + this.thumbPicker.setDataStore(dataStore, request, paramNames); + this.slideShow.setDataStore(dataStore, request, paramNames); + }, + + reset: function(){ + // summary: Resets the widget to its initial state + this.slideShow.reset(); + this.thumbPicker.reset(); + }, + + showNextImage: function(inTimer){ + // summary: Changes the image being displayed in the SlideShow to the next + // image in the data store + // inTimer: Boolean + // If true, a slideshow is active, otherwise the slideshow is inactive. + this.slideShow.showNextImage(); + }, + + toggleSlideshow: function(){ + // summary: Switches the slideshow mode on and off. + this.slideShow.toggleSlideshow(); + }, + + showImage: function(index, /*optional*/callback){ + // summary: Shows the image at index 'idx'. + // idx: Number + // The position of the image in the data store to display + // callback: Function + // Optional callback function to call when the image has finished displaying. + this.slideShow.showImage(index, callback); + }, + + _centerChildren: function() { + // summary: Ensures that the ThumbnailPicker and the SlideShow widgets + // are centered. + var thumbSize = dojo.marginBox(this.thumbPicker.outerNode); + var slideSize = dojo.marginBox(this.slideShow.outerNode); + + var diff = (thumbSize.w - slideSize.w) / 2; + + if(diff > 0) { + dojo.style(this.slideShow.outerNode, "marginLeft", diff + "px"); + } else if(diff < 0) { + dojo.style(this.thumbPicker.outerNode, "marginLeft", (diff * -1) + "px"); + } + } +}); + +} diff --git a/includes/js/dojox/image/Lightbox.js b/includes/js/dojox/image/Lightbox.js new file mode 100644 index 0000000..79056d3 --- /dev/null +++ b/includes/js/dojox/image/Lightbox.js @@ -0,0 +1,451 @@ +if(!dojo._hasResource["dojox.image.Lightbox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.Lightbox"] = true; +dojo.provide("dojox.image.Lightbox"); +dojo.experimental("dojox.image.Lightbox"); + +dojo.require("dijit.Dialog"); +dojo.require("dojox.fx._base"); + +dojo.declare("dojox.image.Lightbox", + dijit._Widget,{ + // summary: + // A dojo-based Lightbox implementation. + // + // description: + // An Elegant, keyboard accessible, markup and store capable Lightbox widget to show images + // in a modal dialog-esque format. Can show individual images as Modal dialog, or can group + // images with multiple entry points, all using a single "master" Dialog for visualization + // + // key controls: + // ESC - close + // Down Arrow / Rt Arrow / N - Next Image + // Up Arrow / Lf Arrow / P - Previous Image + // + // example: + // | show lightbox + // + // example: + // | show group lightbox + // | show group lightbox + // + // example: + // | not implemented fully yet, though works with basic datastore access. need to manually call + // | widget._attachedDialog.addImage(item,"fromStore") for each item in a store result set. + // |
            + // + // group: String + // Grouping images in a page with similar tags will provide a 'slideshow' like grouping of images + group: "", + + // title: String + // A string of text to be shown in the Lightbox beneath the image (empty if using a store) + title: "", + + // href; String + // Link to image to use for this Lightbox node (empty if using a store). + href: "", + + // duration: Integer + // Generic time in MS to adjust the feel of widget. could possibly add various + // durations for the various actions (dialog fadein, sizeing, img fadein ...) + duration: 500, + + // _allowPassthru: Boolean + // Privately set this to disable/enable natural link of anchor tags + _allowPassthru: false, + + // _attachedDialg: dojox.image._LightboxDialog + // The pointer to the global lightbox dialog for this widget + _attachedDialog: null, // try to share a single underlay per page? + + startup: function(){ + this.inherited(arguments); + // setup an attachment to the masterDialog (or create the masterDialog) + var tmp = dijit.byId('dojoxLightboxDialog'); + if(tmp){ + this._attachedDialog = tmp; + }else{ + // this is the first instance to start, so we make the masterDialog + this._attachedDialog = new dojox.image._LightboxDialog({ id: "dojoxLightboxDialog" }); + this._attachedDialog.startup(); + } + if(!this.store){ + // FIXME: full store support lacking, have to manually call this._attachedDialog.addImage(imgage,group) as it stands + this._addSelf(); + this.connect(this.domNode, "onclick", "_handleClick"); + } + }, + + _addSelf: function(){ + // summary: Add this instance to the master LightBoxDialog + this._attachedDialog.addImage({ + href: this.href, + title: this.title + },this.group||null); + }, + + _handleClick: function(/* Event */e){ + // summary: Handle the click on the link + if(!this._allowPassthru){ e.preventDefault(); } + else{ return; } + this.show(); + }, + + show: function(){ + // summary: Show the Lightbox with this instance as the starting point + this._attachedDialog.show(this); + }, + + disable: function(){ + // summary: Disables event clobbering and dialog, and follows natural link + this._allowPassthru = true; + }, + + enable: function(){ + // summary: Enables the dialog (prevents default link) + this._allowPassthru = false; + } + +}); + +dojo.declare("dojox.image._LightboxDialog", + dijit.Dialog,{ + // summary: + // The "dialog" shared between any Lightbox instances on the page + // + // description: + // + // A widget that intercepts anchor links (typically around images) + // and displays a modal Dialog. this is the actual Dialog, which you can + // create and populate manually, though should use simple Lightbox's + // unless you need to direct access. + // + // There should only be one of these on a page, so all dojox.image.Lightbox's will us it + // (the first instance of a Lightbox to be show()'n will create me If i do not exist) + // + // title: String + // The current title, read from object passed to show() + title: "", + + // FIXME: implement titleTemplate + + // inGroup: Array + // Array of objects. this is populated by from the JSON object _groups, and + // should not be populate manually. it is a placeholder for the currently + // showing group of images in this master dialog + inGroup: null, + + // imgUrl: String + // The src="" attribute of our imageNode (can be null at statup) + imgUrl: "", + + // errorMessage: String + // The text to display when an unreachable image is linked + errorMessage: "Image not found.", + + // adjust: Boolean + // If true, ensure the image always stays within the viewport + // more difficult than necessary to disable, but enabled by default + // seems sane in most use cases. + adjust: true, + + // an object of arrays, each array (of objects) being a unique 'group' + _groups: { XnoGroupX: [] }, + + // errorImg: Url + // Path to the image used when a 404 is encountered + errorImg: dojo.moduleUrl("dojox.image","resources/images/warning.png"), + + // privates: + _imageReady: false, + _blankImg: dojo.moduleUrl("dojo","resources/blank.gif"), + _clone: null, // the "untained" image + _wasStyled: null, // indicating taint on the imgNode + + // animation holders: + _loadingAnim:null, + _showImageAnim: null, + _showNavAnim: null, + _animConnects: [], + + templateString:"
            \n\t
            \n\t\t
            \n\t\t\t\"${title}\"\n\t\t\t
            \n\t\t\t\t
            \n\t\t\t\t
            \t\n\t\t\t\t
            \n\n\t\t\t\t
            ${title}
            \n\t\t\t
            \n\t\t
            \t\n\t\t\n\t
            \n
            \n", + + startup: function(){ + // summary: Add some extra event handlers, and startup our superclass. + + this.inherited(arguments); + this._clone = dojo.clone(this.imgNode); + this.connect(document.documentElement,"onkeypress","_handleKey"); + this.connect(window,"onresize","_position"); + this.connect(this.nextNode, "onclick", "_nextImage"); + this.connect(this.prevNode, "onclick", "_prevImage"); + this.connect(this.closeNode, "onclick", "hide"); + this._makeAnims(); + this._vp = dijit.getViewport(); + + }, + + show: function(/* Object */groupData){ + // summary: Show the Master Dialog. Starts the chain of events to show + // an image in the dialog, including showing the dialog if it is + // not already visible + // + // groupData: Object + // needs href and title attributes. the values for this image. + + var _t = this; // size + + // we only need to call dijit.Dialog.show() if we're not already open. + if(!_t.open){ _t.inherited(arguments); } + + if(this._wasStyled){ + // ugly fix for IE being stupid: + dojo._destroyElement(_t.imgNode); + _t.imgNode = dojo.clone(_t._clone); + dojo.place(_t.imgNode,_t.imageContainer,"first"); + _t._makeAnims(); + _t._wasStyled = false; + } + + dojo.style(_t.imgNode,"opacity","0"); + dojo.style(_t.titleNode,"opacity","0"); + + _t._imageReady = false; + _t.imgNode.src = groupData.href; + + if((groupData.group && groupData !== "XnoGroupX") || _t.inGroup){ + if(!_t.inGroup){ + _t.inGroup = _t._groups[(groupData.group)]; + // determine where we were or are in the show + dojo.forEach(_t.inGroup,function(g,i){ + if(g.href == groupData.href){ + _t._positionIndex = i; + } + },_t); + } + if(!_t._positionIndex){ + _t._positionIndex=0; + _t.imgNode.src = _t.inGroup[_t._positionIndex].href; + } + // FIXME: implement titleTemplate + _t.groupCount.innerHTML = " (" +(_t._positionIndex+1) +" of "+_t.inGroup.length+")"; + _t.prevNode.style.visibility = "visible"; + _t.nextNode.style.visibility = "visible"; + }else{ + // single images don't have buttons, or counters: + _t.groupCount.innerHTML = ""; + _t.prevNode.style.visibility = "hidden"; + _t.nextNode.style.visibility = "hidden"; + } + _t.textNode.innerHTML = groupData.title; + + if(!_t._imageReady || _t.imgNode.complete === true){ + // connect to the onload of the image + _t._imgConnect = dojo.connect(_t.imgNode, "onload", _t, function(){ + _t._imageReady = true; + _t.resizeTo({ + w: _t.imgNode.width, + h: _t.imgNode.height, + duration:_t.duration + }); + // cleanup + dojo.disconnect(_t._imgConnect); + if(_t._imgError){ dojo.disconnect(_t._imgError); } + }); + + // listen for 404's: + _t._imgError = dojo.connect(_t.imgNode, "onerror", _t, function(){ + dojo.disconnect(_t._imgError); + // trigger the above onload with a new src: + _t.imgNode.src = _t.errorImg; + _t._imageReady = true; + _t.textNode.innerHTML = _t.errorMessage; + }); + + // onload doesn't fire in IE if you connect before you set the src. + // hack to re-set the src after onload connection made: + if(dojo.isIE){ _t.imgNode.src = _t.imgNode.src; } + + }else{ + // do it quickly. kind of a hack, but image is ready now + _t.resizeTo({ w: _t.imgNode.width, h: _t.imgNode.height, duration: 1 }); + } + + }, + + _nextImage: function(){ + // summary: Load next image in group + if(!this.inGroup){ return; } + if(this._positionIndex+1 this._vp.h || size.w + 50 > this._vp.w)){ + size = this._scaleToFit(size); + } + + var _sizeAnim = dojox.fx.sizeTo({ + node: this.containerNode, + duration: size.duration||this.duration, + width: size.w, + height: size.h + 30 + }); + this.connect(_sizeAnim,"onEnd","_showImage"); + _sizeAnim.play(15); + }, + + _showImage: function(){ + // summary: Fade in the image, and fire showNav + this._showImageAnim.play(1); + }, + + _showNav: function(){ + // summary: Fade in the footer, and setup our connections. + this._showNavAnim.play(1); + }, + + hide: function(){ + // summary: Hide the Master Lightbox + dojo.fadeOut({node:this.titleNode, duration:200, + onEnd: dojo.hitch(this,function(){ + // refs #5112 - if you _don't_ change the .src, safari will _never_ fire onload for this image + this.imgNode.src = this._blankImg; + }) + }).play(5); + this.inherited(arguments); + this.inGroup = null; + this._positionIndex = null; + }, + + addImage: function(child, group){ + // summary: Add an image to this Master Lightbox + // + // child: Object + // The image information to add. + // href: String - link to image (required) + // title: String - title to display + // + // group: String? + // attach to group of similar tag or null for individual image instance + var g = group; + if(!child.href){ return; } + if(g){ + if(!this._groups[g]){ + this._groups[g] = []; + } + this._groups[g].push(child); + }else{ this._groups["XnoGroupX"].push(child); } + }, + + _handleKey: function(/* Event */e){ + // summary: Handle keyboard navigation internally + if(!this.open){ return; } + + var dk = dojo.keys; + var key = (e.charCode == dk.SPACE ? dk.SPACE : e.keyCode); + switch(key){ + + case dk.ESCAPE: this.hide(); break; + + case dk.DOWN_ARROW: + case dk.RIGHT_ARROW: + case 78: // key "n" + this._nextImage(); break; + + case dk.UP_ARROW: + case dk.LEFT_ARROW: + case 80: // key "p" + this._prevImage(); break; + } + }, + + _scaleToFit: function(/* Object */size){ + // summary: resize an image to fit within the bounds of the viewport + // size: Object + // The 'size' object passed around for this image + var ns = {}; + + // one of the dimensions is too big, go with the smaller viewport edge: + if(this._vp.h > this._vp.w){ + // don't actually touch the edges: + ns.w = this._vp.w - 70; + ns.h = ns.w * (size.h / size.w); + }else{ + // give a little room for the titlenode, too: + ns.h = this._vp.h - 80; + ns.w = ns.h * (size.w / size.h); + } + + // trigger the nasty width="auto" workaround in show() + this._wasStyled = true; + + // we actually have to style this image, it's too big + var s = this.imgNode.style; + s.height = ns.h + "px"; + s.width = ns.w + "px"; + + ns.duration = size.duration; + return ns; // Object + + }, + + _position: function(/* Event */e){ + // summary: we want to know the viewport size any time it changes + this.inherited(arguments); + this._vp = dijit.getViewport(); + }, + + _makeAnims: function(){ + // summary: make and cleanup animation and animation connections + + dojo.forEach(this._animConnects,dojo.disconnect); + this._animConnects = []; + this._showImageAnim = dojo.fadeIn({ + node: this.imgNode, + duration: this.duration + }); + this._animConnects.push(dojo.connect(this._showImageAnim, "onEnd", this, "_showNav")); + this._loadingAnim = dojo.fx.combine([ + dojo.fadeOut({ node:this.imgNode, duration:175 }), + dojo.fadeOut({ node:this.titleNode, duration:175 }) + ]); + this._animConnects.push(dojo.connect(this._loadingAnim, "onEnd", this, "_prepNodes")); + this._showNavAnim = dojo.fadeIn({ node: this.titleNode, duration:225 }); + } +}); + +} diff --git a/includes/js/dojox/image/Magnifier.js b/includes/js/dojox/image/Magnifier.js new file mode 100644 index 0000000..b6a3923 --- /dev/null +++ b/includes/js/dojox/image/Magnifier.js @@ -0,0 +1,75 @@ +if(!dojo._hasResource["dojox.image.Magnifier"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.Magnifier"] = true; +dojo.provide("dojox.image.Magnifier"); + +dojo.require("dojox.gfx"); +dojo.require("dojox.image.MagnifierLite"); + +dojo.declare("dojox.image.Magnifier", + [dojox.image.MagnifierLite],{ + // summary: Adds magnification on a portion of an image element, using dojox.gfx + // + // description: An unobtrusive way to add an unstyled overlay + // above the srcNode image element. The overlay/glass is a + // scaled version of the src image (so larger images sized down + // are clearer). + // + // over-ride the _createGlass method to create your custom surface, + // being sure to create an img node on that surface. + + _createGlass: function(){ + // summary: create the glassNode, and an img on a dojox.gfx surface + + // images are hard to make into workable templates, so just add outer overlay + // and skip using dijit._Templated + this.glassNode = dojo.doc.createElement('div'); + this.surfaceNode = this.glassNode.appendChild(dojo.doc.createElement('div')); + + dojo.addClass(this.glassNode,"glassNode"); + dojo.body().appendChild(this.glassNode); + + with(this.glassNode.style){ + height = this.glassSize + "px"; + width = this.glassSize + "px"; + } + + this.surface = dojox.gfx.createSurface(this.surfaceNode, this.glassSize, this.glassSize); + this.img = this.surface.createImage({ + src:this.domNode.src, + width:this._zoomSize.w, + height:this._zoomSize.h + }); + + }, + + _placeGlass: function(e){ + // summary: position the overlay centered under the cursor + var x = e.pageX - 2; + var y = e.pageY - 2 ; + var xMax = this.offset.x + this.offset.w + 2; + var yMax = this.offset.y + this.offset.h + 2; + + // with svg, our mouseout connection to the image surface doesn't + // fire, so we'r have to manually calculate offsets + if(xxMax || y>yMax){ + this._hideGlass(); + }else{ + this.inherited(arguments); + } + }, + + _setImage: function(e){ + // summary: set the image's offset in the clipping window relative to the mouse position + + var xOff = (e.pageX - this.offset.l) / this.offset.w; + var yOff = (e.pageY - this.offset.t) / this.offset.h; + var x = (this._zoomSize.w * xOff * -1)+(this.glassSize*xOff); + var y = (this._zoomSize.h * yOff * -1)+(this.glassSize*yOff); + // set the image offset + this.img.setShape({ x: x, y:y }); + + } + +}); + +} diff --git a/includes/js/dojox/image/MagnifierLite.js b/includes/js/dojox/image/MagnifierLite.js new file mode 100644 index 0000000..2e37340 --- /dev/null +++ b/includes/js/dojox/image/MagnifierLite.js @@ -0,0 +1,126 @@ +if(!dojo._hasResource["dojox.image.MagnifierLite"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.MagnifierLite"] = true; +dojo.provide("dojox.image.MagnifierLite"); +dojo.experimental("dojox.image.MagnifierLite"); + +dojo.require("dijit._Widget"); + +dojo.declare("dojox.image.MagnifierLite", + [dijit._Widget],{ + // summary: Adds magnification on a portion of an image element + // + // description: An unobtrusive way to add an unstyled overlay + // above the srcNode image element. The overlay/glass is a + // scaled version of the src image (so larger images sized down + // are clearer). + // + // The logic behind requiring the src image to be large is + // "it's going to be downloaded, anyway" so this method avoids + // having to make thumbnails and 2 http requests among other things. + // + // glassSize: Int + // the width and height of the bounding box + glassSize: 125, + + // scale: Decimal + // the multiplier of the Mangification. + scale: 6, + + postCreate: function(){ + this.inherited(arguments); + + // images are hard to make into workable templates, so just add outer overlay + // and skip using dijit._Templated + this._adjustScale(); + this._createGlass(); + + this.connect(this.domNode,"onmouseenter","_showGlass"); + this.connect(this.glassNode,"onmousemove","_placeGlass"); + this.connect(this.img,"onmouseout","_hideGlass"); + + // when position of domNode changes, _adjustScale needs to run. + // window.resize isn't it always, FIXME: + this.connect(window,"onresize","_adjustScale"); + + }, + + _createGlass: function(){ + // summary: make img and glassNode elements as children of the body + + this.glassNode = dojo.doc.createElement('div'); + this.surfaceNode = this.glassNode.appendChild(dojo.doc.createElement('div')); + dojo.addClass(this.glassNode,"glassNode"); + dojo.body().appendChild(this.glassNode); + with(this.glassNode.style){ + height = this.glassSize + "px"; + width = this.glassSize + "px"; + } + + this.img = dojo.doc.createElement('img'); + this.glassNode.appendChild(this.img); + this.img.src = this.domNode.src; + // float the image around inside the .glassNode + with(this.img.style){ + position = "relative"; + top = 0; left = 0; + width = this._zoomSize.w+"px"; + height = this._zoomSize.h+"px"; + } + + }, + + _adjustScale: function(){ + // summary: update the calculations should this.scale change + + this.offset = dojo.coords(this.domNode,true); + this._imageSize = { w: this.offset.w, h:this.offset.h }; + this._zoomSize = { + w: this._imageSize.w * this.scale, + h: this._imageSize.h * this.scale + }; + }, + + _showGlass: function(e){ + // summary: show the overlay + this._placeGlass(e); + with(this.glassNode.style){ + visibility = "visible"; + display = ""; + } + + }, + + _hideGlass: function(e){ + // summary: hide the overlay + this.glassNode.style.visibility = "hidden"; + this.glassNode.style.display = "none"; + }, + + _placeGlass: function(e){ + // summary: position the overlay centered under the cursor + + this._setImage(e); + var t = Math.floor(e.pageY - (this.glassSize/2)); + var l = Math.floor(e.pageX - (this.glassSize/2)); + dojo.style(this.glassNode,"top",t); + dojo.style(this.glassNode,"left",l); + + }, + + _setImage: function(e){ + // summary: set the image's offset in the clipping window relative to the mouse position + + var xOff = (e.pageX - this.offset.l) / this.offset.w; + var yOff = (e.pageY - this.offset.t) / this.offset.h; + var x = (this._zoomSize.w * xOff * -1)+(this.glassSize*xOff); + var y = (this._zoomSize.h * yOff * -1)+(this.glassSize*yOff); + with(this.img.style){ + top = y+"px"; + left = x+"px"; + } + + } + +}); + +} diff --git a/includes/js/dojox/image/README b/includes/js/dojox/image/README new file mode 100644 index 0000000..38e9c3d --- /dev/null +++ b/includes/js/dojox/image/README @@ -0,0 +1,66 @@ +------------------------------------------------------------------------------- +dojox.image +------------------------------------------------------------------------------- +Version 1.0 +Release date: 10/31/07 +------------------------------------------------------------------------------- +Project state: +prototype | experimental +------------------------------------------------------------------------------- +Credits + Peter Higgins (dante) + Shane O'Sullivan (shaneosullivan1@gmail.com) +------------------------------------------------------------------------------- +Project description + + A class to provide a common API for images, and home for image + related Widgets. + +------------------------------------------------------------------------------- +Dependencies: + + LightBox: dojo core, dojox.fx and optionally dojox.data. uses + either tundra or soria theme, no standalone icons. + + SlideShow: dojo core, dojo.fx, and dojo.data (optional + dojox.data store implementations apply) + + ThumbNailPicker: dojo core, dojo.fx and dojo.data. Combined + with a SlideShow, creates a sample Gallery app. + + Gallery: core, dojox.image.SlideShow, dojox.image.ThumbNailPicker + + Magnifier: dojo core, dijit._Widget, dojox.gfx + +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/dojo/dojox/trunk/image/* + +Install into the following directory structure: +/dojox/image/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- +Additional Notes + + LightBox: currently works as individual items, and grouped items, + but usage of dojo.data is broken (atm). the API is subject to + change, and is marked accordingly. + + Hoping to implement: Carossel, and Reflect using + a common API provided by dojox.image.Pane (?) + + SlideShow: Shows an image, one by one, from a datastore. Acts + as standing ImagePane implementation, + + Gallery: A combination Thumbnail view and SlideShow, using + a datastore, and providing navigation, and common API. + + Magnifier: Unobtrusive way to attach a hovering window window + when moving the mouse over an image. The window shows a a zoomed + version of the original source. (experimental) diff --git a/includes/js/dojox/image/SlideShow.js b/includes/js/dojox/image/SlideShow.js new file mode 100644 index 0000000..4767cf1 --- /dev/null +++ b/includes/js/dojox/image/SlideShow.js @@ -0,0 +1,598 @@ +if(!dojo._hasResource["dojox.image.SlideShow"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.SlideShow"] = true; +dojo.provide("dojox.image.SlideShow"); +// +// dojox.image.SlideShow courtesy Shane O Sullivan, licensed under a Dojo CLA +// For a sample usage, see http://www.skynet.ie/~sos/photos.php +// +// @author Copyright 2007 Shane O Sullivan (shaneosullivan1@gmail.com) +// +// TODO: more cleanups +// +dojo.require("dojo.string"); +dojo.require("dojo.fx"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); + +dojo.declare("dojox.image.SlideShow", + [dijit._Widget, dijit._Templated], + { + // summary: A Slideshow Widget + + // imageHeight: Number + // The maximum height of an image + imageHeight: 375, + + // imageWidth: Number + // The maximum width of an image. + imageWidth: 500, + + // title: String + // the initial title of the SlideShow + title: "", + + // titleTemplate: String + // a way to customize the wording in the title. supported parameters to be populated are: + // ${title} = the passed title of the image + // ${current} = the current index of the image + // ${total} = the total number of images in the SlideShow + // + // should add more? + titleTemplate: '${title} (${current} of ${total})', + + // noLink: Boolean + // Prevents the slideshow from putting an anchor link around the displayed image + // enables if true, though still will not link in absence of a url to link to + noLink: false, + + // loop: Boolean + // true/false - make the slideshow loop + loop: true, + + // hasNav: Boolean + // toggle to enable/disable the visual navigation controls + hasNav: true, + + // images: Array + // Contains the DOM nodes that individual images are stored in when loaded or loading. + images: [], + + // pageSize: Number + // The number of images to request each time. + pageSize: 20, + + // autoLoad: Boolean + // If true, then images are preloaded, before the user navigates to view them. + // If false, an image is not loaded until the user views it. + autoLoad: true, + + // autoStart: Boolean + // If true, the SlideShow begins playing immediately + autoStart: false, + + // fixedHeight: Boolean + // If true, the widget does not resize itself to fix the displayed image. + fixedHeight: false, + + // imageStore: Object + // Implementation of the dojo.data.api.Read API, which provides data on the images + // to be displayed. + imageStore: null, + + // linkAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // URL to link to from an image, if any. + linkAttr: "link", + + // imageLargeAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // URL to the image. + imageLargeAttr: "imageUrl", + + // titleAttr: String + // Defines the name of the attribute to request from the store to retrieve the + // title of the picture, if any. + titleAttr: "title", + + // slideshowInterval: Number + // Time, in seconds, between image transitions during a slideshow. + slideshowInterval: 3, + + templateString:"
            \n\t
            \n\t\t
            \n\t\t\t
            ${title}
            \n\t\t
            \n\t\t
            \n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
            \n\t\t
            \t\t\n\t\t
            \n\t
            \n
            \n", + + // _tempImgPath: URL + // URL to the image to display when an image is not yet fully loaded. + _tempImgPath: dojo.moduleUrl("dojo", "resources/blank.gif"), + + // _imageCounter: Number + // A counter to keep track of which index image is to be loaded next + _imageCounter: 0, + + // _tmpImage: DomNode + // The temporary image to show when a picture is loading. + _tmpImage: null, + + // _request: Object + // Implementation of the dojo.data.api.Request API, which defines the query + // parameters for accessing the store. + _request: null, + + postCreate: function(){ + // summary: Initilizes the widget, sets up listeners and shows the first image + this.inherited(arguments); + var img = document.createElement("img"); + + // FIXME: should API be to normalize an image to fit in the specified height/width? + img.setAttribute("width", this.imageWidth); + img.setAttribute("height", this.imageHeight); + + if(this.hasNav){ + dojo.connect(this.outerNode, "onmouseover", function(evt){ + try{_this._showNav();} + catch(e){} //TODO: remove try/catch + }); + dojo.connect(this.outerNode, "onmouseout", function(evt){ + try{_this._hideNav(evt);} + catch(e){} //TODO: remove try/catch + }); + } + + this.outerNode.style.width = this.imageWidth + "px"; + + img.setAttribute("src", this._tempImgPath); + var _this = this; + + this.largeNode.appendChild(img); + this._tmpImage = this._currentImage = img; + this._fitSize(true); + + this._loadImage(0, function(){ + _this.showImage(0); + }); + this._calcNavDimensions(); + }, + + setDataStore: function(dataStore, request, /*optional*/paramNames){ + // summary: Sets the data store and request objects to read data from. + // dataStore: + // An implementation of the dojo.data.api.Read API. This accesses the image + // data. + // request: + // An implementation of the dojo.data.api.Request API. This specifies the + // query and paging information to be used by the data store + // paramNames: + // An object defining the names of the item attributes to fetch from the + // data store. The three attributes allowed are 'linkAttr', 'imageLargeAttr' and 'titleAttr' + this.reset(); + var _this = this; + + this._request = { + query: {}, + start: request.start || 0, + count: request.count || this.pageSize, + onBegin: function(count, request){ + _this.maxPhotos = count; + } + }; + if(request.query){ dojo.mixin(this._request.query, request.query); } + if(paramNames){ + dojo.forEach(["imageLargeAttr", "linkAttr", "titleAttr"], function(attrName){ + if(paramNames[attrName]){ this[attrName] = paramNames[attrName]; } + }, this); + } + + var _complete = function(items){ + _this.showImage(0); + _this._request.onComplete = null; + if(_this.autoStart){ + _this.toggleSlideShow(); + } + }; + + this.imageStore = dataStore; + this._request.onComplete = _complete; + this._request.start = 0; + this.imageStore.fetch(this._request); + }, + + reset: function(){ + // summary: Resets the widget to its initial state + // description: Removes all previously loaded images, and clears all caches. + while(this.largeNode.firstChild){ + this.largeNode.removeChild(this.largeNode.firstChild); + } + this.largeNode.appendChild(this._tmpImage); + while(this.hiddenNode.firstChild){ + this.hiddenNode.removeChild(this.hiddenNode.firstChild); + } + dojo.forEach(this.images, function(img){ + if(img && img.parentNode){ img.parentNode.removeChild(img); } + }); + this.images = []; + this.isInitialized = false; + this._imageCounter = 0; + }, + + isImageLoaded: function(index){ + // summary: Returns true if image at the specified index is loaded, false otherwise. + // index: + // The number index in the data store to check if it is loaded. + return this.images && this.images.length > index && this.images[index]; + }, + + moveImageLoadingPointer: function(index){ + // summary: If 'autoload' is true, this tells the widget to start loading + // images from the specified pointer. + // index: + // The number index in the data store to start loading images from. + this._imageCounter = index; + }, + + destroy: function(){ + // summary: Cleans up the widget when it is being destroyed + if(this._slideId) { this._stop(); } + this.inherited(arguments); + }, + + showNextImage: function(inTimer, forceLoop){ + // summary: Changes the image being displayed to the next image in the data store + // inTimer: Boolean + // If true, a slideshow is active, otherwise the slideshow is inactive. + if(inTimer && this._timerCancelled){return false;} + + if(this.imageIndex + 1 >= this.maxPhotos){ + if(inTimer && (this.loop || forceLoop)){ this.imageIndex = -1; } + else{ + if(this._slideId){ this._stop(); } + return false; + } + } + var _this = this; + this.showImage(this.imageIndex + 1, function(){ + if(inTimer){ _this._startTimer(); } + }); + return true; + }, + + toggleSlideShow: function(){ + // summary: Switches the slideshow mode on and off. + if(this._slideId){ + this._stop(); + }else{ + dojo.toggleClass(this.domNode,"slideShowPaused"); + this._timerCancelled = false; + var success = this.showNextImage(true, true); + if(!success){ + this._stop(); + } + } + }, + + getShowTopicName: function(){ + // summary: Returns the topic id published to when an image is shown + // description: + // The information published is: index, title and url + return (this.widgetId || this.id) + "/imageShow"; + }, + + getLoadTopicName: function(){ + // summary: Returns the topic id published to when an image finishes loading. + // description: + // The information published is the index position of the image loaded. + return (this.widgetId ? this.widgetId : this.id) + "/imageLoad"; + }, + + showImage: function(index, /* Function? */callback){ + // summary: Shows the image at index 'index'. + // index: Number + // The position of the image in the data store to display + // callback: Function + // Optional callback function to call when the image has finished displaying. + + if(!callback && this._slideId){ this.toggleSlideShow(); } + var _this = this; + var current = this.largeNode.getElementsByTagName("div"); + this.imageIndex = index; + + var showOrLoadIt = function() { + //If the image is already loaded, then show it. + if(_this.images[index]){ + while(_this.largeNode.firstChild){ + _this.largeNode.removeChild(_this.largeNode.firstChild); + } + _this.images[index].style.opacity = 0; + _this.largeNode.appendChild(_this.images[index]); + _this._currentImage = _this.images[index]._img; + _this._fitSize(); + + var onEnd = function(a,b,c) { + var img = _this.images[index].firstChild; + if(img.tagName.toLowerCase() != "img"){img = img.firstChild;} + title = img.getAttribute("title"); + + if(_this._navShowing){ + _this._showNav(true); + } + dojo.publish(_this.getShowTopicName(), [{ + index: index, + title: title, + url: img.getAttribute("src") + }]); + if(callback) { callback(a,b,c); } + _this._setTitle(title); + }; + + dojo.fadeIn({ + node: _this.images[index], + duration: 300, + onEnd: onEnd + }).play(); + }else{ + //If the image is not loaded yet, load it first, then show it. + _this._loadImage(index, function(){ + dojo.publish(_this.getLoadTopicName(), [index]); + _this.showImage(index, callback); + }); + } + }; + + //If an image is currently showing, fade it out, then show + //the new image. Otherwise, just show the new image. + if(current && current.length > 0){ + dojo.fadeOut({ + node: current[0], + duration: 300, + onEnd: function(){ + _this.hiddenNode.appendChild(current[0]); + showOrLoadIt(); + } + }).play(); + }else{ + showOrLoadIt(); + } + }, + + _fitSize: function(force){ + // summary: Fits the widget size to the size of the image being shown, + // or centers the image, depending on the value of 'fixedHeight' + // force: Boolean + // If true, the widget is always resized, regardless of the value of 'fixedHeight' + if(!this.fixedHeight || force){ + var height = (this._currentImage.height + (this.hasNav ? 20:0)); + dojo.style(this.innerWrapper, "height", height + "px"); + return; + } + dojo.style(this.largeNode, "paddingTop", this._getTopPadding() + "px"); + }, + + _getTopPadding: function(){ + if(!this.fixedHeight){return 0;} + // summary: Returns the padding to place at the top of the image to center it vertically. + return (this.imageHeight - this._currentImage.height)/2; + }, + + _loadNextImage: function(){ + //summary: Load the next unloaded image. + if(!this.autoLoad){ return; } + while(this.images.length >= this._imageCounter && this.images[this._imageCounter]){ + this._imageCounter++; + } + this._loadImage(this._imageCounter); + }, + + _loadImage: function(index, callbackFn){ + // summary: Load image at specified index + // description: + // This function loads the image at position 'index' into the + // internal cache of images. This does not cause the image to be displayed. + // index: + // The position in the data store to load an image from. + // callbackFn: + // An optional function to execute when the image has finished loading. + if(this.images[index] || !this._request) { return; } + + var pageStart = index - (index % this.pageSize); + + this._request.start = pageStart; + + this._request.onComplete = function(items){ + var diff = index - pageStart; + if(items && items.length > diff){ + loadIt(items[diff]); + }else{ /* Squelch - console.log("Got an empty set of items"); */ } + } + + var _this = this; + var loadIt = function(item){ + var url = _this.imageStore.getValue(item, _this.imageLargeAttr); + var img = document.createElement("img"); + var div = document.createElement("div"); + div._img = img; + + var link = _this.imageStore.getValue(item,_this.linkAttr); + if(!link || _this.noLink){ div.appendChild(img); + }else{ + var a = document.createElement("a"); + a.setAttribute("href", link); + a.setAttribute("target","_blank"); + div.appendChild(a); + a.appendChild(img); + } + + div.setAttribute("id",_this.id + "_imageDiv" + index); + dojo.connect(img, "onload", function(){ + _this._fitImage(img); + div.setAttribute("width",_this.imageWidth); + div.setAttribute("height",_this.imageHeight); + + dojo.publish(_this.getLoadTopicName(), [index]); + _this._loadNextImage(); + if(callbackFn){ callbackFn(); } + }); + _this.hiddenNode.appendChild(div); + + var titleDiv = document.createElement("div"); + dojo.addClass(titleDiv, "slideShowTitle"); + div.appendChild(titleDiv); + + _this.images[index] = div; + img.setAttribute("src", url); + + var title = _this.imageStore.getValue(item,_this.titleAttr); + if(title){ img.setAttribute("title",title); } + } + this.imageStore.fetch(this._request); + }, + + _stop: function(){ + // summary: Stops a running slide show. + if(this._slideId){ clearTimeout(this._slideId); } + this._slideId = null; + this._timerCancelled = true; + dojo.removeClass(this.domNode,"slideShowPaused"); + }, + + _prev: function(){ + // summary: Show the previous image. + // FIXME: either pull code from showNext/prev, or call it here + if(this.imageIndex < 1){ return; } + this.showImage(this.imageIndex - 1); + }, + + _next: function(){ + // summary: Show the next image + this.showNextImage(); + }, + + _startTimer: function(){ + // summary: Starts a timeout to show the next image when a slide show is active + var id = this.id; + this._slideId = setTimeout(function(){dijit.byId(id).showNextImage(true);}, this.slideshowInterval * 1000); + }, + + _calcNavDimensions: function() { + // summary: + // Calculates the dimensions of the navigation controls + dojo.style(this.navNode, "position", "absolute"); + + //Place the navigation controls far off screen + dojo.style(this.navNode, "top", "-10000px"); + + //Make the navigation controls visible + dojo._setOpacity(this.navNode, 99); + + this.navPlay._size = dojo.marginBox(this.navPlay); + this.navPrev._size = dojo.marginBox(this.navPrev); + this.navNext._size = dojo.marginBox(this.navNext); + + dojo._setOpacity(this.navNode, 0); + dojo.style(this.navNode, "position", ""); + dojo.style(this.navNode, "top", ""); + }, + + _setTitle: function(title){ + // summary: Sets the title of the image to be displayed + // title: String + // The String title of the image + this.titleNode.innerHTML = dojo.string.substitute(this.titleTemplate, + { title: title, current: 1 + this.imageIndex, total: this.maxPhotos}); + }, + + _fitImage: function(img) { + // summary: Ensures that the image width and height do not exceed the maximum. + // img: Node + // The image DOM node to optionally resize + var width = img.width; + var height = img.height; + + if(width > this.imageWidth){ + height = Math.floor(height * (this.imageWidth / width)); + img.setAttribute("height", height + "px"); + img.setAttribute("width", this.imageWidth + "px"); + } + if(height > this.imageHeight){ + width = Math.floor(width * (this.imageHeight / height)); + img.setAttribute("height", this.imageHeight + "px"); + img.setAttribute("width", width + "px"); + } + }, + + _handleClick: function(/* Event */e){ + // summary: Performs navigation on the images based on users mouse clicks + // e: + // An Event object + switch(e.target){ + case this.navNext:this._next(); break; + case this.navPrev:this._prev(); break; + case this.navPlay:this.toggleSlideShow(); break; + } + }, + + _showNav: function(force){ + // summary: + // Shows the navigation controls + // force: Boolean + // If true, the navigation controls are repositioned even if they are + // currently visible. + if(this._navShowing && !force){return;} + dojo.style(this.navNode, "marginTop", "0px"); + dojo.style(this.navPlay, "marginLeft", "0px"); + var wrapperSize = dojo.marginBox(this.outerNode); + + var margin = this._currentImage.height - this.navPlay._size.h - 10 + this._getTopPadding(); + + if(margin > this._currentImage.height){margin += 10;} + dojo[this.imageIndex < 1 ? "addClass":"removeClass"](this.navPrev, "slideShowCtrlHide"); + dojo[this.imageIndex + 1 >= this.maxPhotos ? "addClass":"removeClass"](this.navNext, "slideShowCtrlHide"); + + var _this = this; + if(this._navAnim) { + this._navAnim.stop(); + } + if(this._navShowing){return;} + this._navAnim = dojo.fadeIn({node: this.navNode, duration: 300, + onEnd: function(){_this._navAnim=null;}}); + + this._navAnim.play(); + this._navShowing = true; + }, + + _hideNav: function(/* Event */e){ + // summary: Hides the navigation controls + // e: Event + // The DOM Event that triggered this function + if(!e || !this._overElement(this.outerNode, e)) { + var _this = this; + if(this._navAnim) { + this._navAnim.stop(); + } + this._navAnim = dojo.fadeOut({node: this.navNode,duration:300, + onEnd: function(){_this._navAnim=null;}}); + this._navAnim.play(); + this._navShowing = false; + } + }, + + _overElement: function(/*DomNode*/element, /*Event*/e){ + // summary: + // Returns whether the mouse is over the passed element. + // Element must be display:block (ie, not a ) + + //When the page is unloading, if this method runs it will throw an + //exception. + if(typeof(dojo)=="undefined"){return false;} + element = dojo.byId(element); + var m = {x: e.pageX, y: e.pageY}; + var bb = dojo._getBorderBox(element); + var absl = dojo.coords(element, true); + var left = absl.x; + + return (m.x >= left + && m.x <= (left + bb.w) + && m.y >= absl.y + && m.y <= (top + bb.h) + ); // boolean + } +}); + +} diff --git a/includes/js/dojox/image/ThumbnailPicker.js b/includes/js/dojox/image/ThumbnailPicker.js new file mode 100644 index 0000000..42f9862 --- /dev/null +++ b/includes/js/dojox/image/ThumbnailPicker.js @@ -0,0 +1,535 @@ +if(!dojo._hasResource["dojox.image.ThumbnailPicker"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.image.ThumbnailPicker"] = true; +dojo.provide("dojox.image.ThumbnailPicker"); +dojo.experimental("dojox.image.ThumbnailPicker"); +// +// dojox.image.ThumbnailPicker courtesy Shane O Sullivan, licensed under a Dojo CLA +// @author Copyright 2007 Shane O Sullivan (shaneosullivan1@gmail.com) +// +// For a sample usage, see http://www.skynet.ie/~sos/photos.php +// +// document topics. + +dojo.require("dojo.fx"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); + +dojo.declare("dojox.image.ThumbnailPicker", + [dijit._Widget, dijit._Templated], + { + // summary: A scrolling Thumbnail Picker widget + // + // imageStore: Object + // A data store that implements the dojo.data Read API. + imageStore: null, + + // request: Object + // A dojo.data Read API Request object. + request: null, + + // size: Number + // Width or height in pixels, depending if horizontal or vertical. + size: 500, //FIXME: use CSS? + + // thumbHeight: Number + // Default height of a thumbnail image + thumbHeight: 75, // FIXME: use CSS? + + // thumbWidth: Number + // Default width of an image + thumbWidth: 100, // FIXME: use CSS? + + // useLoadNotifier: Boolean + // Setting useLoadNotifier to true makes a colored DIV appear under each + // thumbnail image, which is used to display the loading status of each + // image in the data store. + useLoadNotifier: false, + + // useHyperlink: boolean + // Setting useHyperlink to true causes a click on a thumbnail to open a link. + useHyperlink: false, + + // hyperlinkTarget: String + // If hyperlinkTarget is set to "new", clicking on a thumb will open a new window + // If it is set to anything else, clicking a thumbnail will open the url in the + // current window. + hyperlinkTarget: "new", + + // isClickable: Boolean + // When set to true, the cursor over a thumbnail changes. + isClickable: true, + + // isScrollable: Boolean + // When true, uses smoothScroll to move between pages + isScrollable: true, + + // isHorizontal: Boolean + // If true, the thumbnails are displayed horizontally. Otherwise they are displayed + // vertically + isHorizontal: true, + + //autoLoad: Boolean + autoLoad: true, + + // linkAttr: String + // The attribute name for accessing the url from the data store + linkAttr: "link", + + // imageThumbAttr: String + // The attribute name for accessing the thumbnail image url from the data store + imageThumbAttr: "imageUrlThumb", + + // imageLargeAttr: String + // The attribute name for accessing the large image url from the data store + imageLargeAttr: "imageUrl", + + // pageSize: Number + // The number of images to request each time. + pageSize: 20, + + // titleAttr: String + // The attribute name for accessing the title from the data store + titleAttr: "title", + + templateString:"
            \n\t
            \n\t \n\t
            \n\t
            \n\t
            \n\t
            \n\t
            \n\t \n\t
            \n
            \n", + tempImgPath: dojo.moduleUrl("dojo", "resources/blank.gif"), + + // thumbs: Array + // Stores the image nodes for the thumbnails. + _thumbs: [], + + // _thumbIndex: Number + // The index of the first thumbnail shown + _thumbIndex: 0, + + // _maxPhotos: Number + // The total number of photos in the image store + _maxPhotos: 0, + + // _loadedImages: Object + // Stores the indices of images that have been marked as loaded using the + // markImageLoaded function. + _loadedImages: {}, + + postCreate: function(){ + // summary: Initializes styles and listeners + this.widgetid = this.id; + this.inherited(arguments); + this.pageSize = Number(this.pageSize); + + this._scrollerSize = this.size - (51 * 2); + + var sizeProp = this._sizeProperty = this.isHorizontal ? "width" : "height"; + + // FIXME: do this via css? calculate the correct width for the widget + dojo.style(this.outerNode, "textAlign","center"); + dojo.style(this.outerNode, sizeProp, this.size+"px"); + + dojo.style(this.thumbScroller, sizeProp, this._scrollerSize + "px"); + + //If useHyperlink is true, then listen for a click on a thumbnail, and + //open the link + if(this.useHyperlink){ + dojo.subscribe(this.getClickTopicName(), this, function(packet){ + var index = packet.index; + var url = this.imageStore.getValue(packet.data,this.linkAttr); + + //If the data item doesn't contain a URL, do nothing + if(!url){return;} + + if(this.hyperlinkTarget == "new"){ + window.open(url); + }else{ + window.location = url; + } + }); + } + + if(this.isScrollable) { + // FIXME: does this break builds or anything? + dojo.require("dojox.fx.scroll"); + dojo.require("dojox.fx.easing"); + } + if(this.isClickable){ + dojo.addClass(this.thumbsNode, "thumbClickable"); + } + this._totalSize = 0; + this.init(); + }, + + init: function(){ + // summary: Creates DOM nodes for thumbnail images and initializes their listeners + if(this.isInitialized) {return false;} + + var classExt = this.isHorizontal ? "Horiz" : "Vert"; + + // FIXME: can we setup a listener around the whole element and determine based on e.target? + dojo.addClass(this.navPrev, "prev" + classExt); + dojo.addClass(this.navNext, "next" + classExt); + dojo.addClass(this.thumbsNode, "thumb"+classExt); + dojo.addClass(this.outerNode, "thumb"+classExt); + + this.navNextImg.setAttribute("src", this.tempImgPath); + this.navPrevImg.setAttribute("src", this.tempImgPath); + + this.connect(this.navPrev, "onclick", "_prev"); + this.connect(this.navNext, "onclick", "_next"); + this.isInitialized = true; + + if(this.isHorizontal){ + this._offsetAttr = "offsetLeft"; + this._sizeAttr = "offsetWidth"; + this._scrollAttr = "scrollLeft"; + }else{ + this._offsetAttr = "offsetTop"; + this._sizeAttr = "offsetHeight"; + this._scrollAttr = "scrollTop"; + } + + this._updateNavControls(); + if(this.imageStore && this.request){this._loadNextPage();} + return true; + }, + + getClickTopicName: function(){ + // summary: Returns the name of the dojo topic that can be + // subscribed to in order to receive notifications on + // which thumbnail was selected. + return (this.widgetId || this.id) + "/select"; // String + }, + + getShowTopicName: function(){ + // summary: Returns the name of the dojo topic that can be + // subscribed to in order to receive notifications on + // which thumbnail is now visible + return (this.widgetId || this.id) + "/show"; // String + }, + + setDataStore: function(dataStore, request, /*optional*/paramNames){ + // summary: Sets the data store and request objects to read data from. + // dataStore: + // An implementation of the dojo.data.api.Read API. This accesses the image + // data. + // request: + // An implementation of the dojo.data.api.Request API. This specifies the + // query and paging information to be used by the data store + // paramNames: + // An object defining the names of the item attributes to fetch from the + // data store. The four attributes allowed are 'linkAttr', 'imageLargeAttr', + // 'imageThumbAttr' and 'titleAttr' + this.reset(); + + this.request = { + query: {}, + start: request.start || 0, + count: request.count || 10, + onBegin: dojo.hitch(this, function(total){ + this._maxPhotos = total; + }) + }; + + if(request.query){ dojo.mixin(this.request.query, request.query);} + + if(paramNames){ + dojo.forEach(["imageThumbAttr", "imageLargeAttr", "linkAttr", "titleAttr"], function(attrName){ + if(paramNames[attrName]){ this[attrName] = paramNames[attrName]; } + }, this); + } + + this.request.start = 0; + this.request.count = this.pageSize; + this.imageStore = dataStore; + + if(!this.init()){this._loadNextPage();} + }, + + reset: function(){ + // summary: Resets the widget back to its original state. + this._loadedImages = {}; + dojo.forEach(this._thumbs, function(img){ + if(img){ + // dojo.event.browser.clean(img); + if(img.parentNode){ + img.parentNode.removeChild(img); + } + } + }); + + this._thumbs = []; + this.isInitialized = false; + this._noImages = true; + }, + + isVisible: function(index) { + // summary: Returns true if the image at the specified index is currently visible. False otherwise. + var img = this._thumbs[index]; + if(!img){return false;} + var pos = this.isHorizontal ? "offsetLeft" : "offsetTop"; + var size = this.isHorizontal ? "offsetWidth" : "offsetHeight"; + var scrollAttr = this.isHorizontal ? "scrollLeft" : "scrollTop"; + var offset = img[pos] - this.thumbsNode[pos]; + return (offset >= this.thumbScroller[scrollAttr] + && offset + img[size] <= this.thumbScroller[scrollAttr] + this._scrollerSize); + }, + + _next: function() { + // summary: Displays the next page of images + var pos = this.isHorizontal ? "offsetLeft" : "offsetTop"; + var size = this.isHorizontal ? "offsetWidth" : "offsetHeight"; + var baseOffset = this.thumbsNode[pos]; + var firstThumb = this._thumbs[this._thumbIndex]; + var origOffset = firstThumb[pos] - baseOffset; + + var index = -1, img; + + for(var i = this._thumbIndex + 1; i < this._thumbs.length; i++){ + img = this._thumbs[i]; + if(img[pos] - baseOffset + img[size] - origOffset > this._scrollerSize){ + this._showThumbs(i); + return; + } + } + }, + + _prev: function(){ + // summary: Displays the next page of images + if(this.thumbScroller[this.isHorizontal ? "scrollLeft" : "scrollTop"] == 0){return;} + var pos = this.isHorizontal ? "offsetLeft" : "offsetTop"; + var size = this.isHorizontal ? "offsetWidth" : "offsetHeight"; + + var firstThumb = this._thumbs[this._thumbIndex]; + var origOffset = firstThumb[pos] - this.thumbsNode[pos]; + + var index = -1, img; + + for(var i = this._thumbIndex - 1; i > -1; i--) { + img = this._thumbs[i]; + if(origOffset - img[pos] > this._scrollerSize){ + this._showThumbs(i + 1); + return; + } + } + this._showThumbs(0); + }, + + _checkLoad: function(img, index){ + dojo.publish(this.getShowTopicName(), [{index:index}]); + this._updateNavControls(); + this._loadingImages = {}; + + this._thumbIndex = index; + + //If we have not already requested the data from the store, do so. + if(this.thumbsNode.offsetWidth - img.offsetLeft < (this._scrollerSize * 2)){ + this._loadNextPage(); + } + }, + + _showThumbs: function(index){ + // summary: Displays thumbnail images, starting at position 'index' + // index: Number + // The index of the first thumbnail + +//FIXME: When is this be called with an invalid index? Do we need this check at all? +// if(typeof index != "number"){ index = this._thumbIndex; } + index = Math.min(Math.max(index, 0), this._maxPhotos); + + if(index >= this._maxPhotos){ return; } + + var img = this._thumbs[index]; + if(!img){ return; } + + var left = img.offsetLeft - this.thumbsNode.offsetLeft; + var top = img.offsetTop - this.thumbsNode.offsetTop; + var offset = this.isHorizontal ? left : top; + + if( (offset >= this.thumbScroller[this._scrollAttr]) && + (offset + img[this._sizeAttr] <= this.thumbScroller[this._scrollAttr] + this._scrollerSize) + ){ + // FIXME: WTF is this checking for? + return; + } + + + if(this.isScrollable){ + var target = this.isHorizontal ? {x: left, y: 0} : { x:0, y:top}; + dojox.fx.smoothScroll({ + target: target, + win: this.thumbScroller, + duration:300, + easing:dojox.fx.easing.easeOut, + onEnd: dojo.hitch(this, "_checkLoad", img, index) + }).play(10); + }else{ + if(this.isHorizontal){ + this.thumbScroller.scrollLeft = left; + }else{ + this.thumbScroller.scrollTop = top; + } + this._checkLoad(img, index); + } + }, + + markImageLoaded: function(index){ + // summary: Changes a visual cue to show the image is loaded + // description: If 'useLoadNotifier' is set to true, then a visual cue is + // given to state whether the image is loaded or not. Calling this function + // marks an image as loaded. + var thumbNotifier = dojo.byId("loadingDiv_"+this.widgetid+"_"+index); + if(thumbNotifier){this._setThumbClass(thumbNotifier, "thumbLoaded");} + this._loadedImages[index] = true; + }, + + _setThumbClass: function(thumb, className){ + // summary: Adds a CSS class to a thumbnail, only if 'autoLoad' is true + // thumb: DomNode + // The thumbnail DOM node to set the class on + // className: String + // The CSS class to add to the DOM node. + if(!this.autoLoad){ return; } + dojo.addClass(thumb, className); + }, + + _loadNextPage: function(){ + // summary: Loads the next page of thumbnail images + if(this._loadInProgress){return;} + this._loadInProgress = true; + var start = this.request.start + (this._noImages ? 0 : this.pageSize); + + var pos = start; + while(pos < this._thumbs.length && this._thumbs[pos]){pos ++;} + + //Define the function to call when the items have been + //returned from the data store. + var complete = function(items, request){ + if(items && items.length){ + var itemCounter = 0; + var loadNext = dojo.hitch(this, function(){ + if(itemCounter >= items.length){ + this._loadInProgress = false; + return; + } + var counter = itemCounter++; + + this._loadImage(items[counter], pos + counter, loadNext); + }); + loadNext(); + + //Show or hide the navigation arrows on the thumbnails, + //depending on whether or not the widget is at the start, + //end, or middle of the list of images. + this._updateNavControls(); + }else{ + this._loadInProgress = false; + } + }; + + //Define the function to call if the store reports an error. + var error = function(){ + this._loadInProgress = false; + console.debug("Error getting items"); + }; + + this.request.onComplete = dojo.hitch(this, complete); + this.request.onError = dojo.hitch(this, error); + + //Increment the start parameter. This is the dojo.data API's + //version of paging. + this.request.start = start; + this._noImages = false; + + //Execute the request for data. + this.imageStore.fetch(this.request); + + }, + + _loadImage: function(data, index, callback){ + var url = this.imageStore.getValue(data,this.imageThumbAttr); + var img = document.createElement("img"); + var imgContainer = document.createElement("div"); + imgContainer.setAttribute("id","img_" + this.widgetid+"_"+index); + imgContainer.appendChild(img); + img._index = index; + img._data = data; + + this._thumbs[index] = imgContainer; + var loadingDiv; + if(this.useLoadNotifier){ + loadingDiv = document.createElement("div"); + loadingDiv.setAttribute("id","loadingDiv_" + this.widgetid+"_"+index); + + //If this widget was previously told that the main image for this + //thumb has been loaded, make the loading indicator transparent. + this._setThumbClass(loadingDiv, + this._loadedImages[index] ? "thumbLoaded":"thumbNotifier"); + + imgContainer.appendChild(loadingDiv); + } + var size = dojo.marginBox(this.thumbsNode); + var defaultSize; + var sizeParam; + if(this.isHorizontal){ + defaultSize = this.thumbWidth; + sizeParam = 'w'; + } else{ + defaultSize = this.thumbHeight; + sizeParam = 'h'; + } + size = size[sizeParam]; + var sl = this.thumbScroller.scrollLeft, st = this.thumbScroller.scrollTop; + dojo.style(this.thumbsNode, this._sizeProperty, (size + defaultSize + 20) + "px"); + //Remember the scroll values, as changing the size can alter them + this.thumbScroller.scrollLeft = sl; + this.thumbScroller.scrollTop = st; + this.thumbsNode.appendChild(imgContainer); + + dojo.connect(img, "onload", this, function(){ + var realSize = dojo.marginBox(img)[sizeParam]; + this._totalSize += (Number(realSize) + 4); + dojo.style(this.thumbsNode, this._sizeProperty, this._totalSize + "px"); + + if(this.useLoadNotifier){dojo.style(loadingDiv, "width", (img.width - 4) + "px"); } + callback(); + return false; + }); + + dojo.connect(img, "onclick", this, function(evt){ + dojo.publish(this.getClickTopicName(), [{ + index: evt.target._index, + data: evt.target._data, + url: img.getAttribute("src"), + largeUrl: this.imageStore.getValue(data,this.imageLargeAttr), + title: this.imageStore.getValue(data,this.titleAttr), + link: this.imageStore.getValue(data,this.linkAttr) + }]); + return false; + }); + dojo.addClass(img, "imageGalleryThumb"); + img.setAttribute("src", url); + var title = this.imageStore.getValue(data, this.titleAttr); + if(title){ img.setAttribute("title",title); } + this._updateNavControls(); + + }, + + _updateNavControls: function(){ + // summary: Updates the navigation controls to hide/show them when at + // the first or last images. + var cells = []; + var change = function(node, add){ + var fn = add ? "addClass" : "removeClass"; + dojo[fn](node,"enabled"); + dojo[fn](node,"thumbClickable"); + }; + + var pos = this.isHorizontal ? "scrollLeft" : "scrollTop"; + var size = this.isHorizontal ? "offsetWidth" : "offsetHeight"; + change(this.navPrev, (this.thumbScroller[pos] > 0)); + + var last = this._thumbs[this._thumbs.length - 1]; + var addClass = (this.thumbScroller[pos] + this._scrollerSize < this.thumbsNode[size]); + change(this.navNext, addClass); + } +}); + +} diff --git a/includes/js/dojox/image/resources/Gallery.html b/includes/js/dojox/image/resources/Gallery.html new file mode 100644 index 0000000..571dc4f --- /dev/null +++ b/includes/js/dojox/image/resources/Gallery.html @@ -0,0 +1,4 @@ +
            +
            +
            +
            \ No newline at end of file diff --git a/includes/js/dojox/image/resources/Lightbox.html b/includes/js/dojox/image/resources/Lightbox.html new file mode 100644 index 0000000..1eb292f --- /dev/null +++ b/includes/js/dojox/image/resources/Lightbox.html @@ -0,0 +1,15 @@ +
            +
            +
            + ${title} +
            +
            +
            +
            + +
            ${title}
            +
            +
            + +
            +
            \ No newline at end of file diff --git a/includes/js/dojox/image/resources/Magnifier.css b/includes/js/dojox/image/resources/Magnifier.css new file mode 100644 index 0000000..85eba72 --- /dev/null +++ b/includes/js/dojox/image/resources/Magnifier.css @@ -0,0 +1,5 @@ +.glassNode { + overflow:hidden; + position:absolute; + visibility:hidden; +} diff --git a/includes/js/dojox/image/resources/Magnifier.css.commented.css b/includes/js/dojox/image/resources/Magnifier.css.commented.css new file mode 100644 index 0000000..85eba72 --- /dev/null +++ b/includes/js/dojox/image/resources/Magnifier.css.commented.css @@ -0,0 +1,5 @@ +.glassNode { + overflow:hidden; + position:absolute; + visibility:hidden; +} diff --git a/includes/js/dojox/image/resources/SlideShow.html b/includes/js/dojox/image/resources/SlideShow.html new file mode 100644 index 0000000..fa4aca6 --- /dev/null +++ b/includes/js/dojox/image/resources/SlideShow.html @@ -0,0 +1,14 @@ +
            +
            +
            +
            ${title}
            +
            +
            + + + +
            +
            +
            +
            +
            \ No newline at end of file diff --git a/includes/js/dojox/image/resources/ThumbnailPicker.html b/includes/js/dojox/image/resources/ThumbnailPicker.html new file mode 100644 index 0000000..561ce2d --- /dev/null +++ b/includes/js/dojox/image/resources/ThumbnailPicker.html @@ -0,0 +1,11 @@ +
            +
            + +
            +
            +
            +
            +
            + +
            +
            \ No newline at end of file diff --git a/includes/js/dojox/image/resources/image.css b/includes/js/dojox/image/resources/image.css new file mode 100644 index 0000000..e626e0f --- /dev/null +++ b/includes/js/dojox/image/resources/image.css @@ -0,0 +1,283 @@ + +.dijitDialogUnderlay { + background-color:#000; +} +.dojoxLightbox { + position:absolute; + z-index:999; + overflow:hidden; + width:100px; + height:100px; + border:11px solid #fff; + background:#fff url('images/loading.gif') no-repeat center center; + + -webkit-box-shadow: 0px 6px 10px #636363; + -webkit-border-radius: 3px; + -moz-border-radius:4px; +} +.dojoxLightboxContainer { + position:absolute; + top:0; left:0; +} +.dojoxLightboxFooter { + height:50px; + position:relative; + bottom:0; + left:0; + margin-top:8px; + color:#333; + z-index:1000; + font-size:10pt; +} +.dojoxLightboxGroupText { + color:#666; + font-size:8pt; +} +.LightboxNext, +.LightboxPrev, +.LightboxClose { + float:right; + width:16px; + height:16px; + cursor:pointer; +} +.nihilo .LightboxClose, +.tundra .LightboxClose { + background:url('images/close.png') no-repeat center center; +} +.nihilo .LightboxNext, +.tundra .LightboxNext { + background:url('images/right.png') no-repeat center center; +} +.nihilo .LightboxPrev, +.tundra .LightboxPrev { + background:url('images/left.png') no-repeat center center; +} +.soria .LightboxClose, +.soria .LightboxNext, +.soria .LightboxPrev { + width:15px; + height:15px; + background:url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png') no-repeat center center; + background-position:-60px; +} +.soria .LightboxNext { + background-position:-30px 0; +} +.soria .LightboxPrev { + background-position:0 0; +} +.slideShowWrapper { + position:relative; + background:#fff; + padding:8px; + border:1px solid #333; + padding-bottom:20px; + overflow:hidden; + text-align: center; + -moz-border-radius:3pt; + -webkit-border-radius:4pt; + -webkit-drop-shadow:#ccc 4pt; +} +.slideShowNav { + position:absolute; + bottom:-18px; + left:0px; + padding:0px 3px 2px 0px; + background-color:#fff; + width:100%; +} +.slideShowNavWrapper { float:right; } +.slideShowTitle { + float:left; + color:#333; + font-size:10pt; +} +.slideShowTitle .slideShowCounterText { + font-size:6pt; color:#666; +} +.slideShowHidden { + position:absolute; + display: none; + height: 1px; + width: 1px; +} +.slideShowImageWrapper { + position:relative; + text-align: center; + margin-top: -42px; + float: left; + width: 100%; +} +.slideShowImageWrapper img { + border: 0px none; +} +.slideShowNotifier { + background-color: red; + width: 100px; + height: 5px; + font-size: 1%; +} +.slideShowSlideShow { + position:absolute; + top:30px; + padding: 0 5px; + border: 0px; + text-decoration: none; + color: #2e6ab1; +} +.slideShowLoading { background-color: #fad66a; } +.slideShowLoaded { background-color: transparent; } +.slideShowCtrlPrev { + background-position: -96px 0px; + float: left; +} +.slideShowCtrlNext { + background-position: -144px 0px; + float: right; +} +.slideShowCtrlPlay { + background-position: -190px 0px; + position: absolute; +} +.slideShowPaused .slideShowCtrlPlay { + background-position: -236px 0px; + position: absolute; +} +.slideShowCtrl span.slideShowCtrlHide { + background-image: url("../../../dojo/resources/blank.gif"); + cursor: auto; +} +.slideShowCtrl { + height: 50px; + width: 100%; + position: relative; + z-index:999; + float: left; +} +.slideShowCtrl span { + width: 50px; + height: 100%; + background-image: url("images/buttons.png"); + cursor: pointer; +} +.dj_ie6 .slideShowCtrl span { + background-image: url("images/buttons.gif"); +} +.dj_ie6 .slideShowPager li.currentpage, +.dj_ie6 .pagination li.disablepage{ + + margin-right: 5px; + padding-right: 0; +} +.thumbWrapper .thumbNav { + background-repeat: no-repeat; + background-position: center; + padding-top: 1px; + width: 30px; + height: 100%; +} +.thumbOuter { + padding-bottom: 2px; +} +.thumbOuter.thumbHoriz { + width: 500px; + height: 85px; +} +.thumbOuter.thumbVert { + width: 100px; + height: 400px; +} +.thumbOuter .enabled { + background: transparent url("images/buttons.png") no-repeat center center; +} +.dj_ie6 .thumbOuter .enabled { background-image: url("images/buttons.gif"); } +.thumbOuter .thumbNav img { + width: 48px; + height: 75px; +} +.thumbOuter .thumbClickable div { + cursor: pointer; +} +.thumbOuter .prevHoriz { + background-position: -96px 12px; + position: relative; + float: left; + height: 100%; +} +.thumbOuter .nextHoriz { + background-position: -144px 12px; + position: relative; + float: right; + height: 100%; +} +.thumbOuter .prevVert { + background-position: 0px 0px; + height: 48px; + width:48px; + margin-left:24px; +} +.thumbOuter .nextVert { + background-position: -48px 0px; + height: 48px; + width:48px; + margin-left:24px; +} +.thumbWrapper img { + height: 75px; + max-width: 100px; + width: expression(this.width > 100 ? 100: true); +} +.thumbWrapper .thumbNav .imageGalleryThumb { + height: 50px; +} +.thumbWrapper .thumbNotifier { + background-color: red; + width: 0px; + margin-left: 2px; + height: 5px; + font-size: 1%; +} +.thumbWrapper .thumbLoaded { + background-color: transparent; +} +.thumbScroller { + overflow-x: hidden; + overflow-y: hidden; + white-space: nowrap; + text-align: center; +} +.thumbHoriz .thumbScroller { + width: 500px; + height: 85px; + float: left; +} +.thumbVert .thumbScroller { + height: 500px; + width: 100px; +} +.thumbWrapper { + float: left; +} +.thumbVert .thumbWrapper { + width: 100px; + height: 10px; +} +.thumbHoriz .thumbWapper { + height:85px; + width: 10px; +} +.thumbWrapper.thumbHoriz div { + float: left; + padding-right: 2px; +} +.thumbWrapper.thumbVert { + width: 100px; +} +.thumbWrapper.thumbVert div { + padding-bottom: 2px; +} +.imageGalleryWrapper { + padding-bottom: 20px; + text-align: center; +} diff --git a/includes/js/dojox/image/resources/image.css.commented.css b/includes/js/dojox/image/resources/image.css.commented.css new file mode 100644 index 0000000..3539a71 --- /dev/null +++ b/includes/js/dojox/image/resources/image.css.commented.css @@ -0,0 +1,345 @@ +/* + This is the master CSS file for the dojox.image project, and provides all + needed definitions for: + + dojox.image.Lightbox + dojox.image.Gallery [which is a combination of:] + dojox.image.SlideShow + dojox.image.ThumbNailPicker + +*/ + + +/* dojox.image.Lightbox:base */ +/* FIXME: should be be doing this? I want a black underlay, but this sets ALL dialogs to black, + but because it's decendant of body, i can't set this color any other way ... */ +.dijitDialogUnderlay { + background-color:#000; +} + +.dojoxLightbox { + position:absolute; + z-index:999; + overflow:hidden; + width:100px; + height:100px; + border:11px solid #fff; + background:#fff url('images/loading.gif') no-repeat center center; + + /* special safari + FF specific rounding + shadows */ + -webkit-box-shadow: 0px 6px 10px #636363; /* #adadad; */ + -webkit-border-radius: 3px; + -moz-border-radius:4px; +} + +.dojoxLightboxContainer { + position:absolute; + top:0; left:0; +} + +.dojoxLightboxFooter { + height:50px; + position:relative; + bottom:0; + left:0; + margin-top:8px; + color:#333; + z-index:1000; + font-size:10pt; +} + +.dojoxLightboxGroupText { + color:#666; + font-size:8pt; +} + +.LightboxNext, +.LightboxPrev, +.LightboxClose { + float:right; + width:16px; + height:16px; + cursor:pointer; +} + +/* dojox.image.Lightbox:tundra:nihilo */ + +.nihilo .LightboxClose, +.tundra .LightboxClose { + background:url('images/close.png') no-repeat center center; +} +.nihilo .LightboxNext, +.tundra .LightboxNext { + background:url('images/right.png') no-repeat center center; +} +.nihilo .LightboxPrev, +.tundra .LightboxPrev { + background:url('images/left.png') no-repeat center center; +} + +/* dojox.image.Lightbox:soria */ +.soria .LightboxClose, +.soria .LightboxNext, +.soria .LightboxPrev { + width:15px; + height:15px; + background:url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png') no-repeat center center; + background-position:-60px; +} +.soria .LightboxNext { + background-position:-30px 0; +} +.soria .LightboxPrev { + background-position:0 0; +} + + + +/* dojox.image.SlideShow */ + +.slideShowWrapper { + position:relative; + background:#fff; + padding:8px; + border:1px solid #333; + padding-bottom:20px; + overflow:hidden; + text-align: center; + -moz-border-radius:3pt; + -webkit-border-radius:4pt; + -webkit-drop-shadow:#ccc 4pt; +} +.slideShowNav { + position:absolute; + bottom:-18px; + left:0px; + padding:0px 3px 2px 0px; + background-color:#fff; + width:100%; +} +.slideShowNavWrapper { float:right; } +.slideShowTitle { + float:left; + color:#333; + font-size:10pt; +} +.slideShowTitle .slideShowCounterText { + font-size:6pt; color:#666; +} +.slideShowHidden { + position:absolute; + display: none; + height: 1px; + width: 1px; +} +.slideShowImageWrapper { + position:relative; + text-align: center; + margin-top: -42px; + float: left; + width: 100%; +} +.slideShowImageWrapper img { + border: 0px none; +} +.slideShowNotifier { + background-color: red; + width: 100px; + height: 5px; + font-size: 1%;/*IE hack to get around the Empty-Div bug*/ +} +.slideShowSlideShow { + position:absolute; + top:30px; + padding: 0 5px; + border: 0px; + text-decoration: none; + color: #2e6ab1; +} +.slideShowLoading { background-color: #fad66a; } +.slideShowLoaded { background-color: transparent; } +/* +.sprite-arrowbottom { background-position: 0 -30px; } +.sprite-arrowtop { background-position: 0 -430px; } +*/ +.slideShowCtrlPrev { + background-position: -96px 0px; + float: left; +} +.slideShowCtrlNext { + background-position: -144px 0px; + float: right; +} +.slideShowCtrlPlay { + background-position: -190px 0px; + position: absolute; +} +.slideShowPaused .slideShowCtrlPlay { + background-position: -236px 0px; + position: absolute; +} +.slideShowCtrl span.slideShowCtrlHide { + background-image: url("../../../dojo/resources/blank.gif"); + cursor: auto; +} + +.slideShowCtrl { + height: 50px; + width: 100%; + position: relative; + z-index:999; + float: left; +} +.slideShowCtrl span { + width: 50px; + height: 100%; + background-image: url("images/buttons.png"); + cursor: pointer; +} +.dj_ie6 .slideShowCtrl span { + background-image: url("images/buttons.gif"); +} + +.dj_ie6 .slideShowPager li.currentpage, +.dj_ie6 .pagination li.disablepage{ + /*IE 6 and below. Adjust non linked LIs slightly to account for bugs*/ + margin-right: 5px; + padding-right: 0; +} + +/* dojox.image.ThumbnailPicker */ + +.thumbWrapper .thumbNav { + background-repeat: no-repeat; + background-position: center; + padding-top: 1px; + width: 30px; + height: 100%; +} + +.thumbOuter { + padding-bottom: 2px; +} + +.thumbOuter.thumbHoriz { + width: 500px; + height: 85px; +} + +.thumbOuter.thumbVert { + width: 100px; + height: 400px; +} + +.thumbOuter .enabled { + background: transparent url("images/buttons.png") no-repeat center center; +} +.dj_ie6 .thumbOuter .enabled { background-image: url("images/buttons.gif"); } + +.thumbOuter .thumbNav img { + width: 48px; + height: 75px; +} +.thumbOuter .thumbClickable div { + cursor: pointer; +} +.thumbOuter .prevHoriz { + background-position: -96px 12px; + position: relative; + float: left; + height: 100%; +} + +.thumbOuter .nextHoriz { + background-position: -144px 12px; + position: relative; + float: right; + height: 100%; +/* margin-top: -85px;*/ +} +.thumbOuter .prevVert { + background-position: 0px 0px; + height: 48px; + width:48px; + margin-left:24px; +} + +.thumbOuter .nextVert { + background-position: -48px 0px; + height: 48px; + width:48px; + margin-left:24px; +} + +.thumbWrapper img { + height: 75px; + max-width: 100px; + width: expression(this.width > 100 ? 100: true);/*IE Hack*/ +} + +.thumbWrapper .thumbNav .imageGalleryThumb { + height: 50px; +} + +.thumbWrapper .thumbNotifier { + background-color: red; + width: 0px; + margin-left: 2px; + height: 5px; + font-size: 1%;/*IE hack to get around the Empty-Div bug*/ +} + +.thumbWrapper .thumbLoaded { + background-color: transparent; +} + +.thumbScroller { + overflow-x: hidden; + overflow-y: hidden; + white-space: nowrap; + text-align: center; +} + +.thumbHoriz .thumbScroller { + width: 500px; + height: 85px; + float: left; +} + +.thumbVert .thumbScroller { + height: 500px; + width: 100px; +} + +.thumbWrapper { + float: left; +} + +.thumbVert .thumbWrapper { + width: 100px; + height: 10px; +} +.thumbHoriz .thumbWapper { + height:85px; + width: 10px; +} + +.thumbWrapper.thumbHoriz div { + float: left; + padding-right: 2px; +} + +.thumbWrapper.thumbVert { + width: 100px; +} + +.thumbWrapper.thumbVert div { + padding-bottom: 2px; +} + +/* dojox.image.Gallery */ + +.imageGalleryWrapper { + padding-bottom: 20px; + text-align: center; +} diff --git a/includes/js/dojox/image/resources/images/buttons.gif b/includes/js/dojox/image/resources/images/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f9081ff66ee5b620bfaf8010a1e0e25287297fa GIT binary patch literal 4620 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 V#7R=nMeM%-in6LQby8+w{{!g1t-JsL literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/resources/images/close.png b/includes/js/dojox/image/resources/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac9d10ee4881464b9cb9735a43a0f6a0ee97d68 GIT binary patch literal 675 zcmV;U0$lxxP)uD zv|(}Yxo59^*I9cXfd359nQs!rU4#a4g%Bgwh#6wazq5Z8R3aRSMB;U`*{rYE>lMQo zkH@2YKL5_`cKdPv0soV~$xf&9DG}M3I3AB|I-P!x#bU28*T5_LO}3-aXnbV1#D2eL zi^XCejYePaM?A&7WHR|iNbL1`43(US{eGVni$yjXjo50nVx3OsD{`EqLXcsI$Kx-x zTJ3#W3tYDwPj{87iaE_(+iBa5!MI*+98m zhV6C>7K;Uf!5~*~x7z`VqHm8eRUs4*%VaXe%`@qAI#@23fSmw?!2p++mvA^70L|p~ zrBbPk#y}{roy}&~8jVIvi*C0I>2wb9NA{GafL_$c4R=j3%t#!jZAqA(P4EG4;o32123GGnBlhR*~Do;gD+^o|&OK z)@rqApxAsqXSrOih#VswLFmH1-ELp2)oO{$<$8inU!c>RY=TH60+mXIJrk3_gU-iKn>?r^M002ov JPDHLkV1k#LHyHo` literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/resources/images/close_dark.png b/includes/js/dojox/image/resources/images/close_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..105fe552f7e9dc7a5b0b524f1dec780e27487a67 GIT binary patch literal 711 zcmV;&0yzDNP)7Ysf;Zn0Z?GMzb(H%5uP&jZVMA}4(CYOr1II$aDrQ_o!*Y~k+ zZS)}FtOJ|1&))0%*0&y8N~hEGKcD>X!C)}3OOh1R>-GDv*KuT8tyT)w7gbe1V*PTv z-OF7B(r`Eo%Ch`0lgT^@hr=Gf-!B=BMp6`oTCJAaY&PF^I-M8&e*Y6lMhw!!NuU7^ zdA;7Fa=Cn%OeU=^mrH^Qac8w!$>;M)fk5EqVzIajlJAqrq-{2v=YoJ`Bl6=?sdN|& z2BlrOA{{aq4CL{6?9=J=R=3-&n@pyky7gr&o6SDmfDaB1D4);MMnNi-qC%lSI-QO< zrD!x7#Qr{1TLl4r_CukNdlL=PI1=S@If}(%ggdg?Y?=~>!$I+Q{1JYyZV0X+e@%L= zRuhF|5++zKmsGFU37rsowib)UuMu#oIO_Iyc6O%i$Kx@faD)Pi#RLedhZkTkw^&V(P%_=yPb-~BBAm$pU(vW?nbbEL4e`-dU|@QZshIl?FrjxG^kpw(&go) zs0&*rWxsa2-2kpFuN8bgIXQV3iA3%oH>y-Bv_2Pr357E}`*T{nbU>p_BW2hcL%?(Vb0V;l@EAM-~-Ww2oz`3GL=&t9C t$6^G@6>PcJMl5Ch3NN@c+rEDV7yyuMRhp_X@4Wy3002ovPDHLkV1lm)LPr1q literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/resources/images/left.png b/includes/js/dojox/image/resources/images/left.png new file mode 100644 index 0000000000000000000000000000000000000000..0848dba9d9448d4f5f14a9a913c3c5d55b36c7e1 GIT binary patch literal 626 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 Hu0mjf&D9ve literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/resources/images/warning.png b/includes/js/dojox/image/resources/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..a52a55f43f57307ace3ed79c6e3e723e57767733 GIT binary patch literal 995 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4kn<;H+e}VASGGi8c`CQpH@yemU@Y{;#R&euD`+qBnSBtx6Ph05g u!6;i6#&b}O>PcZxM=y!KP5r8SfMMB#(|6pM++~5emci52&t;ucLK6UJa`o{5 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/images.json b/includes/js/dojox/image/tests/images.json new file mode 100644 index 0000000..bd0cf96 --- /dev/null +++ b/includes/js/dojox/image/tests/images.json @@ -0,0 +1,32 @@ +{ items: [ + { + "thumb":"images/extraWide.jpg", + "large":"images/extraWide.jpg", + "title":"I'm wide, me", + "link":"http://www.flickr.com/photos/44153025@N00/748348847" + }, + { + "thumb":"images/imageHoriz.jpg", + "large":"images/imageHoriz.jpg", + "title":"I'm a horizontal picture", + "link":"http://www.flickr.com/photos/44153025@N00/735656038" + }, + { + "thumb":"images/imageHoriz2.jpg", + "large":"images/imageHoriz2.jpg", + "title":"I'm another horizontal picture", + "link":"http://www.flickr.com/photos/44153025@N00/714540483" + }, + { + "thumb":"images/imageVert.jpg", + "large":"images/imageVert.jpg", + "title":"I'm a vertical picture", + "link":"http://www.flickr.com/photos/44153025@N00/715392758" + }, + { + "large":"images/square.jpg", + "thumb":"images/square.jpg", + "link" :"images/square.jpg", + "title":"1:1 aspect ratio" + } +]} \ No newline at end of file diff --git a/includes/js/dojox/image/tests/images/extraWide.jpg b/includes/js/dojox/image/tests/images/extraWide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21618252448903e6ab1bb44ce5a4a4d56e78eba7 GIT binary patch literal 49250 zcmeFZ2UJsAw=cevkN_d{gpP*ZOXyYU9qApE5_$_A6%kNSf+(OMiiKVU0U<R*EHVYGT z6958*Kx84Z0I)TOj5AIQ4gdgib7_D9001U{1p)=H0FVcstRO~!_sihP_7j(Zm;(X> zAmE*L@P6n~?$sIXpvP%5Kcv_MidVmhRDJm%`!g6+=Ap>Nh z`-v}t7?Qig0|B1}n!A&K1C1vSxh*IO#PGZwdMAkK^LEODgZVQ2#I&Lqe_|dGBY*Pu zf&3YH^uQ62_7KEC@lSbhii(ipKXnH!-qGD-kO%e?BWPMGqu-VRR3`xWiD_g=`A%98 z0?=PD>=#T|z9X|Gm>B+(E(Y==e&M121vC7D8GpgZUoh$yOe-5nD_)=U{E?JoF2gdhoO|gNOl;V z5C;yfZ|B1)9F?ksK#$S9?H+2b2IB~wJ zt$*UTPwe131ErYyV_TS=4tfIxWx80pk~= zvMz?82|zEd+BFOcQO1ooc2bM=pZ`OI|6BrzKSkJ@0#LB+GTDK>K*3(uWo|^l()jRu z2ubiX{ekk`{K>>8{YP9fOZ(hazp${(n?}C6E?e7&d^XV*KUbCO98CJ?I?eOFqMXxD zz};PMYU1$GXs6u!SBGIQ$2Ck14%mkxWn9TRHVuNl7mG|@t)66#TTy6aU2^SL9-Z9+ z7}{CRZ}iiPgeup@i=8m^JF;<*^9R@M=NrA)N3ii*;{x`A3WG2CMxE0ILL~<)&M&x5 z*CZB9c9VB^yxanUT|*sKd@r(Jgl4%D$1BgJ4W@`RF_vI*I7M%9^;%QkQ`v_;o?QIo zbgbAWdGOdd6SV;`YtqeqPI?V(wK9{GZf|V>tZv0CaGKZLQ|*$6CALM z8k|qN_Nwhw74fvpl*MwW?|LG;_eC}7)7zPOv8pt04sFfn);vW555{=q$0(GX5!t65 zGZ%XFXGIZx;_(su#)TJH`_)>@SEBf{_PucXdM4uIkLXux$+w@j7X;2XHuW%FukURD zg1+A7IecIX;Chgi^WjRcABq0N06lqRS@*f|)lozLdRAspHQf$#i8D(_-ON#W{FuB` z`{q9CST@B-`EQa)udZr)K8yXL*Yw2C^UtzWsJYg0rka3!se&AqNPK1i(F*BzFvN3%pX5v>y^(Sn;zOstx54Smi6}$d+ zcdOi!{d=C50$RCyqxWdT1ayTOJ1Eya4xQ;R{H?O~hlsmjCU*Ck7ugo-3eWb2RC7`8 z9cE-9;O0vYWftb>^h;mazu*&7Y(CNdZOn~gb#|^a@zNHMRFpv3>(e{B6&#@4l_ALW_f~ z?8MRBTCkl29o(J!b~^FxIF{|}_GNDhuu~@Uc92%`u5C`O*I1)0s=tJFz~w5kVAe_N-kXdgQB#Zn>%>@ormVILbm;) zpOo!9H@EX7fDQe>Jzy_s@&7hz>;EQhTQdyXWz(J&d~T@T&iPY|yFe=F@zO5aynHkS zGX^g^($j(f1jNwCAYcI9qZq­cJB58wc0S|p9*UyfgBv~;xee?5L-_#@({fV6N# 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�k9w;n3*5`Nc5-!L$V&9^ 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/images/huuuge.png b/includes/js/dojox/image/tests/images/huuuge.png new file mode 100644 index 0000000000000000000000000000000000000000..ee98a39ff50a08f9e3a3fcab6ad452f859d3d71a GIT binary patch literal 37958 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 jP~!hyB5d;xe*dNe{@-{S=ShRYml|_JGO@ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/images/imageHoriz.jpg b/includes/js/dojox/image/tests/images/imageHoriz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3948416ec562c919f090f4d91e3ea3434b2c3ae5 GIT binary patch literal 47693 zcmeFacUTllw=di?L(W+;L(WK+oO8|@6@~$ZoDmTLCFdMf5F{tbNkNf}pkxHeK|sJP z3M#h;+@&Gsh0N?{e5GZ&BfHd$V1~C>G-Ud&SpST#rWDpnt0Ymgj3&A`M zD?m*56W4>7>n9Hs#6nF4R|?CAx+ARq_`3kqJ40{=t=;X;y9q8Fq@CBYm3 zGmv-VOx6HUsM|mBbr7?}oXLTfmGdWdKxaw81~9-tP*_+HmU7mHD3A%`C(Z*gB=w93 z0=5O3dRBfdnkNnKRL~X>W2T+ayFiScc2*ZAST4>_jIIjzC#D85-cSC1kUuI78wdeu zV;}|!f65~yClYsEUog%u821;9_X{TY1*7Z615Y>;0Pz3BV8@9`2?|RIiNggY z!K;+07`ik60}ZVTbUV-ox(tS&p~TM+3{HjIFI1Ayo> z1~`PFGoLH~5dZ-W4h}930WK~9DLx)PDJ3xh0Wl>tIXNXcIW;N4>G3l-i~Q>qLWqw~ zNJL0NL_|VCL_|b^z7SEIWg-3FDd6N0K#Bug2Et$v763{LfssN^7Qs=5bJ7cu2c^V> zoF1US=mWGgG;?(b;9K1GBFV zNx?n?rNuav2^$Mj>{JA1Aum&u_f$f&^eKmeVek;AJ{1x$r z0VRzpCSlDg&Ghx+y%}MVWK+IYu`XH)Rz+4xRz((Rd7I^W4!OcIltq2mLh9K})TIhqfTmZ$+05CyhPP8@gI~^Oc}S5wN4T+Tp*501R%vIg zV%aD?uqNG-sFdOOCKg27P~A8`gOviL1Sc00CKp?W=DV0lW{N&N$Mj@$7;~*Kgz8Ch zpew#w$B&AxmR45Q3)7pQ_Xtse$)&O(m5}6^0~Q%w5t_G&v2xJmljlo24~@^2H?>qa zs=6dY5RD7bbx& zR8T$M(e_Rz?+nvgYo`J&D8eyNsW zX8+-&|GR`pt(I9QtwX=#k{OfP?B0i?3uRkBQX+NdY(>}~CuETlvU-sy$lsd@d}G*O z%z5FXXZ?OjqVVOEQ2*i&HqqIWvRK)(h>QKP*WaM950yhRzg9An5EIj2W(=nGJ;JdI zVA7c9sd?qadR^_y^B?_QKfCcQ(?SPuSHkXh?jLneUy~~g zaf#_2f?g0Ro(yOdpIYp`cLGEpy4NXuHe=3_U&p+%1(CaZQM&tNyl2o|@BV^w*39U0 z$>(G7wL9HbN9;Kg1FYq<7Y)ksBNtk+L-`jN9{yOK5RmI(3}B?kVI3q4-OZqh)TfPQ zJ)o^%7NJbV(WbCx8)Cbkg1}5d`nhkXToq zje_rjwavhh@3+^vo!j5VW@p}LerO_-me8y0b+VtIh$g5AcdzDe=ugM8e&B2bd6PEm z&~{r{bL#W=Y4`R+8lpLwLHWa}SCTcJ75w%(zKUkKZn=dDon06RiTYx2#c6-P#=aIJWzvw z>rEQ#T-w5lv%*(MY$U13A%t zbyichyW=>k?!Riu{a6VZ3*QIy`^?&2gf?tR%xEmi;G6&zrq;89OIruN`SkiYWkSi) zd2gS;!6ucvJ_V%A#Cb?tT;gP+FtRk`y@<{Bo%L<#q=ltu)Pp_LWm>AXAq=19Jug40 z&JlW|yzEeh;mA+NCC`>V3?;9X_G(BKj7D=|ILmX&J~iMoXSnp3VCEXdOC8Y@;ACRU zTl?iJYd1RjC3OI`?`m2q9cj$)ocJ+q>#^e3d)dac34HUH5>ZU3>Z{ZBD^%^NEu-B^ z{SP}sex#oO`6mFh_TzFjgHxHKWwcX;FE5Zlf0&}Jx8LG-P=yFlpZ$?^tHpZn1ZXwq zof59DeQZoS5Z2$;F!tWI*!H8b;Y|HOos$Xjb5!R?)2T0nb|*ko+l%(;&cg|eo0rS` zg((z52)nIm(oO)S7J8ZR(Q`44KU(y+-A{lT=5B!zdRs&*(~{4|+q#`xbMx5bX>Ciy zqspYaW(}c2?fZ2-%}BSFR@k;@SJ5l1g0~J9ug`nFpSmgk#<|z) z`s?5s&hD4DEX=U?Z7P>{7L$0de4Fh=aUN@3YCZsT355~b>W3^oNxRg^PF{1wv;}Mz zY?h(**jD_Iq$;yVe)BVTBo9OQ2X9ukuZ$|FlOp^cOeLIB1 zkx)Xndi2}`9m&sC9kUlQ&Ye9)VEwwqD^I7?zi=L2?f^cxmo^^VDePsE1$mL-qy z=PW{lZu;tfzMgMdy16DNZZkk$4J&_h;56a%d6s0XdSd6ASV7R1d}a7`SHk?8^ZSx3 zJ=o&Ym9hoJOPe+?-GYS~*~}Kld%wTVV$hu(ce`|?H5d#VE7hB2D*5;$dW$FMw&Q{~ zP0Z7@&lU<|xk6>FJITe}FZL{-ITtHwdb7TqqrV+mQ(vPq`V?oT^P?@jpV$FtHItht z7W%jzfOH_O#yZBeGw6qkS!aW$Z^vR14FRFlRfKOagI2L_t!u~y!cmzU!B==?b=tpP z9Pe~hNRp>C_fJT%QcuIt?|4`?LB}W;j{U6Tj+%%2SlzyOe!QRSA`wgIZl+_m;eIk1 zI3rDL_qX@^O}6&2E#K5rF+9#-m2NQDNK}fOGVH=pJds^QVVDCNMB!&)Ihshpkx} zT$4AKdQQ+*P~2XP2raKMHKnp_ZWddJp%uk^CMr9j;5(AgOBE|WWGjGw6w=ldUqk(Z z;=Wkl{&Po>GZs%B z8(NMEoP6cAcdy@RR{kVzN${+2x`M9qep~2mYx&*jABnfeI|42b4UHZv)6z93xK>8b zB7-Pj@SnSy;97M=XZQm9VzQyW$x+r3jmHreF&T}!HPhI#Z^(rU-v-J%YeLjLqIsD% zt)G3@-GW^nn)X=*W_=D1US{Tx$>C*%#vU607y*<xE?3)4S6u z+efi|9VFi46!giLPh#9wXOX@at$lv)%Vt6`%hT)>{MdU_PuhazMt7O4`cHs`uBx(Xy)Q1%9JK!zTf@%_l2c6~Bb#>r8i`PuwxhKZˡHj;P85Q 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 JC7Ox3 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 GfB)I8wZ_~4 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/images/imageVert.jpg b/includes/js/dojox/image/tests/images/imageVert.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1652338a9f2bc52d282db9c137d25da02d08a9cc GIT binary patch literal 71533 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/images/spanke.jpg b/includes/js/dojox/image/tests/images/spanke.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec95fb075e390ea4ac146bffb76a93287895cb2b GIT binary patch literal 302741 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≤9P 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ȬUUH&Y+KiS6v*dbSB*LkbExGH_@=h+0N{Gq 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�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

          • I+AX5XL8Eir<6q@5Z9}dv8YXPV2twOx)aOjPpopaZgftVTKRx5FMPN zja#(hO{zV3sW(=zfWNyE$o31NMr{c4-QlycjEsWk9>Q0t(7GMET=jHnS&KkCA|If2 z0=ZI=bT%p|VAVu@lMGhWS%;tseGR{{tGmNGKkX<`%K3Kb44HqHF~Y-0y0c^IY;fsx zd0LjeP^}T*+$2iDUQu|~Z$7fOfcAQw-Oc_36v?tb_H3B12h^D?B1l8o`%SsfXNBOC zz|DtPDi2h1RCPQ35l!Hd?JJ`DZyVK=Nt8!C$`@QHEpkQt&9TXCc`{Q@eaiu=mar~L zc$%@HY)41^J$h6wXReft#HJ1z8F+~>rF#~dh zX0;8rqm4v3E{((sDg`Uk+t8ZSjG9NO)AIC-Ba65*7Vqz&Om#c=EDrhzzaSfZ3oDp~ zEF7!mK(X?97QOM4P~SL*_b%=o`q!@l77dawm{A}FXlPdQAQadkv-T0qcKbQ$Wou{a zYiW=R4Z6QIEJi7skKACOwbiW9LA66d{Jf_HmQ*2`f?yTde}E@L-QI^+$Au&G2vw!0 z1IV6l!m@Ax-m~weAN@MMW!uP_q>TlGu5Y(fo&b_s4N{(n9kPNh#8KMwk%^%1^hwYo zQ+yh`cAe4}a*$fc4*kI?iut4L4pFA~HK-0)J$ZqL(xh5*G2`t*1R_JC3R+)AIh<3f z|HNR6WuhF@v2{26>SGoK(YyL8IC$tRhlz2T@3g-V{SR3XUmT|VUF;Ahio%z~bjbs^+PsvQKqWHXuFt(JH zzfEfV2um_EiQ)S4dMvVupQSLQ2rY9v!i1%)ZqXS1|57skZ&YT@_G&hLVe#IC;tIIs zVIqr1TR5$9RDq|YRt2hBxpgN~EYjK?TMuj}1Ys|ZCywfM;W%JXbvzmRToKnQt{Nxq z4KFsypakc}L4|EnjoxY$eDI(S2kJQEv1U5e$ciN~C^|*R?}ZLaqJnu6b?^`78J|T@ zA$ulg%9Sc9f17uI5c0~tCGOh#!wgL|yjoGEhG!o-a&gJHr?T)vtCiU{3LU=7GpMPI zsmKsd?qLDwnP(>|cq>2K3w_B(Mo5N4%d$3U4R)a^@|N3uc8 zs-hCVys#gAAejQG?ya=`-21u08*u|6%ch#pRr(w8K6%r6yYi^aa{tSDkLqJb&W49@ zH!f8*!4@7dZ#FJ0-M~n;oriP3cMG2i3z6o=TyCpCCj|YOF0$Lpy&b=ddPK3&SLt0X zX~jg?YL4UcmbGX2gN_vzu?E2=4caF?#5h&<7`sDAvm#SMp`*oW8nsVOv#rd`9bgDYei6 zLYNvP$xhxlr?#xZ&?>9{VV?@$QiOVQbdJ06V_~B3=?O^JTy?gFf{fe>bhVAl z7onYNP8FXyb!kY5h2t5@e3i(pnf?e6$^cKtWPoYHgfb_<4EqR`sKxaR>wis1) ze!}m$xuT+Sg`O#kZe`x>SUreaz}MS3${fsH^=w!c3|S{n)iV`RbmbOtt6v+u{8b7A%!oGJQ`shTAMDR!vPP%{{TE|d3!xsu-=66SkS8+x0ujZjXJC>Tks6Ju8P(~ z-7;aFQp<8I2NmGc+LpZ^s3l1d*s3yKCqs%>Cg8~Qe{-z#-zUcXH@BJp+ZPtfWzHH9 z91JLfZW&!;I;vkVMA?GtNe&EJ$qc&E-k_6L)F3absPXFjgkMx_sqyh<;71b!gqyOk zFL@pME-Q_U_TgZ)lM4QOEUyG^;bdEfri923&c1^nbRTJKFh1v;9l~THpyA+9@ zBn~s7ly}wpstvaEnbHgLFCw4v$S`U`M;J3&=yHO)W`qAX4&m$`yX)?yegLQL&G2aB z!koCSwtQtcYFB-LnZ^977WRJ-_ugSmMP1$~Du@+CL8L~hQY>_(MMb(u4ZSG6_XMQH z3QF%CA}tU?ks1gB0@8agAt0R)dM_c|8WvOS5aAqhm7J;L=x$(QY~v(xAIXfKt{Sb^NM)g#g)Xw|OSTSn)k z>jvg$Mx9Tojcs>%!4mS_p*ly>{C;-mdHdErp9|aF(!K1l*_V={^dk%{NV|lQ2ye)+ z^pCXy(cLFdX81QqzoolpIqFq0Qc}=boKF2}?1E0TDofiG&Oyh7XI5jt=lr?eBwj9f z9!(Lixzd;W>DAqh+u?t`grW=I9vF*r4RsXTkK-T_J%PH|;$2OP5KFlhbfeq%H_7qkL;_%S%S1KY%uk4n#KOn>4x@H6xN z-tGQ7FsI9?Z$C%~hhd0A&a-0Wt0G$2=~=#*e|E;sKdGEC_W;01gI&puh{bc;)OBc- zsUuvDj5{oyRzy6TWK0X!bgPH?0^7tB*!N*DL-T;Eez2 z&H7*4eEN|qTLU#vW?WJUsbzfJ^7R^p;Wx~n$C6`QhC^Y2y&~fsQKg9 z{?5EV#wQt<+2D+8;2DDL!}$USc7zrMU>d9Bo1U_8Gu(1tXa7CfsLavN;KY5g{X;S& ztec0EB{bV7CssuCOsOgigGjaS92XsD(<@d~_Dua71WdlT-a++4G-eE5$Lk6xIj(qfuFzuH8gIC>?8D23 zn?rLy6$2$~5(d3`x`Jr>B>l+pOa`~mc4ayb2aup^si5^4ML}e}srNw{oQfY?4^$r` zuq8j-8lS28)0(1*_KprM!YPDum7{#>K7A{BE(LbC9 zkQqnP#GO2&imX7rM{WdzQdcPuQ%qp4%)_;IjRw2^yvkG!?cp{{9sOx5Y)I8097*qeT+Ktk zBRGdN1}=T4ABqvV9sc+$-KE>NF_^dz{t^?e;K9L#@aV_q5-(_)%CM8{4F{hj?7A zNXbcyaf_FabN%}5X8guzZB+QmgOhsZ;?=w3DZEv}zON&Syk!3r6<*|5LJ13VJARUv z>gf7VJBp2~f~P1pKB$;DN=LQ9Xf_ZhCG{wuTrXG=C#pt5qR$9Oa&JF=J2&Q=^;1a7 zu(-%|{Ln+pO;hKxL$eIG@kgeG;Ab6mMEuR#3ew8sBQOG2pNW<%o)6jWfXX&x<5FOt zulNQ=r#~kt_a<-&w(Cx<*saDu$24Aboj>3p8Ci3~`*|-*+L5|ek$^L@G8gci6hi0? zF|mtYtJ|6KtP!xXAZ{h<^QVXKCUq`hcwpI@PN%2}@sTSb+*Mw>#NH7E1G^MRO%ozz zoNotobegUpu*9Xx?jtGEAhrwILSB=J8j|7Ow3!z_+IaYL&A+T3tH4&Bie3#z<@{Pt zJ1sf63c_T?Cnq=w#(6$fzUTcGX{Yk4{^uvWZx*;5p2oPnGVNVA)#dbhyP(73*rHGZ z?6zdjO$=}Q&9g>)kR&{~9=0$XmO3%^dv#UzcBcM_R}*t4n!nTKvM?=lJ)DiY^WppU z1KIY&Q~5FdqZ*4J$0{ySEUFHt>B=m;LmKmWLUNv!^2?)43cUHn7y0dwDkzR%14AF8%MO~&GW9^lwcwL$$asc8|<%p536~dVm zQMk;8OYK?fFpF31!%eent-PvaWYCP?`g8EmJp7ZZ^8^zC#r00Wt*U()^+ry*Oz>Ws z|0uSMhIphs00Qmj8g9t`#y1LrTsPLDM$*hrTv#IU!znlz?53(_B_HhcB0jebVtL=b zWN3RtRgXE@_I{?_JT%k{s9Shxh61Ny8faFgYPn0q6&6>MQ;Xl}Ir&$A>llIt&c;}; z$~I2lv@{<#(Vj3`x>GHaQ&uAal@%iQ(htY9$^ABoRQY^T>#L%_UvwkFdEgC-J#`lk5tF{hw$8N`HByy@35sWS?9 zmx2oRDO|PvYWx_oX=wn>TeavG9-h}p9|v+R2*Uej9AM!o2>?9pGFwyWeygQdt=K~& zpVe-}_@x>zYnSc?<#I_PTw7~ojcsona-!#CwS2tfWW9_wPiHElRa#8@nL}w>A3(%E z_VU{Kbf~;Ve79fMw2EKAq9kZ_l!pThWy;Ek2gADL?`!@aAQSXV>lMwb1dn&Mot5H& zP1%m|f7)vwh+Py;nzIl%x}}FbP<8%9wg+93eGNPHQt_;JQO0_`G*XwSb$y2|O#4~6 z_-k6q*Irrv_I3gB^r-r=cOm8{ygGWG)A)O4x_X7=x>ERybRwQt9K2(82%luxU>Z)- ztH-dWeEK0`(EV-TG^NJJx6&1W)xJa~XCjaPGiws~UyJzKnfGPv-i8 z?N=6vtq15IQ6*uvbDwN-NX|P_-KJf1Za9)J^TNQOUOESu7OZUI#Hk%dh#ueY^FGX! z9X-20-}>5XMAdaQzpDTWdYfdA65bWv>AbJ_LJ@mlbn)cCbU9{SeUWWTzy><)v|qHk zx`(R)WszUhHy1T`%0N-W=j#A_Vr3^Sw+o6*7a8svTGmm z9z&`e>!ch;m7`kJbo5qVs7YIM!U5W`!6T--=4KSz@xx;^ig~`_tQ9W$t6dRRHl-;c z_8V*=6{Trbfo*l1V&lGGsEaWT^|_zo7g>1HnNureGku!ifT-_-ziiK;zvKE zEe3%KKHwI0&-O~q)!0;#j5^n5G=cGksPjlCY4*$+U;D;=-LR=#B4(DUBDe)R!ok4hl$ zaT9)@ju;0Kx3PoVIRB-e1ek6|>*(C$9}t<_>LLlf&ac*#GI1x`_D%&1w^d!&3r7)! zvi#C8+2qW8ShdbTLFanyu$YtC;=NI}JyQ2RkFPz<#cHqkCCTp)v@K9Ve!f~agYyOE zBIZ@bzjkh0@p;9*w)!Ay?8)kRHFb52*w9?5+O?8w;U~c+YJvg4hn2vC&AL)%rn^ms zu`tEfy8ir0T$%k_K8)odaGAY&ezn`c)U0e<1~zIllv#h%A5q5W=KoAH$ybF)aDB^0}JJ{XeB#E-|EO#k*6e+pYtY0iisRkR8gK} z2lr%iMh2K|DWbFP%XAv=)@H0S>!a>}alXwTTwr26Fhk(u@?o`><^9YN9jKDTZ=+{( z7aN^W<&aJ%6UE)p^`eS7;-)Q}AC6|@V|>OD7^Z)g2WyF7!n50cNVbVTRX ziN%fHYZVMa=eR@`Y*Nd^R0Wa0iLi72{Fx(F?=$$W9K4t6%}tYqm*tl)EF16Z&HN47 zc$C`nhp|4f*ACCj2}bhq8N}JG$jeJM<_`_c-i^|#%ngG^>W4j>XerUB8W|KvU1r*$ z7n>thL8~9;-%z+uA$Bynu+RrJGSQ35v(G0?Wo8WDXq$J9`X2tIUx#0j-ZlfGL!}`| zU6G&vN#y}!c6PiNPi|iN+W)1HX$qj!|1+A?f0Kd)t22sAy(`8x0K#2w9GDMdhBLok zBlmM#bZ}t_q9*gM&*)+}tX=IX#c2)?{GCl~$oQ*kaM{01^T#iJ-Lbf>H(KUodc4}6 zyTeP*9cE@X!i;<%>QZ+QZsDFIVv?dVARnzC_q>#!iuD{&=JQ@`-y=4)i@xKH^q9Epv=cJhv2j;5)!qlDE3MZhnfg3=84!8BksBUDiHkV^VdHewIsFKhnksb&v0i;;YU;btqXa6A`YY)4Vg1rGpYK%)*O4}JOSz{s_ke(jJP0TvAd3Wb(ift;*>)?Tr>1FXIGX4d)=Em zZd5X|`uaN#Yvp|&TFmDM+ub>lw8f)^uHE;`YeBRtll>&2@mU_1GtWo3cTxt&(Lw?{ zIJ7&;nipQ?e&T((vrN@kCL73glX@?|uu}DBK&M-NPRf_Pep`rDA z(r9gx*2nkFNTuzXQKsh{jDvGF-gaRSDa>&UJnz_d?DlRxMeC4)`U&+mablt(qyP2A zXR^Hr<7J}I3(?XMW^swTIEYj6M)dy8YIc8(6qz5C6(`6Pp>4;mQIArW?rTomMPIl;ZP;^V!0412&%F;;3t@`Im1KO*BE~ zeqV|=NC(>yhZQ6Bw@&8fcn$YlI@0rUr=b4h!%!3D5F8tN2+ub*{vc}v5B=2MeqDiV zl4BB*-#ITlBm|5jd#|k-B^aX1|2NP#yGlC^=?X+|W3q5K@oA&-Fc>%=Wk1 zlqfm|xvn9;;mY9VUd~>gYg1iq`xn~-Wq)pr9q2CS0ayU_{?1H%c0Bn}3(cq?Wx#3N z62JK99psGS>Gjb%_Y+=lrO-*pk)bEa=tFL}Bl0S3?dZJoX#oNVj`;F%IMte^G!6{C zVwW_4!^Czz_jR=5eG8_$mM)L^TKJHdjdi;5Yg=Ob<7g{Z8U1nE8jPI1w# znMaM1&cS4>CqCDf%;x!B%^1LO#Vzd71abokSFye3fpwS44H$q;DNO6S2ksIAf6Ee3ZOp@3;*TCsUkKXOpjo{)mHrB^* zN9?<6Je}s1w>kOrFd!ZYU20cJO=$+9%jOcd|1zKpAtH3sSJK?v!9XV~{YER%7 zF1B_L!Y<))S#`GXTB#H%42|?spd7V!S{CzCh|ZIVJCO3`I~eSNa=~9$vo4VgF~N}v zym%XX<7;9TdRWjk_4%`(im@OM7t_KuI}D8%6yWRe&rSOyvf=(HGmHcqyUt?%Phc82 zBf~Kv{vzTzu%+Q}_(Pgl9IhDncT$|XEtE}ORHi2NaBt)!)Wrl9*);E^ZVVyu5mp4r z&3OfFTAI3$H+I5It6?%G(lj?EtF83P^Irf?_p8#BOwdPM?om4F&1C)c6I^-Ctwn{c zZq+Tx8r1P8k$N9u<#C9|Zov48b3S1;oRpKB;Ic;sW#_vM(?7l9_p|T$^XCFO3Z)mB z0js8SD`iI3p@>+YG;$RKV^ff;#BLl}`n^8vEcZ1mJ7>nll&=)P;QWfwmZpA6WH9+v zvaXA?=$+MXSxHO%-;f67=!bw`^D+IHnBKG2`x((LaIf#g+)4x534pV;%>teGqWLD%EV=tNSCZY3Sgf$Vnm zc9@O~b_DXch-+!1_3W6X7glvLetL&cy`Y@N)zo;xL}D_(pG&KsEclHRGT+__ZxTB> zUQnQc9uyVPxz0|+8%!(sITL&1>-nYR77?Bs&co|v{cJmR*s|FJ&HV%ut7CM2fb_g% zhYDM56{e_l%z(drcI`SYaZ+=rUA~SuchS%lVM8VLBD{`>H#(yLzO&-qk||c=jDM*^E`cSd42W>wfV`L6f}LxGG0+rzZA4{^^mi&wARI>Lgb8MN*dfU9lloX z6P?9d<2E#eXc3N1tO$S-P(d}Iv+{&%?y;|pb>abN`L^P#o zChNild^oN8ow}|oNLdfgizBRd0j$iGj;`iwqA9)(+8h2kpHgVUkf^-uj~+rF3^ZyU zVGrcZQ`}c4myDfPhvBczD1;v+oKc7_V_7Q1*#!OjfkqKGQo!=Y=Nh=oFfPbugSn@c zSQ6T}YuXs$w3h$vK7q4Qc5d?N*sz@)`cmrO`B{ekjE$@64sc%C=#`>6;)5DYO_@E3 z=>zs5|H@_Yuz=?E^p3+(lX9<%DwpqQs$nE#SDcn&vf6ZYc$4``Mbx-+sDc0()!{8h zsS4Mlh;Zcze+E)Zoi3?^a6mjo{N;=37gl5$lK!FB|H&826W+nh0AGa4Uu?js=?vkp z7{2N<1KSK;q^(UJv&<;A!e!Cp^QufqZNN1W3Wry%l_C}faQl6j#GO?8pbIxQu)dT| zg-gRyWks8(sB&?0VYQlVyj)UmXjEn{PgxUZ`=!&$zmd|U09R{YqoYVKkf%#;cs+f9 zri7suiE-k@p1-Jv&^mip_@gl_-Epo zz2{$;)Q)0HUk9!kg3}RQpt;<(hY`yGD=RdShhba9pOrL6(`=nX@6uxvJlDyyh@ujl zQMPzGu6Iy#-ow+xNxcj$3>kbD7Mhth7tZ^DgAv%;{wYvsk{3jJz(~g14Avjk$k?1w z)OpqYtv}h`2gK1on7sNohehRj%}1u=YE;;p>>JPQS>)MF{9l$7d=2MA*>QTszZ|(t zS@c~^Or%M^6s04FDZep ztWIuDt^_laI>eldCk7ktN@Yt%Ebfu8@UHdbH%b=*x-vV_c2;AcWg{ZxBp%w* zlmAPVq<1S~{Ylz$#$ZXhUAirRmR*0rM*b%@@K3C9HVh>8fVkiP8rryMPhtCfHjjNmWIo>=h zHH=>gurE7-H$R74A5a_b35|&YK|t@h$}e!IefC>hn=4eIk(agMF(aUea@s4=c(qk^u=|@-5XB# zC3-Dj&RZSM_|czbbe6&uo3mLqZB2@I;)~SihobmATmUV^EE6{_10C0a0?W| zWBzXE+s7grx;9%n6+f1|_*Za=26i^+aPMv0hj$rBejYSvG48KS5OG^~sxI5y^9_Nm zU*j3U?Os=j8}Dw7``-9=IT>4u0KKeuC!M-muCr!frbkal?P{5Yo2fQ|R2%qlU>V$Qlr z+b1psn~&#_9UG~E=i^pH(3J!Qc9blEFa0U^huIecd}hGuNxzlY@0v6MJ8Y12=UP7PJqi?unOP+&k3Qd3A6;QQ$|D}NV5A`Ay zH-I%W&nR#O$6kQ(Yy%kJ2R#R)fZl0G|eNOsy> zW*c{=&U>#&J@rM2=)JchQM*@^)2}n6t>VWJ)Aud*xu)n%Ri+bI6jRez15>32jb=Ev zA{Gb)Sy6_AT#P8gFQz?Ji-~6b#QGF)UcL>s>Tsv~+|y$L;e(XYvk%#u_S_YR6|t9A zzL(pBI(rapHfZAANY*%@c|P4nnF|(vkJ7QL{f1YhLiQ$ho_nHc+rNs6f^uk2PUVjV zG-T>{^q-Kv|C3thg@pQEi&<5T0~#CQg0Ax|KVh`o>!GsR0<^M!a;yV{)g310JM7n@CnRidk=uO;5h{N zzE0ipuV`A@xYjL>pD@aD)ooyduwQjvEEDrAlWb;Cd-#Y&+eA}cuqc|#t(%_8Aoz!d zi^c9=bw*D%^OQK3{%PvoYhTan8G-nx zSVvvSBrn~C{HPIZ(UZ5|hyAs`=+LQMO@s=(nVXICudG>>N7@<~;!) zbwm4)%m$1Ykr<3RFb^(#s{IeGAqHJ$v{n}Gh(GI|to?WD!kLXB8lO4ev;v*MkTWGNX zj$VpQ5nr1`MvWNDxN-F$pQ#k{wFLROJHq31W@=au->!=3O@XX*?623hIBwE#x-J z<9?8t@>DEa(9Q)%D3zyg5ToX}(VXqf_MPh`!;gYH`UYMd8nmd2-9?3qeM>M-KOMzZ zO|2a6jiwzL4eXuliCE`m)RfsB>^H<*jwRnVpT>zWRQ(wH6wi?kYkSL;foE{gRJj)L zrsJv|CE&-SM$Zl0pF)QVSc>f3qwv%RGGAn z1K{+BU1H9%CImf(fVq!B)X#N$<%$v(W-d7TVg zwmSe`$~aBrv=N+<)InBk(z}~*L86sh*rZ`~9OAr=%8IgEYS;)E>(x4%P5heVMisW} z23Y?55sL>?1}d@zN7SWtteSd$4C|mMqYHBh`upL_>z81?Fj$zLg-epp8N~&hln6?p zug!efXVLNZO?B1V+K*IC%$|cL?|(CS27K7V!!*+GI*{M9>H03k!kUB<;mre6_)!cg zb&9t@oY7$ak@d#p2sQU<`|mZ!+K1Fdu<#jZPC@hAXol#F*`JY5cq0IF!RBz|C${$} z6fV@ec%{tId2t*MsRhKHo*D^?_YN2zV+qQWx@{~@!k>1G2TzJm<74F>eQjQNoP=Tq z#;2X{m9~D)LJ2^@WHoIE9YNubx(CZE^~_1lenlS0fJdHe)Ovrm{0k?gvMvnP@Y*}& zdlMARtxBFuj^JC=#s}sygTu<)YamMBZod2o2?fmVXtQ=bnV&oLwwM8D2W)G`xlH)z6K91Bm~B7LBV4zHaNaZU&9d+0UrF?;0Ks{xL_gY_W*r;^*R;p!mx3~o<;VE1Jtp&5}oyHbwZQthqBsjmGa0fV`Oq7s^V3P z{2)~D&(vrYxBrP6m3t5b-JSl=EhPcudr?e`CU?bkZb7ULPfFm$1IcRY zzZOf;-vsVo0v6MfZw2+OO#>Z#Ml;SdKBDL*XwN~nS2{FDKAKrc(#3A^pyx{F%Qw$Q zYlXb4bjVyueHE~2F3^|MznQC*eTPM_sMbIua>U`LVwSKeig;9$rh~j zEIr2hD_}+b9y;>`nWFbcO_v@S$e1&=q-`iGQ$Z6U|b%8IaaM4sbZ6Da^ zogch--^_%5vrZ7!Cjk?1bG^1Hm8dq3kp=tZkS+WPwML-G?%$hl$-1po)+^s!>6rvs zAH?9L0$zo>Su%7z))E~k7w*nr0`#=X{u#yg%#jVaTRn1GI6!vk7~{P0lh$ij5$@-h zy_y=XQf9NSvqf_1@$)|d4W}ijzt7C;UG1{=bqN*;>KH71`D0j0B20tP47v`qUWUos zA~i@*_sZ=^E%boqbQ^KENV<~gEN`H`J!bEJ7w~x+dt)lw7ghW|`KmM2~asMo&}Bqj+QE*xGkx z;$Bv>Wg@dT8bqwz*CHol-I`UfR|`U$KV|?1=@2{Wuw={#d=&0idE|v?bJ8P{7naW` z!qXt5W0OuMo+n7=^wJm~z4ha?c4b-ND}w$~^BzC0$WiH#y}R)imL-7Z_ynL-4IjN7 z9tTJGMljY$0==Gx_4w&-0Ut-&4F>1s$swjx-p)_Shz$2?$!p>wEL>5u9!YfCRe9G< zr2G5ve2dXq5dTr^Yv`kfjg;CCI~H?@w)NS=nN62jZm$>4YJ*k2Qq=(h&i?I@tDu-& zmQS{e;=|Sroon+GQl{|;E1T`=C)*Gku%?-j8aMwTi^(2fB9~AD=Y!J5l12O)4{Nu< zKgp_o4C5(!b&~Z9h3r7?ZMs={$+CH%rYELs^ThWAP3`Roa?sNnegh*f^*Ak?2R%}Z z+$tD;+^T&w$55p)RoN?zXWof*D6&GUzkE^dL|KMagYdlhV zt=3fp&nQ|0;*ZLvq|CTA!x~q+0<^dzt#8N5$0x_%ci^Yf?oufpDHXpt+rUca!;> zJ16t*atjaaz7gIRoqkBzy6|+wB!Sd$z-uuND_R~03;X6r1iXcj1rAf=yiemEsjSwO zb-%&5k7{ZSgoar;-~2(9R6o7YOVGe6DuEal*nPWJ$A zwNlS^Kb*u`5n-c^WDIh0Y`r`q7bPERF0ivvv*KWHo62N2l}vkYNDx@%QIh%>vu4IBTVA@pCICroTq-Rt%~n#fK%$Zq^6kD8?xwbm~ql*n}y}~;OI{@RfXM3Z#_|wy6b*&r4|*y!|1XQmBU_ z$?(1=2mG$4`*Ud;ei?)0*LGk_$QVK{sszT)Q6&#xy~rQ@#63jqo$|- zs-*ve`~8obUH_yOO%b+DyL(2V^P6_-;KxJCAn2ooKCee<(T9 zwd#&(gpE_O{*9;5wncCUkzLjH78NCy?fjp2=Rd-gmT=cuttu?%dP#Uk;i4A@aCB#0 zxk*M`vShwYJL8rgREtd+fX8XHpM`ox-(!GKfA}q-CRner;9@z z%iPt{J9L+c)qdc0ySmMwa&)dTilaJ=Dm=)wQV^_s5co0lx*59cqQ^u6e`3gLOOefUW zMBpqFdm#lQ8Gf|}IQ*G(3ytEZBJ31U%ij?**6OR(}f&u4&uJhbp& zC-CT^tQK69Hq~U9%4pPFg0@X<53^sP-MO%{T2xhJS}`u7FfAYKgetei>$qkV0+%^| z9MH7?WXA13H*x<)mp1^Z_Fs2I!q58p9%7U1Y_?jqRj;S(OxCJC^ehhL0!dvXOoi`jvx?i0J207zObaNEG;Iwv5A;H&hAqx zZRuuIU2V(JSXPM-*RguLr%TDM2q@)h+jclA5l<4)Y)THP3I z(iY6&c90gP`}0|Vk2|pR5*c%#FucG9x6!4iI2dGmk*FO8a^3;w9!U3R!(5h=xnr~d zAzE_q7A=Vy36sV)ZTLI<`^o*kCPDvFut+H*4U%S|Yo)b%C;$AjhYbv=`Qd6Gz_+sRE;$ZBq8=G(LmBP`4^joT` zg8Dw^l|}F9pHT#9*S3S}-h$mA=HA;ixUCJJhp>dotOLo+kb zk`k>49t{UMI@j}BvPsA9oVj1w=K&5^P{#R`AADt?ipUg}D{PlZV0Vj)uRmm!qQ907 zIWTy-S4O)CKW45&HsQz6CE4~BtR6r+;b8vqY@o>lQ%Z=>H-qOR!-Ef=8Wxxs4d%Rz zlY(VtJq=Zevb4LP$aP(t-gEJHao8nomj=vx4dFeojapTh?PY3KMKy@OQNrWkuG@+X zRkqp8-=m{ZZ_?#!tAoE6JRf3z7Kwn-Jw4P(Pwtzv8{p){?0CPS(PlJyS?HiFD#*bV zeg5c~&J1sIw>an#jokD_Xlf4S4F?gL9X}bgQ zqsy7KxQ(V8H(Y#2&Lo1sUXnY0a)Ir_Q%&g#f5b)I^oNdCc~|%TI*oOn6%dHnu$Wjy zOeaLoKzbMg5vfs?kym>eCb-kh89ksXSY(ix67BNWP!i`|zKj`-$OV3f{r^_Xp7r-J zWL#y8LWZjF*oKMa?BqcxJ6c<3=vH=drs#;A>Vy2HK)%*uXwcO0|2;i#@?O2~78&z5 zGO;0dMuBoU0t}&Mnd4gDVmp_;2jsDnVZ~xoV&MaF_8CQ`EWqb-Lva~Jo(4C=QT<=zyo zC=lHAec@_fLObtRkk2nog>?h1xC&;t(a*O)yF909&aI?C0Ci5~4$#L9^j`-s`E3!4 zy1MryjA|jY$_F+kZ)Wi+pRCsmk2?yI#-vVcnI{C17A|klD>+Yo#y?%LC)jbRNMw7z z4b~YQHiFm3BV0^3dA39M%EZ7V{;NllLoZ_BxrL|dh0lc`p1iINqL%Mfl)}m#nUpb< zA*YwwiF=h(TBEC!K#?xmU-Xwwj_d%nmL8dYkCcK_t5a}p?D}?BeHS!IRjzz|=R;X< zPDI}+?c8+OTGi~*K709t1)dLzYiyR_&0O{Q<%jBRPO}t@T)TSi`selldU!nebzoLp zvF&j}dxXUdbhoPSu!$fJbuilyEjho8p7WO}*%Q}lK3=AzJMH`P5g1ujya_%50HP$+ z4%N0#vq+~3@IwgW_G<H8SA)=_nZgO?%XhPiQ?pwkbs>s*w2ssTOa8lmaE3Xo0^a^k%2@0Ugwr0orPswFktTQK`2V zHc%d50!Zc#vrh9!fRo)$9=Gk<6Ylg*46Xp zIC49(@_>5kMie-@{7Y1Tl1mJSbXz~XbZ08?+3q@Ll;^`Ht{?6cAnil;jaj6~C-tRa zKk?qty7=3;CDdI z;HD80ANYOLh*aa6Bc8)G{BGWz_wU4fInL8xXg`Km9%y?2AOZ3W zM>ZrjZ@GJaf>4TNhO4Ax4e~)7e)zR0lbHH|f5nZh5ANi`T=)3JeN3&t4(|u>4`8M_ z`VJTCv(v1+4FCr^nyg9}chm2C&pl6NdI>dH-%vC~+uZ4~H2Q+uhWX5OB|U(nTy~(^ zw`he<6pxNS!e?~g?Q+9e^Xn^VL$~IT%da<3apk9eZVe@D^O({1-Uo07SEajt&A``` zv-X9TwE}O6C97$dtEx|%B!QFU6xz4S>f(i2;&_x{*K9L_?nYB%Q@&C;@PCxGDEyi& znh6>o8U{%F0?sRUTtocvR&p-%O8EPATc&i~fsETGsbALi#A}0i@z)oA6cexc*DtP2 zs{`bb19#>@5Syro`5L*WNW{GJ5de@V?FqC<`i|sfeaup=5O0V($NiNWljyigg=6Z}5#A$j#97bOZFc6z|<=KF~&f{>^7v z%ChefODfPZ%3%Iqv|XMFz#S~Ak5)gOPX`?Afp;5^$PNB^gmfTp^4tW@g*a)K0dmjT zJ5y$-AA!U(ae9|wbX)n1;%CgX*|ECJ!WqTbBS8KA&pb{*O8_+LB&#H*T0#72ePIFf z`MKZbgRXu)JjLCZC#FFXpQ}Ec!Bw$Js@`LMo?b*>&G_b_BKE+L4=xK|3c`X@sU25C zO}od(1M&~c2Go;d(BcmRN~6)<&i~ivh7*rRp zYKq2b1M$R__kYcZf6UGKukG>w#uI8GAcF@&h5B4440$RB0-_Q)InnnF2H6x}*O4T$ z%t~hY&Ps!RQ9f)Wj&LFt++uNG)7B%=u`{{HG+J_uIKuO-fK^3a2zf1a>^6;}_<{Mw zOHaU^KI!v#~VA+54#WEMVoPU3x$~s zDmfedb(3i)0^3;BD{EN=$GMPBVzJ;CRVsbD4z^3Et~H>LAz7kvMTyix#@&tVb{V-6>2i3WFjGuVHW6h=41UD^WkvSq1kM~>hfiYm8T;8*UgWpi z_p|VIGlBo@$X3~9x?nc@OYE7l=_?XlD5!WL!ZH4VngOws^HC({(m-I)gA$3C8#G?jYLzxZ?YvvY zR*pZktFJs$$UJ$+aq_Y2lK8-g1n2TFNN6Off_WMAhftYi^QTnH$ZkFV$_Q_0z?(|` zvT&njv6pVzLtm~vc=LH|tGO2U+V;A~NZzGFTYuW4L(h~>Cz;ky>f+jT2CC|4b-e8@ zty}*5@~^IQ-G+&4qYH9TovAn$tVX`-? zZON`IK>pyK@w61A9}{`0|Co_cz#$^w#2Z?o5@sy*yGMoR=YNb( z92`01E)F)ho1XVXLFI|*v)dBfjmOV01G^ASjjQ3Yx0pHUqbdMEz6km6+sfoR!hrKX z>BIl;c%lG`U6wu6Gh80Fq!1_szs+ZSWKG3tpC8Wz`P27XI5YZp1SE*EXvr0_`lXCy zYL>trFK@5zQK*=!;t@2l*-G!pa)B>8v|3w}n|`S699&yjT&w7E0XD4SK06}sw(Qte zk+9kKj6*^$VPNONQ8L07QB>3AZ8Der2t4<8A(@eY~V!(-Zh5YwH3Y1u#D?>QI4|bKV*GKZH4G0 zsZ?cao=~sm+4HEZIqNJNh$&qM)YtC>X2R@K%3}?`!%(Oh4Vzfs_lRB+veq>@;dXid z*ZuNgk+`sUAGU8dn>8w~+a{+8Z+j0=UDSs6JU{$7 z@FC2Zvif{07*w1Ia$3qud~fY7PVUdzeoT?TCp>h2mruO*7s%B4fv$%c8-U#T>WpF) zI!mvu^PsgKm_a5Zt`(g5j=sTET?*>dGIt%&2zMV_F0nQW{OuIHzBsa9~xJh|FcGx$>F({Eq6!|$LF70zcLDq zX>(RImc~K;(6v^^GrlRf8PqlOXnPhs+=OQOIQnF}K@1po(=hTX&Pm<`oWOLt81C{2 z$uCoTIZuZ_;U=6p2l*{a&fW32LhQp`x(&_mT9knzJ45g`<&|DOfn%Q*zgT!eLE^zA zK{c-_z7Q67r8Oq2L35Z(%YY_vxm2?Sbv@+&VDGJi;)=gKQ3xS;2n0xQcejw>5~LxW zMjE%^!6mpRB)EHUr)k_94HjrLXyX!sYjB6`&F<{0*_}7_ep|C|cK5ychoY#aDf-^~ zJ)d*VM@TIQ0iRo%GX`0Gt{l}vu7ED7Y;=@5C@>A0{a1@P!mV&DOeCbU_2`wh;Tt!; zjwV(MdoZSu>IRt4N+rlL_G3WhuTp{>Wj=~qc=vuq+S$HFJnp(Rkl-Z2H(hU`&z1Pq zV4uUYFapW-l%h`@@l+J`Z3|Wqz=omx&{k*pSfaHwpN4_RIEipQCwmiRTO3|Gm6iGj zEe3s3)JA7}^AkgH->>;tFsyL6I+Sa6JpKwUyA@IIz|TeO~kz*t7tg8Q#O`avXyU>B)OP&?~?G z!uS{~D;YN$#XigJd=6m(DaQ-v$zI(ig6(Uc%AjXYU9;nXIZcQ@0ei*Qv~~fkOYamJ z<7Se9dVSfdR4zs@!A4z%&}~ll2{2BWjB!cn!g7qaYtTnP9!(oxRe2)uUML9`YS;7Ai#h8c_rm4tyQYXEoGGg8=8PJ5I-=-fo?D3vsrD-a7g3*g0!%KVn^FwUu|0 zYNAencJiY}(TkC();jpZMn;{Iv9iw&4w0n;8{F#HHtNwC#NluAa*P1X=jh-kF8w0s zT55s~HlI~z5jRi{%{~Rj03QQB!`r{R5QxKdo2;$51hh9- zMcgz0{O{{el|MP@+Op8^DY9xtA!&`h#~Pm&@Z-H@s=UH7;&$x)e2i5V z|C=BXO^+=v51nb^{?3M?{Hc;Ed8`V1gsHt6N;Fx&s{#^7nX_H+G6#SBfXr z@+(~Z;!AAIf=Vo}(>{p)Jakgn^Lsl;Sq+%DMshjkkTR0*Wx(xwO zxGShjaq+!W4od)Xao5?8pG>6pmac?{P~+n|lm56E?sBo#Qr@RU*(r#uR3dXfL;ObWZXsa$RIna$e+hpOh+A(So1fw}ux#O|XF| zCPHv}YSg3L7+_8yqPn_FnI=RO`NbjEkVGY>cd+OcHZSfKJLMauPg^wEhZpVn4aE$i zv~_@6S;^h&_MY32t7bRu@k!KCz)K~JkQ`ozr_o(~w@IlMfdowxt- zwq*7A-gu=_|GM7>TN62W2bc~N^EhmekR&COlID_V zZYYi@)QQO?Yj4PeE)ctsJiHIs+(BDP&o$Ly971(JV2ys6#}*#S`>yP1e=){&8225d z<&L|FIZ_%?2|Zfxp^8rD5Nv90j3m|d&3uEEfPaP(`0mM==%t)RczWR$&Lo;FOmP0V z#5^vDyr0&3hbakFgZ!0TQKEDwg?woQin0b?7JhV+H{|0k6#%|DPP5ZdGNd zah#o3@kJ!biLFPBRVNe4@xoS-N9*A~1sMtZ8X1?H&lN=d;CYp42}FjP=cw3$ENtud z6xo*{v+CmSDT>u)7!`}Z1$oIS5l-q&qh!ioMrWG4#Pv-w2D9rC>IHl`Wt-T8UoewW zQ`*NIWZ;mv30(!pCpYIQeYf}a-lE(qjrc+JqNqtrl?(j>{EnI_{+3S)bx)HW+k2FU zEgQE%0J@@~7VU31e>{?V14e2q#wA7cVW@BQ5AQ~eX4ld7RqLzxC-s zc_HrS?`Qi`UAE&7l-7dgUYU6o$XP|po4ZMk#eKAp+Wk9)5Bb~G14Hh=yPTbXBLmnR zNaj|dadd!@cr2}Hm@ANhg4=Zi^3-!yMn4*R6(C=$0-b=X#I5eOczYi(OEknAol&+4 zPdivS;Az->dA~sIOz^wqh|*oRe%m6ZlfVb$LJ*kXAki2no>s>#8wkn4n67kd7P;k? zt7n_`yd}8&T)%tt(icnLt>OLvzk*aE)uKwq6mUuj6Q@83;v>SwWewZj;m#9&M+9i5y1SzaiN8tObLO$K4N zWho_PqICrvl*IhJeY#>gt?~0Uoy37~c$zq8BvVE8_ZX&VJ2*vc3++}(PA#p^_D7r! z@?EA$l+g8?(~}OGYy2?~O}SL*+j>K-_7@iituj7fX~n^rOh;MxS`;Hit4pX366;mE$D}XsB8)dt zI#86E$>v%>s?^$UY{3FwK^ApWvh{O5IURR-s0uroVjOWYjyZ zo#vLQe%KmE}NumE>?q?HnvCC(d@fzakw zmQtUA+8=FR-_*1UKa`=kS|7P?XGC$*0dr;VfI?~!P+)?9?7D!@RV1gYi3}tf<_EsU zlz2!S9OoLS+g^#acl&)V2^grlt8Hiab<9F4|h}OHI?{_vGrT>ho`SUTTpsjAEa=3J8C+ zdb$q9=NC)os%I!w?!g{^ZjK@2s9<*{4}m9hzo}1j)*Kb$9f)~4z>u+{afarMtnY49 ziszSGd+)70sqp9(ho6h+*Yp-whW7^d`by5sX$>BtpB@^tRC8_vJDJn98#n@JL2`Nb zc9)p4d%az$!&+kX#M6*I&p74fN^~Ct3G@xW=_z!3uzBKWm(FR*W`>*#7(w0V8H_dF zh8RkjIzH1fUKL<7F*Pg9jY3}L7Ya1f9zCS>A=Bzg4E3M5_iuGzVMuF_-FbL3;x@@q z*7BLtg6R{rLF}DBg70fT?N871pNNmp(3EpGV=~C9giN}VRSA??!Io3t!E>%AT!d=J z6N+K>XK2~(Iwl6d%O2O6#~yvS@$Qjy6x1Z{)JX1!%H|E?qfi2`F+Wx*CRUCHKzxXL zi}LsgXGD+U6-aoLZoKV*RX)qIO8QMZbhq-qXJY(#MIq2*zoQ@rC%WU|vM<-+)ZbEM zJoMWNKRajw;y4SGu7$dAi@vTZ)aqSl5*a~Y=V6S?#ptXf<ZTrnS_&EacRvU!-b5+oDTAp+&{-BtMl0>YlY#(L#%-jWc-P2si{?Jhj2`|2KI-xVq@U_nnRta<&LK?TC~s0i2F1I&0@3unzP z%sfK*Fwk)WTAaa&Qd_|&)%$QbUEe;?7qAJ*O2*B%0jZ&6ST|-CJ!=zS$V)FwZF=Vy1qqie#z= zlaxYO7yAM%Y^*;W)d>@Slv1)qz?Sl(_t$V4^9YU4%t{tI9|oN=l=?;qo;$&2M~xvd z210Jn!3!T=zPB9$SaE8TUd4-fZrV5D*mFu8>OX1eTIlry%5w8u-_-yTuhRAV5&5k= z2{i*7O-H$yAtwp3DZbgsFvB`TWkzc$)y$ZhiYgOGPC%KRs3<5>OEjVvn>COS%dRBH zigk}6+fhG_El>4u;gRsl=6JH-qFn5Eq;YfAS9@f1vJ#w@F%!qBG#AK;0MrXxz=RV@%^19~qG7t`j*Nn1{8t~i;zXcoLaYdtHIQ>JLh#B3Rw zyaiL~k+9+*2HIUc(CI4Rm3%X!byV`@;k}%a<+7PlR~=TTwk{}l56{v|_a7E~L;3}* zx|C#jxSyP?GlBrQh;IOcuZ;4xcOlea>k>r+~E`q1ElXvuz>j)w*rdFq3VA(Ut z*F<-7&Sul=|Ne@lM^$v+-uMB^dg@cg`VkmWr@9L=J(m#zS ze0Y;1kEKc?@p592Vaxq55h=T;U$Lv_Q!>J>Q zG3IE7{v%@u)QvwrQmonf;v0M-i;*zyhgP>tR8f4Mm*JBnMSkguxi=_cj;i2?*R?cg zG^ax)IA$_a9jqY=B6uiDhrsx!i6DVgqTG$dNfiPvmwX&@_Mef+3TF1AW1A_Q#%ERU zJ@-1dm8z9-Gk~3D^+W`Xi?`D6vfjQCZDwu-V-b?cN8WB}f!MZAN20}|#DQMp*m?q9!29eCzP%6Sk;_>TiUWM zIEK!01$6%NVfaJ|m));YxvQ8%ngskpol-o3_%g!DCw4M_&~$Dtz-QC{teyIoz*cl3s;pC0w7@#1T{6BJwjQ>oIb>Fe>=MkJ2R^Bo8I{!f{ z>7Lc8X*>ZaGlVMNis+T)?;khvTANtsbAu4%B|I`7FR#IBwPfQ)@zLip@3>m$HnaWj zmgy_tM_1X0S*2&nSax2w?ZXq6Ds>9d`M_kqENsk`L%y+w1em%OHz2};ITXFT>Id(n zX!g?m)9!)czZcf6@GjU@Cs6w;`&grxc5 zw+|RW_(!S|l7xF>(*C4YHEGoAy+s!t2?KRE~mZqSxXJ3G$ zs^yQ39W>n&@>fY94yMWyr-BG#3}tC1pTh#RK=9` zLP;T*6BeJ+bnWL?UBUYVGpTMfX12SMlT#C)3H^NfJUSsPuB4snAJ$XN}EKvDue% z%?6vxeRMWMG4tVIEg``ufsJQ?dW$f1Sjxg% z)g(XX`})q73-o#Gb(>hIjcHazLp(VdYcjj`rA-{vp6xTfJ~#dL&3H zWgq!AM`zvQT?PAj41)Z|TYc2-t}i@20#gN~z^Vs=A2H;X(q~1(wX}8TN(O&E=*de= zMvN}_nDwal^66v?h{vo?Y&&wluI31|mM^y7%j3O%Tv)z5@)EgmZ7H4`r6N6)DxTxd!Fdsk=s?{i9MRpjMZ zgo5{#g9XFbAC%1T^N$(#i%GX+V91pV5&`+9?HA|TEG6c`I`56*;XhS7`Z)@I!L$4Q zRlhJD@*a%X6t^K5z9k`zJdOCIIl9*qAcv!wJB+A9A<)wkJNDp#_CC+ z&LpIKNsJ&}GcGBX)x-_y{8v&tSEqf_9jc?J{0OKARVE4;51zRluKsC zDcbuBi~W?iB>ND7cmx$DAk^ek$nCpwYew8MKCR%J7x4hhLZ#Bhx`gxR3>n96tW0=p za!G_9Lehy_kNd<$GAlzgrd)=ajjGczuyaFXCWq^4M z{2n$hEH2)BfuV*hwB8e^amxEm4Oi5rgOK+D(*FJ(X)ZiOSV7cmcroJl$A+4Zge{!B zzx2)yvaDYq3=i7rx-5(G`k*ym;hcpDztyI+vz)3mmHdwig6baBNX9mYnfZ*t;jRe@ zT}k(5A$!|B=EC?e?ec*B`w=x4!`EL2%yiWnWi>iUq`Vkb&5Limm|}ZR06#No{-gT( zSD1+gaqpCtF%%!t*3u#>F=dsk*{@u=>~}1>RYR?<`43HqqjBK7aF!3;A6lhHB1Kh7rH}lPBq{*i+V4!1QygIk09_8}qjc#27t zahx@R3bCavGQ#+p0;PRO8eeyJHm(>KC3X3F{rS;~hJ726A@9=@HU&9K4~?ta=7{vY z9ny5>aDH?C$Fb~%eVyE-uEV^MeNULUHNoIDGI`qpY1`NWpK*CA_5NQ}69XaTJERP9 za^F>5$xK@ag+XfT{n)jtotEYl_(O`X%$k+M@I_rG9uA35UOAhJ<;<_?I^CFF@3W3 zm=DY8tSVFCr!a+*BQCa;88)n(Ix>mO4Zo^;niX%;p|=4kI#={;_{+c$IS&86qsP5doX2Pt!c&>H(f2| z5(*{42iUjwe%AIWiV;k0Nyoqj$m}+geVaeiLR;;8vc_zO!$sLNJkz2SzcL3?&oU`l z)H+qZgH=Pxj&OCU$a=ICQ@wte!&^14Gh6wS!d3Pe;mO&ct$ju?YDDvU1g51xbL#1o zxPoZ&ho^{WS~~o=lxZvUa=L1ah(~J{uG+%I$AEidTYYV()Dttt&;so}9pw<*T;D_mhN_qHTfRI~=l^b*oej|`uf(L*H+P0|MrA4L?7+=3^9xIhPHUf1 zB2}wA7i^?Iff(b_&#lDd%%xPCT1O~=3B~&K*WNFE#e%(Gv5t>N3Pp95Cw10^Nl|=d zHKOuw^0EZg;S66$s<}*dILJVZUW8P5_hk12D#C+K7zO3r2HO-t&b#9uUU6G$V@Q?7)ge801*GS{t0MzYIXRfuXDCigz7M&OGWernVem$x* z)`z&=c4J)hhN<2C6JM88p!>3d;q%Kcb*FGLMz&T1(1Yx{60=SzXB@QbGnKurpPq;E zAB=-SGYwEu+d}N{tI;a{hrFbaYg%3>h0`r&l8Ii4kTS(f_p3RB=VA zQ9LA1+UCc#^vd~}Q{!aE*4ftRs0J08WO&$Gd9jX}vPH4EH=I%yQvmw4doeSNE*9;< z_nWf#+&%pKzNf}1w1`qN0!ZxXh>XZPN1I4ZN)!GoT+xA@?^zUcJ7DOU5If~%Vbss4 zwQ!1(gko=9S2oEk=nYCCsf4FeZ90sDjiTVxsBNO?e|{vzzty1Zf5*=4e<~{Y7ck+! z`GKK*=3UBsoCIEhmz_#J>*2uW2NIc1!t-$gFq%{E4!SIOKfptqgCAMxdIV~4&)V0e zby#QWw7{`^&edITB(n6_Sou7A?hiaoNj5!mX)^--rJ}tB^rpE#j7{@=;6Sm9)D?=1;ovY=|&Z=}U^1X<1tD(%rC`0bb15 zOgGuuvD0Hg{A2P0pW*hFwrG%b)5T``Fek+aQiDd3H1CqPjzHQZ&(DxVCtGYiCdcU& z-%1Ki;$0)l6=e0^n|w*Kl7A03!z18b>`P%wk$P4fO-uN8y?C3Wn?yx+UZj9fMSy*uhEpgzhN%Nz9Px#a&7ZoQVk+ z*5LK$e5b{`FJ|VvGCR59zKNdOc=8&tek$lPmY(B$TPQ~-3A~>B0zbc+V-8$|b})`b zMcS7WN#niK7xrzn4TnAIk*aGoal~Lv$9WVKhj`B%_Q~80rV~|OU|_vo0cm({po{|* zl{5&DjGP+BgzBMs-7vCe*WYFr>83hz02|}gSjFf#_*$|W+*}jHK`cleom0--K27Iy zjK-;zd&(H2LaE-1UCKwLz`475+uZX=J-iIOHHMMAB>zR218$ACda{IrlYiwJL2avqKW*bt1S z?4h3n8i0!7sNj_()e;^`F50e3z-8{s+!T`Fq0#Z2ll+-wJ+N62lh|jL6BQL|c^-~Z z+J~f}ZiN!A%4Za6t7bO?nk3vmN^g|R8Z$q+6$Ch5!^b{==$VAAr?ls`u5eD^7m7}k zV+DAc`t&6^fl7IyLa}47Pj`si-fK?gpOMnW-^$RNV&HnwB4G6IsC8Z>>?%hWYPQ)^ zQ^l84;}m}quk}MgPba}tS~e+q2^js)b&~3m70~9^bZ*oiW|6yP&>jbr#_VmsNf-pn zfs6&DI!F19=Lwn3tH<84>(kP6oSwM}OhUoD+r&5~6Zq~@(k0*T+>Ga0+)WBQ7z^y? zhLyu_tEV=l4s*ds-6M=EdO {;9Efn@577Zvpr2M>JlHPu;u<(I&7vz}56%dtmSgxgCO9C3$;vkG`D9 z))T$w$-(4ya3HLo`tH%C-yjd0S%BUz`1^SUs*!Q^##j#n+imNQ6i94mka46Q}8fk$!rphyuh#poUHRN4% zMz|CaTn~M$v~%TXhJua1@zOjzQ%=cXC$%6=3%wv&9bKT${**#f`X`>xN!1r>VF}4@ z+0f}A@6Rn4hA*b`PKNX}1U%uZ;R-kKk_hj74prnscF2xEa^nkh(0Q5!vD#d2$jMF} z|JYhg-653}>ikrdHBB$IusBOG*?K+Rx-c#R#8vakBW~vS$KLmZE6Igz5t{0MoPlOw zw;vI^B;`Aa;v18br6&-6qamuow4tK-EJ}%)Oh7-2N2>Tj%apy)#(M^q3RCu*o_@Yx z-9X85#W9eP;U*NDbR_5btA`Jey&zpkXCAqbCsH^Q6fAK9y(ppPKyW9<4Ew6^bn6|PWt zdm=zwuA8~jl;?;i`$?Sj%?xO*c3^sRUhhuJOJ;7&+|<+V@{PeV8rMtV)&=oN^*TxB zqC3Ur`gdG|msQs{3!}N{D|9g_SFO$CWR{}}-ZJLrZSIS~Hg@McMOofq+n6+#ukbJX z-nHN+xdlB}I>3$Vb1t~{I!_qfoM^^PM^ z?6nK|Mr6;gV#Q!F0sg46_H_MuhhXVPvD!mK#+MbqP*8QKm(R08n)NE+bM9NVEtX!% zpFhkGeHx;pO!>4X$C$an;%}DQF=Z9ki6{A;e+7*SDtU31+>iG$>&c^GLpG%PudZDi zpAT8ATf}L9D#WJAmWpMJfmAyfwiyy|lYAK0pqMc<$$^!HQ9RF&w2oHD``WF@sIZ(P z#d4bv;3x;IOsNuvYH0Z zleUtSNUB;6h8Km8K}O&Z6ew$2p)s{SfOr13*?KQOZ2MOYBJK~GrfAE^8vHi*M&zo( zqhV)uKHVcKW;9bmF>vI9@cl1-BB+BDjiq;^dqv+|qMHf})o;UD7LFPdHC38)YI%^* zv7*>l>op6*%ro{ITe+#CxRnUG{<3M>O$kQ`qJ4!oV1N)OG{0Btbkp)6t@-_HjRS)2 zrMBdzjEJD|Gt$rK=^ZQM)&w)*-b#$>er$Oi`rWd&1=@Kh;$>|5)GwicfXO5vp-s6L zmUD3{$@fVweT~qq<35N(Sk%!F;wHY+b`Q&Tr-!UitBRpXzufujb_4hVCG+NO#v$cwEa7#&EKRPEieqf`<*O| zVNFxTQTt156xNk}sgz8veJsrop6mJ7bv}poQsv^<(Rzn9VRhsB>*NG8(-;&OW4c2% z>afT8Ac%CIR`Dwx8VO}P&+}hm^vu>-_2X&)9h@V(UoToCA@>s5YGb=yL^@gLa{K8Z zC_k-;{Na&C|HJtodi-yW+0K^tZ6Q3*6&w6+~r4-$W0J01BP`fnt#x6 zRPU9AYq;vAC@;GEs*z-cR~U=2iwqPRsv$lK6)T=xGG}W7L(!67*trC%NU-{P$kWEA2V^SS?@~F)w=>-D4e3lC?F`L@0c!^{ z_{)Gx72ac`PKbtD^yOxoTFELu6e;3&A)zTgcJ(mVC@bF^L=e~0^AXWT3|EME~Rb7R{!2A+xf$N8zS^VmSZkVcvo+(p0z+2a?31s#WwZkjMSJ4aeAWElLqpC zeUV??)QHw_!^Clic8&hq?|po48A#$CAhJ~p07SN{mVZUI!GOs2N81g+VYtS8_Sbr0 z>4jtE9h<{3AcNWkX3&5RLwjAPqY z2t@hs)Vam=*G+VdZ{9ppyUlh#VM&$nOgoKSpgl~WT`N!huC?lXM?L4GUQz%)vslq zGp26IrcN6^jj>#JJ~TV&IbWB@7lXZXO!LNG?cq6|%jcFCgsO8vQz=CIY#73yolIx| z0723JUvm>{|1%1l!N5fH-?2&k|18p|Qo1IVngZz1ZR48+?I+I%$eo3q)vcVLB7Uo` zk1NN_TM{rijjR#N7a#K$GhTmepPGxpmhdk6f)SlE@1O3lkyBhbd!;;_o`I&Q7M4|L z>s*hSG^>qNEklv)k<2#npKM(l9TlK>Dc^Z{{XwhUTu1$~die3Qa{b0z#bK}Lw72uc zGhul-c@=#VW-!4+wTZQ~7sNtiD2B^9#hP7QqK^-L`V>Sn(FsJ^9_QX(yKN-0ev!sI zci!e~IB$S_m{cJpE_2f0Xak!MvIagGB2_=iPf6_=fIUMyme_x)Ta+WYlpfBKR2PUf zKbAWG@@3WKwVsp^>P#rh>|&xL#HLL$9r`iKkqHL!vdCe-|YWY6TkL9WB>8k{o`%cKXziY;sC4AOW<9%de2r5 z#ItA&{6CNqxKpr^S07t^F;z|#PFA*1Zd^y^?p#`KKG1+1K+v+#Xu(#+Be9e)Y)G9^k6VtS%bL?*eQGd9f$Nzq52 z3et&=O>e2*b|MDJhdH(k6pwFpQ0S3!BQq!OPfG(%Z0w}C2x)eHKMp4?y=^2sIbF$8 zFl3r^J0%8&(Gc^}n)b)vEVaxzEK1-BYv;=-rjV^?B`@ZJUaJxdqv2tq`Md#%L%?p$ zF>P)KrM7JW>9FJT%k7z0(eORv*v96H@ACpAOJW)o4Z-*OWzon{Ua5=OW~8k{vqUNP z^Ji(evnKFxB-HfpBJ$rM*Hn|97c7;zboj)p!S9o%{__D*_I2QMuNEMd1JBG3xDA7IK~T| z*S96t_&U6n26$Hh**_#YJFl3IG`hKtt;a)$q$PJ3A1+EAx99lmdN@dgp(yXu-5fIE z)0v>T*;e%x1Q~;k{ih{Q+_n+aP56r+znsG~AWeLU5dLU^iLrD=_1M17zfzu)$ScZ; ztL)g8>|Z}v-6|AY+>LeL-FUd~i;7#Sd%7R=FEsU^-#@72&y0?$f|47w*^9MFN-76c zBqw@JF%nh+NXFosjBn5`Z=|6Q?R)nn71r=Mf!}Z2W{6OxPEAyIW)6}+mKr5K*T1`` zjR^LxY)E%KFWOwXDQe^QF|)GYo7!3M0uh54dw;s0 zzkuxN3^YB7j~eOBje6UCmr zJ55cyox`34iwBmjMtFZGI2Jjq5mga2$DR**l1>CDo^rANVz7VCxqILjbBtBtU0dt@ ztQcWvq$|?iPcYW%o~^Tb)aYFnC2XW^7l`O^-w z-*hu2@Ol1cR}mKXinH1Ioe28)S+QDsM|^iyiS)Ty<-5v^UaPI6mUMgV;qV20_ir## zO-%xt4;TqBZ|?yRxm8gnu2M#YO0zzPR$WlzK zm80tAtl+Bw`^vCVcyPOvT1fYIlqN`psvPpB2=pN5ufy4=ec17bvWt{{o}ZWSFv@Tq z)V4&}lwVX!0)42mVT*2qj~=-D@j|x42BvvTVsT-%{g0&L(JnfVNKPe{E#RVb|5yBi z-8|oRosaO4a@bpHS&Td29vq|GkZjnuGd2CtxG|SLWk4qAf((j>@kSuW)+0Cwit{(0F@# zU$p%QK18gXq;CJ>^GzF3VoaT7%DU5T>{LQiAf&sVi9@!1QvCoVdRN^1lOO26IBfrn z|3|I*AFovv&h*JjzwpD&U8TqQlqOp+@eh^~W&A-u34xnM!t#8{*6|I)fNKAP>btbW zx=A>wd}>FSc@v;v<3c)fJdps z*0V{Wa&OhR;z2&tnkY#L$CmS`_!ULCH?C_vEIHRK)QPKP{A<6de?&i`UNdpqgAqn! zsB#o@=5P3Had@^Vc|f!KV?}s2^}`KOn_}xR82q)C9A}$SBB{Hn)<7#qy79atJyQwb z=x|Kdap{fEX=`&V{9#%f!mMfdCRi^#47`>si^j9jwf1R0>p8XX^tjwT5%nK5bF&jh zz&*qV9mp4gIsEXFE3=7a^u=H&>h>9DTo7)pnbKj+QTu_Y zS>@{Mc$oF5#YVp(>o{xSV^0m>!Gg7axg$7ASV1EFV|FUaQp|p?F5i5>(tNyG*>AGC zWC;A3nj702RO3akqM)JZh7X?W!OOW)cJ^uYqw$?lIOGW)V8Bh}8?-mPeaL#1;QMLE zICR!mTW{}o!p$GFD_eIOfUULS^wl?bYIlEsuAQzX6Ef!}H1FLUUWpJdjpe?8Xv6vC7OOIkw}j+%-m6zC9@7JFUOeNib4m|e2@xaz^6M9}R^=F9`6w%8Ute$|4zHlmWQ;YR0E4{;4xq~G7Vsv#+L8+6dt zg3={SY?EndKq(HsU*jR_A&gxuNqLj@*}*n zt3*DQbV`1j_s5$e?=&h^I{ z_5qv@9lI6P5jkRU7ccIw@Q$Ct8d!dH+S8tTHMYkbP`riBCHx-l`PygdOk=%@Y%^qp z_C-8NBx?i;gkQwkW8)Rxc90G-FYb%Po@CTzW3zB~$>(=A`A+lJSW zre1Te*V{BKo$K=Jie6%RERW^H3lr-Ar5wxFBl{$Ix$WjCzqp3_YD|JvhgDA5N`o*BcIasK_`)T1BmDJy?3uB_2KgifbU$w4lWk zU!&(4*cJa{N%%Df;8s7TeQ&Mv_H4wr_8xlqJDRf6bdP4P4-g3T@4a1EHjHc7MMO`` zshUd)90V_T!5gxq=p(Y7Hj2-Kc;t^=}bx8J>u2{_Zk(=H+X< zw{$UUh?qO`^E>+8>@V({Gw&yl5dDKDC{ue8GO*OJCAm0fm@oz6S)D;L27>4D0mx;c zv%_vX-zR?bAZvF~2W!Y-?20@7s^!S`7q9#U?D|2sM+$Nz(Pz-vF^vZ?a~GA~>j3nn zJNdOI&-b)0bIOo?&YwkeDK%1}aaPMd&{;(j1MfrPxE3=(%h<38={H2RNb0O1M2zgE z(xn6%$S${LuC>eE4|u)YGaugta!os;9L2rCE$<uM$`q-)$8>Z#Mrb+ni_sJbr2S z=66KL+5ERXQYpy*4|jIRE<@4M!^7RwTQ=335MEnzYc)9G>pV2+fK#PQmB?T;EVfG? zURrdxIj))K{h7=BYusN15&F_GV?02lGA@(ysJ+&mjJL|A9p9fk>-s8ecF{3v!Hv>` zygF}rQp5bb^3BTbp_qD$&-wk;*Cz3p)j)?M<)N@^297aJABi8V#t4FRgUoJ zGb+7YT@V`xS#wZn|0dr(nQ-o)%`S5U9GVDL>3wkN(dH^jDD@c-+rISbmUk)ABfJ71 zOu+pHj)y@3YrfECzOB1?x;|~`>b|}p#eH}+;QMi}?2Z-eP<}GynH9hP_WO2X&UY}v zBjvs8H#~_Zem~o$QkPoo*NG|`B;#Xp_!H_Atw9hV{Fwci@G9_jQ`y?O`Ke%CjYO`< zNz-0TFtvUi=lQ(|5ke#eYX2>lWTp)<>js@XF}LB@A()M`tM^yV((~SC+hTkq|9awY zJ;=DaH<=&*3?zNSg)IEd0H{o49@dt+;Ss{F{Fm>kl`S=4&r;UwCAf zs2YE7rZy=tI#Awif%#6rUZg+eAGBX1RzTe5}KI!}FUQmX|CrUlTsSENaz7?V3{RqNe& zyEw;U%uk=0hljfz+97IfyTCRCxaQpMS$+KnVevBe@)7uhJhGY(`5`D$F8QPq=Jsba zNgErt&$L)gN;2DY<&`S16pRTP_**QKOnb(+zkL$#8rOUaqG{TE!PUB~L=W|Qw&)rr z#-RmJT-CPUCDYS{PSdX3eamFJz_M7Wa@&_-#*{ZSRVZpu=16mg1-l5PIgK06>1ay( zl*}ACjTADhNrPE zvM` z_Vz1hd=x+IaqoXd9@wY1y|_2CbtrF13OV3!T5QYCDel?e7d~9{O-#DHhBG)}i|Pjw zN&+Bg8qyRHuRT!ST?6c(R`+O;Yk9aWp!M1rd=-=ffI$m8|x>pxz)-Q_)u}(NTl(6bC9QNuPxnXXDpL3Z6s!)(WYmoGsdRlG@Ky2n*SwVIHwOEdh(BoC80=G5;LlmRWgFf5 zxW1+qCtq?!Si`)_P)7C6OQvfr&8dtUi|=!)Rh>(fMu+XLH#>^0*Kg8I2TsiXFH zuD?w!{a^jA4AD=pIH-(V%xpM6c1|62hL32dA|Ta(fRHKB_#2C><&5pO1$8!xQCOQ z`~5EN-lPzp`9}A+<8W!x+{wBL653B7?Av%*6KoNz_&PC1y@L`+A`GS3x;M=HJaeb0 zeNHh zJ+t>TdA}^;P+5J{_52*+1vA9z(My>lbtTuX_eeI+38dzI>CHYO3QW2Xx2_EzQLaAy zzAI9H*>zmz=n5NJNWo=GuX0(`ILT|@6q4$ke`PmbSC{s4pC9Je>TbbJ-df{IF_}}4 z4Hf7Wl0Y7yoNknL27)LubI~~d_h)zg`)(~dUaLDCG0hFrMx^KI9ScP}$qR+k1`xl^ zg_cF$S6>4+`rmu(+n5eKLM#e4QP+J;@2mt9j2%s?s*;!;N>c;5S#|^<3cSH(#MpxA zy2s)9{(Z-dB0}TQ+ z)UVM8oo^0lIxGxsH=_!r%O^MnEk$H#IRFZ2lmkYAo=s~a4l5Iv+YT|aT`LThH@1tU zt=>DrmsMwm!;6lC(F=ljEahBoUpvt}SnECJ=rjpAg}^T>@l-IQh%9?>f#5bqbTQw$ZP?v32SW`|^ z+STzRsas-XK*X@{0nD@ywo%|=i@GDM zJv}D3#A*Xr6Tb5lU2+`tt&&rks+(-JXm}YeZ~9Wc^v5ll4BP4jA4(4vg{#WW#k{;PN+~ z%XlB(lwA)tR;X!uh29yHXU{cFu&s?uH#f-&Oj?3lWp`PzHC?6JcXyikIP&;J6ruiX z&2>&YmIaS~^_mu0e>~{@j_yYo0UTLEl-wfB%PsFtpOeBJXTP_;@A|xZm$*A4e{qNt1r2l>`CE<7I1KmuDK_9mu#_iBh}(^d4sRhmlkLK7(>Upu z2bVOl^PYvx8VCNXdkp0sKb(LDo@0XDyWOdI?%4bR+tT70a-9hyiUYw|rpQi>_ndg= z6j~)qUUjA`6(`{E#qZ-4^+|Bm*JgR%)b}1n_{Qv_gt7}j!H%}QOHUG9M&`di??yrr zDJ;^HY@4bmc+o73Ss|`P79am|L{eHu=SgqcM=dp(m>y0}e?*1nvFCLa=R0|=$&y%I zt<1YRWAL7oHuKhcXasq-Sr}z}ek4XNwXF1Vq180;ScDixov8m{^-#&T3`g|K!^;m_ z%b{)*umM@d(H~0EN(z#SvZHhqwa-+jLf5Z`>RW(F9Z(9 z{K7ehc)vCYX^gb++kvzc$=r%qHXbHti$B6vl0(L0WhILq(SJ$#hT{h|o7e+J4;w8C z--mLz{c_y6Iw5~x4>$seOe30^4wJsRWv7#;chyQot66n{WSO>#Hm$|y<-uuec8a|N zg_PZmpH6PQ>&cXhFd|cNT{gjRV4C;xl-t^rualdf&0I4Lo)`LR_QG*M2~{Q1TUOJ$ z{&R46H-135@e{*2PqS0ClZ%_HIeI#1@zIGx?=<|XP z?Llr-^h95+ox^Zt2t{@tQ(3P}=0jf-5sic?%}x$?{YAK2{^(>@`&KAegFDB^ObF-?1Y}hrVQL79?RmyK zkuwpw`bI)Pb)GXM2svSwJ$pN{qt|#VyfXzmW}!(CtAXXCb7$si0nZ7+Yx+=b8tyoi zf>;QU@;s>{e7L-di+V|=jf*z%E#__!$g)A+qb)9qonfRZ&90FX(+B2UaoX|{v-uyE zU2b&rCuFmj2*tidCK@xCt78-c3mBS5nEM;0`QxzL7c&bB!x%y({0^j%MSt@ zVakqUstN?=>{~3@%RJE0?#i}1M?NXcjKVs=OLCW8TYPnb@ZN#IPZ85A1VDIGCg7Rj zYN6@iu-9n_74G|5*X(L8J&n(`&kRrhm88`sSyxeX#&h`Ca`*;Xx6gRrgR`F{q6BX3 z_B!{r8wh*8l+)`4-rMaONx;28 zzOqzCWdov$(EFmRq@Q2^+k#c-8{}I@xBI6-YEkiunxe$HBCHgVIP>OPE}fb;_#7l$ zZ|M>#62;blur%*8`S2Uk9u2Vpv|UY84ogavKblwK-FwVQS|lJ_A>(Wy5o$)Im!sqw zQ<+o~(@IlS{Jvis}j9?`w^i^=v+WKHk0qpYLn+tg{=o z+mU)(#-Q|wu-G#n0uH2rTlY>`ttQaKblF}Yto=9wnCZYuGRVL+q|wXutf}+^2&web zkO;5t14{66o0vJZx+93{!CiyUJ=`aeKpo{*nLy49CVP!BWesO6Fe?lc=xy|%L@G&x z#m_0JU=bHa^>*i)9IXH3TOfE zwMo3a*SRCKzO$=OX?`jIrbn|q6A~27cNGyYKdW6Q->S`>CAwK!(EiF!D;7P2M=vEi zBf7-fBKy6XA140ikcJ=wL2o;?NyeEOv^31*we~evr;|e>LUzapE*N&+xgR_K@hHLG;kIw`nY{qB zV%?to*ycc&bYsO>VsXfVuw+Bt%q*n$iQHbqsjsJpRnblfjE1K`DUL?FW77JRo zV?Q}9?C`8CosV$Y2ev*hYSzF*e!rX%9h4)bIGx4R0>(A`iO4mKf)>6(s&GJo9rR*Eb zkmIQ3o}&L4*Qq|*8IiyD*4>J9JjW6qq>rX@g{4(-elR%qTBJe-u+fg71LE;Ihj_RSmUxbs{XhZIhAOnJ% z+&jndvsUM`pq{jmU3=&^7YbLJsq0?h*cb#w*TvxUYrDF`l?USot5#?1*rv-g-;FEO zJs3sybT@S~x(B(kfF0DPG3F+}_;xm)77MR8^9D%^()H)H7;N#C zo^lPw9rkI_+ukK%b0?(SR<`8XpPk#(S6*bguz*x(*M9{A_mwoeNO*Q`;A+0QZ zP=06O?9jcKaIHl?VI=I)w7Rg?eU{#J;kx0tl#o;FGQahuQe=FVRNB;n(ej{yn9ojP zoJDrDD#_%l9B?o|<{)^7f@Qy4kEQR7Nhh5g=2~tM4vCb^b<*wfbQDK(7v6P;=PW?s zL3M0j<5e#;cSvPcOa8j`7(bu-$y=@!C16$iU_H*z8*p ztdgqoA$J>wwj~h>I}#EB6?{WRNXSstr6SHiCFtk!gM?1Erril|a^9ii@xPp7iV?#-j=*=qL}Hu9r2 zLQ;~kfPZ^C**EAX%mVnaI7rVNrR^EN(M{l`^g%0DtE=YIDl>4$&h}`+~Kx|j|&1^t*%elh0>uR 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 z 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 L{{X;bI;;QLLz6eZ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/image/tests/test_Gallery.html b/includes/js/dojox/image/tests/test_Gallery.html new file mode 100644 index 0000000..320c481 --- /dev/null +++ b/includes/js/dojox/image/tests/test_Gallery.html @@ -0,0 +1,67 @@ + + + + + Testing the Image Gallery + + + + + + + + + + + + + + + + + +

            dojox.image.Gallery

            + +

            From FlickrRestStore:

            +
            + + + + + diff --git a/includes/js/dojox/image/tests/test_Lightbox.html b/includes/js/dojox/image/tests/test_Lightbox.html new file mode 100644 index 0000000..15b34c8 --- /dev/null +++ b/includes/js/dojox/image/tests/test_Lightbox.html @@ -0,0 +1,105 @@ + + + + dojox.image.Lightbox Tests | The Dojo Toolkit + + + + + + + + + + + + + + +
            +

            a Dojo based Lightbox implementation:

            + +

            Individual

            +

            + tall + 4:3 image + Broken link + large than viewport? +

            + +

            Grouped:

            +

            + wide image + square + wide image + Broken link +

            + +

            Alternate Group:

            +

            + wide image + square + 4:3 image + tall +

            + +

            From dojox.data.FlickrStore:

            + +
            +
            + + + +
            + + + diff --git a/includes/js/dojox/image/tests/test_Magnifier.html b/includes/js/dojox/image/tests/test_Magnifier.html new file mode 100644 index 0000000..fef1ddd --- /dev/null +++ b/includes/js/dojox/image/tests/test_Magnifier.html @@ -0,0 +1,98 @@ + + + Testing image + + + + + + + + + + + +

            dojox.image.Magnifier test page

            + +

            They are just images. It's entirely unobtrusive to add magnification to an image, and style it accordingly.

            +

            This widget is based on dojox.image.MagnifierLite, an image-only variant on this dojox.gfx + based Widget. The idea was/is to include addational surfaces in some kind of _Templated GFX widget, based on _Widget.

            +

            + Scale= 2.34, 5.67, and 8.90:
            + + + + +

            + +

            + + I Am Some inline text.
            lorem ipsum.
            +

            + +

            A Transparent .png:
            + + +

            + +

            Programatic:
            + + + + + +
            + +

            + +

            Remote file (GTA:LCS/psp map):
            + + +
            Everybody loves Zelda, right?
            + +

            + +

            + +

            + + + diff --git a/includes/js/dojox/image/tests/test_MagnifierLite.html b/includes/js/dojox/image/tests/test_MagnifierLite.html new file mode 100644 index 0000000..6e6ccd7 --- /dev/null +++ b/includes/js/dojox/image/tests/test_MagnifierLite.html @@ -0,0 +1,91 @@ + + + Testing image + + + + + + + + + +

            dojox.image.MagnifierLite test page

            + +

            They are just images. It's entirely unobtrusive to add magnification to an image, and style it accordingly.

            + +

            This is the base class for dojox.image.Magnifier, a dojox.gfx-based extension + this portion does not require the dojox.gfx package, but is limited to CSS-based styling. +

            + +

            + Scale= 2.34, 5.67, and 8.90:
            + + + + +

            + +

            + + I Am Some inline text.
            lorem ipsum.
            +

            + +

            A Transparent .png: (url unavailable in release versions, need build-utils package, or svn)
            + + +

            + +

            Programatic: (destroy() removes this.domNode)
            + + + + + +
            + +

            + +

            Remote file (GTA:LCS/psp map):
            + + +
            Everybody loves Zelda:
            + +

            + + + diff --git a/includes/js/dojox/image/tests/test_SlideShow.html b/includes/js/dojox/image/tests/test_SlideShow.html new file mode 100644 index 0000000..9200c4b --- /dev/null +++ b/includes/js/dojox/image/tests/test_SlideShow.html @@ -0,0 +1,68 @@ + + + + + Testing dojox.image.SlideShow + + + + + + + + + + + + +

            dojox.image.SlideShow

            + +

            from dojo.data.ItemFileReadStore

            +
            + + This SlideShow should display five photos, and loop. It should also + open a URL when the image is clicked. The widget should also resize to + fit the image. +
            + +

            from dojox.data.FlickrRestStore

            + This SlideShow should display five photos, and not loop. It should also not + open a URL when the image is clicked. AutoLoading of images is also disabled. + The time between images in a SlideShow is 1 second. The widget should not resize to fit the image +
            + + + diff --git a/includes/js/dojox/image/tests/test_ThumbnailPicker.html b/includes/js/dojox/image/tests/test_ThumbnailPicker.html new file mode 100644 index 0000000..90cdf2e --- /dev/null +++ b/includes/js/dojox/image/tests/test_ThumbnailPicker.html @@ -0,0 +1,134 @@ + + + + + Testing the ThumbnailPicker + + + + + + + + + + +

            dojox.image.ThumbnailPicker

            + +
            + When you click on a thumbnail image, it's information is placed here +
            + +

            From FlickrRestStore:

            + This ThumbnailPicker should have 8 thumbnails, with each of them linking + to a URL when clicked on. The cursor should also change when over an image. +
            + +

            From ItemFileReadStore:

            + This ThumbnailPicker should have 5 thumbnails. Clicking on a thumbnail should NOT + open a URL, and the cursor should not change when over an image that is not an arrow. + +
            +
            + +

            From FlickrRestStore:

            + This ThumbnailPicker should have 6 thumbnails, with each of them linking + to a URL when clicked on. The cursor should also change when over an image. + Unlike the ThumbnailPicker above, when these links are clicked on, this page + changes, instead of a popup window. + +
            + +

            From ItemFileReadStore, and vertical:

            + This ThumbnailPicker should have 5 thumbnails. Clicking on a thumbnail should NOT + open a URL, and the cursor should not change when over an image that is not an arrow. + The thumbnails should also be aligned vertically. +
            + + + diff --git a/includes/js/dojox/io/README b/includes/js/dojox/io/README new file mode 100644 index 0000000..2dfd62e --- /dev/null +++ b/includes/js/dojox/io/README @@ -0,0 +1,45 @@ +------------------------------------------------------------------------------- +DojoX IO +------------------------------------------------------------------------------- +Version 0.3.1 +Release date: 09/06/2007 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Bryan Forbes (bryan@reigndropsfall.net) +------------------------------------------------------------------------------- +Project description + +------------------------------------------------------------------------------- +Dependencies: + +DojoX IO depends on Dojo Core and DojoX UUID's generateRandomUuid function. +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/uuid.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/uuid/* + +Install into the following directory structure: +/dojox/uuid/ + +AND + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/io/* + +Install into the following directory structure: +/dojox/io/ + +...both of which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- +Additional Notes + +The information contained in this README does not pertain to DojoX XHR IFrame Proxy. +For that information see proxy/README. diff --git a/includes/js/dojox/io/proxy/README b/includes/js/dojox/io/proxy/README new file mode 100644 index 0000000..8898a56 --- /dev/null +++ b/includes/js/dojox/io/proxy/README @@ -0,0 +1,82 @@ +------------------------------------------------------------------------------- +Project Name +------------------------------------------------------------------------------- +Version 0.6 +Release date: 01/31/2008 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + James Burke (jburke@dojotoolkit.org) +------------------------------------------------------------------------------- +Project description + +The XHR IFrame Proxy (xip) allows you to do cross-domain XMLHttpRequests (XHRs). +It works by using two iframes, one your domain (xip_client.html), one on the +other domain (xip_server.html). They use fragment IDs in the iframe URLs to pass +messages to each other. The xip.js file defines dojox.io.proxy.xip. This module +intercepts XHR calls made by the Dojo XHR methods (dojo.xhr* methods). The module +returns a facade object that acts like an XHR object. Once send is called on the +facade, the facade's data is serialized, given to xip_client.html. xip_client.html +then passes the serialized data to xip_server.html by changing xip_server.html's +URL fragment ID (the #xxxx part of an URL). xip_server.html deserializes the +message fragments, and does an XHR call, gets the response, and serializes the +data. The serialized data is then passed back to xip_client.html by changing +xip_client.html's fragment ID. Then the response is deserialized and used as +the response inside the facade XHR object that was created by dojox.io.proxy.xip. +------------------------------------------------------------------------------- +Dependencies: + +xip.js: Dojo Core, dojox.data.dom +xip_client.html: none +xip_server.html: none (but see Additional Notes section) +------------------------------------------------------------------------------- +Documentation + +There is some documentation that applies to the Dojo 0.4.x version of these files: +http://dojotoolkit.org/book/dojo-book-0-4/part-5-connecting-pieces/i-o/cross-domain-xmlhttprequest-using-iframe-proxy + +The general theory still applies to this code, but the specifics are different +for the Dojo 0.9+ codebase. Doc updates hopefully after the basic code is ported. + +The current implementation destroys the iframes used for a request after the request +completes. This seems to cause a memory leak, particularly in IE. So, it is not +suited for doing polling cross-domain requests. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojox SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/io/proxy/xip.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/io/proxy/xip_client.html + +Install into the following directory structure: +/dojox/io/proxy/ + +...which should be at the same level as your Dojo checkout. + +Grab the following from the Dojox SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/io/proxy/xip_server.html + +and install it on the domain that you want to allow receiving cross-domain +requests. Be sure to read the documentation, the Additional Notes below, and +the in-file comments. +------------------------------------------------------------------------------- +Additional Notes + +xip_client.html and xip_server.html do not work right away. You need to uncomment +out the script tags in the files. Additionally, xip_server.html requires a JS file, +isAllowed.js, to be defined. See the notes in xip_server.html for more informaiton. + +XDOMAIN BUILD INSTRUCTIONS: +The dojox.io.proxy module requires some setup to use with an xdomain build. +The xip_client.html file has to be served from the same domain as your web page. +It cannot be served from the domain that has the xdomain build. Download xip_client.html +and install it on your server. Then set djConfig.xipClientUrl to the local path +of xip_client.html (just use a path, not a whole URL, since it will be on the same +domain as the page). The path to the file should be the path relative to the web +page that is using dojox.io.proxy. + + + + diff --git a/includes/js/dojox/io/proxy/tests/frag.xml b/includes/js/dojox/io/proxy/tests/frag.xml new file mode 100644 index 0000000..6904bba --- /dev/null +++ b/includes/js/dojox/io/proxy/tests/frag.xml @@ -0,0 +1,4 @@ + +This is the foo text node value +This is the bar text node value + diff --git a/includes/js/dojox/io/proxy/tests/xip.html b/includes/js/dojox/io/proxy/tests/xip.html new file mode 100644 index 0000000..5a5ba5f --- /dev/null +++ b/includes/js/dojox/io/proxy/tests/xip.html @@ -0,0 +1,62 @@ + + + + XHR IFrame Proxy Tests + + + + + + + + +

            XHR IFrame Proxy Tests

            +

            Run this test from a web server, not from local disk.

            + +

            + +

            +
            + + + diff --git a/includes/js/dojox/io/proxy/xip.js b/includes/js/dojox/io/proxy/xip.js new file mode 100644 index 0000000..b88d910 --- /dev/null +++ b/includes/js/dojox/io/proxy/xip.js @@ -0,0 +1,441 @@ +if(!dojo._hasResource["dojox.io.proxy.xip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.io.proxy.xip"] = true; +dojo.provide("dojox.io.proxy.xip"); + +dojo.require("dojo.io.iframe"); +dojo.require("dojox.data.dom"); + +dojox.io.proxy.xip = { + //summary: Object that implements the iframe handling for XMLHttpRequest + //IFrame Proxying. + //description: Do not use this object directly. See the Dojo Book page + //on XMLHttpRequest IFrame Proxying: + //http://dojotoolkit.org/book/dojo-book-0-4/part-5-connecting-pieces/i-o/cross-domain-xmlhttprequest-using-iframe-proxy + //Usage of XHR IFrame Proxying does not work from local disk in Safari. + + /* + This code is really focused on just sending one complete request to the server, and + receiving one complete response per iframe. The code does not expect to reuse iframes for multiple XHR request/response + sequences. This might be reworked later if performance indicates a need for it. + + xip fragment identifier/hash values have the form: + #id:cmd:realEncodedMessage + + id: some ID that should be unique among message fragments. No inherent meaning, + just something to make sure the hash value is unique so the message + receiver knows a new message is available. + + cmd: command to the receiver. Valid values are: + - init: message used to init the frame. Sent as the first URL when loading + the page. Contains some config parameters. + - loaded: the remote frame is loaded. Only sent from xip_client.html to this module. + - ok: the message that this page sent was received OK. The next message may + now be sent. + - start: the start message of a block of messages (a complete message may + need to be segmented into many messages to get around the limitiations + of the size of an URL that a browser accepts. + - part: indicates this is a part of a message. + - end: the end message of a block of messages. The message can now be acted upon. + If the message is small enough that it doesn't need to be segmented, then + just one hash value message can be sent with "end" as the command. + + To reassemble a segmented message, the realEncodedMessage parts just have to be concatenated + together. + */ + + xipClientUrl: ((dojo.config || djConfig)["xipClientUrl"]) || dojo.moduleUrl("dojox.io.proxy", "xip_client.html"), + + + //MSIE has the lowest limit for URLs with fragment identifiers, + //at around 4K. Choosing a slightly smaller number for good measure. + urlLimit: 4000, + + _callbackName: (dojox._scopeName || "dojox") + ".io.proxy.xip.fragmentReceived", + _state: {}, + _stateIdCounter: 0, + _isWebKit: navigator.userAgent.indexOf("WebKit") != -1, + + + send: function(/*Object*/facade){ + //summary: starts the xdomain request using the provided facade. + //This method first does some init work, then delegates to _realSend. + + var url = this.xipClientUrl; + //Make sure we are not dealing with javascript urls, just to be safe. + if(url.split(":")[0].match(/javascript/i) || facade._ifpServerUrl.split(":")[0].match(/javascript/i)){ + return; + } + + //Make xip_client a full URL. + var colonIndex = url.indexOf(":"); + var slashIndex = url.indexOf("/"); + if(colonIndex == -1 || slashIndex < colonIndex){ + //No colon or we are starting with a / before a colon, so we need to make a full URL. + var loc = window.location.href; + if(slashIndex == 0){ + //Have a full path, just need the domain. + url = loc.substring(0, loc.indexOf("/", 9)) + url; //Using 9 to get past http(s):// + }else{ + url = loc.substring(0, (loc.lastIndexOf("/") + 1)) + url; + } + } + this.fullXipClientUrl = url; + + //Set up an HTML5 messaging listener if postMessage exists. + //As of this writing, this is only useful to get Opera 9.25+ to work. + if(typeof document.postMessage != "undefined"){ + document.addEventListener("message", dojo.hitch(this, this.fragmentReceivedEvent), false); + } + + //Now that we did first time init, always use the realSend method. + this.send = this._realSend; + return this._realSend(facade); //Object + }, + + _realSend: function(facade){ + //summary: starts the actual xdomain request using the provided facade. + var stateId = "XhrIframeProxy" + (this._stateIdCounter++); + facade._stateId = stateId; + + var frameUrl = facade._ifpServerUrl + "#0:init:id=" + stateId + "&client=" + + encodeURIComponent(this.fullXipClientUrl) + "&callback=" + encodeURIComponent(this._callbackName); + + this._state[stateId] = { + facade: facade, + stateId: stateId, + clientFrame: dojo.io.iframe.create(stateId, "", frameUrl), + isSending: false, + serverUrl: facade._ifpServerUrl, + requestData: null, + responseMessage: "", + requestParts: [], + idCounter: 1, + partIndex: 0, + serverWindow: null + }; + + return stateId; //Object + }, + + receive: function(/*String*/stateId, /*String*/urlEncodedData){ + /* urlEncodedData should have the following params: + - responseHeaders + - status + - statusText + - responseText + */ + //Decode response data. + var response = {}; + var nvPairs = urlEncodedData.split("&"); + for(var i = 0; i < nvPairs.length; i++){ + if(nvPairs[i]){ + var nameValue = nvPairs[i].split("="); + response[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); + } + } + + //Set data on facade object. + var state = this._state[stateId]; + var facade = state.facade; + + facade._setResponseHeaders(response.responseHeaders); + if(response.status == 0 || response.status){ + facade.status = parseInt(response.status, 10); + } + if(response.statusText){ + facade.statusText = response.statusText; + } + if(response.responseText){ + facade.responseText = response.responseText; + + //Fix responseXML. + var contentType = facade.getResponseHeader("Content-Type"); + if(contentType){ + var mimeType = contentType.split(";")[0]; + if(mimeType.indexOf("application/xml") == 0 || mimeType.indexOf("text/xml") == 0){ + facade.responseXML = dojox.data.dom.createDocument(response.responseText, contentType); + } + } + } + facade.readyState = 4; + + this.destroyState(stateId); + }, + + frameLoaded: function(/*String*/stateId){ + var state = this._state[stateId]; + var facade = state.facade; + + var reqHeaders = []; + for(var param in facade._requestHeaders){ + reqHeaders.push(param + ": " + facade._requestHeaders[param]); + } + + var requestData = { + uri: facade._uri + }; + if(reqHeaders.length > 0){ + requestData.requestHeaders = reqHeaders.join("\r\n"); + } + if(facade._method){ + requestData.method = facade._method; + } + if(facade._bodyData){ + requestData.data = facade._bodyData; + } + + this.sendRequest(stateId, dojo.objectToQuery(requestData)); + }, + + destroyState: function(/*String*/stateId){ + var state = this._state[stateId]; + if(state){ + delete this._state[stateId]; + var parentNode = state.clientFrame.parentNode; + parentNode.removeChild(state.clientFrame); + state.clientFrame = null; + state = null; + } + }, + + createFacade: function(){ + if(arguments && arguments[0] && arguments[0].iframeProxyUrl){ + return new dojox.io.proxy.xip.XhrIframeFacade(arguments[0].iframeProxyUrl); + }else{ + return dojox.io.proxy.xip._xhrObjOld.apply(dojo, arguments); + } + }, + + //**** State-bound methods **** + sendRequest: function(stateId, encodedData){ + var state = this._state[stateId]; + if(!state.isSending){ + state.isSending = true; + + state.requestData = encodedData || ""; + + //Get a handle to the server iframe. + state.serverWindow = frames[state.stateId]; + if (!state.serverWindow){ + state.serverWindow = document.getElementById(state.stateId).contentWindow; + } + + //Make sure we have contentWindow, but only do this for non-postMessage + //browsers (right now just opera is postMessage). + if(typeof document.postMessage == "undefined"){ + if(state.serverWindow.contentWindow){ + state.serverWindow = state.serverWindow.contentWindow; + } + } + + this.sendRequestStart(stateId); + } + }, + + sendRequestStart: function(stateId){ + //Break the message into parts, if necessary. + var state = this._state[stateId]; + state.requestParts = []; + var reqData = state.requestData; + var urlLength = state.serverUrl.length; + var partLength = this.urlLimit - urlLength; + var reqIndex = 0; + + while((reqData.length - reqIndex) + urlLength > this.urlLimit){ + var part = reqData.substring(reqIndex, reqIndex + partLength); + //Safari will do some extra hex escaping unless we keep the original hex + //escaping complete. + var percentIndex = part.lastIndexOf("%"); + if(percentIndex == part.length - 1 || percentIndex == part.length - 2){ + part = part.substring(0, percentIndex); + } + state.requestParts.push(part); + reqIndex += part.length; + } + state.requestParts.push(reqData.substring(reqIndex, reqData.length)); + + state.partIndex = 0; + this.sendRequestPart(stateId); + + }, + + sendRequestPart: function(stateId){ + var state = this._state[stateId]; + + if(state.partIndex < state.requestParts.length){ + //Get the message part. + var partData = state.requestParts[state.partIndex]; + + //Get the command. + var cmd = "part"; + if(state.partIndex + 1 == state.requestParts.length){ + cmd = "end"; + }else if (state.partIndex == 0){ + cmd = "start"; + } + + this.setServerUrl(stateId, cmd, partData); + state.partIndex++; + } + }, + + setServerUrl: function(stateId, cmd, message){ + var serverUrl = this.makeServerUrl(stateId, cmd, message); + var state = this._state[stateId]; + + //Safari won't let us replace across domains. + if(this._isWebKit){ + state.serverWindow.location = serverUrl; + }else{ + state.serverWindow.location.replace(serverUrl); + } + }, + + makeServerUrl: function(stateId, cmd, message){ + var state = this._state[stateId]; + var serverUrl = state.serverUrl + "#" + (state.idCounter++) + ":" + cmd; + if(message){ + serverUrl += ":" + message; + } + return serverUrl; + }, + + fragmentReceivedEvent: function(evt){ + //summary: HTML5 document messaging endpoint. Unpack the event to see + //if we want to use it. + if(evt.uri.split("#")[0] == this.fullXipClientUrl){ + this.fragmentReceived(evt.data); + } + }, + + fragmentReceived: function(frag){ + var index = frag.indexOf("#"); + var stateId = frag.substring(0, index); + var encodedData = frag.substring(index + 1, frag.length); + + var msg = this.unpackMessage(encodedData); + var state = this._state[stateId]; + + switch(msg.command){ + case "loaded": + this.frameLoaded(stateId); + break; + case "ok": + this.sendRequestPart(stateId); + break; + case "start": + state.responseMessage = "" + msg.message; + this.setServerUrl(stateId, "ok"); + break; + case "part": + state.responseMessage += msg.message; + this.setServerUrl(stateId, "ok"); + break; + case "end": + this.setServerUrl(stateId, "ok"); + state.responseMessage += msg.message; + this.receive(stateId, state.responseMessage); + break; + } + }, + + unpackMessage: function(encodedMessage){ + var parts = encodedMessage.split(":"); + var command = parts[1]; + encodedMessage = parts[2] || ""; + + var config = null; + if(command == "init"){ + var configParts = encodedMessage.split("&"); + config = {}; + for(var i = 0; i < configParts.length; i++){ + var nameValue = configParts[i].split("="); + config[decodeURIComponent(nameValue[0])] = decodeURIComponent(nameValue[1]); + } + } + return {command: command, message: encodedMessage, config: config}; + } +} + +//Replace the normal XHR factory with the proxy one. +dojox.io.proxy.xip._xhrObjOld = dojo._xhrObj; +dojo._xhrObj = dojox.io.proxy.xip.createFacade; + +/** + Using this a reference: http://www.w3.org/TR/XMLHttpRequest/ + + Does not implement the onreadystate callback since dojo.xhr* does + not use it. +*/ +dojox.io.proxy.xip.XhrIframeFacade = function(ifpServerUrl){ + //summary: XMLHttpRequest facade object used by dojox.io.proxy.xip. + + //description: Do not use this object directly. See the Dojo Book page + //on XMLHttpRequest IFrame Proxying: + //http://dojotoolkit.org/book/dojo-book-0-4/part-5-connecting-pieces/i-o/cross-domain-xmlhttprequest-using-iframe-proxy + this._requestHeaders = {}; + this._allResponseHeaders = null; + this._responseHeaders = {}; + this._method = null; + this._uri = null; + this._bodyData = null; + this.responseText = null; + this.responseXML = null; + this.status = null; + this.statusText = null; + this.readyState = 0; + + this._ifpServerUrl = ifpServerUrl; + this._stateId = null; +} + +dojo.extend(dojox.io.proxy.xip.XhrIframeFacade, { + //The open method does not properly reset since Dojo does not reuse XHR objects. + open: function(/*String*/method, /*String*/uri){ + this._method = method; + this._uri = uri; + + this.readyState = 1; + }, + + setRequestHeader: function(/*String*/header, /*String*/value){ + this._requestHeaders[header] = value; + }, + + send: function(/*String*/stringData){ + this._bodyData = stringData; + + this._stateId = dojox.io.proxy.xip.send(this); + + this.readyState = 2; + }, + abort: function(){ + dojox.io.proxy.xip.destroyState(this._stateId); + }, + + getAllResponseHeaders: function(){ + return this._allResponseHeaders; //String + }, + + getResponseHeader: function(/*String*/header){ + return this._responseHeaders[header]; //String + }, + + _setResponseHeaders: function(/*String*/allHeaders){ + if(allHeaders){ + this._allResponseHeaders = allHeaders; + + //Make sure ther are now CR characters in the headers. + allHeaders = allHeaders.replace(/\r/g, ""); + var nvPairs = allHeaders.split("\n"); + for(var i = 0; i < nvPairs.length; i++){ + if(nvPairs[i]){ + var nameValue = nvPairs[i].split(": "); + this._responseHeaders[nameValue[0]] = nameValue[1]; + } + } + } + } +}); + +} diff --git a/includes/js/dojox/io/proxy/xip_client.html b/includes/js/dojox/io/proxy/xip_client.html new file mode 100644 index 0000000..c51a839 --- /dev/null +++ b/includes/js/dojox/io/proxy/xip_client.html @@ -0,0 +1,102 @@ + + + + + + + + + + // + + + +

            The Dojo Toolkit -- xip_client.html

            + +

            This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the "client" file used + internally by dojox.io.proxy.xip.

            + + diff --git a/includes/js/dojox/io/proxy/xip_server.html b/includes/js/dojox/io/proxy/xip_server.html new file mode 100644 index 0000000..01b7274 --- /dev/null +++ b/includes/js/dojox/io/proxy/xip_server.html @@ -0,0 +1,382 @@ + + + + + + + + + + + // + + + +

            The Dojo Toolkit -- xip_server.html

            + +

            This file is used for Dojo's XMLHttpRequest Iframe Proxy. This is the the file + that should go on the server that will actually be doing the XHR request.

            +
            + + diff --git a/includes/js/dojox/io/xhrMultiPart.js b/includes/js/dojox/io/xhrMultiPart.js new file mode 100644 index 0000000..5792267 --- /dev/null +++ b/includes/js/dojox/io/xhrMultiPart.js @@ -0,0 +1,81 @@ +if(!dojo._hasResource["dojox.io.xhrMultiPart"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.io.xhrMultiPart"] = true; +dojo.provide("dojox.io.xhrMultiPart"); + +dojo.require("dojo._base.xhr"); +dojo.require("dojox.uuid.generateRandomUuid"); + +(function(){ + function _createPart(args, boundary){ + if(!args["name"] && !args["content"]){ + throw new Error("Each part of a multi-part request requires 'name' and 'content'."); + } + + var tmp = []; + tmp.push("--" + boundary, + "Content-Disposition: form-data; name=\"" + args.name + "\"" + + (args["filename"] ? "; filename=\"" + args.filename + "\"" : "")); + + if(args["contentType"]){ + var ct = "Content-Type: " + args.contentType; + if(args["charset"]){ + ct += "; Charset=" + args.charset; + } + tmp.push(ct); + } + + if(args["contentTransferEncoding"]){ + tmp.push("Content-Transfer-Encoding: " + args.contentTransferEncoding); + } + + tmp.push("", args.content); + + return tmp; + } + + function _needIframe(node){ + return (!!(dojo.query("input[type=file]", node).length)); + } + + function _partsFromNode(node, boundary){ + // TODO: write this function! + var tmp = []; + return tmp; + } + + dojox.io.xhrMultiPart = function(args){ + if(!args["file"] && !args["form"]){ + throw new Error("file or form must be provided to dojox.io.xhrMultiPart's arguments"); + } + + // unique guid as a boundary value for multipart posts + var boundary = dojox.uuid.generateRandomUuid(); + + var tmp = []; + var out = ""; + + if(args["file"]){ + var d = (dojo.isArray(args.file) ? args.file : [args.file]); + + for(var i=0; i < d.length; i++){ + tmp = tmp.concat(_createPart(d[i], boundary)); + } + } + + if(args["form"]){ + tmp = tmp.concat(_partsFromNode(args["form"], boundary)); + } + + if(tmp.length){ + tmp.push("--"+boundary+"--", ""); + out = tmp.join("\r\n"); + } + + return dojo.rawXhrPost(dojo.mixin(args, { + contentType: "multipart/form-data; boundary=" + boundary, + postData: out + })); + } +})(); + +} diff --git a/includes/js/dojox/jsonPath.js b/includes/js/dojox/jsonPath.js new file mode 100644 index 0000000..692e855 --- /dev/null +++ b/includes/js/dojox/jsonPath.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.jsonPath"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.jsonPath"] = true; +dojo.provide("dojox.jsonPath"); +dojo.require("dojox.jsonPath.query"); + +} diff --git a/includes/js/dojox/jsonPath/README b/includes/js/dojox/jsonPath/README new file mode 100644 index 0000000..2da2b31 --- /dev/null +++ b/includes/js/dojox/jsonPath/README @@ -0,0 +1,125 @@ +------------------------------------------------------------------------------- +dojox.jsonPath +------------------------------------------------------------------------------- +Version 1.0 +Release date: 11/14/2007 +------------------------------------------------------------------------------- +Project state: beta +------------------------------------------------------------------------------- +Project authors + Dustin Machi + Kris Zyp +------------------------------------------------------------------------------- +Project description + +jsonPath is a query system similar in idea to xpath, but for use against +javascript objects. This code is a port of the jsonPath code at +http://code.google.com/p/jsonpath/. It was contributed under CLA by Stefan +Goessner. Thanks Stefan! +------------------------------------------------------------------------------- +Dependencies: + +Dojo Core (package loader). +------------------------------------------------------------------------------- +Documentation + +Usage: + +var matches = dojox.jsonPath.query(objectToQuery, jsonPathExpresson) + +Expressions: + + $ The Root Object + @ The current object/element + . or [] The child operator + .. Recursive descent + * all objects + [] subscript operator + [,] Union operator + [start:end:step] array slice operator + ?() applies a filter/script expression + () script expresions + + some examples: + + Given the following test data set: + + var json = + { "store": { + "book": [ + { "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], + "bicycle": { + "color": "red", + "price": 19.95 + } + } + }; + + Here are some example queries and their output: + + $.store.book[*].author + ["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] + + $..author + ["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] + + $.store.* + [[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"color":"red","price":19.95}] + + $.store..price + [8.95,12.99,8.99,22.99,19.95] + + $..book[(@.length-1)] + [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[-1] + [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[0,1] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}] + + $..book[:2] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}] + + $..book[?(@.isbn)] + [{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}] + + $..book[?(@.price<10)] + [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}] + + $..* + [{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}},[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],{"color":"red","price":19.95},{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99},"reference","Nigel Rees","Sayings of the Century",8.95,"fiction","Evelyn Waugh","Sword of Honour",12.99,"fiction","Herman Melville","Moby Dick","0-553-21311-3",8.99,"fiction","J. R. R. Tolkien","The Lord of the Rings","0-395-19395-8",22.99,"red",19.95] + + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/jsonPath + +Install into the following directory structure: +/dojox/jsonPath/ + +...which should be at the same level as your Dojo checkout. diff --git a/includes/js/dojox/jsonPath/query.js b/includes/js/dojox/jsonPath/query.js new file mode 100644 index 0000000..4e24309 --- /dev/null +++ b/includes/js/dojox/jsonPath/query.js @@ -0,0 +1,163 @@ +if(!dojo._hasResource["dojox.jsonPath.query"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.jsonPath.query"] = true; +dojo.provide("dojox.jsonPath.query"); + +dojox.jsonPath.query = function(/*Object*/obj, /*String*/expr, /*Object*/arg){ + // summaRy + // Perform jsonPath query `expr` on javascript object or json string `obj` + // obj - object || json string to perform query on + // expr - jsonPath expression (string) to be evaluated + // arg - {}special arugments. + // resultType: "VALUE"||"BOTH"||"PATH"} (defaults to value) + // evalType: "RESULT"||"ITEM"} (defaults to ?) + + var re = dojox.jsonPath._regularExpressions; + if (!arg){arg={};} + + var strs = []; + function _str(i){ return strs[i];} + var acc; + if (arg.resultType == "PATH" && arg.evalType == "RESULT") throw Error("RESULT based evaluation not supported with PATH based results"); + var P = { + resultType: arg.resultType || "VALUE", + normalize: function(expr){ + var subx = []; + expr = expr.replace(/'([^']|'')*'/g, function(t){return "_str("+(strs.push(eval(t))-1)+")";}); + var ll = -1; + while(ll!=subx.length){ + ll=subx.length;//TODO: Do expression syntax checking + expr = expr.replace(/(\??\([^\(\)]*\))/g, function($0){return "#"+(subx.push($0)-1);}); + } + expr = expr.replace(/[\['](#[0-9]+)[\]']/g,'[$1]') + .replace(/'?\.'?|\['?/g, ";") + .replace(/;;;|;;/g, ";..;") + .replace(/;$|'?\]|'$/g, ""); + ll = -1; + while(ll!=expr){ + ll=expr; + expr = expr.replace(/#([0-9]+)/g, function($0,$1){return subx[$1];}); + } + return expr.split(";"); + }, + asPaths: function(paths){ + for (var j=0;j + + + Dojox Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/lang/LICENSE b/includes/js/dojox/lang/LICENSE new file mode 100644 index 0000000..d84a6aa --- /dev/null +++ b/includes/js/dojox/lang/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2007 Oliver Steele + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/includes/js/dojox/lang/README b/includes/js/dojox/lang/README new file mode 100644 index 0000000..753b943 --- /dev/null +++ b/includes/js/dojox/lang/README @@ -0,0 +1,37 @@ +------------------------------------------------------------------------------- +dojox.lang +------------------------------------------------------------------------------- +Version 0.991 +Release date: 07/30/2007 +------------------------------------------------------------------------------- +Project state: +[beta] +------------------------------------------------------------------------------- +Credits + Eugene Lazutkin (eugene.lazutkin@gmail.com) +------------------------------------------------------------------------------- +Project description + +Implementation of common functional operations, and provisions +Later we can add other JS language-related helpers. +------------------------------------------------------------------------------- +Dependencies: + +None. +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/lang/* + +Install into the following directory structure: +/dojox/lang/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- +Additional Notes + +See tests and the source for more details. diff --git a/includes/js/dojox/lang/functional.js b/includes/js/dojox/lang/functional.js new file mode 100644 index 0000000..e75ad00 --- /dev/null +++ b/includes/js/dojox/lang/functional.js @@ -0,0 +1,9 @@ +if(!dojo._hasResource["dojox.lang.functional"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional"] = true; +dojo.provide("dojox.lang.functional"); + +dojo.require("dojox.lang.functional.lambda"); +dojo.require("dojox.lang.functional.array"); +dojo.require("dojox.lang.functional.object"); + +} diff --git a/includes/js/dojox/lang/functional/array.js b/includes/js/dojox/lang/functional/array.js new file mode 100644 index 0000000..45c2613 --- /dev/null +++ b/includes/js/dojox/lang/functional/array.js @@ -0,0 +1,113 @@ +if(!dojo._hasResource["dojox.lang.functional.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.array"] = true; +dojo.provide("dojox.lang.functional.array"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - array-processing functions similar to standard JS functions + +// Notes: +// - this module provides JS standard methods similar to high-level functions in dojo/_base/array.js: +// forEach, map, filter, every, some + +// Defined methods: +// - take any valid lambda argument as the functional argument +// - operate on dense arrays +// - take a string as the array argument +// - take an iterator objects as the array argument + +(function(){ + var d = dojo, df = dojox.lang.functional; + + d.mixin(df, { + // JS 1.6 standard array functions, which can take a lambda as a parameter. + // Consider using dojo._base.array functions, if you don't need the lambda support. + filter: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: creates a new array with all elements that pass the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var t = [], v; + if(d.isArray(a)){ + for(var i = 0, n = a.length; i < n; ++i){ + v = a[i]; + if(f.call(o, v, i, a)){ t.push(v); } + } + }else{ + for(var i = 0; a.hasNext();){ + v = a.next(); + if(f.call(o, v, i++)){ t.push(v); } + } + } + return t; // Array + }, + forEach: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: executes a provided function once per array element. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + if(d.isArray(a)){ + for(var i = 0, n = a.length; i < n; f.call(o, a[i], i, a), ++i); + }else{ + for(var i = 0; a.hasNext(); f.call(o, a.next(), i++)); + } + }, + map: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: creates a new array with the results of calling + // a provided function on every element in this array. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var t, n; + if(d.isArray(a)){ + t = new Array(n = a.length); + for(var i = 0; i < n; t[i] = f.call(o, a[i], i, a), ++i); + }else{ + t = []; + for(var i = 0; a.hasNext(); t.push(f.call(o, a.next(), i++))); + } + return t; // Array + }, + every: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: tests whether all elements in the array pass the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + if(d.isArray(a)){ + for(var i = 0, n = a.length; i < n; ++i){ + if(!f.call(o, a[i], i, a)){ + return false; // Boolean + } + } + }else{ + for(var i = 0; a.hasNext();){ + if(!f.call(o, a.next(), i++)){ + return false; // Boolean + } + } + } + return true; // Boolean + }, + some: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: tests whether some element in the array passes the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + if(d.isArray(a)){ + for(var i = 0, n = a.length; i < n; ++i){ + if(f.call(o, a[i], i, a)){ + return true; // Boolean + } + } + }else{ + for(var i = 0; a.hasNext();){ + if(f.call(o, a.next(), i++)){ + return true; // Boolean + } + } + } + return false; // Boolean + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/curry.js b/includes/js/dojox/lang/functional/curry.js new file mode 100644 index 0000000..7c795ec --- /dev/null +++ b/includes/js/dojox/lang/functional/curry.js @@ -0,0 +1,96 @@ +if(!dojo._hasResource["dojox.lang.functional.curry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.curry"] = true; +dojo.provide("dojox.lang.functional.curry"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - currying and partial functions +// - argument pre-processing: mixer and flip + +// Acknoledgements: +// - partial() is based on work by Oliver Steele +// (http://osteele.com/sources/javascript/functional/functional.js) +// which was published under MIT License + +// Defined methods: +// - take any valid lambda argument as the functional argument + +(function(){ + var df = dojox.lang.functional; + + var currying = function(/*Object*/ info){ + return function(){ // Function + if(arguments.length + info.args.length < info.arity){ + return currying({func: info.func, arity: info.arity, + args: Array.prototype.concat.apply(info.args, arguments)}); + } + return info.func.apply(this, Array.prototype.concat.apply(info.args, arguments)); + }; + }; + + dojo.mixin(df, { + // currying and partial functions + curry: function(/*Function|String|Array*/ f, /*Number?*/ arity){ + // summary: curries a function until the arity is satisfied, at + // which point it returns the calculated value. + f = df.lambda(f); + arity = typeof arity == "number" ? arity : f.length; + return currying({func: f, arity: arity, args: []}); // Function + }, + arg: {}, // marker for missing arguments + partial: function(/*Function|String|Array*/ f){ + // summary: creates a function where some arguments are bound, and + // some arguments (marked as dojox.lang.functional.arg) are will be + // accepted by the final function in the order they are encountered. + // description: This method is used to produce partially bound + // functions. If you want to change the order of arguments, use + // dojox.lang.functional.mixer() or dojox.lang.functional.flip(). + var a = arguments, args = new Array(a.length - 1), p = []; + f = df.lambda(f); + for(var i = 1; i < a.length; ++i){ + var t = a[i]; + args[i - 1] = t; + if(t == df.arg){ + p.push(i - 1); + } + } + return function(){ // Function + var t = Array.prototype.slice.call(args, 0); // clone the array + for(var i = 0; i < p.length; ++i){ + t[p[i]] = arguments[i]; + } + return f.apply(this, t); + }; + }, + // argument pre-processing + mixer: function(/*Function|String|Array*/ f, /*Array*/ mix){ + // summary: changes the order of arguments using an array of + // numbers mix --- i-th argument comes from mix[i]-th place + // of supplied arguments. + f = df.lambda(f); + return function(){ // Function + var t = new Array(mix.length); + for(var i = 0; i < mix.length; ++i){ + t[i] = arguments[mix[i]]; + } + return f.apply(this, t); + }; + }, + flip: function(/*Function|String|Array*/ f){ + // summary: changes the order of arguments by reversing their + // order. + f = df.lambda(f); + return function(){ // Function + // reverse arguments + var a = arguments, l = a.length - 1, t = new Array(l + 1), i; + for(i = 0; i <= l; ++i){ + t[l - i] = a[i]; + } + return f.apply(this, t); + }; + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/fold.js b/includes/js/dojox/lang/functional/fold.js new file mode 100644 index 0000000..90a9a3d --- /dev/null +++ b/includes/js/dojox/lang/functional/fold.js @@ -0,0 +1,87 @@ +if(!dojo._hasResource["dojox.lang.functional.fold"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.fold"] = true; +dojo.provide("dojox.lang.functional.fold"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - "fold" family of functions + +// Notes: +// - missing high-level functions are provided with the compatible API: +// foldl, foldl1, foldr, foldr1 +// - missing JS standard functions are provided with the compatible API: +// reduce, reduceRight + +// Defined methods: +// - take any valid lambda argument as the functional argument +// - operate on dense arrays +// - take a string as the array argument +// - take an iterator objects as the array argument (only foldl, foldl1, and reduce) + +(function(){ + var d = dojo, df = dojox.lang.functional; + + d.mixin(df, { + // classic reduce-class functions + foldl: function(/*Array|String|Object*/ a, /*Function*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from left + // to right using a seed value as a starting point; returns the final + // value. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + if(d.isArray(a)){ + for(var i = 0, n = a.length; i < n; z = f.call(o, z, a[i], i, a), ++i); + }else{ + for(var i = 0; a.hasNext(); z = f.call(o, z, a.next(), i++)); + } + return z; // Object + }, + foldl1: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from left + // to right; returns the final value. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var z; + if(d.isArray(a)){ + z = a[0]; + for(var i = 1, n = a.length; i < n; z = f.call(o, z, a[i], i, a), ++i); + }else if(a.hasNext()){ + z = a.next(); + for(var i = 1; a.hasNext(); z = f.call(o, z, a.next(), i++)); + } + return z; // Object + }, + foldr: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from right + // to left using a seed value as a starting point; returns the final + // value. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + for(var i = a.length; i > 0; --i, z = f.call(o, z, a[i], i, a)); + return z; // Object + }, + foldr1: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from right + // to left; returns the final value. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var n = a.length, z = a[n - 1]; + for(var i = n - 1; i > 0; --i, z = f.call(o, z, a[i], i, a)); + return z; // Object + }, + // JS 1.8 standard array functions, which can take a lambda as a parameter. + reduce: function(/*Array|String|Object*/ a, /*Function*/ f, /*Object?*/ z){ + // summary: apply a function simultaneously against two values of the array + // (from left-to-right) as to reduce it to a single value. + return arguments.length < 3 ? df.foldl1(a, f) : df.foldl(a, f, z); // Object + }, + reduceRight: function(/*Array|String*/ a, /*Function*/ f, /*Object?*/ z){ + // summary: apply a function simultaneously against two values of the array + // (from right-to-left) as to reduce it to a single value. + return arguments.length < 3 ? df.foldr1(a, f) : df.foldr(a, f, z); // Object + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/lambda.js b/includes/js/dojox/lang/functional/lambda.js new file mode 100644 index 0000000..60be9f3 --- /dev/null +++ b/includes/js/dojox/lang/functional/lambda.js @@ -0,0 +1,110 @@ +if(!dojo._hasResource["dojox.lang.functional.lambda"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.lambda"] = true; +dojo.provide("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - anonymous functions built from the string + +// Acknoledgements: +// - lambda() is based on work by Oliver Steele +// (http://osteele.com/sources/javascript/functional/functional.js) +// which was published under MIT License + +// Notes: +// - lambda() produces functions, which after the compilation step are +// as fast as regular JS functions (at least theoretically). + +// Lambda input values: +// - returns functions unchanged +// - converts strings to functions +// - converts arrays to a functional composition + +(function(){ + var df = dojox.lang.functional; + + // split() is augmented on IE6 to ensure the uniform behavior + var split = "ab".split(/a*/).length > 1 ? String.prototype.split : + function(sep){ + var r = this.split.call(this, sep), + m = sep.exec(this); + if(m && m.index == 0){ r.unshift(""); } + return r; + }; + + var lambda = function(/*String*/ s){ + var args = [], sects = split.call(s, /\s*->\s*/m); + if(sects.length > 1){ + while(sects.length){ + s = sects.pop(); + args = sects.pop().split(/\s*,\s*|\s+/m); + if(sects.length){ sects.push("(function(" + args + "){return (" + s + ")})"); } + } + }else if(s.match(/\b_\b/)){ + args = ["_"]; + }else{ + var l = s.match(/^\s*(?:[+*\/%&|\^\.=<>]|!=)/m), + r = s.match(/[+\-*\/%&|\^\.=<>!]\s*$/m); + if(l || r){ + if(l){ + args.push("$1"); + s = "$1" + s; + } + if(r){ + args.push("$2"); + s = s + "$2"; + } + }else{ + // the point of the long regex below is to exclude all well-known + // lower-case words from the list of potential arguments + var vars = s. + replace(/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|this|true|false|null|undefined|typeof|instanceof|in|delete|new|void|arguments|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|eval|isFinite|isNaN|parseFloat|parseInt|unescape|dojo|dijit|dojox|window|document|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/g, ""). + match(/([a-z_$][a-z_$\d]*)/gi) || []; + var t = {}; + dojo.forEach(vars, function(v){ + if(!(v in t)){ + args.push(v); + t[v] = 1; + } + }); + } + } + return {args: args, body: "return (" + s + ");"}; // Object + }; + + var compose = function(/*Array*/ a){ + return a.length ? + function(){ + var i = a.length - 1, x = df.lambda(a[i]).apply(this, arguments); + for(--i; i >= 0; --i){ x = df.lambda(a[i]).call(this, x); } + return x; + } + : + // identity + function(x){ return x; }; + }; + + dojo.mixin(df, { + // lambda + buildLambda: function(/*String*/ s){ + // summary: builds a function from a snippet, returns a string, + // which represents the function. + // description: This method returns a textual representation of a function + // built from the snippet. It is meant to be evaled in the proper context, + // so local variables can be pulled from the environment. + s = lambda(s); + return "function(" + s.args.join(",") + "){" + s.body + "}"; // String + }, + lambda: function(/*Function|String|Array*/ s){ + // summary: builds a function from a snippet, or array (composing), returns + // a function object; functions are passed through unmodified. + // description: This method is used to normalize a functional representation + // (a text snippet, an array, or a function) to a function object. + if(typeof s == "function"){ return s; } + if(s instanceof Array){ return compose(s); } + s = lambda(s); + return new Function(s.args, s.body); // Function + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/listcomp.js b/includes/js/dojox/lang/functional/listcomp.js new file mode 100644 index 0000000..adb4883 --- /dev/null +++ b/includes/js/dojox/lang/functional/listcomp.js @@ -0,0 +1,54 @@ +if(!dojo._hasResource["dojox.lang.functional.listcomp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.listcomp"] = true; +dojo.provide("dojox.lang.functional.listcomp"); + +// This module adds high-level functions and related constructs: +// - list comprehensions similar to JavaScript 1.7 + +// Notes: +// - listcomp() produces functions, which after the compilation step are +// as fast as regular JS functions (at least theoretically). + +(function(){ + var g_re = /\bfor\b|\bif\b/gm; + + var listcomp = function(/*String*/ s){ + var frag = s.split(g_re), act = s.match(g_re), + head = ["var r = [];"], tail = []; + for(var i = 0; i < act.length;){ + var a = act[i], f = frag[++i]; + if(a == "for" && !/^\s*\(\s*(;|var)/.test(f)){ + f = f.replace(/^\s*\(/, "(var "); + } + head.push(a, f, "{"); + tail.push("}"); + } + return head.join("") + "r.push(" + frag[0] + ");" + tail.join("") + "return r;"; // String + }; + + dojo.mixin(dojox.lang.functional, { + buildListcomp: function(/*String*/ s){ + // summary: builds a function from a text snippet, which represents a valid + // JS 1.7 list comprehension, returns a string, which represents the function. + // description: This method returns a textual representation of a function + // built from the list comprehension text snippet (conformant to JS 1.7). + // It is meant to be evaled in the proper context, so local variable can be + // pulled from the environment. + return "function(){" + listcomp(s) + "}"; // String + }, + compileListcomp: function(/*String*/ s){ + // summary: builds a function from a text snippet, which represents a valid + // JS 1.7 list comprehension, returns a function object. + // description: This method returns a function built from the list + // comprehension text snippet (conformant to JS 1.7). It is meant to be + // reused several times. + return new Function([], listcomp(s)); // Function + }, + listcomp: function(/*String*/ s){ + // summary: executes the list comprehension building an array. + return (new Function([], listcomp(s)))(); // Array + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/object.js b/includes/js/dojox/lang/functional/object.js new file mode 100644 index 0000000..52b6272 --- /dev/null +++ b/includes/js/dojox/lang/functional/object.js @@ -0,0 +1,48 @@ +if(!dojo._hasResource["dojox.lang.functional.object"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.object"] = true; +dojo.provide("dojox.lang.functional.object"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - object/dictionary helpers + +// Defined methods: +// - take any valid lambda argument as the functional argument + +(function(){ + var d = dojo, df = dojox.lang.functional, empty = {}; + + d.mixin(df, { + // object helpers + forIn: function(/*Object*/ obj, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: iterates over all object members skipping members, which + // are present in the empty object (IE and/or 3rd-party libraries). + o = o || d.global; f = df.lambda(f); + for(var i in obj){ + if(i in empty){ continue; } + f.call(o, obj[i], i, obj); + } + }, + keys: function(/*Object*/ obj){ + // summary: returns an array of all keys in the object + var t = []; + for(var i in obj){ + if(i in empty){ continue; } + t.push(i); + } + return t; // Array + }, + values: function(/*Object*/ obj){ + // summary: returns an array of all values in the object + var t = []; + for(var i in obj){ + if(i in empty){ continue; } + t.push(obj[i]); + } + return t; // Array + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/reversed.js b/includes/js/dojox/lang/functional/reversed.js new file mode 100644 index 0000000..4375948 --- /dev/null +++ b/includes/js/dojox/lang/functional/reversed.js @@ -0,0 +1,79 @@ +if(!dojo._hasResource["dojox.lang.functional.reversed"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.reversed"] = true; +dojo.provide("dojox.lang.functional.reversed"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - reversed versions of array-processing functions similar to standard JS functions + +// Notes: +// - this module provides reversed versions of standard array-processing functions: +// forEachRev, mapRev, filterRev + +// Defined methods: +// - take any valid lambda argument as the functional argument +// - operate on dense arrays +// - take a string as the array argument + +(function(){ + var d = dojo, df = dojox.lang.functional; + + d.mixin(df, { + // JS 1.6 standard array functions, which can take a lambda as a parameter. + // Consider using dojo._base.array functions, if you don't need the lambda support. + filterRev: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: creates a new array with all elements that pass the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var t = [], v; + for(var i = a.length - 1; i >= 0; --i){ + v = a[i]; + if(f.call(o, v, i, a)){ t.push(v); } + } + return t; // Array + }, + forEachRev: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: executes a provided function once per array element. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + for(var i = a.length - 1; i >= 0; f.call(o, a[i], i, a), --i); + }, + mapRev: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: creates a new array with the results of calling + // a provided function on every element in this array. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var n = a.length, t = new Array(n); + for(var i = n - 1, j = 0; i >= 0; t[j++] = f.call(o, a[i], i, a), --i); + return t; // Array + }, + everyRev: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: tests whether all elements in the array pass the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + for(var i = a.length - 1; i >= 0; --i){ + if(!f.call(o, a[i], i, a)){ + return false; // Boolean + } + } + return true; // Boolean + }, + someRev: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: tests whether some element in the array passes the test + // implemented by the provided function. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + for(var i = a.length - 1; i >= 0; --i){ + if(f.call(o, a[i], i, a)){ + return true; // Boolean + } + } + return false; // Boolean + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/scan.js b/includes/js/dojox/lang/functional/scan.js new file mode 100644 index 0000000..65a3ef2 --- /dev/null +++ b/includes/js/dojox/lang/functional/scan.js @@ -0,0 +1,84 @@ +if(!dojo._hasResource["dojox.lang.functional.scan"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.scan"] = true; +dojo.provide("dojox.lang.functional.scan"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - "scan" family of functions + +// Notes: +// - missing high-level functions are provided with the compatible API: +// scanl, scanl1, scanr, scanr1 + +// Defined methods: +// - take any valid lambda argument as the functional argument +// - operate on dense arrays +// - take a string as the array argument +// - take an iterator objects as the array argument (only scanl, and scanl1) + +(function(){ + var d = dojo, df = dojox.lang.functional; + + d.mixin(df, { + // classic reduce-class functions + scanl: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from left + // to right using a seed value as a starting point; returns an array + // of values produced by foldl() at that point. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var t, n; + if(d.isArray(a)){ + t = new Array((n = a.length) + 1); + t[0] = z; + for(var i = 0; i < n; z = f.call(o, z, a[i], i, a), t[++i] = z); + }else{ + t = [z]; + for(var i = 0; a.hasNext(); t.push(z = f.call(o, z, a.next(), i++))); + } + return t; // Array + }, + scanl1: function(/*Array|String|Object*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from left + // to right; returns an array of values produced by foldl1() at that + // point. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var t, n, z; + if(d.isArray(a)){ + t = new Array(n = a.length); + t[0] = z = a[0]; + for(var i = 1; i < n; t[i] = z = f.call(o, z, a[i], i, a), ++i); + }else if(a.hasNext()){ + t = [z = a.next()]; + for(var i = 1; a.hasNext(); t.push(z = f.call(o, z, a.next(), i++))); + } + return t; // Array + }, + scanr: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from right + // to left using a seed value as a starting point; returns an array + // of values produced by foldr() at that point. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var n = a.length, t = new Array(n + 1); + t[n] = z; + for(var i = n; i > 0; --i, z = f.call(o, z, a[i], i, a), t[i] = z); + return t; // Array + }, + scanr1: function(/*Array|String*/ a, /*Function|String|Array*/ f, /*Object?*/ o){ + // summary: repeatedly applies a binary function to an array from right + // to left; returns an array of values produced by foldr1() at that + // point. + if(typeof a == "string"){ a = a.split(""); } + o = o || d.global; f = df.lambda(f); + var n = a.length, t = new Array(n), z = a[n - 1]; + t[n - 1] = z; + for(var i = n - 1; i > 0; --i, z = f.call(o, z, a[i], i, a), t[i] = z); + return t; // Array + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/sequence.js b/includes/js/dojox/lang/functional/sequence.js new file mode 100644 index 0000000..c5aaa1c --- /dev/null +++ b/includes/js/dojox/lang/functional/sequence.js @@ -0,0 +1,38 @@ +if(!dojo._hasResource["dojox.lang.functional.sequence"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.sequence"] = true; +dojo.provide("dojox.lang.functional.sequence"); + +dojo.require("dojox.lang.functional.lambda"); + +// This module adds high-level functions and related constructs: +// - sequence generators + +// Defined methods: +// - take any valid lambda argument as the functional argument + +(function(){ + var d = dojo, df = dojox.lang.functional; + + d.mixin(df, { + // sequence generators + repeat: function(/*Number*/ n, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: builds an array by repeatedly applying a unary function N times + // with a seed value Z. + o = o || d.global; f = df.lambda(f); + var t = new Array(n); + t[0] = z; + for(var i = 1; i < n; t[i] = z = f.call(o, z), ++i); + return t; // Array + }, + until: function(/*Function|String|Array*/ pr, /*Function|String|Array*/ f, /*Object*/ z, /*Object?*/ o){ + // summary: builds an array by repeatedly applying a unary function with + // a seed value Z until the predicate is satisfied. + o = o || d.global; f = df.lambda(f); pr = df.lambda(pr); + var t = []; + for(; !pr.call(o, z); t.push(z), z = f.call(o, z)); + return t; // Array + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/functional/zip.js b/includes/js/dojox/lang/functional/zip.js new file mode 100644 index 0000000..523f400 --- /dev/null +++ b/includes/js/dojox/lang/functional/zip.js @@ -0,0 +1,45 @@ +if(!dojo._hasResource["dojox.lang.functional.zip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.functional.zip"] = true; +dojo.provide("dojox.lang.functional.zip"); + +// This module adds high-level functions and related constructs: +// - zip combiners + +// Defined methods: +// - operate on dense arrays + +(function(){ + var df = dojox.lang.functional; + + dojo.mixin(df, { + // combiners + zip: function(){ + // summary: returns an array of arrays, where the i-th array + // contains the i-th element from each of the argument arrays. + // description: This is the venerable zip combiner (for example, + // see Python documentation for general details). The returned + // array is truncated to match the length of the shortest input + // array. + var n = arguments[0].length, m = arguments.length, i; + for(i = 1; i < m; n = Math.min(n, arguments[i++].length)); + var t = new Array(n), j; + for(i = 0; i < n; ++i){ + var p = new Array(m); + for(j = 0; j < m; p[j] = arguments[j][i], ++j); + t[i] = p; + } + return t; // Array + }, + unzip: function(/*Array*/ a){ + // summary: similar to dojox.lang.functional.zip(), but takes + // a single array of arrays as the input. + // description: This function is similar to dojox.lang.functional.zip() + // and can be used to unzip objects packed by + // dojox.lang.functional.zip(). It is here mostly to provide + // a short-cut for the different method signature. + return df.zip.apply(null, a); // Array + } + }); +})(); + +} diff --git a/includes/js/dojox/lang/tests/array.js b/includes/js/dojox/lang/tests/array.js new file mode 100644 index 0000000..292210c --- /dev/null +++ b/includes/js/dojox/lang/tests/array.js @@ -0,0 +1,84 @@ +if(!dojo._hasResource["dojox.lang.tests.array"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.array"] = true; +dojo.provide("dojox.lang.tests.array"); + +dojo.require("dojox.lang.functional"); +dojo.require("dojox.lang.functional.fold"); +dojo.require("dojox.lang.functional.reversed"); + +(function(){ + var df = dojox.lang.functional, v, isOdd = "%2"; + + var revArrayIter = function(array){ + this.array = array; + this.position = array.length - 1; + }; + dojo.extend(revArrayIter, { + hasNext: df.lambda("this.position >= 0"), + next: df.lambda("this.array[this.position--]") + }); + + tests.register("dojox.lang.tests.array", [ + function testFilter1(t){ t.assertEqual(df.filter([1, 2, 3], isOdd), [1, 3]); }, + function testFilter2(t){ t.assertEqual(df.filter([1, 2, 3], "%2==0"), [2]); }, + function testFilterIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.filter(iter, isOdd), [3, 1]); + }, + function testFilterRev(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.filter(iter, isOdd), df.filterRev([1, 2, 3], isOdd)); + }, + + function testForEach(t){ + t.assertEqual((v = [], df.forEach([1, 2, 3], function(x){ v.push(x); }), v), [1, 2, 3]); + }, + function testForEachIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual((v = [], df.forEach(iter, function(x){ v.push(x); }), v), [3, 2, 1]); + }, + function testForEachRev(t){ + t.assertEqual((v = [], df.forEachRev([1, 2, 3], function(x){ v.push(x); }), v), [3, 2, 1]); + }, + + function testMap(t){ t.assertEqual(df.map([1, 2, 3], "+3"), [4, 5, 6]); }, + function testMapIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.map(iter, "+3"), [6, 5, 4]); + }, + function testMapRev(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.map(iter, "+3"), df.mapRev([1, 2, 3], "+3")); + }, + + function testEvery1(t){ t.assertFalse(df.every([1, 2, 3], isOdd)); }, + function testEvery2(t){ t.assertTrue(df.every([1, 3, 5], isOdd)); }, + function testEveryIter(t){ + var iter = new revArrayIter([1, 3, 5]); + t.assertTrue(df.every(iter, isOdd)); + }, + function testEveryRev1(t){ t.assertFalse(df.everyRev([1, 2, 3], isOdd)); }, + function testEveryRev2(t){ t.assertTrue(df.everyRev([1, 3, 5], isOdd)); }, + + function testSome1(t){ t.assertFalse(df.some([2, 4, 6], isOdd)); }, + function testSome2(t){ t.assertTrue(df.some([1, 2, 3], isOdd)); }, + function testSomeIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertTrue(df.some(iter, isOdd)); + }, + function testSomeRev1(t){ t.assertFalse(df.someRev([2, 4, 6], isOdd)); }, + function testSomeRev2(t){ t.assertTrue(df.someRev([1, 2, 3], isOdd)); }, + + function testReduce1(t){ t.assertEqual(df.reduce([4, 2, 1], "x-y"), 1); }, + function testReduce2(t){ t.assertEqual(df.reduce([4, 2, 1], "x-y", 8), 1); }, + function testReduceIter(t){ + var iter = new revArrayIter([1, 2, 4]); + t.assertEqual(df.reduce(iter, "x-y"), 1); + }, + + function testReduceRight1(t){ t.assertEqual(df.reduceRight([4, 2, 1], "x-y"), -5); }, + function testReduceRight2(t){ t.assertEqual(df.reduceRight([4, 2, 1], "x-y", 8), 1); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/curry.js b/includes/js/dojox/lang/tests/curry.js new file mode 100644 index 0000000..cb6fa6a --- /dev/null +++ b/includes/js/dojox/lang/tests/curry.js @@ -0,0 +1,31 @@ +if(!dojo._hasResource["dojox.lang.tests.curry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.curry"] = true; +dojo.provide("dojox.lang.tests.curry"); + +dojo.require("dojox.lang.functional.curry"); + +(function(){ + var df = dojox.lang.functional, add5 = df.curry("+")(5), sub3 = df.curry("_-3"), fun = df.lambda("100*a + 10*b + c"); + tests.register("dojox.lang.tests.curry", [ + function testCurry1(t){ t.assertEqual(df.curry("+")(1, 2), 3); }, + function testCurry2(t){ t.assertEqual(df.curry("+")(1)(2), 3); }, + function testCurry3(t){ t.assertEqual(df.curry("+")(1, 2, 3), 3); }, + function testCurry4(t){ t.assertEqual(add5(1), 6); }, + function testCurry5(t){ t.assertEqual(add5(3), 8); }, + function testCurry6(t){ t.assertEqual(add5(5), 10); }, + function testCurry7(t){ t.assertEqual(sub3(1), -2); }, + function testCurry8(t){ t.assertEqual(sub3(3), 0); }, + function testCurry9(t){ t.assertEqual(sub3(5), 2); }, + + function testPartial1(t){ t.assertEqual(df.partial(fun, 1, 2, 3)(), 123); }, + function testPartial2(t){ t.assertEqual(df.partial(fun, 1, 2, df.arg)(3), 123); }, + function testPartial3(t){ t.assertEqual(df.partial(fun, 1, df.arg, 3)(2), 123); }, + function testPartial4(t){ t.assertEqual(df.partial(fun, 1, df.arg, df.arg)(2, 3), 123); }, + function testPartial5(t){ t.assertEqual(df.partial(fun, df.arg, 2, 3)(1), 123); }, + function testPartial6(t){ t.assertEqual(df.partial(fun, df.arg, 2, df.arg)(1, 3), 123); }, + function testPartial7(t){ t.assertEqual(df.partial(fun, df.arg, df.arg, 3)(1, 2), 123); }, + function testPartial8(t){ t.assertEqual(df.partial(fun, df.arg, df.arg, df.arg)(1, 2, 3), 123); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/fold.js b/includes/js/dojox/lang/tests/fold.js new file mode 100644 index 0000000..e766c62 --- /dev/null +++ b/includes/js/dojox/lang/tests/fold.js @@ -0,0 +1,64 @@ +if(!dojo._hasResource["dojox.lang.tests.fold"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.fold"] = true; +dojo.provide("dojox.lang.tests.fold"); + +dojo.require("dojox.lang.functional.fold"); +dojo.require("dojox.lang.functional.scan"); +dojo.require("dojox.lang.functional.curry"); + +(function(){ + var df = dojox.lang.functional, a = df.arg; + + var revArrayIter = function(array){ + this.array = array; + this.position = array.length - 1; + }; + dojo.extend(revArrayIter, { + hasNext: df.lambda("this.position >= 0"), + next: df.lambda("this.array[this.position--]") + }); + + tests.register("dojox.lang.tests.fold", [ + function testFoldl1(t){ t.assertEqual(df.foldl([1, 2, 3], "+", 0), 6); }, + function testFoldl2(t){ t.assertEqual(df.foldl1([1, 2, 3], "*"), 6); }, + function testFoldl3(t){ t.assertEqual(df.foldl1([1, 2, 3], "/"), 1/6); }, + function testFoldl4(t){ t.assertEqual(df.foldl1([1, 2, 3], df.partial(Math.max, a, a)), 3); }, + function testFoldl5(t){ t.assertEqual(df.foldl1([1, 2, 3], df.partial(Math.min, a, a)), 1); }, + + function testFoldlIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.foldl(iter, "+", 0), 6); + }, + function testFoldl1Iter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.foldl1(iter, "/"), 3/2); + }, + + function testFoldr1(t){ t.assertEqual(df.foldr([1, 2, 3], "+", 0), 6); }, + function testFoldr2(t){ t.assertEqual(df.foldr1([1, 2, 3], "*"), 6); }, + function testFoldr3(t){ t.assertEqual(df.foldr1([1, 2, 3], "/"), 3/2); }, + function testFoldr4(t){ t.assertEqual(df.foldr1([1, 2, 3], df.partial(Math.max, a, a)), 3); }, + function testFoldr5(t){ t.assertEqual(df.foldr1([1, 2, 3], df.partial(Math.min, a, a)), 1); }, + + function testScanl1(t){ t.assertEqual(df.scanl([1, 2, 3], "+", 0), [0, 1, 3, 6]); }, + function testScanl2(t){ t.assertEqual(df.scanl1([1, 2, 3], "*"), [1, 2, 6]); }, + function testScanl3(t){ t.assertEqual(df.scanl1([1, 2, 3], df.partial(Math.max, a, a)), [1, 2, 3]); }, + function testScanl4(t){ t.assertEqual(df.scanl1([1, 2, 3], df.partial(Math.min, a, a)), [1, 1, 1]); }, + + function testScanlIter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.scanl(iter, "+", 0), [0, 3, 5, 6]); + }, + function testScanl1Iter(t){ + var iter = new revArrayIter([1, 2, 3]); + t.assertEqual(df.scanl1(iter, "*"), [3, 6, 6]); + }, + + function testScanr1(t){ t.assertEqual(df.scanr([1, 2, 3], "+", 0), [6, 5, 3, 0]); }, + function testScanr2(t){ t.assertEqual(df.scanr1([1, 2, 3], "*"), [6, 6, 3]); }, + function testScanr3(t){ t.assertEqual(df.scanr1([1, 2, 3], df.partial(Math.max, a, a)), [3, 3, 3]); }, + function testScanr4(t){ t.assertEqual(df.scanr1([1, 2, 3], df.partial(Math.min, a, a)), [1, 2, 3]); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/fun_perf.html b/includes/js/dojox/lang/tests/fun_perf.html new file mode 100644 index 0000000..9d19a60 --- /dev/null +++ b/includes/js/dojox/lang/tests/fun_perf.html @@ -0,0 +1,176 @@ + + + clocking fun + + + + + + + + +

            This test is meant to run with Firebug.

            + + diff --git a/includes/js/dojox/lang/tests/lambda.js b/includes/js/dojox/lang/tests/lambda.js new file mode 100644 index 0000000..7e5e7ed --- /dev/null +++ b/includes/js/dojox/lang/tests/lambda.js @@ -0,0 +1,24 @@ +if(!dojo._hasResource["dojox.lang.tests.lambda"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.lambda"] = true; +dojo.provide("dojox.lang.tests.lambda"); + +dojo.require("dojox.lang.functional"); +dojo.require("dojox.lang.functional.sequence"); + +(function(){ + var df = dojox.lang.functional; + tests.register("dojox.lang.tests.lambda", [ + function testLambda1(t){ t.assertEqual(df.repeat(3, "3*", 1), [1, 3, 9]); }, + function testLambda2(t){ t.assertEqual(df.repeat(3, "*3", 1), [1, 3, 9]); }, + function testLambda3(t){ t.assertEqual(df.repeat(3, "_*3", 1), [1, 3, 9]); }, + function testLambda4(t){ t.assertEqual(df.repeat(3, "3*_", 1), [1, 3, 9]); }, + function testLambda5(t){ t.assertEqual(df.repeat(3, "n->n*3", 1), [1, 3, 9]); }, + function testLambda6(t){ t.assertEqual(df.repeat(3, "n*3", 1), [1, 3, 9]); }, + function testLambda7(t){ t.assertEqual(df.repeat(3, "3*m", 1), [1, 3, 9]); }, + function testLambda8(t){ t.assertEqual(df.repeat(3, "->1", 1), [1, 1, 1]); }, + function testLambda9(t){ t.assertEqual(df.repeat(3, function(n){ return n * 3; }, 1), [1, 3, 9]); }, + function testLambda10(t){ t.assertEqual(df.repeat(3, ["_-1", ["*3"]], 1), [1, 2, 5]); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/listcomp.js b/includes/js/dojox/lang/tests/listcomp.js new file mode 100644 index 0000000..45cd8ab --- /dev/null +++ b/includes/js/dojox/lang/tests/listcomp.js @@ -0,0 +1,28 @@ +if(!dojo._hasResource["dojox.lang.tests.listcomp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.listcomp"] = true; +dojo.provide("dojox.lang.tests.listcomp"); + +dojo.require("dojox.lang.functional.listcomp"); +dojo.require("dojox.lang.functional.sequence"); + +(function(){ + var df = dojox.lang.functional; + tests.register("dojox.lang.tests.listcomp", [ + function testIterator1(t){ t.assertEqual(df.repeat(3, function(n){ return n + 1; }, 0), [0, 1, 2]); }, + function testIterator2(t){ t.assertEqual(df.repeat(3, function(n){ return n * 3; }, 1), [1, 3, 9]); }, + function testIterator3(t){ t.assertEqual(df.until(function(n){ return n > 10; }, function(n){ return n * 3; }, 1), [1, 3, 9]); }, + + function testListcomp1(t){ t.assertEqual(df.listcomp("i for(var i=0; i<3; ++i)"), [0, 1, 2]); }, + function testListcomp2(t){ t.assertEqual(df.listcomp("i*j for(var i=0; i<3; ++i) for(var j=0; j<3; ++j)"), [0, 0, 0, 0, 1, 2, 0, 2, 4]); }, + function testListcomp3(t){ t.assertEqual(df.listcomp("i*j for(var i=0; i<3; ++i) if(i%2==1) for(var j=0; j<3; ++j)"), [0, 1, 2]); }, + function testListcomp4(t){ t.assertEqual(df.listcomp("i+j for(var i=0; i<3; ++i) for(var j=0; j<3; ++j)"), [0, 1, 2, 1, 2, 3, 2, 3, 4]); }, + function testListcomp5(t){ t.assertEqual(df.listcomp("i+j for(var i=0; i<3; ++i) if(i%2==1) for(var j=0; j<3; ++j)"), [1, 2, 3]); }, + function testListcomp6(t){ t.assertEqual(df.listcomp("i for(i=0; i<3; ++i)"), [0, 1, 2]); }, + function testListcomp7(t){ t.assertEqual(df.listcomp("i*j for(i=0; i<3; ++i) for(j=0; j<3; ++j)"), [0, 0, 0, 0, 1, 2, 0, 2, 4]); }, + function testListcomp8(t){ t.assertEqual(df.listcomp("i*j for(i=0; i<3; ++i) if(i%2==1) for(j=0; j<3; ++j)"), [0, 1, 2]); }, + function testListcomp9(t){ t.assertEqual(df.listcomp("i+j for(i=0; i<3; ++i) for(j=0; j<3; ++j)"), [0, 1, 2, 1, 2, 3, 2, 3, 4]); }, + function testListcomp10(t){ t.assertEqual(df.listcomp("i+j for(i=0; i<3; ++i) if(i%2==1) for(j=0; j<3; ++j)"), [1, 2, 3]); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/main.js b/includes/js/dojox/lang/tests/main.js new file mode 100644 index 0000000..1f0d7ab --- /dev/null +++ b/includes/js/dojox/lang/tests/main.js @@ -0,0 +1,17 @@ +if(!dojo._hasResource["dojox.lang.tests.main"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.main"] = true; +dojo.provide("dojox.lang.tests.main"); + +try{ + // functional block + dojo.require("dojox.lang.tests.listcomp"); + dojo.require("dojox.lang.tests.lambda"); + dojo.require("dojox.lang.tests.fold"); + dojo.require("dojox.lang.tests.curry"); + dojo.require("dojox.lang.tests.misc"); + dojo.require("dojox.lang.tests.array"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/lang/tests/misc.js b/includes/js/dojox/lang/tests/misc.js new file mode 100644 index 0000000..f17ea8c --- /dev/null +++ b/includes/js/dojox/lang/tests/misc.js @@ -0,0 +1,31 @@ +if(!dojo._hasResource["dojox.lang.tests.misc"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.tests.misc"] = true; +dojo.provide("dojox.lang.tests.misc"); + +dojo.require("dojox.lang.functional.object"); +dojo.require("dojox.lang.functional.zip"); + +(function(){ + var df = dojox.lang.functional, fun = df.lambda("100*a + 10*b + c"), result = []; + df.forIn({a: 1, b: 2}, function(v, i){ result.push("[" + i + "] = " + v); }); + + tests.register("dojox.lang.tests.misc", [ + function testZip1(t){ t.assertEqual(df.zip([1, 2, 3], [4, 5, 6]), [[1, 4], [2, 5], [3, 6]]); }, + function testZip2(t){ t.assertEqual(df.zip([1, 2], [3, 4], [5, 6]), [[1, 3, 5], [2, 4, 6]]); }, + + function testUnzip1(t){ t.assertEqual(df.unzip([[1, 4], [2, 5], [3, 6]]), [[1, 2, 3], [4, 5, 6]]); }, + function testUnzip2(t){ t.assertEqual(df.unzip([[1, 3, 5], [2, 4, 6]]), [[1, 2], [3, 4], [5, 6]]); }, + + function testMixer(t){ t.assertEqual(df.mixer(fun, [1, 2, 0])(3, 1, 2), 123); }, + function testFlip(t){ t.assertEqual(df.flip(fun)(3, 2, 1), 123); }, + + function testCompose1(t){ t.assertEqual(df.lambda(["+5", "*3"])(8), 8 * 3 + 5); }, + function testCompose2(t){ t.assertEqual(df.lambda(["+5", "*3"].reverse())(8), (8 + 5) * 3); }, + + function testForIn(t){ t.assertEqual(result.sort().join(", "), "[a] = 1, [b] = 2"); }, + function testKeys(t){ t.assertEqual(df.keys({a: 1, b: 2, c: 3}), ["a", "b", "c"]); }, + function testValues(t){ t.assertEqual(df.values({a: 1, b: 2, c: 3}), [1, 2, 3]); } + ]); +})(); + +} diff --git a/includes/js/dojox/lang/tests/runTests.html b/includes/js/dojox/lang/tests/runTests.html new file mode 100644 index 0000000..32fdfdb --- /dev/null +++ b/includes/js/dojox/lang/tests/runTests.html @@ -0,0 +1,9 @@ + + + DojoX Functional Unit Test Runner + + + +

            Redirecting to D.O.H runner.

            + + diff --git a/includes/js/dojox/lang/utils.js b/includes/js/dojox/lang/utils.js new file mode 100644 index 0000000..b7926c6 --- /dev/null +++ b/includes/js/dojox/lang/utils.js @@ -0,0 +1,54 @@ +if(!dojo._hasResource["dojox.lang.utils"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.lang.utils"] = true; +dojo.provide("dojox.lang.utils"); + +(function(){ + var empty = {}, du = dojox.lang.utils; + + dojo.mixin(dojox.lang.utils, { + coerceType: function(target, source){ + switch(typeof target){ + case "number": return Number(eval("(" + source + ")")); + case "string": return String(source); + case "boolean": return Boolean(eval("(" + source + ")")); + } + return eval("(" + source + ")"); + }, + + updateWithObject: function(target, source, conv){ + // summary: updates an existing object in place with properties from an "source" object. + // target: Object: the "target" object to be updated + // source: Object: the "source" object, whose properties will be used to source the existed object. + // conv: Boolean?: force conversion to the original type + if(!source){ return target; } + for(var x in target){ + if(x in source && !(x in empty)){ + var t = target[x]; + if(t && typeof t == "object"){ + du.updateObject(t, source[x]); + }else{ + target[x] = conv ? du.coerceType(t, source[x]) : dojo.clone(source[x]); + } + } + } + return target; // Object + }, + + updateWithPattern: function(target, source, pattern, conv){ + // summary: updates an existing object in place with properties from an "source" object. + // target: Object: the "target" object to be updated + // source: Object: the "source" object, whose properties will be used to source the existed object. + // pattern: Array: an array of properties to be copied + // conv: Boolean?: force conversion to the original type + if(!source || !pattern){ return target; } + for(var x in pattern){ + if(x in source && !(x in empty)){ + target[x] = conv ? du.coerceType(pattern[x], source[x]) : dojo.clone(source[x]); + } + } + return target; // Object + } + }); +})(); + +} diff --git a/includes/js/dojox/layout/BorderContainer.js b/includes/js/dojox/layout/BorderContainer.js new file mode 100644 index 0000000..7fa5393 --- /dev/null +++ b/includes/js/dojox/layout/BorderContainer.js @@ -0,0 +1,7 @@ +if(!dojo._hasResource["dojox.layout.BorderContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.layout.BorderContainer"] = true; +dojo.provide("dojox.layout.BorderContainer"); + +console.error("dojox.layout.BorderContainer moved to dijit.layout.BorderContainer"); + +} diff --git a/includes/js/dojox/layout/ContentPane.js b/includes/js/dojox/layout/ContentPane.js new file mode 100644 index 0000000..d60202c --- /dev/null +++ b/includes/js/dojox/layout/ContentPane.js @@ -0,0 +1,479 @@ +if(!dojo._hasResource["dojox.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.layout.ContentPane"] = true; +dojo.provide("dojox.layout.ContentPane"); + +dojo.require("dijit.layout.ContentPane"); + +(function(){ // private scope, sort of a namespace + + // TODO: should these methods be moved to dojox.html.cssPathAdjust or something? + + // css at-rules must be set before any css declarations according to CSS spec + // match: + // @import 'http://dojotoolkit.org/dojo.css'; + // @import 'you/never/thought/' print; + // @import url("it/would/work") tv, screen; + // @import url(/did/you/now.css); + // but not: + // @namespace dojo "http://dojotoolkit.org/dojo.css"; /* namespace URL should always be a absolute URI */ + // @charset 'utf-8'; + // @media print{ #menuRoot {display:none;} } + + + // we adjust all paths that dont start on '/' or contains ':' + //(?![a-z]+:|\/) + + if(dojo.isIE){ + var alphaImageLoader = /(AlphaImageLoader\([^)]*?src=(['"]))(?![a-z]+:|\/)([^\r\n;}]+?)(\2[^)]*\)\s*[;}]?)/g; + } + + var cssPaths = /(?:(?:@import\s*(['"])(?![a-z]+:|\/)([^\r\n;{]+?)\1)|url\(\s*(['"]?)(?![a-z]+:|\/)([^\r\n;]+?)\3\s*\))([a-z, \s]*[;}]?)/g; + + function adjustCssPaths(cssUrl, cssText){ + // summary: + // adjusts relative paths in cssText to be relative to cssUrl + // a path is considered relative if it doesn't start with '/' and not contains ':' + // description: + // Say we fetch a HTML page from level1/page.html + // It has some inline CSS: + // @import "css/page.css" tv, screen; + // ... + // background-image: url(images/aplhaimage.png); + // + // as we fetched this HTML and therefore this CSS + // from level1/page.html, these paths needs to be adjusted to: + // @import 'level1/css/page.css' tv, screen; + // ... + // background-image: url(level1/images/alphaimage.png); + // + // In IE it will also adjust relative paths in AlphaImageLoader() + // filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/alphaimage.png'); + // will be adjusted to: + // filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='level1/images/alphaimage.png'); + // + // Please note that any relative paths in AlphaImageLoader in external css files wont work, as + // the paths in AlphaImageLoader is MUST be declared relative to the HTML page, + // not relative to the CSS file that declares it + + if(!cssText || !cssUrl){ return; } + + // support the ImageAlphaFilter if it exists, most people use it in IE 6 for transparent PNGs + // We are NOT going to kill it in IE 7 just because the PNGs work there. Somebody might have + // other uses for it. + // If user want to disable css filter in IE6 he/she should + // unset filter in a declaration that just IE 6 doesn't understands + // like * > .myselector { filter:none; } + if(alphaImageLoader){ + cssText = cssText.replace(alphaImageLoader, function(ignore, pre, delim, url, post){ + return pre + (new dojo._Url(cssUrl, './'+url).toString()) + post; + }); + } + + return cssText.replace(cssPaths, function(ignore, delimStr, strUrl, delimUrl, urlUrl, media){ + if(strUrl){ + return '@import "' + (new dojo._Url(cssUrl, './'+strUrl).toString()) + '"' + media; + }else{ + return 'url(' + (new dojo._Url(cssUrl, './'+urlUrl).toString()) + ')' + media; + } + }); + } + + // attributepaths one tag can have multiple paths, example: + // or + // + var htmlAttrPaths = /(<[a-z][a-z0-9]*\s[^>]*)(?:(href|src)=(['"]?)([^>]*?)\3|style=(['"]?)([^>]*?)\5)([^>]*>)/gi; + + function adjustHtmlPaths(htmlUrl, cont){ + var url = htmlUrl || "./"; + + return cont.replace(htmlAttrPaths, + function(tag, start, name, delim, relUrl, delim2, cssText, end){ + return start + (name ? + (name + '=' + delim + (new dojo._Url(url, relUrl).toString()) + delim) + : ('style=' + delim2 + adjustCssPaths(url, cssText) + delim2) + ) + end; + } + ); + } + + function secureForInnerHtml(cont){ + /********* remove .. tag **********/ + // khtml is picky about dom faults, you can't attach a + + + + + +

            dojox.layout.ContentPane

            +

            As dojox ContentPane is derived from dijit ContentPane, make sure that the dijit test passes before running this test

            +

            Test relies on a php page as backend, so you need php installed on your server

            + +
            + Initial value +
            + + + + + + + + + + + + +
            + + \ No newline at end of file diff --git a/includes/js/dojox/layout/tests/_bottomPane.html b/includes/js/dojox/layout/tests/_bottomPane.html new file mode 100644 index 0000000..8f5090a --- /dev/null +++ b/includes/js/dojox/layout/tests/_bottomPane.html @@ -0,0 +1,53 @@ +
            + Bottom Pane Content: + + + + +
            \ No newline at end of file diff --git a/includes/js/dojox/layout/tests/_expando.css b/includes/js/dojox/layout/tests/_expando.css new file mode 100644 index 0000000..8efd20e --- /dev/null +++ b/includes/js/dojox/layout/tests/_expando.css @@ -0,0 +1,477 @@ + +body, div, dl, dt, dd, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td { + margin: 0; + padding: 0; +} +fieldset, img { + border: 0 none; +} +address, caption, cite, code, dfn, th, var { + font-style: normal; + font-weight: normal; +} +caption, th { + text-align: left; +} +q:before, q:after { + content:""; +} +abbr, acronym { + border:0; +} +body { + font: 13px Myriad,Arial,Helvetica,clean,sans-serif; + *font-size: small; + *font: x-small; +} +h1 { + font-size: 1.5em; + font-weight: normal; + line-height: 1em; + margin-top: 1em; + margin-bottom:0; +} +h2 { + font-size: 1.1667em; + font-weight: bold; + line-height: 1.286em; + margin-top: 1.929em; + margin-bottom:0.643em; +} +h3, h4, h5, h6 { + font-size: 1em; + font-weight: bold; + line-height: 1.5em; + margin-top: 1.5em; + margin-bottom: 0; +} +p { + font-size: 1em; + margin-top: 1.5em; + margin-bottom: 1.5em; + line-height: 1.5em; +} +blockquote { + font-size: 0.916em; + margin-top: 3.272em; + margin-bottom: 3.272em; + line-height: 1.636em; + padding: 1.636em; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} +ol li, ul li { + font-size: 1em; + line-height: 1.5em; + margin: 0; +} +pre, code { + font-size:115%; + *font-size:100%; + font-family: Courier, "Courier New"; + background-color: #efefef; + border: 1px solid #ccc; +} +pre { + border-width: 1px 0; + padding: 1.5em; +} +table { font-size:100%; } +table.dojoTabular { + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #ccc; + margin: 0 1.5em; +} +.dojoTabular th { + text-align: center; + font-weight: bold; +} +table.dojoTabular thead, table.dojoTabular tfoot { + background-color: #efefef; + border: 1px solid #ccc; + border-width: 1px 0; +} +table.dojoTabular thead tr th, +table.dojoTabular thead tr td, +table.dojoTabular tbody tr td, +table.dojoTabular tfoot tr td { + padding: 0.25em 0.5em; +} +body { + background:#fff url(../../../dijit/tests/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(../../../dijit/tests/images/plus.gif); + background-repeat: no-repeat; + width: 16px; + height: 16px; +} +.plusBlockIcon { + display: block !important; +} +.noteIcon { + background-image: url(../../../dijit/tests/images/note.gif); + background-repeat: no-repeat; + width: 20px; + height: 20px; +} +.flatScreenIcon { + background-image: url(../../../dijit/tests/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(../../../dijit/tests/../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(../../../dijit/tests/../demos/mail/icons.gif); +} +.customFolderClosedIcon { + background-position: -154px; +} +body .medium { + font-size: larger; +} +.dojoxFloatingPane { + background-color:#fff; + position:relative; + border: 1px solid #dedede; + overflow: hidden; + -webkit-box-shadow: 0px 5px 10px #adadad; +} +.dojoxFloatingPaneFg { + -webkit-box-shadow: 0px 8px 20px #525252; +} +.dojoxFloatingPaneTitle { + background: #cccccc; + background:#fafafa repeat-x bottom left; + border:1px solid #bfbfbf; + padding:4px 4px 2px 4px; + cursor: pointer; + white-space: nowrap; +} +.soria .dojoxFloatingPaneTitle { + background:#fff url(../../../dijit/themes/soria/images/titleBar.png) repeat-x top left; + border:1px solid #b1badf; + font-size: 0.9em; + font-weight: bold; + line-height:1.2em; +} +.tundra .dojoxFloatingPaneTitle { + background:#fafafa url(../../../dijit/themes/tundra/images/titleBarBg.gif) repeat-x bottom left; + border:1px solid #bfbfbf; + color:#000; +} +.dojoxFloatingCloseIcon { + background:url(../resources/icons/tabClose.png) no-repeat center center; + width:16px; + height:16px; + overflow:hidden; + float:right; +} +.dojoxFloatingMinimizeIcon { + background:url(../../../dijit/themes/tundra/images/arrowDown.png) no-repeat center center; + width:16px; + height:16px; + overflow:hidden; + float:right; +} +.soria .dojoxFloatingMinimizeIcon { + background:url(../../../dijit/themes/soria/images/spriteRoundedIconsSmallBl.png) no-repeat -15px top; +} +.floatingPaneMaximized .dojoxFloatingMaximizeIcon { display:none; } +.dojoxFloatingMaximizeIcon { + background:url(../../../dijit/themes/tundra/images/arrowUp.png) no-repeat center center; + width:16px; + height:16px; + overflow:hidden; + float:right; +} +.soria .dojoxFloatingMaximizeIcon { + background:url(../../../dijit/themes/soria/images/spriteRoundedIconsSmallBl.png) no-repeat -45px top; +} +.floatingPaneMaximized .dojoxFloatingRestoreIcon { display:inline; } +.dojoxFloatingRestoreIcon { + background:url(../../../dijit/themes/tundra/images/arrowDown.png) no-repeat center center; + width:16px; height:16px; + overflow:hidden; + float:right; + display:none; +} +.dojoxFloatingResizeHandle { + background:url(../resources/icons/resize.png) no-repeat bottom right; + position:absolute; + right:0; + bottom:0; + width:16px; + height:16px; + cursor:nw-resize; +} +.dojoxFloatingCloseIcon { + width:15px; + height:15px; + overflow:hidden; + float:right; + cursor:pointer; +} +.soria .dojoxFloatingCloseIcon { + background:url(../../../dijit/themes/soria/images/spriteRoundedIconsSmallBl.png) no-repeat -60px top; +} +.tundra .dojoxFloatingCloseIcon { + background:url(../../../dijit/themes/tundra/images/tabClose.png) no-repeat center center; +} +.dojoxFloatingDockDefault { + position:absolute; + bottom:0px; + left:0px; + overflow:hidden; + margin:0; + margin-bottom:3px; + padding:0px; + width:100%; + z-index:99; + background:transparent; + +} +.dojoxDockList { + padding: 0px; + margin: 0px; +} +.dojoxDockRestoreButton { + background:url(../../../dijit/themes/tundra/images/arrowUp.png) no-repeat center center; + width:16px; height:16px; + overflow:hidden; + float:left; + margin-top:2px; +} +.soria .dojoxDockRestoreButton { + background:url(../../../dijit/themes/soria/images/spriteRoundedIconsSmallBl.png) no-repeat -45px top; +} +.dojoxDockTitleNode { + overflow:hidden; +} +.dojoxDock { + display: block; + border: 1px solid black; + position: absolute; + padding:0; + margin:0; + background:#fcfcfc; +} +.dojoxDockNode { + border: 1px solid #adadad; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 3px; + cursor:pointer; + list-style: none; + padding: 2px; + margin: 0px; + height: 16px; + width: auto; + float: left; + background: #fafafa url(../resources/images/floatTitleBarBg.gif) repeat-x bottom left; +} +.soria .dojoxDockNode { + background:#b7cdee url(../../../dijit/themes/soria/images/titleBar.png) repeat-x; +} +.dojoxFloatingPaneContent { + overflow: auto; + background-color: #fff; + height: 100%; + width: 100%; +} +.dojoxFloatingPaneCanvas { + background-color:#fff; +} +.dojoxExpandoPane { + overflow:hidden; + margin-top:1px; + border-top:1px solid #ccc; + z-index:440; + background:#fff; +} +.dojoxExpandoPane .dojoxExpandoWrapper { + overflow:hidden; +} +.dojoxExpandoIcon { + width:14px; + cursor:pointer; + background-position:-60px 0px; + height:14px; +} +.soria .dojoxExpandoIcon { + background: url(../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png) no-repeat center center; +} +.tundra .dojoxExpandoLeft .dojoxExpandoIcon, +.nihilo .dojoxExpandoLeft .dojoxExpandoIcon { + + background: url(../../../dijit/themes/tundra/images/minusButton.gif) no-repeat; +} +.tundra .dojoxExpandoRight .dojoxExpandoIcon, +.nihilo .dojoxExpandoRight .dojoxExpandoIcon { + + background: url(../../../dijit/themes/tundra/images/minusButton.gif) no-repeat; +} +.tundra .dojoxExpandoClosed .dojoxExpandoIcon { + background: url(../../../dijit/themes/tundra/images/plusButton.gif) no-repeat; +} +.dojoxExpandoClosed .dojoxExpandoIcon { + background-position: 0px 0px; +} +.dojoxExpandoClosed .dojoxExpandoTitleNode { + visibility:hidden; +} +.dojoxExpandoTitleNode { + padding-right:6px; padding-left:6px; +} +.dojoxExpandoClosed .dijitContentPane { + overflow: hidden; +} +.dojoxExpandoIcon .a11yNode { + display:none; + visibility:hidden; +} +.dojoxExpandoBottom .dojoxExpandoIcon, +.dojoxExpandoTop .dojoxExpandoIcon, +.dojoxExpandoLeft .dojoxExpandoIcon { + float:right; +} +.dojoxExpandoRight .dojoxExpandoIcon { + float:left; +} +.nihilo .dojoxExpandoTitle { + height:18px; + font-size:0.9em; + font-weight:bold; + padding:3px; + padding-top:7px; + padding-bottom:7px; + background:#fafafa url(../../../dijit/themes/nihilo/images/tabStripe.gif) repeat-x left bottom; + +} +.nihilo .dojoxExpandoTop { + border-bottom:1px solid #ccc; + border-left:1px solid #ccc; + border-right:1px solid #ccc; +} +.soria .dojoxExpandoTop { + +} +.soria .dojoxExpandoTitle { + height:18px; + font-size:0.9em; + font-weight:bold; + padding:3px; + padding-top:7px; + padding-bottom:7px; + background:#f0f4fc url(../../../dijit/themes/soria/images/tabStripe.gif) repeat-x left bottom; +} +.tundra .dojoxExpandoTitle { + font-size: 0.9em; + font-weight: bold; + padding: 3px; + padding-top: 7px; + padding-bottom: 7px; + background: #fafafa url(../../../dijit/themes/tundra/images/accordionItemActive.gif) repeat-x scroll left bottom; +} +.tundra .dojoxExpandoClosed { + + background-color: #fafafa; +} +.tundra .dojoxExpandoClosed .dojoxExpandoTitle { + background-image: none; + background-color: transparent; +} +body, html { + margin:0; + padding:0; + width:100%; + height:100%; + background: #fafafa; + overflow: hidden; +} +.wrap { + margin: 0; + padding: 15px; +} +.wrap h3 { + margin-top: 5px; +} +#header { + height:32px; +} +.searchBar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 25px; + border-bottom: 1px solid #666; + background: #fafafa; +} +.searchBar p { + margin: 0; + padding: 2px; +} +.searchStuff { + position: absolute; + top: 25px; + margin: 0 auto; +} +.searchStuff ul { + width: auto; + margin: 0 auto; + padding: 0; +} +div.itty { + font-weight: normal; + font: 8pt Arial,sans-serif; + color:#666; + padding:5px; + padding-left:10px; +} +div.itty:hover { + color:#333; +} +.itemType { + font-style:italic; + font-size:12pt; +} +#runSearchIcon { + border:1px solid #000; +} diff --git a/includes/js/dojox/layout/tests/_expando.css.commented.css b/includes/js/dojox/layout/tests/_expando.css.commented.css new file mode 100644 index 0000000..2fd0636 --- /dev/null +++ b/includes/js/dojox/layout/tests/_expando.css.commented.css @@ -0,0 +1,64 @@ +@import "../../../dojo/resources/dojo.css"; +@import "../../../dijit/tests/css/dijitTests.css"; + +@import "../resources/FloatingPane.css"; +@import "../resources/ExpandoPane.css"; + +body, html { + margin:0; + padding:0; + width:100%; + height:100%; + background: #fafafa; + overflow: hidden; +} +.wrap { + margin: 0; + padding: 15px; +} +.wrap h3 { + margin-top: 5px; +} +#header { + height:32px; +} +.searchBar { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 25px; + border-bottom: 1px solid #666; + background: #fafafa; +} +.searchBar p { + margin: 0; + padding: 2px; +} +.searchStuff { + position: absolute; + top: 25px; + margin: 0 auto; +} +.searchStuff ul { + width: auto; + margin: 0 auto; + padding: 0; +} +div.itty { + font-weight: normal; + font: 8pt Arial,sans-serif; + color:#666; + padding:5px; + padding-left:10px; +} +div.itty:hover { + color:#333; +} +.itemType { + font-style:italic; + font-size:12pt; +} +#runSearchIcon { + border:1px solid #000; +} diff --git a/includes/js/dojox/layout/tests/_floating.html b/includes/js/dojox/layout/tests/_floating.html new file mode 100644 index 0000000..be5ece9 --- /dev/null +++ b/includes/js/dojox/layout/tests/_floating.html @@ -0,0 +1,48 @@ +
            +

            I am FloatingPane

            +

            Windows in the Browser is weird UI, but sometimes useful. Even more useful:
            +
            + +
            + +

            + (both technically unsupported) +

            + +
            \ No newline at end of file diff --git a/includes/js/dojox/layout/tests/_lorem.html b/includes/js/dojox/layout/tests/_lorem.html new file mode 100644 index 0000000..9e7aaef --- /dev/null +++ b/includes/js/dojox/layout/tests/_lorem.html @@ -0,0 +1,11 @@ +

            + 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. +

            diff --git a/includes/js/dojox/layout/tests/_script.html b/includes/js/dojox/layout/tests/_script.html new file mode 100644 index 0000000..64bcd0e --- /dev/null +++ b/includes/js/dojox/layout/tests/_script.html @@ -0,0 +1,9 @@ + +

            + bar baz +

            diff --git a/includes/js/dojox/layout/tests/doc0.html b/includes/js/dojox/layout/tests/doc0.html new file mode 100644 index 0000000..10fd03a --- /dev/null +++ b/includes/js/dojox/layout/tests/doc0.html @@ -0,0 +1,14 @@ +

            Document 0

            +This document has
            a link.
            +(to check we're copying children around properly).
            +Also it's got a widget, a combo box:
            + +And a button too: + +Here's some text that comes AFTER the button. +Okay textbox: + diff --git a/includes/js/dojox/layout/tests/images/blank.gif b/includes/js/dojox/layout/tests/images/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..e565824aafafe632011b281cba976baf8b3ba89a GIT binary patch literal 43 qcmZ?wbhEHbWMp7uXkcLY4+e@qSs1y10y+#p0Fq%~V)9{Rum%7ZWeN!Z literal 0 HcmV?d00001 diff --git a/includes/js/dojox/layout/tests/images/dojoLogo.png b/includes/js/dojox/layout/tests/images/dojoLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1219de7ac67812b878a8c7bc9b17811148a918a8 GIT binary patch literal 14712 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/layout/tests/images/gridUnderlay.png b/includes/js/dojox/layout/tests/images/gridUnderlay.png new file mode 100644 index 0000000000000000000000000000000000000000..016f129369e3d9b3ba0b677cdebfaece6e17293d GIT binary patch literal 915 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 +
            + + +
            +
            +
            +
            + + + + "; + break; + + case 'importCss': + header('Content-type: text/css; charset=utf-8'); + echo "#importMediaTest { + margin: 4px; + border: 1px dashed red; + width: 200px; + height: 200px; + } + #importCssTest { + margin: 4px; + border: 1px solid blue; + width: 100px; + height: 100px; + }"; + break; + + case 'linkCss': + header('Content-type: text/css; charset=utf-8'); + echo "#linkMediaTest { + margin: 4px; + border: 2px dashed red; + width: 200px; + height: 200px; + } + #linkCssTest { + margin: 4px; + border: 2px dashed red; + width: 100px; + height: 100px; + }"; + break; + + case 'importMediaPrint': // may download but not render + header('Content-type: text/css; charset=utf-8'); + echo "#importMediaTest { + margin: 10px; + border: 5px dashed gray; + width: 100px; + height: 100px; + }"; + break; + + case 'linkMediaPrint': // may download but not render + header('Content-type: text/css; charset=utf-8'); + echo "#linkMediaTest { + margin: 10px; + border: 5px dashed gray; + width: 100px; + height: 100px; + }"; + break; + + case 'remoteJsTrue': + header('Content-type: text/javascript; charset=utf-8'); + echo "unTypedVarInDocScope = true;"; + break; + + case 'remoteJsFalse': + header('Content-type: text/javascript; charset=utf-8'); + echo "unTypedVarInDocScope = false;"; + break; + + case 'bounceInput': + echo file_get_contents("php://input"); + break; + + case 'bounceHeaders'; + if(function_exists("apache_request_headers")){ + $headers = apache_request_headers(); + foreach($headers as $header => $vlu){ + echo "$header=$vlu\n
            "; + } + }else{ + // IIS, php as CGI etc gets here, messes formating, suboptimal + $headers = preg_grep('/HTTP_/i', array_keys($_SERVER)); + foreach($headers as $header){ + $vlu = preg_replace(array('/^HTTP_/', '/_/'), array('', '-'), $header); + echo "$vlu={$_SERVER[$header]}\n
            "; + } + } + break; + + default: + echo "unkown mode {$_GET['mode']}"; + } + } +?> \ No newline at end of file diff --git a/includes/js/dojox/layout/tests/test_DragPane.html b/includes/js/dojox/layout/tests/test_DragPane.html new file mode 100644 index 0000000..df38b7e --- /dev/null +++ b/includes/js/dojox/layout/tests/test_DragPane.html @@ -0,0 +1,93 @@ + + + + + DragPane layout widget Test + + + + + + + + + +
            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +

            + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

            +
            + + diff --git a/includes/js/dojox/layout/tests/test_ExpandoPane.html b/includes/js/dojox/layout/tests/test_ExpandoPane.html new file mode 100644 index 0000000..ceaad50 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ExpandoPane.html @@ -0,0 +1,307 @@ + + + + dojox.layout.ExpandoPane + + + + + + + + +
            + +
            +
            +
            + + +
            +
            +
            +
              +
              +
              +
                +
                +
                +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  a
                  +
                  b
                  +
                  +
                  +
                  +
                    +
                    +
                    +
                    +
                    +
                    + +
                    +
                    +
                    +

                    This select modifies the left Expando's easing function. An Expando can have an easeIn and an easeOut parameter. This sets both.

                    + +

                    +

                    Some easing functions break when used with width: (negative width? but how?). Be warned.

                    +
                    +
                    +
                    +
                    +

                    This is a BorderContainer (the window). Each of the panes is set to one of + "left", "right", or "center". The left and right panes are ExpandoPanes (they collapse). +

                    +

                    + We can add other panes programatically: +
                    + +

                    +

                    What does a FloatingPane look like here?
                    + +

                    +
                    +
                    +
                    c
                    +
                    +
                    +
                    + +
                    Loading progress
                    + + + diff --git a/includes/js/dojox/layout/tests/test_ExpandoPane_code.html b/includes/js/dojox/layout/tests/test_ExpandoPane_code.html new file mode 100644 index 0000000..2b71fcc --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ExpandoPane_code.html @@ -0,0 +1,98 @@ + + + + dojox.layout.ExpandoPane + + + + + + + +
                    +
                    + +
                    + +
                    +
                    +
                    pane 0 content
                    +
                    pane 1 content
                    +
                    pane 2 content
                    +
                    pane 3 content
                    +
                    + + diff --git a/includes/js/dojox/layout/tests/test_ExpandoPane_more.html b/includes/js/dojox/layout/tests/test_ExpandoPane_more.html new file mode 100644 index 0000000..aed990e --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ExpandoPane_more.html @@ -0,0 +1,114 @@ + + + + dojox.layout.ExpandoPane + + + + + + + + + + + + + + +

                    Basic ExpandoPane tests

                    + +

                    Left:

                    +
                    +
                    + foo +
                    +
                    +
                    +
                    +
                    +
                    + +

                    Right:

                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    +
                    + +

                    Top (easeIn="dojox.fx.easing.bounceOut" duration="1200"):

                    +
                    +
                    + foo +
                    +
                    +
                    + +

                    Bottom:

                    +
                    +
                    + foo +
                    +
                    +
                    + +

                    Bottom/Left:

                    +
                    +
                    + foo +
                    +
                    + foo +
                    +
                    +
                    + +

                    Top/Left/Right

                    +
                    +
                    + foo +
                    +
                    + foo +
                    +
                    + foo +
                    +
                    +
                    + +

                    Top/Left/Right + splitters

                    +
                    +
                    + foo +
                    +
                    + foo +
                    +
                    + foo +
                    +
                    +
                    + + + + diff --git a/includes/js/dojox/layout/tests/test_FloatingPane.html b/includes/js/dojox/layout/tests/test_FloatingPane.html new file mode 100644 index 0000000..016f8a6 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_FloatingPane.html @@ -0,0 +1,167 @@ + + + + dojox.layout.FloatPane - simplest extension on TitlePane ... ever. + + + + + + + + + + + + + hide first pane | + show first pane | + minimize 'uncloseable, dockable' pane pane | + new floater + +
                    +

                    I am the content to be floated around

                    +
                    + +
                    +

                    + I am dockable, though I have no dockTo="" attribute. I will create or use an existing dock + on the bottom of the screen. +

                    + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc + eleifend sagittis turpis. purus purus in nibh. Phasellus in nunc. +

                    +
                    + +
                    +

                    + I am made into a FloatingPane in dojo.addOnLoad();

                    + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

                    +
                    + +
                    +
                    +
                    +

                    + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In porta. Etiam mattis libero nec ante. Nam + porta lacus eu ligula. Cras mauris. Suspendisse vel augue. Vivamus aliquam orci ut eros. Nunc eleifend + sagittis turpis. purus purus in nibh. Phasellus in nunc. +

                    +
                    + + +

                    + This is just a pane. You cannot close me, you cannot resize me, you cannot minimize me. +

                    +
                    + +
                    + +
                    + + + +
                    +
                    +
                    + First Page +
                    +
                    +
                    +
                    + Story of Paul. +
                    +
                    + Story about Paul. +
                    +
                    + Story about... guess who. +
                    +
                    +
                    +
                    +
                    + + diff --git a/includes/js/dojox/layout/tests/test_RadioGroup.html b/includes/js/dojox/layout/tests/test_RadioGroup.html new file mode 100644 index 0000000..d2c6ba0 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_RadioGroup.html @@ -0,0 +1,61 @@ + + + + + RadioGroup Widget Test + + + + + + + + + + +

                    dojox.layout.RadioGroup test

                    + + +
                    +
                    +
                    +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    + +
                    +
                    +
                    +
                    +
                    +
                    + + + diff --git a/includes/js/dojox/layout/tests/test_ResizeHandle.html b/includes/js/dojox/layout/tests/test_ResizeHandle.html new file mode 100644 index 0000000..ed16473 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ResizeHandle.html @@ -0,0 +1,134 @@ + + + + + Resize Widget Test + + + + + + + + + + +

                    dojox.layout.ResizeHandle test

                    + +

                    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.

                    + +

                    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.

                    + + + +
                    This is text!
                    +

                    +
                    + + + Content Pane w/a resize handle. activeResize'ing only on layout Widgets? FIXME: :) +
                    +
                    + +
                    + +
                    + + Plain div w/a resize handle. All Default settings. +
                    +
                    + +

                    + +
                    + Plain div w/a resize handle but resizeAxis="y", and activeResize="true" +
                    +
                    + + +
                    + Plain div w/a resize handle but resizeAxis="x" with animated sizing. +
                    +
                    + +

                    + +
                    + Plain div w/a resize handle but resizeAxis="xy" with animated sizing (combine). +
                    +
                    + +

                    + +

                    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.

                    + +

                    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.

                    + +

                    Sed aliquam, quam consectetuer condimentum bibendum, neque libero commodo metus, non consectetuer magna risus vitae eros. Pellentesque mollis augue id libero. Morbi nonummy hendrerit dui. Morbi nisi felis, fringilla ac, euismod vitae, dictum mollis, pede. Integer suscipit, est sed posuere ullamcorper, ipsum lectus interdum nunc, quis blandit erat eros hendrerit pede. Vestibulum varius, elit id mattis mattis, nulla est feugiat ante, eget vestibulum augue eros ut odio. Maecenas euismod purus quis felis. Ut hendrerit tincidunt est. Fusce euismod, nunc eu tempus tempor, purus ligula volutpat tellus, nec lacinia sapien enim id risus. Aliquam orci turpis, condimentum sed, sollicitudin vel, placerat in, purus. Proin tortor nisl, blandit quis, imperdiet quis, scelerisque at, nisl. Maecenas suscipit fringilla erat. Curabitur consequat, dui blandit suscipit dictum, felis lectus imperdiet tellus, sit amet ornare risus mauris non ipsum. Fusce a purus. Vestibulum sodales. Sed porta ultrices nibh. Vestibulum metus.

                    + + + diff --git a/includes/js/dojox/layout/tests/test_ScrollPane.html b/includes/js/dojox/layout/tests/test_ScrollPane.html new file mode 100644 index 0000000..53a4a26 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ScrollPane.html @@ -0,0 +1,129 @@ + + + + + ScrollPane layout widget Test + + + + + + + + + + + +

                    dojox.layout.ScrollPane

                    + +

                    An intuitive UI for lists of data in a confined space. supports horizontal or vertical "scrolling", but not both

                    + +

                    vertical:

                    +
                    + +
                    +
                      +
                    1. testItem
                    2. +
                    +
                    +
                    +
                    + +
                    +
                      +
                      + +
                      + +
                      + +

                      horizontal

                      +
                      + + + + + + + + + + + + + + + + + + + + + + +
                      LOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUMLOREM IPSUM
                      +
                      + +

                      In a layoutContainer:

                      + +
                      +
                      +
                        +
                        +
                        +

                        Foo!

                        +
                        +
                        + +

                        Programatically:

                        + +
                        +
                          +
                          + + + diff --git a/includes/js/dojox/layout/tests/test_ScrollPaneSingle.html b/includes/js/dojox/layout/tests/test_ScrollPaneSingle.html new file mode 100644 index 0000000..3957fda --- /dev/null +++ b/includes/js/dojox/layout/tests/test_ScrollPaneSingle.html @@ -0,0 +1,71 @@ + + + + + ScrollPane layout widget Test + + + + + + + + + + +
                          +

                          dojox.layout.ScrollPane

                          +

                          horizontal

                          +
                          +
                          +
                          +

                          Foo!

                          text

                          • bar
                          • bar

                          +
                          +
                          +
                          +
                          + + diff --git a/includes/js/dojox/layout/tests/test_SizingPane.html b/includes/js/dojox/layout/tests/test_SizingPane.html new file mode 100644 index 0000000..372f396 --- /dev/null +++ b/includes/js/dojox/layout/tests/test_SizingPane.html @@ -0,0 +1,170 @@ + + + + dojox.layout.SizingPane + + + + + + + + + +

                          dojox.layout.SizingPane

                          + +

                          This is simply a test / example. There is no real dojox.layout.SizingPane, but this code + should/might become part of a dojox.fx.toggle class ... it's just "neat", isn't it?

                          + +
                          + lorem. lorem. lorem. +
                          + + + + diff --git a/includes/js/dojox/math.js b/includes/js/dojox/math.js new file mode 100644 index 0000000..a1ab261 --- /dev/null +++ b/includes/js/dojox/math.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.math"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.math"] = true; +dojo.provide("dojox.math"); +dojo.require("dojox.math._base"); + +} diff --git a/includes/js/dojox/math/README b/includes/js/dojox/math/README new file mode 100644 index 0000000..f9f50ad --- /dev/null +++ b/includes/js/dojox/math/README @@ -0,0 +1,38 @@ +------------------------------------------------------------------------------- +DojoX Math +------------------------------------------------------------------------------- +Version 0.9 +Release date: 10/20/2007 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Cal Henderson + Dan Pupius + Tom Trenka (ttrenka AT gmail.com) +------------------------------------------------------------------------------- +Project description + +A port of the main functionality of dojo.math 0.4. Includes advanced math +functions, abstract curve definitions, and some point calculations. +------------------------------------------------------------------------------- +Dependencies: + +Depends on the Dojo Core, v1.0 +------------------------------------------------------------------------------- +Documentation + +See the API documentation. +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/math.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/math/* + +Install into the following directory structure: +/dojox/math/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/math/_base.js b/includes/js/dojox/math/_base.js new file mode 100644 index 0000000..ef2243c --- /dev/null +++ b/includes/js/dojox/math/_base.js @@ -0,0 +1,122 @@ +if(!dojo._hasResource["dojox.math._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.math._base"] = true; +dojo.provide("dojox.math._base"); + +dojo.mixin(dojox.math, { + degreesToRadians: function(/* Number */n){ + // summary + // Convert the passed number to radians. + return (n*Math.PI)/180; // Number + }, + radiansToDegrees: function(/* Number */n){ + // summary + // Convert the passed number to degrees. + return (n*180)/Math.PI; // Number + }, + + factoral: function(/* Number */n){ + // summary + // Return the factoral of n. + if(n<1){ + return 0; // Number + } + var ret=1; + for(var i=1; i<=n; i++){ + ret*=i; + } + return ret; // Number + }, + permutations: function(/* Number */n, /* Number */k){ + // summary + // TODO + if(n==0 || k==0){ + return 1; // Number + } + return (this.factoral(n)/this.factoral(n-k)); + }, + combinations: function(/* Number */n, /* Number */r){ + // summary + // TODO + if(n==0 || r==0){ + return 1; // Number + } + return (this.factoral(n)/(this.factoral(n-r)*this.factoral(r))); // Number + }, + bernstein: function(/* Number */t, /* Number */n, /* Number */ i){ + // summary + // TODO + return (this.combinations(n, i)*Math.pow(t, i)*Math.pow(1-t, n-i)); // Number + }, + gaussian: function(){ + // summary + // Return a random number based on the Gaussian algo. + var k=2; + do{ + var i=2*Math.random()-1; + var j=2*Math.random()-1; + k = i*i+j*j; + }while(k>=1); + return (i * Math.sqrt((-2*Math.log(k))/k)); // Number + }, + + // basic statistics + sd: function(/* Array */a){ + // summary + // Returns the standard deviation of the passed arguments. + return Math.sqrt(this.variance(a)); // Number + }, + variance: function(/* Array */a){ + // summary + // Find the variance in the passed array of numbers. + var mean=0, squares=0; + dojo.forEach(a, function(item){ + mean+=item; + squares+=Math.pow(item,2); + }); + return (squares/a.length)-Math.pow(mean/a.length, 2); // Number + }, + + // create a range of numbers + range: function(/* Number */a, /* Number? */b, /* Number? */step){ + // summary + // Create a range of numbers based on the parameters. + if(arguments.length<2){ + b=a,a=0; + } + var s=step||1; + var range=[]; + if(s>0){ + for(var i=a; ib; i+=s){ + range.push(i); + } + }else{ + throw new Error("dojox.math.range: step must not be zero."); + } + } + return range; // Array + }, + distance: function(/* Array */a, /* Array */b){ + // summary + // Calculate the distance between point A and point B + return Math.sqrt(Math.pow(b[0]-a[0],2)+Math.pow(b[1]-a[1],2)); // Number + }, + midpoint: function(/* Array */a, /* Array */b){ + // summary + // Calculate the midpoint between points A and B. A and B may be multidimensional. + if(a.length!=b.length){ + console.error("dojox.math.midpoint: Points A and B are not the same dimensionally.", a, b); + } + var m=[]; + for(var i=0; i= 1) { + return this.p[this.p.length - 1]; + } + if (step <= 0) { + return this.p[0]; + } + var retVal = new Array(this.p[0].length); + for (var k = 0; j < this.p[0].length; k++) { + retVal[k] = 0; + } + for (var j = 0; j < this.p[0].length; j++) { + var C = 0; + var D = 0; + for (var i = 0; i < this.p.length; i++) { + C += this.p[i][j] * this.p[this.p.length - 1][0] * dojox.math.bernstein(step, this.p.length, i); + } + for (var l = 0; l < this.p.length; l++) { + D += this.p[this.p.length - 1][0] * dojox.math.bernstein(step, this.p.length, l); + } + retVal[j] = C / D; + } + return retVal; + }; + this.p = pnts; + return this; + }, + CatmullRom:function (pnts, c) { + this.getValue = function (step) { + var percent = step * (this.p.length - 1); + var node = Math.floor(percent); + var progress = percent - node; + var i0 = node - 1; + if (i0 < 0) { + i0 = 0; + } + var i = node; + var i1 = node + 1; + if (i1 >= this.p.length) { + i1 = this.p.length - 1; + } + var i2 = node + 2; + if (i2 >= this.p.length) { + i2 = this.p.length - 1; + } + var u = progress; + var u2 = progress * progress; + var u3 = progress * progress * progress; + var retVal = new Array(this.p[0].length); + for (var k = 0; k < this.p[0].length; k++) { + var x1 = (-this.c * this.p[i0][k]) + ((2 - this.c) * this.p[i][k]) + ((this.c - 2) * this.p[i1][k]) + (this.c * this.p[i2][k]); + var x2 = (2 * this.c * this.p[i0][k]) + ((this.c - 3) * this.p[i][k]) + ((3 - 2 * this.c) * this.p[i1][k]) + (-this.c * this.p[i2][k]); + var x3 = (-this.c * this.p[i0][k]) + (this.c * this.p[i1][k]); + var x4 = this.p[i][k]; + retVal[k] = x1 * u3 + x2 * u2 + x3 * u + x4; + } + return retVal; + }; + if (!c) { + this.c = 0.7; + } else { + this.c = c; + } + this.p = pnts; + return this; + }, + Arc:function (start, end, ccw){ + function translate(a,b){ + var c=new Array(a.length); + for(var i=0; i= r[0] && n < r[1]) { + var subN = (n - r[0]) / r[2]; + value = curves[i].getValue(subN); + found = true; + break; + } + } + if (!found) { + value = curves[curves.length - 1].getValue(1); + } + for (var j = 0; j < i; j++) { + value = dojox.math.points.translate(value, curves[j].getValue(1)); + } + return value; + }; + function computeRanges() { + var start = 0; + for (var i = 0; i < weights.length; i++) { + var end = start + weights[i] / totalWeight; + var len = end - start; + ranges[i] = [start, end, len]; + start = end; + } + } + return this; + } +}); + +} diff --git a/includes/js/dojox/math/matrix.js b/includes/js/dojox/math/matrix.js new file mode 100644 index 0000000..386bad3 --- /dev/null +++ b/includes/js/dojox/math/matrix.js @@ -0,0 +1,294 @@ +if(!dojo._hasResource["dojox.math.matrix"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.math.matrix"] = true; +dojo.provide("dojox.math.matrix"); + +dojo.mixin(dojox.math.matrix, { + iDF:0, + ALMOST_ZERO: 1e-10, + multiply: function(/* Array */a, /* Array */b){ + // summary + // Multiply matrix a by matrix b. + var ay=a.length, ax=a[0].length, by=b.length, bx=b[0].length; + if(ax!=by){ + console.warn("Can't multiply matricies of sizes " + ax + "," + ay + " and " + bx + "," + by); + return [[0]]; + } + var c=[]; + for (var k=0; k-1){ + b+="."; + } + while(b.length0?a[0].length:0; + var buffer=""; + for(var y=0; y + +

                          Browser Bookmarklets

                          + +

                          Drag the following bookmarklets to your links toolbar and press to clear the Google Gears cache:

                          + +

                          Firefox: Clear Gears Cache

                          +

                          Internet Explorer: Clear Gears Cache

                          + + diff --git a/includes/js/dojox/off/files.js b/includes/js/dojox/off/files.js new file mode 100644 index 0000000..6c19ea0 --- /dev/null +++ b/includes/js/dojox/off/files.js @@ -0,0 +1,454 @@ +if(!dojo._hasResource["dojox.off.files"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off.files"] = true; +dojo.provide("dojox.off.files"); + +// Author: Brad Neuberg, bkn3@columbia.edu, http://codinginparadise.org + +// summary: +// Helps maintain resources that should be +// available offline, such as CSS files. +// description: +// dojox.off.files makes it easy to indicate +// what resources should be available offline, +// such as CSS files, JavaScript, HTML, etc. +dojox.off.files = { + // versionURL: String + // An optional file, that if present, records the version + // of our bundle of files to make available offline. If this + // file is present, and we are not currently debugging, + // then we only refresh our offline files if the version has + // changed. + versionURL: "version.js", + + // listOfURLs: Array + // For advanced usage; most developers can ignore this. + // Our list of URLs that will be cached and made available + // offline. + listOfURLs: [], + + // refreshing: boolean + // For advanced usage; most developers can ignore this. + // Whether we are currently in the middle + // of refreshing our list of offline files. + refreshing: false, + + _cancelID: null, + + _error: false, + _errorMessages: [], + _currentFileIndex: 0, + _store: null, + _doSlurp: false, + + slurp: function(){ + // summary: + // Autoscans the page to find all resources to + // cache. This includes scripts, images, CSS, and hyperlinks + // to pages that are in the same scheme/port/host as this + // page. We also scan the embedded CSS of any stylesheets + // to find @import statements and url()'s. + // You should call this method from the top-level, outside of + // any functions and before the page loads: + // + // + // + // Note that inline styles on elements are not handled (i.e. + // if you somehow have an inline style that uses a URL); + // object and embed tags are not scanned since their format + // differs based on type; and elements created by JavaScript + // after page load are not found. For these you must manually + // add them with a dojox.off.files.cache() method call. + + // just schedule the slurp once the page is loaded and + // Dojo Offline is ready to slurp; dojox.off will call + // our _slurp() method before indicating it is finished + // loading + this._doSlurp = true; + }, + + cache: function(urlOrList){ /* void */ + // summary: + // Caches a file or list of files to be available offline. This + // can either be a full URL, such as http://foobar.com/index.html, + // or a relative URL, such as ../index.html. This URL is not + // actually cached until dojox.off.sync.synchronize() is called. + // urlOrList: String or Array[] + // A URL of a file to cache or an Array of Strings of files to + // cache + + //console.debug("dojox.off.files.cache, urlOrList="+urlOrList); + + if(dojo.isString(urlOrList)){ + var url = this._trimAnchor(urlOrList+""); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }else if(urlOrList instanceof dojo._Url){ + var url = this._trimAnchor(urlOrList.uri); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }else{ + dojo.forEach(urlOrList, function(url){ + url = this._trimAnchor(url); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }, this); + } + }, + + printURLs: function(){ + // summary: + // A helper function that will dump and print out + // all of the URLs that are cached for offline + // availability. This can help with debugging if you + // are trying to make sure that all of your URLs are + // available offline + console.debug("The following URLs are cached for offline use:"); + dojo.forEach(this.listOfURLs, function(i){ + console.debug(i); + }); + }, + + remove: function(url){ /* void */ + // summary: + // Removes a URL from the list of files to cache. + // description: + // Removes a URL from the list of URLs to cache. Note that this + // does not actually remove the file from the offline cache; + // instead, it just prevents us from refreshing this file at a + // later time, so that it will naturally time out and be removed + // from the offline cache + // url: String + // The URL to remove + for(var i = 0; i < this.listOfURLs.length; i++){ + if(this.listOfURLs[i] == url){ + this.listOfURLs = this.listOfURLs.splice(i, 1); + break; + } + } + }, + + isAvailable: function(url){ /* boolean */ + // summary: + // Determines whether the given resource is available offline. + // url: String + // The URL to check + for(var i = 0; i < this.listOfURLs.length; i++){ + if(this.listOfURLs[i] == url){ + return true; + } + } + + return false; + }, + + refresh: function(callback){ /* void */ + //console.debug("dojox.off.files.refresh"); + // summary: + // For advanced usage; most developers can ignore this. + // Refreshes our list of offline resources, + // making them available offline. + // callback: Function + // A callback that receives two arguments: whether an error + // occurred, which is a boolean; and an array of error message strings + // with details on errors encountered. If no error occured then message is + // empty array with length 0. + try{ + if(dojo.config.isDebug){ + this.printURLs(); + } + + this.refreshing = true; + + if(this.versionURL){ + this._getVersionInfo(function(oldVersion, newVersion, justDebugged){ + //console.warn("getVersionInfo, oldVersion="+oldVersion+", newVersion="+newVersion + // + ", justDebugged="+justDebugged+", isDebug="+dojo.config.isDebug); + if(dojo.config.isDebug || !newVersion || justDebugged + || !oldVersion || oldVersion != newVersion){ + console.warn("Refreshing offline file list"); + this._doRefresh(callback, newVersion); + }else{ + console.warn("No need to refresh offline file list"); + callback(false, []); + } + }); + }else{ + console.warn("Refreshing offline file list"); + this._doRefresh(callback); + } + }catch(e){ + this.refreshing = false; + + // can't refresh files -- core operation -- + // fail fast + dojox.off.coreOpFailed = true; + dojox.off.enabled = false; + dojox.off.onFrameworkEvent("coreOperationFailed"); + } + }, + + abortRefresh: function(){ + // summary: + // For advanced usage; most developers can ignore this. + // Aborts and cancels a refresh. + if(!this.refreshing){ + return; + } + + this._store.abortCapture(this._cancelID); + this.refreshing = false; + }, + + _slurp: function(){ + if(!this._doSlurp){ + return; + } + + var handleUrl = dojo.hitch(this, function(url){ + if(this._sameLocation(url)){ + this.cache(url); + } + }); + + handleUrl(window.location.href); + + dojo.query("script").forEach(function(i){ + try{ + handleUrl(i.getAttribute("src")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'script' error: " + // + exp.message||exp); + } + }); + + dojo.query("link").forEach(function(i){ + try{ + if(!i.getAttribute("rel") + || i.getAttribute("rel").toLowerCase() != "stylesheet"){ + return; + } + + handleUrl(i.getAttribute("href")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'link' error: " + // + exp.message||exp); + } + }); + + dojo.query("img").forEach(function(i){ + try{ + handleUrl(i.getAttribute("src")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'img' error: " + // + exp.message||exp); + } + }); + + dojo.query("a").forEach(function(i){ + try{ + handleUrl(i.getAttribute("href")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'a' error: " + // + exp.message||exp); + } + }); + + // FIXME: handle 'object' and 'embed' tag + + // parse our style sheets for inline URLs and imports + dojo.forEach(document.styleSheets, function(sheet){ + try{ + if(sheet.cssRules){ // Firefox + dojo.forEach(sheet.cssRules, function(rule){ + var text = rule.cssText; + if(text){ + var matches = text.match(/url\(\s*([^\) ]*)\s*\)/i); + if(!matches){ + return; + } + + for(var i = 1; i < matches.length; i++){ + handleUrl(matches[i]) + } + } + }); + }else if(sheet.cssText){ // IE + var matches; + var text = sheet.cssText.toString(); + // unfortunately, using RegExp.exec seems to be flakey + // for looping across multiple lines on IE using the + // global flag, so we have to simulate it + var lines = text.split(/\f|\r|\n/); + for(var i = 0; i < lines.length; i++){ + matches = lines[i].match(/url\(\s*([^\) ]*)\s*\)/i); + if(matches && matches.length){ + handleUrl(matches[1]); + } + } + } + }catch(exp){ + //console.debug("dojox.off.files.slurp stylesheet parse error: " + // + exp.message||exp); + } + }); + + //this.printURLs(); + }, + + _sameLocation: function(url){ + if(!url){ return false; } + + // filter out anchors + if(url.length && url.charAt(0) == "#"){ + return false; + } + + // FIXME: dojo._Url should be made public; + // it's functionality is very useful for + // parsing URLs correctly, which is hard to + // do right + url = new dojo._Url(url); + + // totally relative -- ../../someFile.html + if(!url.scheme && !url.port && !url.host){ + return true; + } + + // scheme relative with port specified -- brad.com:8080 + if(!url.scheme && url.host && url.port + && window.location.hostname == url.host + && window.location.port == url.port){ + return true; + } + + // scheme relative with no-port specified -- brad.com + if(!url.scheme && url.host && !url.port + && window.location.hostname == url.host + && window.location.port == 80){ + return true; + } + + // else we have everything + return window.location.protocol == (url.scheme + ":") + && window.location.hostname == url.host + && (window.location.port == url.port || !window.location.port && !url.port); + }, + + _trimAnchor: function(url){ + return url.replace(/\#.*$/, ""); + }, + + _doRefresh: function(callback, newVersion){ + // get our local server + var localServer; + try{ + localServer = google.gears.factory.create("beta.localserver", "1.0"); + }catch(exp){ + dojo.setObject("google.gears.denied", true); + dojox.off.onFrameworkEvent("coreOperationFailed"); + throw "Google Gears must be allowed to run"; + } + + var storeName = "dot_store_" + + window.location.href.replace(/[^0-9A-Za-z_]/g, "_"); + + // clip at 64 characters, the max length of a resource store name + if(storeName.length >= 64){ + storeName = storeName.substring(0, 63); + } + + // refresh everything by simply removing + // any older stores + localServer.removeStore(storeName); + + // open/create the resource store + localServer.openStore(storeName); + var store = localServer.createStore(storeName); + this._store = store; + + // add our list of files to capture + var self = this; + this._currentFileIndex = 0; + this._cancelID = store.capture(this.listOfURLs, function(url, success, captureId){ + //console.debug("store.capture, url="+url+", success="+success); + if(!success && self.refreshing){ + self._cancelID = null; + self.refreshing = false; + var errorMsgs = []; + errorMsgs.push("Unable to capture: " + url); + callback(true, errorMsgs); + return; + }else if(success){ + self._currentFileIndex++; + } + + if(success && self._currentFileIndex >= self.listOfURLs.length){ + self._cancelID = null; + self.refreshing = false; + if(newVersion){ + dojox.storage.put("oldVersion", newVersion, null, + dojox.off.STORAGE_NAMESPACE); + } + dojox.storage.put("justDebugged", dojo.config.isDebug, null, + dojox.off.STORAGE_NAMESPACE); + callback(false, []); + } + }); + }, + + _getVersionInfo: function(callback){ + var justDebugged = dojox.storage.get("justDebugged", + dojox.off.STORAGE_NAMESPACE); + var oldVersion = dojox.storage.get("oldVersion", + dojox.off.STORAGE_NAMESPACE); + var newVersion = null; + + callback = dojo.hitch(this, callback); + + dojo.xhrGet({ + url: this.versionURL + "?browserbust=" + new Date().getTime(), + timeout: 5 * 1000, + handleAs: "javascript", + error: function(err){ + //console.warn("dojox.off.files._getVersionInfo, err=",err); + dojox.storage.remove("oldVersion", dojox.off.STORAGE_NAMESPACE); + dojox.storage.remove("justDebugged", dojox.off.STORAGE_NAMESPACE); + callback(oldVersion, newVersion, justDebugged); + }, + load: function(data){ + //console.warn("dojox.off.files._getVersionInfo, load=",data); + + // some servers incorrectly return 404's + // as a real page + if(data){ + newVersion = data; + } + + callback(oldVersion, newVersion, justDebugged); + } + }); + } +} + +} diff --git a/includes/js/dojox/off/network_check.txt b/includes/js/dojox/off/network_check.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/includes/js/dojox/off/network_check.txt @@ -0,0 +1 @@ +1 diff --git a/includes/js/dojox/off/offline.js b/includes/js/dojox/off/offline.js new file mode 100644 index 0000000..997206e --- /dev/null +++ b/includes/js/dojox/off/offline.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["dojox.storage.Provider"]){dojo._hasResource["dojox.storage.Provider"]=true;dojo.provide("dojox.storage.Provider");dojo.declare("dojox.storage.Provider",null,{constructor:function(){},SUCCESS:"success",FAILED:"failed",PENDING:"pending",SIZE_NOT_AVAILABLE:"Size not available",SIZE_NO_LIMIT:"No size limit",DEFAULT_NAMESPACE:"default",onHideSettingsUI:null,initialize:function(){console.warn("dojox.storage.initialize not implemented");},isAvailable:function(){console.warn("dojox.storage.isAvailable not implemented");},put:function(_1,_2,_3,_4){console.warn("dojox.storage.put not implemented");},get:function(_5,_6){console.warn("dojox.storage.get not implemented");},hasKey:function(_7,_8){return !!this.get(_7,_8);},getKeys:function(_9){console.warn("dojox.storage.getKeys not implemented");},clear:function(_a){console.warn("dojox.storage.clear not implemented");},remove:function(_b,_c){console.warn("dojox.storage.remove not implemented");},getNamespaces:function(){console.warn("dojox.storage.getNamespaces not implemented");},isPermanent:function(){console.warn("dojox.storage.isPermanent not implemented");},getMaximumSize:function(){console.warn("dojox.storage.getMaximumSize not implemented");},putMultiple:function(_d,_e,_f,_10){console.warn("dojox.storage.putMultiple not implemented");},getMultiple:function(_11,_12){console.warn("dojox.storage.getMultiple not implemented");},removeMultiple:function(_13,_14){console.warn("dojox.storage.remove not implemented");},isValidKeyArray:function(_15){if(_15===null||_15===undefined||!dojo.isArray(_15)){return false;}return !dojo.some(_15,function(key){return !this.isValidKey(key);});},hasSettingsUI:function(){return false;},showSettingsUI:function(){console.warn("dojox.storage.showSettingsUI not implemented");},hideSettingsUI:function(){console.warn("dojox.storage.hideSettingsUI not implemented");},isValidKey:function(_17){if(_17===null||_17===undefined){return false;}return /^[0-9A-Za-z_]*$/.test(_17);},getResourceList:function(){return [];}});}if(!dojo._hasResource["dojox.storage.manager"]){dojo._hasResource["dojox.storage.manager"]=true;dojo.provide("dojox.storage.manager");dojox.storage.manager=new function(){this.currentProvider=null;this.available=false;this.providers=[];this._initialized=false;this._onLoadListeners=[];this.initialize=function(){this.autodetect();};this.register=function(_18,_19){this.providers.push(_19);this.providers[_18]=_19;};this.setProvider=function(_1a){};this.autodetect=function(){if(this._initialized){return;}var _1b=dojo.config["forceStorageProvider"]||false;var _1c;for(var i=0;i6&&i%Nk==4){_60=SubWord(_60);}}for(var t=0;t<4;t++){w[i][t]=w[i-Nk][t]^_60[t];}}return w;};function SubWord(w){for(var i=0;i<4;i++){w[i]=_3c[w[i]];}return w;};function RotWord(w){w[4]=w[0];for(var i=0;i<4;i++){w[i]=w[i+1];}return w;};function AESEncryptCtr(_68,_69,_6a){if(!(_6a==128||_6a==192||_6a==256)){return "";}var _6b=_6a/8;var _6c=new Array(_6b);for(var i=0;i<_6b;i++){_6c[i]=_69.charCodeAt(i)&255;}var key=Cipher(_6c,KeyExpansion(_6c));key=key.concat(key.slice(0,_6b-16));var _6f=16;var _70=new Array(_6f);var _71=(new Date()).getTime();for(var i=0;i<4;i++){_70[i]=(_71>>>i*8)&255;}for(var i=0;i<4;i++){_70[i+4]=(_71/4294967296>>>i*8)&255;}var _72=KeyExpansion(key);var _73=Math.ceil(_68.length/_6f);var _74=new Array(_73);for(var b=0;b<_73;b++){for(var c=0;c<4;c++){_70[15-c]=(b>>>c*8)&255;}for(var c=0;c<4;c++){_70[15-c-4]=(b/4294967296>>>c*8);}var _77=Cipher(_70,_72);var _78=b<_73-1?_6f:(_68.length-1)%_6f+1;var ct="";for(var i=0;i<_78;i++){var _7a=_68.charCodeAt(b*_6f+i);var _7b=_7a^_77[i];ct+=String.fromCharCode(_7b);}_74[b]=escCtrlChars(ct);}var _7c="";for(var i=0;i<8;i++){_7c+=String.fromCharCode(_70[i]);}_7c=escCtrlChars(_7c);return _7c+"-"+_74.join("-");};function AESDecryptCtr(_7d,_7e,_7f){if(!(_7f==128||_7f==192||_7f==256)){return "";}var _80=_7f/8;var _81=new Array(_80);for(var i=0;i<_80;i++){_81[i]=_7e.charCodeAt(i)&255;}var _83=KeyExpansion(_81);var key=Cipher(_81,_83);key=key.concat(key.slice(0,_80-16));var _85=KeyExpansion(key);_7d=_7d.split("-");var _86=16;var _87=new Array(_86);var _88=unescCtrlChars(_7d[0]);for(var i=0;i<8;i++){_87[i]=_88.charCodeAt(i);}var _89=new Array(_7d.length-1);for(var b=1;b<_7d.length;b++){for(var c=0;c<4;c++){_87[15-c]=((b-1)>>>c*8)&255;}for(var c=0;c<4;c++){_87[15-c-4]=((b/4294967296-1)>>>c*8)&255;}var _8c=Cipher(_87,_85);_7d[b]=unescCtrlChars(_7d[b]);var pt="";for(var i=0;i<_7d[b].length;i++){var _8e=_7d[b].charCodeAt(i);var _8f=_8e^_8c[i];pt+=String.fromCharCode(_8f);}_89[b-1]=pt;}return _89.join("");};function escCtrlChars(str){return str.replace(/[\0\t\n\v\f\r\xa0!-]/g,function(c){return "!"+c.charCodeAt(0)+"!";});};function unescCtrlChars(str){return str.replace(/!\d\d?\d?!/g,function(c){return String.fromCharCode(c.slice(1,-1));});};function encrypt(_94,_95){return AESEncryptCtr(_94,_95,256);};function decrypt(_96,_97){return AESDecryptCtr(_96,_97,256);};var cmd=msg.substr(0,4);var arg=msg.substr(5);if(cmd=="encr"){arg=eval("("+arg+")");var _9a=arg.plaintext;var _9b=arg.password;var _9c=encrypt(_9a,_9b);gearsWorkerPool.sendMessage(String(_9c),_3b);}else{if(cmd=="decr"){arg=eval("("+arg+")");var _9d=arg.ciphertext;var _9b=arg.password;var _9c=decrypt(_9d,_9b);gearsWorkerPool.sendMessage(String(_9c),_3b);}}}});}if(!dojo._hasResource["dojox._sql.common"]){dojo._hasResource["dojox._sql.common"]=true;dojo.provide("dojox._sql.common");dojox.sql=new Function("return dojox.sql._exec(arguments);");dojo.mixin(dojox.sql,{dbName:null,debug:(dojo.exists("dojox.sql.debug")?dojox.sql.debug:false),open:function(_9e){if(this._dbOpen&&(!_9e||_9e==this.dbName)){return;}if(!this.dbName){this.dbName="dot_store_"+window.location.href.replace(/[^0-9A-Za-z_]/g,"_");if(this.dbName.length>63){this.dbName=this.dbName.substring(0,63);}}if(!_9e){_9e=this.dbName;}try{this._initDb();this.db.open(_9e);this._dbOpen=true;}catch(exp){throw exp.message||exp;}},close:function(_9f){if(dojo.isIE){return;}if(!this._dbOpen&&(!_9f||_9f==this.dbName)){return;}if(!_9f){_9f=this.dbName;}try{this.db.close(_9f);this._dbOpen=false;}catch(exp){throw exp.message||exp;}},_exec:function(_a0){try{this._initDb();if(!this._dbOpen){this.open();this._autoClose=true;}var sql=null;var _a2=null;var _a3=null;var _a4=dojo._toArray(_a0);sql=_a4.splice(0,1)[0];if(this._needsEncrypt(sql)||this._needsDecrypt(sql)){_a2=_a4.splice(_a4.length-1,1)[0];_a3=_a4.splice(_a4.length-1,1)[0];}if(this.debug){this._printDebugSQL(sql,_a4);}if(this._needsEncrypt(sql)){var _a5=new dojox.sql._SQLCrypto("encrypt",sql,_a3,_a4,_a2);return;}else{if(this._needsDecrypt(sql)){var _a5=new dojox.sql._SQLCrypto("decrypt",sql,_a3,_a4,_a2);return;}}var rs=this.db.execute(sql,_a4);rs=this._normalizeResults(rs);if(this._autoClose){this.close();}return rs;}catch(exp){exp=exp.message||exp;console.debug("SQL Exception: "+exp);if(this._autoClose){try{this.close();}catch(e){console.debug("Error closing database: "+e.message||e);}}throw exp;}},_initDb:function(){if(!this.db){try{this.db=google.gears.factory.create("beta.database","1.0");}catch(exp){dojo.setObject("google.gears.denied",true);dojox.off.onFrameworkEvent("coreOperationFailed");throw "Google Gears must be allowed to run";}}},_printDebugSQL:function(sql,_a8){var msg="dojox.sql(\""+sql+"\"";for(var i=0;i<_a8.length;i++){if(typeof _a8[i]=="string"){msg+=", \""+_a8[i]+"\"";}else{msg+=", "+_a8[i];}}msg+=")";console.debug(msg);},_normalizeResults:function(rs){var _ac=[];if(!rs){return [];}while(rs.isValidRow()){var row={};for(var i=0;i=this._totalCrypto&&this._finishedSpawningCrypto){_d3(this._finalArgs);}}));}}this._finishedSpawningCrypto=true;},_decrypt:function(_d8,_d9,_da,_db){this._totalCrypto=0;this._finishedCrypto=0;this._finishedSpawningCrypto=false;this._finalResultSet=_d8;for(var i=0;i<_d8.length;i++){var row=_d8[i];for(var _de in row){if(_d9=="*"||_d9[_de]){this._totalCrypto++;var _df=row[_de];this._decryptSingleColumn(_de,_df,_da,i,function(_e0){_db(_e0);});}}}this._finishedSpawningCrypto=true;},_stripCryptoSQL:function(sql){sql=sql.replace(/DECRYPT\(\*\)/ig,"*");var _e2=sql.match(/ENCRYPT\([^\)]*\)/ig);if(_e2!=null){for(var i=0;i<_e2.length;i++){var _e4=_e2[i];var _e5=_e4.match(/ENCRYPT\(([^\)]*)\)/i)[1];sql=sql.replace(_e4,_e5);}}_e2=sql.match(/DECRYPT\([^\)]*\)/ig);if(_e2!=null){for(var i=0;i<_e2.length;i++){var _e6=_e2[i];var _e7=_e6.match(/DECRYPT\(([^\)]*)\)/i)[1];sql=sql.replace(_e6,_e7);}}return sql;},_flagEncryptedArgs:function(sql,_e9){var _ea=new RegExp(/([\"][^\"]*\?[^\"]*[\"])|([\'][^\']*\?[^\']*[\'])|(\?)/ig);var _eb;var _ec=0;var _ed=[];while((_eb=_ea.exec(sql))!=null){var _ee=RegExp.lastMatch+"";if(/^[\"\']/.test(_ee)){continue;}var _ef=false;if(/ENCRYPT\([^\)]*$/i.test(RegExp.leftContext)){_ef=true;}_ed[_ec]=_ef;_ec++;}return _ed;},_determineDecryptedColumns:function(sql){var _f1={};if(/DECRYPT\(\*\)/i.test(sql)){_f1="*";}else{var _f2=/DECRYPT\((?:\s*\w*\s*\,?)*\)/ig;var _f3;while(_f3=_f2.exec(sql)){var _f4=new String(RegExp.lastMatch);var _f5=_f4.replace(/DECRYPT\(/i,"");_f5=_f5.replace(/\)/,"");_f5=_f5.split(/\s*,\s*/);dojo.forEach(_f5,function(_f6){if(/\s*\w* AS (\w*)/i.test(_f6)){_f6=_f6.match(/\s*\w* AS (\w*)/i)[1];}_f1[_f6]=true;});}}return _f1;},_decryptSingleColumn:function(_f7,_f8,_f9,_fa,_fb){dojox._sql._crypto.decrypt(_f8,_f9,dojo.hitch(this,function(_fc){this._finalResultSet[_fa][_f7]=_fc;this._finishedCrypto++;if(this._finishedCrypto>=this._totalCrypto&&this._finishedSpawningCrypto){_fb(this._finalResultSet);}}));}});}if(!dojo._hasResource["dojox.sql"]){dojo._hasResource["dojox.sql"]=true;dojo.provide("dojox.sql");}if(!dojo._hasResource["dojox.storage.GearsStorageProvider"]){dojo._hasResource["dojox.storage.GearsStorageProvider"]=true;dojo.provide("dojox.storage.GearsStorageProvider");if(dojo.isGears){(function(){dojo.declare("dojox.storage.GearsStorageProvider",dojox.storage.Provider,{constructor:function(){},TABLE_NAME:"__DOJO_STORAGE",initialized:false,_available:null,initialize:function(){if(dojo.config["disableGearsStorage"]==true){return;}this.TABLE_NAME="__DOJO_STORAGE";try{dojox.sql("CREATE TABLE IF NOT EXISTS "+this.TABLE_NAME+"( "+" namespace TEXT, "+" key TEXT, "+" value TEXT "+")");dojox.sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index"+" ON "+this.TABLE_NAME+" (namespace, key)");}catch(e){console.debug("dojox.storage.GearsStorageProvider.initialize:",e);this.initialized=false;dojox.storage.manager.loaded();return;}this.initialized=true;dojox.storage.manager.loaded();},isAvailable:function(){return this._available=dojo.isGears;},put:function(key,_fe,_ff,_100){if(this.isValidKey(key)==false){throw new Error("Invalid key given: "+key);}_100=_100||this.DEFAULT_NAMESPACE;if(dojo.isString(_fe)){_fe="string:"+_fe;}else{_fe=dojo.toJson(_fe);}try{dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND key = ?",_100,key);dojox.sql("INSERT INTO "+this.TABLE_NAME+" VALUES (?, ?, ?)",_100,key,_fe);}catch(e){console.debug("dojox.storage.GearsStorageProvider.put:",e);_ff(this.FAILED,key,e.toString());return;}if(_ff){_ff(dojox.storage.SUCCESS,key,null);}},get:function(key,_102){if(this.isValidKey(key)==false){throw new Error("Invalid key given: "+key);}_102=_102||this.DEFAULT_NAMESPACE;var _103=dojox.sql("SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = ? AND "+" key = ?",_102,key);if(!_103.length){return null;}else{_103=_103[0].value;}if(dojo.isString(_103)&&(/^string:/.test(_103))){_103=_103.substring("string:".length);}else{_103=dojo.fromJson(_103);}return _103;},getNamespaces:function(){var _104=[dojox.storage.DEFAULT_NAMESPACE];var rs=dojox.sql("SELECT namespace FROM "+this.TABLE_NAME+" DESC GROUP BY namespace");for(var i=0;idew){minw=dew;maxw=dbw;}else{maxw=dew;minw=dbw;}var dbh=_143.body.clientHeight;if(dbh>deh){minh=deh;maxh=dbh;}else{maxh=deh;minh=dbh;}w=(maxw>_142.innerWidth)?minw:maxw;h=(maxh>_142.innerHeight)?minh:maxh;}else{if(!dojo.isOpera&&_142.innerWidth){w=_142.innerWidth;h=_142.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 _14f=dojo._docScroll();return {w:w,h:h,l:_14f.x,t:_14f.y};};dijit.placeOnScreen=function(node,pos,_152,_153){var _154=dojo.map(_152,function(_155){return {corner:_155,pos:pos};});return dijit._place(node,_154);};dijit._place=function(node,_157,_158){var view=dijit.getViewport();if(!node.parentNode||String(node.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(node);}var best=null;dojo.some(_157,function(_15b){var _15c=_15b.corner;var pos=_15b.pos;if(_158){_158(node,_15b.aroundCorner,_15c);}var _15e=node.style;var _15f=_15e.display;var _160=_15e.visibility;_15e.visibility="hidden";_15e.display="";var mb=dojo.marginBox(node);_15e.display=_15f;_15e.visibility=_160;var _162=(_15c.charAt(1)=="L"?pos.x:Math.max(view.l,pos.x-mb.w)),_163=(_15c.charAt(0)=="T"?pos.y:Math.max(view.t,pos.y-mb.h)),endX=(_15c.charAt(1)=="L"?Math.min(view.l+view.w,_162+mb.w):pos.x),endY=(_15c.charAt(0)=="T"?Math.min(view.t+view.h,_163+mb.h):pos.y),_166=endX-_162,_167=endY-_163,_168=(mb.w-_166)+(mb.h-_167);if(best==null||_1680){for(var i=0;i0){for(var i=0;i","Function VBGetSwfVer(i)"," on error resume next"," Dim swControl, swVersion"," swVersion = 0"," set swControl = CreateObject(\"ShockwaveFlash.ShockwaveFlash.\" + CStr(i))"," if (IsObject(swControl)) then"," swVersion = swControl.GetVariable(\"$version\")"," end if"," VBGetSwfVer = swVersion","End Function",""].join("\r\n"));}this._detectVersion();};dojox.flash.Info.prototype={version:-1,versionMajor:-1,versionMinor:-1,versionRevision:-1,capable:false,installing:false,isVersionOrAbove:function(_17a,_17b,_17c){_17c=parseFloat("."+_17c);if(this.versionMajor>=_17a&&this.versionMinor>=_17b&&this.versionRevision>=_17c){return true;}else{return false;}},_detectVersion:function(){var _17d;for(var _17e=25;_17e>0;_17e--){if(dojo.isIE){_17d=VBGetSwfVer(_17e);}else{_17d=this._JSFlashInfo(_17e);}if(_17d==-1){this.capable=false;return;}else{if(_17d!=0){var _17f;if(dojo.isIE){var _180=_17d.split(" ");var _181=_180[1];_17f=_181.split(",");}else{_17f=_17d.split(".");}this.versionMajor=_17f[0];this.versionMinor=_17f[1];this.versionRevision=_17f[2];var _182=this.versionMajor+"."+this.versionRevision;this.version=parseFloat(_182);this.capable=true;break;}}}},_JSFlashInfo:function(_183){if(navigator.plugins!=null&&navigator.plugins.length>0){if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){var _184=navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"";var _185=navigator.plugins["Shockwave Flash"+_184].description;var _186=_185.split(" ");var _187=_186[2].split(".");var _188=_187[0];var _189=_187[1];if(_186[3]!=""){var _18a=_186[3].split("r");}else{var _18a=_186[4].split("r");}var _18b=_18a[1]>0?_18a[1]:0;var _18c=_188+"."+_189+"."+_18b;return _18c;}}return -1;}};dojox.flash.Embed=function(_18d){this._visible=_18d;};dojox.flash.Embed.prototype={width:215,height:138,id:"flashObject",_visible:true,protocol:function(){switch(window.location.protocol){case "https:":return "https";break;default:return "http";break;}},write:function(_18e){var _18f="";_18f+=("width: "+this.width+"px; ");_18f+=("height: "+this.height+"px; ");if(!this._visible){_18f+="position: absolute; z-index: 10000; top: -1000px; left: -1000px; ";}var _190;var _191=dojox.flash.url;var _192=_191;var _193=_191;var _194=dojo.baseUrl;if(_18e){var _195=escape(window.location);document.title=document.title.slice(0,47)+" - Flash Player Installation";var _196=escape(document.title);_192+="?MMredirectURL="+_195+"&MMplayerType=ActiveX"+"&MMdoctitle="+_196+"&baseUrl="+escape(_194);_193+="?MMredirectURL="+_195+"&MMplayerType=PlugIn"+"&baseUrl="+escape(_194);}else{_192+="?cachebust="+new Date().getTime();}if(_193.indexOf("?")==-1){_193+="?baseUrl="+escape(_194);}else{_193+="&baseUrl="+escape(_194);}_190="\n "+"\n "+"\n "+"\n "+"\n "+"\n"+"\n";dojo.connect(dojo,"loaded",dojo.hitch(this,function(){var div=document.createElement("div");div.setAttribute("id",this.id+"Container");div.setAttribute("style",_18f);div.innerHTML=_190;var body=document.getElementsByTagName("body");if(!body||!body.length){throw new Error("No body tag for this page");}body=body[0];body.appendChild(div);}));},get:function(){if(dojo.isIE||dojo.isSafari){return document.getElementById(this.id);}else{return document[this.id+"Embed"];}},setVisible:function(_199){var _19a=dojo.byId(this.id+"Container");if(_199==true){_19a.style.position="absolute";_19a.style.visibility="visible";}else{_19a.style.position="absolute";_19a.style.x="-1000px";_19a.style.y="-1000px";_19a.style.visibility="hidden";}},center:function(){var _19b=this.width;var _19c=this.height;var _19d=dijit.getViewport();var x=_19d.l+(_19d.w-_19b)/2;var y=_19d.t+(_19d.h-_19c)/2;var _1a0=dojo.byId(this.id+"Container");_1a0.style.top=y+"px";_1a0.style.left=x+"px";}};dojox.flash.Communicator=function(){};dojox.flash.Communicator.prototype={_addExternalInterfaceCallback:function(_1a1){var _1a2=dojo.hitch(this,function(){var _1a3=new Array(arguments.length);for(var i=0;i/g,">");data=data.replace("\\","&custom_backslash;");data=data.replace(/\0/g,"\\0");data=data.replace(/\"/g,""");return data;},_decodeData:function(data){if(data&&data.length&&typeof data!="string"){data=data[0];}if(!data||typeof data!="string"){return data;}data=data.replace(/\&custom_lt\;/g,"<");data=data.replace(/\&custom_gt\;/g,">");data=data.replace(/\&custom_backslash\;/g,"\\");data=data.replace(/\\0/g,"");return data;},_execFlash:function(_1a9,_1aa){var _1ab=dojox.flash.obj.get();_1aa=(_1aa)?_1aa:[];for(var i=0;i<_1aa;i++){if(typeof _1aa[i]=="string"){_1aa[i]=this._encodeData(_1aa[i]);}}var _1ad=function(){return eval(_1ab.CallFunction(""+__flash__argumentsToXML(_1aa,0)+""));};var _1ae=_1ad.call(_1aa);if(typeof _1ae=="string"){_1ae=this._decodeData(_1ae);}return _1ae;}};dojox.flash.Install=function(){};dojox.flash.Install.prototype={needed:function(){if(dojox.flash.info.capable==false){return true;}if(!dojox.flash.info.isVersionOrAbove(8,0,0)){return true;}return false;},install:function(){dojox.flash.info.installing=true;dojox.flash.installing();if(dojox.flash.info.capable==false){var _1af=new dojox.flash.Embed(false);_1af.write();}else{if(dojox.flash.info.isVersionOrAbove(6,0,65)){var _1af=new dojox.flash.Embed(false);_1af.write(true);_1af.setVisible(true);_1af.center();}else{alert("This content requires a more recent version of the Macromedia "+" Flash Player.");window.location.href=+dojox.flash.Embed.protocol()+"://www.macromedia.com/go/getflashplayer";}}},_onInstallStatus:function(msg){if(msg=="Download.Complete"){dojox.flash._initialize();}else{if(msg=="Download.Cancelled"){alert("This content requires a more recent version of the Macromedia "+" Flash Player.");window.location.href=dojox.flash.Embed.protocol()+"://www.macromedia.com/go/getflashplayer";}else{if(msg=="Download.Failed"){alert("There was an error downloading the Flash Player update. "+"Please try again later, or visit macromedia.com to download "+"the latest version of the Flash plugin.");}}}}};dojox.flash.info=new dojox.flash.Info();}if(!dojo._hasResource["dojox.flash"]){dojo._hasResource["dojox.flash"]=true;dojo.provide("dojox.flash");}if(!dojo._hasResource["dojox.storage.FlashStorageProvider"]){dojo._hasResource["dojox.storage.FlashStorageProvider"]=true;dojo.provide("dojox.storage.FlashStorageProvider");dojo.declare("dojox.storage.FlashStorageProvider",dojox.storage.Provider,{initialized:false,_available:null,_statusHandler:null,_flashReady:false,_pageReady:false,initialize:function(){if(dojo.config["disableFlashStorage"]==true){return;}dojox.flash.addLoadedListener(dojo.hitch(this,function(){this._flashReady=true;if(this._flashReady&&this._pageReady){this._loaded();}}));var _1b1=dojo.moduleUrl("dojox","storage/Storage.swf").toString();dojox.flash.setSwf(_1b1,false);dojo.connect(dojo,"loaded",this,function(){this._pageReady=true;if(this._flashReady&&this._pageReady){this._loaded();}});},setFlushDelay:function(_1b2){if(_1b2===null||typeof _1b2==="undefined"||isNaN(_1b2)){throw new Error("Invalid argunment: "+_1b2);}dojox.flash.comm.setFlushDelay(String(_1b2));},getFlushDelay:function(){return Number(dojox.flash.comm.getFlushDelay());},flush:function(_1b3){if(_1b3==null||typeof _1b3=="undefined"){_1b3=dojox.storage.DEFAULT_NAMESPACE;}dojox.flash.comm.flush(_1b3);},isAvailable:function(){return (this._available=!dojo.config["disableFlashStorage"]);},put:function(key,_1b5,_1b6,_1b7){if(!this.isValidKey(key)){throw new Error("Invalid key given: "+key);}if(!_1b7){_1b7=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1b7)){throw new Error("Invalid namespace given: "+_1b7);}this._statusHandler=_1b6;if(dojo.isString(_1b5)){_1b5="string:"+_1b5;}else{_1b5=dojo.toJson(_1b5);}dojox.flash.comm.put(key,_1b5,_1b7);},putMultiple:function(keys,_1b9,_1ba,_1bb){if(!this.isValidKeyArray(keys)||!_1b9 instanceof Array||keys.length!=_1b9.length){throw new Error("Invalid arguments: keys = ["+keys+"], values = ["+_1b9+"]");}if(!_1bb){_1bb=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1bb)){throw new Error("Invalid namespace given: "+_1bb);}this._statusHandler=_1ba;var _1bc=keys.join(",");var _1bd=[];for(var i=0;i<_1b9.length;i++){if(dojo.isString(_1b9[i])){_1b9[i]="string:"+_1b9[i];}else{_1b9[i]=dojo.toJson(_1b9[i]);}_1bd[i]=_1b9[i].length;}var _1bf=_1b9.join("");var _1c0=_1bd.join(",");dojox.flash.comm.putMultiple(_1bc,_1bf,_1c0,this.namespace);},get:function(key,_1c2){if(!this.isValidKey(key)){throw new Error("Invalid key given: "+key);}if(!_1c2){_1c2=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1c2)){throw new Error("Invalid namespace given: "+_1c2);}var _1c3=dojox.flash.comm.get(key,_1c2);if(_1c3==""){return null;}return this._destringify(_1c3);},getMultiple:function(keys,_1c5){if(!this.isValidKeyArray(keys)){throw new ("Invalid key array given: "+keys);}if(!_1c5){_1c5=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1c5)){throw new Error("Invalid namespace given: "+_1c5);}var _1c6=keys.join(",");var _1c7=dojox.flash.comm.getMultiple(_1c6,this.namespace);var _1c8=eval("("+_1c7+")");for(var i=0;i<_1c8.length;i++){_1c8[i]=(_1c8[i]=="")?null:this._destringify(_1c8[i]);}return _1c8;},_destringify:function(_1ca){if(dojo.isString(_1ca)&&(/^string:/.test(_1ca))){_1ca=_1ca.substring("string:".length);}else{_1ca=dojo.fromJson(_1ca);}return _1ca;},getKeys:function(_1cb){if(!_1cb){_1cb=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1cb)){throw new Error("Invalid namespace given: "+_1cb);}var _1cc=dojox.flash.comm.getKeys(_1cb);if(_1cc==null||_1cc=="null"){_1cc="";}_1cc=_1cc.split(",");_1cc.sort();return _1cc;},getNamespaces:function(){var _1cd=dojox.flash.comm.getNamespaces();if(_1cd==null||_1cd=="null"){_1cd=dojox.storage.DEFAULT_NAMESPACE;}_1cd=_1cd.split(",");_1cd.sort();return _1cd;},clear:function(_1ce){if(!_1ce){_1ce=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1ce)){throw new Error("Invalid namespace given: "+_1ce);}dojox.flash.comm.clear(_1ce);},remove:function(key,_1d0){if(!_1d0){_1d0=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1d0)){throw new Error("Invalid namespace given: "+_1d0);}dojox.flash.comm.remove(key,_1d0);},removeMultiple:function(keys,_1d2){if(!this.isValidKeyArray(keys)){dojo.raise("Invalid key array given: "+keys);}if(!_1d2){_1d2=dojox.storage.DEFAULT_NAMESPACE;}if(!this.isValidKey(_1d2)){throw new Error("Invalid namespace given: "+_1d2);}var _1d3=keys.join(",");dojox.flash.comm.removeMultiple(_1d3,this.namespace);},isPermanent:function(){return true;},getMaximumSize:function(){return dojox.storage.SIZE_NO_LIMIT;},hasSettingsUI:function(){return true;},showSettingsUI:function(){dojox.flash.comm.showSettings();dojox.flash.obj.setVisible(true);dojox.flash.obj.center();},hideSettingsUI:function(){dojox.flash.obj.setVisible(false);if(dojo.isFunction(dojox.storage.onHideSettingsUI)){dojox.storage.onHideSettingsUI.call(null);}},getResourceList:function(){return [];},_loaded:function(){this._allNamespaces=this.getNamespaces();this.initialized=true;dojox.storage.manager.loaded();},_onStatus:function(_1d4,key,_1d6){var ds=dojox.storage;var dfo=dojox.flash.obj;if(_1d4==ds.PENDING){dfo.center();dfo.setVisible(true);}else{dfo.setVisible(false);}if(ds._statusHandler){ds._statusHandler.call(null,_1d4,key,_1d6);}}});dojox.storage.manager.register("dojox.storage.FlashStorageProvider",new dojox.storage.FlashStorageProvider());}if(!dojo._hasResource["dojox.storage._common"]){dojo._hasResource["dojox.storage._common"]=true;dojo.provide("dojox.storage._common");dojox.storage.manager.initialize();}if(!dojo._hasResource["dojox.storage"]){dojo._hasResource["dojox.storage"]=true;dojo.provide("dojox.storage");}if(!dojo._hasResource["dojox.off.files"]){dojo._hasResource["dojox.off.files"]=true;dojo.provide("dojox.off.files");dojox.off.files={versionURL:"version.js",listOfURLs:[],refreshing:false,_cancelID:null,_error:false,_errorMessages:[],_currentFileIndex:0,_store:null,_doSlurp:false,slurp:function(){this._doSlurp=true;},cache:function(_1d9){if(dojo.isString(_1d9)){var url=this._trimAnchor(_1d9+"");if(!this.isAvailable(url)){this.listOfURLs.push(url);}}else{if(_1d9 instanceof dojo._Url){var url=this._trimAnchor(_1d9.uri);if(!this.isAvailable(url)){this.listOfURLs.push(url);}}else{dojo.forEach(_1d9,function(url){url=this._trimAnchor(url);if(!this.isAvailable(url)){this.listOfURLs.push(url);}},this);}}},printURLs:function(){console.debug("The following URLs are cached for offline use:");dojo.forEach(this.listOfURLs,function(i){console.debug(i);});},remove:function(url){for(var i=0;i=64){_1f9=_1f9.substring(0,63);}_1f8.removeStore(_1f9);_1f8.openStore(_1f9);var _1fa=_1f8.createStore(_1f9);this._store=_1fa;var self=this;this._currentFileIndex=0;this._cancelID=_1fa.capture(this.listOfURLs,function(url,_1fd,_1fe){if(!_1fd&&self.refreshing){self._cancelID=null;self.refreshing=false;var _1ff=[];_1ff.push("Unable to capture: "+url);_1f6(true,_1ff);return;}else{if(_1fd){self._currentFileIndex++;}}if(_1fd&&self._currentFileIndex>=self.listOfURLs.length){self._cancelID=null;self.refreshing=false;if(_1f7){dojox.storage.put("oldVersion",_1f7,null,dojox.off.STORAGE_NAMESPACE);}dojox.storage.put("justDebugged",dojo.config.isDebug,null,dojox.off.STORAGE_NAMESPACE);_1f6(false,[]);}});},_getVersionInfo:function(_200){var _201=dojox.storage.get("justDebugged",dojox.off.STORAGE_NAMESPACE);var _202=dojox.storage.get("oldVersion",dojox.off.STORAGE_NAMESPACE);var _203=null;_200=dojo.hitch(this,_200);dojo.xhrGet({url:this.versionURL+"?browserbust="+new Date().getTime(),timeout:5*1000,handleAs:"javascript",error:function(err){dojox.storage.remove("oldVersion",dojox.off.STORAGE_NAMESPACE);dojox.storage.remove("justDebugged",dojox.off.STORAGE_NAMESPACE);_200(_202,_203,_201);},load:function(data){if(data){_203=data;}_200(_202,_203,_201);}});}};}if(!dojo._hasResource["dojox.off.sync"]){dojo._hasResource["dojox.off.sync"]=true;dojo.provide("dojox.off.sync");dojo.mixin(dojox.off.sync,{isSyncing:false,cancelled:false,successful:true,details:[],error:false,actions:null,autoSync:true,onSync:function(type){},synchronize:function(){if(this.isSyncing||dojox.off.goingOnline||(!dojox.off.isOnline)){return;}this.isSyncing=true;this.successful=false;this.details=[];this.cancelled=false;this.start();},cancel:function(){if(!this.isSyncing){return;}this.cancelled=true;if(dojox.off.files.refreshing){dojox.off.files.abortRefresh();}this.onSync("cancel");},finishedDownloading:function(_207,_208){if(typeof _207=="undefined"){_207=true;}if(!_207){this.successful=false;this.details.push(_208);this.error=true;}this.finished();},start:function(){if(this.cancelled){this.finished();return;}this.onSync("start");this.refreshFiles();},refreshFiles:function(){if(this.cancelled){this.finished();return;}this.onSync("refreshFiles");dojox.off.files.refresh(dojo.hitch(this,function(_209,_20a){if(_209){this.error=true;this.successful=false;for(var i=0;i<_20a.length;i++){this.details.push(_20a[i]);}}this.upload();}));},upload:function(){if(this.cancelled){this.finished();return;}this.onSync("upload");dojo.connect(this.actions,"onReplayFinished",this,this.download);this.actions.replay();},download:function(){if(this.cancelled){this.finished();return;}this.onSync("download");},finished:function(){this.isSyncing=false;this.successful=(!this.cancelled&&!this.error);this.onSync("finished");},_save:function(_20c){this.actions._save(function(){_20c();});},_load:function(_20d){this.actions._load(function(){_20d();});}});dojo.declare("dojox.off.sync.ActionLog",null,{entries:[],reasonHalted:null,isReplaying:false,autoSave:true,add:function(_20e){if(this.isReplaying){throw "Programming error: you can not call "+"dojox.off.sync.actions.add() while "+"we are replaying an action log";}this.entries.push(_20e);if(this.autoSave){this._save();}},onReplay:function(_20f,_210){},length:function(){return this.entries.length;},haltReplay:function(_211){if(!this.isReplaying){return;}if(_211){this.reasonHalted=_211.toString();}if(this.autoSave){var self=this;this._save(function(){self.isReplaying=false;self.onReplayFinished();});}else{this.isReplaying=false;this.onReplayFinished();}},continueReplay:function(){if(!this.isReplaying){return;}this.entries.shift();if(!this.entries.length){if(this.autoSave){var self=this;this._save(function(){self.isReplaying=false;self.onReplayFinished();});return;}else{this.isReplaying=false;this.onReplayFinished();return;}}var _214=this.entries[0];this.onReplay(_214,this);},clear:function(){if(this.isReplaying){return;}this.entries=[];if(this.autoSave){this._save();}},replay:function(){if(this.isReplaying){return;}this.reasonHalted=null;if(!this.entries.length){this.onReplayFinished();return;}this.isReplaying=true;var _215=this.entries[0];this.onReplay(_215,this);},onReplayFinished:function(){},toString:function(){var _216="";_216+="[";for(var i=0;i";html+=dojox.off.sync.details[i];html+="
                        1. ";}html+="
                        \n";html+=""+"Close Window"+"\n";html+="";var _24c="height=400,width=600,resizable=true,"+"scrollbars=true,toolbar=no,menubar=no,"+"location=no,directories=no,dependent=yes";var _24d=window.open("","SyncDetails",_24c);if(!_24d){alert("Please allow popup windows for this domain; can't display sync details window");return;}_24d.document.open();_24d.document.write(html);_24d.document.close();if(_24d.focus){_24d.focus();}},_cancel:function(evt){evt.preventDefault();evt.stopPropagation();dojox.off.sync.cancel();},_needsBrowserRestart:function(){var _24f=dojo.byId("dot-widget-browser-restart");if(_24f){dojo.addClass(_24f,"dot-needs-browser-restart");}var _250=dojo.byId("dot-widget-browser-restart-app-name");if(_250){_250.innerHTML="";_250.appendChild(document.createTextNode(this.appName));}var _251=dojo.byId("dot-sync-status");if(_251){_251.style.display="none";}},_showNeedsOfflineCache:function(){var _252=dojo.byId("dot-widget-container");if(_252){dojo.addClass(_252,"dot-needs-offline-cache");}},_hideNeedsOfflineCache:function(){var _253=dojo.byId("dot-widget-container");if(_253){dojo.removeClass(_253,"dot-needs-offline-cache");}},_initMainEvtHandlers:function(){var _254=dojo.byId("dot-sync-details-button");if(_254){dojo.connect(_254,"onclick",this,this._showDetails);}var _255=dojo.byId("dot-sync-cancel-button");if(_255){dojo.connect(_255,"onclick",this,this._cancel);}},_setOfflineEnabled:function(_256){var _257=[];_257.push(dojo.byId("dot-sync-status"));for(var i=0;i<_257.length;i++){if(_257[i]){_257[i].style.visibility=(_256?"visible":"hidden");}}},_syncFinished:function(){this._updateSyncUI();var _259=dojo.byId("dot-success-checkmark");var _25a=dojo.byId("dot-sync-details");if(dojox.off.sync.successful==true){this._setSyncMessage("Sync Successful");if(_259){_259.style.display="inline";}}else{if(dojox.off.sync.cancelled==true){this._setSyncMessage("Sync Cancelled");if(_259){_259.style.display="none";}}else{this._setSyncMessage("Sync Error");var _25b=dojo.byId("dot-sync-messages");if(_25b){dojo.addClass(_25b,"dot-sync-error");}if(_259){_259.style.display="none";}}}if(dojox.off.sync.details.length&&_25a){_25a.style.display="inline";}},_onFrameworkEvent:function(type,_25d){if(type=="save"){if(_25d.status==dojox.storage.FAILED&&!_25d.isCoreSave){alert("Please increase the amount of local storage available "+"to this application");if(dojox.storage.hasSettingsUI()){dojox.storage.showSettingsUI();}}}else{if(type=="coreOperationFailed"){console.log("Application does not have permission to use Dojo Offline");if(!this._userInformed){alert("This application will not work if Google Gears is not allowed to run");this._userInformed=true;}}else{if(type=="offlineCacheInstalled"){this._hideNeedsOfflineCache();if(dojox.off.hasOfflineCache==true&&dojox.off.browserRestart==true){this._needsBrowserRestart();return;}else{var _25e=dojo.byId("dot-widget-browser-restart");if(_25e){_25e.style.display="none";}}this._updateSyncUI();this._initMainEvtHandlers();this._setOfflineEnabled(dojox.off.enabled);this._testNet();}}}},_onSync:function(type){switch(type){case "start":this._updateSyncUI();break;case "refreshFiles":this._setSyncMessage("Downloading UI...");break;case "upload":this._setSyncMessage("Uploading new data...");break;case "download":this._setSyncMessage("Downloading new data...");break;case "finished":this._syncFinished();break;case "cancel":this._setSyncMessage("Canceling Sync...");break;default:dojo.warn("Programming error: "+"Unknown sync type in dojox.off.ui: "+type);break;}},_onNetwork:function(type){if(!this._initialized){return;}this._updateNetIndicator();if(type=="offline"){this._setSyncMessage("You are working offline");var _261=dojo.byId("dot-sync-details");if(_261){_261.style.display="none";}this._updateSyncUI();}else{if(dojox.off.sync.autoSync){if(dojo.isAIR){window.setTimeout(function(){dojox.off.sync.synchronize();},1000);}else{window.setTimeout(dojox._scopeName+".off.sync.synchronize()",1000);}}}}});dojo.connect(dojox.off,"onFrameworkEvent",dojox.off.ui,"_onFrameworkEvent");dojo.connect(dojox.off,"onLoad",dojox.off.ui,dojox.off.ui._initialize);}if(!dojo._hasResource["dojox.off.offline"]){dojo._hasResource["dojox.off.offline"]=true;dojo.provide("dojox.off.offline");} diff --git a/includes/js/dojox/off/offline.js.uncompressed.js b/includes/js/dojox/off/offline.js.uncompressed.js new file mode 100644 index 0000000..aa2866d --- /dev/null +++ b/includes/js/dojox/off/offline.js.uncompressed.js @@ -0,0 +1,5910 @@ +/* + 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["dojox.storage.Provider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.storage.Provider"] = true; +dojo.provide("dojox.storage.Provider"); + +dojo.declare("dojox.storage.Provider", null, { + // summary: A singleton for working with dojox.storage. + // description: + // dojox.storage exposes the current available storage provider on this + // platform. It gives you methods such as dojox.storage.put(), + // dojox.storage.get(), etc. + // + // For more details on dojox.storage, see the primary documentation + // page at + // http://manual.dojotoolkit.org/storage.html + // + // Note for storage provider developers who are creating subclasses- + // This is the base class for all storage providers Specific kinds of + // Storage Providers should subclass this and implement these methods. + // You should avoid initialization in storage provider subclass's + // constructor; instead, perform initialization in your initialize() + // method. + constructor: function(){ + }, + + // SUCCESS: String + // Flag that indicates a put() call to a + // storage provider was succesful. + SUCCESS: "success", + + // FAILED: String + // Flag that indicates a put() call to + // a storage provider failed. + FAILED: "failed", + + // PENDING: String + // Flag that indicates a put() call to a + // storage provider is pending user approval. + PENDING: "pending", + + // SIZE_NOT_AVAILABLE: String + // Returned by getMaximumSize() if this storage provider can not determine + // the maximum amount of data it can support. + SIZE_NOT_AVAILABLE: "Size not available", + + // SIZE_NO_LIMIT: String + // Returned by getMaximumSize() if this storage provider has no theoretical + // limit on the amount of data it can store. + SIZE_NO_LIMIT: "No size limit", + + // DEFAULT_NAMESPACE: String + // The namespace for all storage operations. This is useful if several + // applications want access to the storage system from the same domain but + // want different storage silos. + DEFAULT_NAMESPACE: "default", + + // onHideSettingsUI: Function + // If a function is assigned to this property, then when the settings + // provider's UI is closed this function is called. Useful, for example, + // if the user has just cleared out all storage for this provider using + // the settings UI, and you want to update your UI. + onHideSettingsUI: null, + + initialize: function(){ + // summary: + // Allows this storage provider to initialize itself. This is + // called after the page has finished loading, so you can not do + // document.writes(). Storage Provider subclasses should initialize + // themselves inside of here rather than in their function + // constructor. + console.warn("dojox.storage.initialize not implemented"); + }, + + isAvailable: function(){ /*Boolean*/ + // summary: + // Returns whether this storage provider is available on this + // platform. + console.warn("dojox.storage.isAvailable not implemented"); + }, + + put: function( /*string*/ key, + /*object*/ value, + /*function*/ resultsHandler, + /*string?*/ namespace){ + // summary: + // Puts a key and value into this storage system. + // description: + // Example- + // var resultsHandler = function(status, key, message){ + // alert("status="+status+", key="+key+", message="+message); + // }; + // dojox.storage.put("test", "hello world", resultsHandler); + // + // Important note: if you are using Dojo Storage in conjunction with + // Dojo Offline, then you don't need to provide + // a resultsHandler; this is because for Dojo Offline we + // use Google Gears to persist data, which has unlimited data + // once the user has given permission. If you are using Dojo + // Storage apart from Dojo Offline, then under the covers hidden + // Flash might be used, which is both asychronous and which might + // get denied; in this case you must provide a resultsHandler. + // key: + // A string key to use when retrieving this value in the future. + // value: + // A value to store; this can be any JavaScript type. + // resultsHandler: + // A callback function that will receive three arguments. The + // first argument is one of three values: dojox.storage.SUCCESS, + // dojox.storage.FAILED, or dojox.storage.PENDING; these values + // determine how the put request went. In some storage systems + // users can deny a storage request, resulting in a + // dojox.storage.FAILED, while in other storage systems a storage + // request must wait for user approval, resulting in a + // dojox.storage.PENDING status until the request is either + // approved or denied, resulting in another call back with + // dojox.storage.SUCCESS. + // The second argument in the call back is the key name that was being stored. + // The third argument in the call back is an optional message that + // details possible error messages that might have occurred during + // the storage process. + // namespace: + // Optional string namespace that this value will be placed into; + // if left off, the value will be placed into dojox.storage.DEFAULT_NAMESPACE + + console.warn("dojox.storage.put not implemented"); + }, + + get: function(/*string*/ key, /*string?*/ namespace){ /*Object*/ + // summary: + // Gets the value with the given key. Returns null if this key is + // not in the storage system. + // key: + // A string key to get the value of. + // namespace: + // Optional string namespace that this value will be retrieved from; + // if left off, the value will be retrieved from dojox.storage.DEFAULT_NAMESPACE + // return: Returns any JavaScript object type; null if the key is not present + console.warn("dojox.storage.get not implemented"); + }, + + hasKey: function(/*string*/ key, /*string?*/ namespace){ + // summary: Determines whether the storage has the given key. + return !!this.get(key, namespace); // Boolean + }, + + getKeys: function(/*string?*/ namespace){ /*Array*/ + // summary: Enumerates all of the available keys in this storage system. + // return: Array of available keys + console.warn("dojox.storage.getKeys not implemented"); + }, + + clear: function(/*string?*/ namespace){ + // summary: + // Completely clears this storage system of all of it's values and + // keys. If 'namespace' is provided just clears the keys in that + // namespace. + console.warn("dojox.storage.clear not implemented"); + }, + + remove: function(/*string*/ key, /*string?*/ namespace){ + // summary: Removes the given key from this storage system. + console.warn("dojox.storage.remove not implemented"); + }, + + getNamespaces: function(){ /*string[]*/ + console.warn("dojox.storage.getNamespaces not implemented"); + }, + + isPermanent: function(){ /*Boolean*/ + // summary: + // Returns whether this storage provider's values are persisted + // when this platform is shutdown. + console.warn("dojox.storage.isPermanent not implemented"); + }, + + getMaximumSize: function(){ /* mixed */ + // summary: The maximum storage allowed by this provider + // returns: + // Returns the maximum storage size + // supported by this provider, in + // thousands of bytes (i.e., if it + // returns 60 then this means that 60K + // of storage is supported). + // + // If this provider can not determine + // it's maximum size, then + // dojox.storage.SIZE_NOT_AVAILABLE is + // returned; if there is no theoretical + // limit on the amount of storage + // this provider can return, then + // dojox.storage.SIZE_NO_LIMIT is + // returned + console.warn("dojox.storage.getMaximumSize not implemented"); + }, + + putMultiple: function( /*array*/ keys, + /*array*/ values, + /*function*/ resultsHandler, + /*string?*/ namespace){ + // summary: + // Puts multiple keys and values into this storage system. + // description: + // Example- + // var resultsHandler = function(status, key, message){ + // alert("status="+status+", key="+key+", message="+message); + // }; + // dojox.storage.put(["test"], ["hello world"], resultsHandler); + // + // Important note: if you are using Dojo Storage in conjunction with + // Dojo Offline, then you don't need to provide + // a resultsHandler; this is because for Dojo Offline we + // use Google Gears to persist data, which has unlimited data + // once the user has given permission. If you are using Dojo + // Storage apart from Dojo Offline, then under the covers hidden + // Flash might be used, which is both asychronous and which might + // get denied; in this case you must provide a resultsHandler. + // keys: + // An array of string keys to use when retrieving this value in the future, + // one per value to be stored + // values: + // An array of values to store; this can be any JavaScript type, though the + // performance of plain strings is considerably better + // resultsHandler: + // A callback function that will receive three arguments. The + // first argument is one of three values: dojox.storage.SUCCESS, + // dojox.storage.FAILED, or dojox.storage.PENDING; these values + // determine how the put request went. In some storage systems + // users can deny a storage request, resulting in a + // dojox.storage.FAILED, while in other storage systems a storage + // request must wait for user approval, resulting in a + // dojox.storage.PENDING status until the request is either + // approved or denied, resulting in another call back with + // dojox.storage.SUCCESS. + // The second argument in the call back is the key name that was being stored. + // The third argument in the call back is an optional message that + // details possible error messages that might have occurred during + // the storage process. + // namespace: + // Optional string namespace that this value will be placed into; + // if left off, the value will be placed into dojox.storage.DEFAULT_NAMESPACE + + console.warn("dojox.storage.putMultiple not implemented"); + // JAC: We could implement a 'default' puMultiple here by just doing + // each put individually + }, + + getMultiple: function(/*array*/ keys, /*string?*/ namespace){ /*Object*/ + // summary: + // Gets the valuse corresponding to each of the given keys. + // Returns a null array element for each given key that is + // not in the storage system. + // keys: + // An array of string keys to get the value of. + // namespace: + // Optional string namespace that this value will be retrieved from; + // if left off, the value will be retrieved from dojox.storage.DEFAULT_NAMESPACE + // return: Returns any JavaScript object type; null if the key is not present + + console.warn("dojox.storage.getMultiple not implemented"); + // JAC: We could implement a 'default' getMultiple here by just + // doing each get individually + }, + + removeMultiple: function(/*array*/ keys, /*string?*/ namespace) { + // summary: Removes the given keys from this storage system. + + // JAC: We could implement a 'default' removeMultiple here by just + // doing each remove individually + console.warn("dojox.storage.remove not implemented"); + }, + + isValidKeyArray: function( keys) { + if(keys === null || keys === undefined || !dojo.isArray(keys)){ + return false; + } + + // JAC: This could be optimized by running the key validity test + // directly over a joined string + return !dojo.some(keys, function(key){ + return !this.isValidKey(key); + }); // Boolean + }, + + hasSettingsUI: function(){ /*Boolean*/ + // summary: Determines whether this provider has a settings UI. + return false; + }, + + showSettingsUI: function(){ + // summary: If this provider has a settings UI, determined + // by calling hasSettingsUI(), it is shown. + console.warn("dojox.storage.showSettingsUI not implemented"); + }, + + hideSettingsUI: function(){ + // summary: If this provider has a settings UI, hides it. + console.warn("dojox.storage.hideSettingsUI not implemented"); + }, + + isValidKey: function(/*string*/ keyName){ /*Boolean*/ + // summary: + // Subclasses can call this to ensure that the key given is valid + // in a consistent way across different storage providers. We use + // the lowest common denominator for key values allowed: only + // letters, numbers, and underscores are allowed. No spaces. + if(keyName === null || keyName === undefined){ + return false; + } + + return /^[0-9A-Za-z_]*$/.test(keyName); + }, + + getResourceList: function(){ /* Array[] */ + // summary: + // Returns a list of URLs that this + // storage provider might depend on. + // description: + // This method returns a list of URLs that this + // storage provider depends on to do its work. + // This list is used by the Dojo Offline Toolkit + // to cache these resources to ensure the machinery + // used by this storage provider is available offline. + // What is returned is an array of URLs. + // Note that Dojo Offline uses Gears as its native + // storage provider, and does not support using other + // kinds of storage providers while offline anymore. + + return []; + } +}); + +} + +if(!dojo._hasResource["dojox.storage.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.storage.manager"] = true; +dojo.provide("dojox.storage.manager"); +//dojo.require("dojo.AdapterRegistry"); +// FIXME: refactor this to use an AdapterRegistry + +dojox.storage.manager = new function(){ + // summary: A singleton class in charge of the dojox.storage system + // description: + // Initializes the storage systems and figures out the best available + // storage options on this platform. + + // currentProvider: Object + // The storage provider that was automagically chosen to do storage + // on this platform, such as dojox.storage.FlashStorageProvider. + this.currentProvider = null; + + // available: Boolean + // Whether storage of some kind is available. + this.available = false; + + // providers: Array + // Array of all the static provider instances, useful if you want to + // loop through and see what providers have been registered. + this.providers = []; + + this._initialized = false; + + this._onLoadListeners = []; + + this.initialize = function(){ + // summary: + // Initializes the storage system and autodetects the best storage + // provider we can provide on this platform + this.autodetect(); + }; + + this.register = function(/*string*/ name, /*Object*/ instance){ + // summary: + // Registers the existence of a new storage provider; used by + // subclasses to inform the manager of their existence. The + // storage manager will select storage providers based on + // their ordering, so the order in which you call this method + // matters. + // name: + // The full class name of this provider, such as + // "dojox.storage.FlashStorageProvider". + // instance: + // An instance of this provider, which we will use to call + // isAvailable() on. + + // keep list of providers as a list so that we can know what order + // storage providers are preferred; also, store the providers hashed + // by name in case someone wants to get a provider that uses + // a particular storage backend + this.providers.push(instance); + this.providers[name] = instance; + }; + + this.setProvider = function(storageClass){ + // summary: + // Instructs the storageManager to use the given storage class for + // all storage requests. + // description: + // Example- + // dojox.storage.setProvider( + // dojox.storage.IEStorageProvider) + + }; + + this.autodetect = function(){ + // summary: + // Autodetects the best possible persistent storage provider + // available on this platform. + + //console.debug("dojox.storage.manager.autodetect"); + + if(this._initialized){ // already finished + return; + } + + // a flag to force the storage manager to use a particular + // storage provider type, such as + // djConfig = {forceStorageProvider: "dojox.storage.WhatWGStorageProvider"}; + var forceProvider = dojo.config["forceStorageProvider"] || false; + + // go through each provider, seeing if it can be used + var providerToUse; + //FIXME: use dojo.some + for(var i = 0; i < this.providers.length; i++){ + providerToUse = this.providers[i]; + if(forceProvider && forceProvider == providerToUse.declaredClass){ + // still call isAvailable for this provider, since this helps some + // providers internally figure out if they are available + // FIXME: This should be refactored since it is non-intuitive + // that isAvailable() would initialize some state + providerToUse.isAvailable(); + break; + }else if(!forceProvider && providerToUse.isAvailable()){ + break; + } + } + + if(!providerToUse){ // no provider available + this._initialized = true; + this.available = false; + this.currentProvider = null; + console.warn("No storage provider found for this platform"); + this.loaded(); + return; + } + + // create this provider and mix in it's properties + // so that developers can do dojox.storage.put rather + // than dojox.storage.currentProvider.put, for example + this.currentProvider = providerToUse; + dojo.mixin(dojox.storage, this.currentProvider); + + // have the provider initialize itself + dojox.storage.initialize(); + + this._initialized = true; + this.available = true; + }; + + this.isAvailable = function(){ /*Boolean*/ + // summary: Returns whether any storage options are available. + return this.available; + }; + + this.addOnLoad = function(func){ /* void */ + // summary: + // Adds an onload listener to know when Dojo Offline can be used. + // description: + // Adds a listener to know when Dojo Offline can be used. This + // ensures that the Dojo Offline framework is loaded and that the + // local dojox.storage system is ready to be used. This method is + // useful if you don't want to have a dependency on Dojo Events + // when using dojox.storage. + // func: Function + // A function to call when Dojo Offline is ready to go + this._onLoadListeners.push(func); + + if(this.isInitialized()){ + this._fireLoaded(); + } + }; + + this.removeOnLoad = function(func){ /* void */ + // summary: Removes the given onLoad listener + for(var i = 0; i < this._onLoadListeners.length; i++){ + if(func == this._onLoadListeners[i]){ + this._onLoadListeners = this._onLoadListeners.splice(i, 1); + break; + } + } + }; + + this.isInitialized = function(){ /*Boolean*/ + // summary: + // Returns whether the storage system is initialized and ready to + // be used. + + // FIXME: This should REALLY not be in here, but it fixes a tricky + // Flash timing bug. + // Confirm that this is still needed with the newly refactored Dojo + // Flash. Used to be for Internet Explorer. -- Brad Neuberg + if(this.currentProvider != null + && this.currentProvider.declaredClass == "dojox.storage.FlashStorageProvider" + && dojox.flash.ready == false){ + return false; + }else{ + return this._initialized; + } + }; + + this.supportsProvider = function(/*string*/ storageClass){ /* Boolean */ + // summary: Determines if this platform supports the given storage provider. + // description: + // Example- + // dojox.storage.manager.supportsProvider( + // "dojox.storage.InternetExplorerStorageProvider"); + + // construct this class dynamically + try{ + // dynamically call the given providers class level isAvailable() + // method + var provider = eval("new " + storageClass + "()"); + var results = provider.isAvailable(); + if(!results){ return false; } + return results; + }catch(e){ + return false; + } + }; + + this.getProvider = function(){ /* Object */ + // summary: Gets the current provider + return this.currentProvider; + }; + + this.loaded = function(){ + // summary: + // The storage provider should call this method when it is loaded + // and ready to be used. Clients who will use the provider will + // connect to this method to know when they can use the storage + // system. You can either use dojo.connect to connect to this + // function, or can use dojox.storage.manager.addOnLoad() to add + // a listener that does not depend on the dojo.event package. + // description: + // Example 1- + // if(dojox.storage.manager.isInitialized() == false){ + // dojo.connect(dojox.storage.manager, "loaded", TestStorage, "initialize"); + // }else{ + // dojo.connect(dojo, "loaded", TestStorage, "initialize"); + // } + // Example 2- + // dojox.storage.manager.addOnLoad(someFunction); + + + // FIXME: we should just provide a Deferred for this. That way you + // don't care when this happens or has happened. Deferreds are in Base + this._fireLoaded(); + }; + + this._fireLoaded = function(){ + //console.debug("dojox.storage.manager._fireLoaded"); + + dojo.forEach(this._onLoadListeners, function(i){ + try{ + i(); + }catch(e){ console.debug(e); } + }); + }; + + this.getResourceList = function(){ + // summary: + // Returns a list of whatever resources are necessary for storage + // providers to work. + // description: + // This will return all files needed by all storage providers for + // this particular environment type. For example, if we are in the + // browser environment, then this will return the hidden SWF files + // needed by the FlashStorageProvider, even if we don't need them + // for the particular browser we are working within. This is meant + // to faciliate Dojo Offline, which must retrieve all resources we + // need offline into the offline cache -- we retrieve everything + // needed, in case another browser that requires different storage + // mechanisms hits the local offline cache. For example, if we + // were to sync against Dojo Offline on Firefox 2, then we would + // not grab the FlashStorageProvider resources needed for Safari. + var results = []; + dojo.forEach(dojox.storage.manager.providers, function(currentProvider){ + results = results.concat(currentProvider.getResourceList()); + }); + + return results; + } +}; + +} + +if(!dojo._hasResource["dojox._sql._crypto"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox._sql._crypto"] = true; +// Taken from http://www.movable-type.co.uk/scripts/aes.html by +// Chris Veness (CLA signed); adapted for Dojo and Google Gears Worker Pool +// by Brad Neuberg, bkn3@columbia.edu + +dojo.provide("dojox._sql._crypto"); + +dojo.mixin(dojox._sql._crypto,{ + // _POOL_SIZE: + // Size of worker pool to create to help with crypto + _POOL_SIZE: 100, + + encrypt: function(plaintext, password, callback){ + // summary: + // Use Corrected Block TEA to encrypt plaintext using password + // (note plaintext & password must be strings not string objects). + // Results will be returned to the 'callback' asychronously. + this._initWorkerPool(); + + var msg ={plaintext: plaintext, password: password}; + msg = dojo.toJson(msg); + msg = "encr:" + String(msg); + + this._assignWork(msg, callback); + }, + + decrypt: function(ciphertext, password, callback){ + // summary: + // Use Corrected Block TEA to decrypt ciphertext using password + // (note ciphertext & password must be strings not string objects). + // Results will be returned to the 'callback' asychronously. + this._initWorkerPool(); + + var msg ={ciphertext: ciphertext, password: password}; + msg = dojo.toJson(msg); + msg = "decr:" + String(msg); + + this._assignWork(msg, callback); + }, + + _initWorkerPool: function(){ + // bugs in Google Gears prevents us from dynamically creating + // and destroying workers as we need them -- the worker + // pool functionality stops working after a number of crypto + // cycles (probably related to a memory leak in Google Gears). + // this is too bad, since it results in much simpler code. + + // instead, we have to create a pool of workers and reuse them. we + // keep a stack of 'unemployed' Worker IDs that are currently not working. + // if a work request comes in, we pop off the 'unemployed' stack + // and put them to work, storing them in an 'employed' hashtable, + // keyed by their Worker ID with the value being the callback function + // that wants the result. when an employed worker is done, we get + // a message in our 'manager' which adds this worker back to the + // unemployed stack and routes the result to the callback that + // wanted it. if all the workers were employed in the past but + // more work needed to be done (i.e. it's a tight labor pool ;) + // then the work messages are pushed onto + // a 'handleMessage' queue as an object tuple{msg: msg, callback: callback} + + if(!this._manager){ + try{ + this._manager = google.gears.factory.create("beta.workerpool", "1.0"); + this._unemployed = []; + this._employed ={}; + this._handleMessage = []; + + var self = this; + this._manager.onmessage = function(msg, sender){ + // get the callback necessary to serve this result + var callback = self._employed["_" + sender]; + + // make this worker unemployed + self._employed["_" + sender] = undefined; + self._unemployed.push("_" + sender); + + // see if we need to assign new work + // that was queued up needing to be done + if(self._handleMessage.length){ + var handleMe = self._handleMessage.shift(); + self._assignWork(handleMe.msg, handleMe.callback); + } + + // return results + callback(msg); + } + + var workerInit = "function _workerInit(){" + + "gearsWorkerPool.onmessage = " + + String(this._workerHandler) + + ";" + + "}"; + + var code = workerInit + " _workerInit();"; + + // create our worker pool + for(var i = 0; i < this._POOL_SIZE; i++){ + this._unemployed.push("_" + this._manager.createWorker(code)); + } + }catch(exp){ + throw exp.message||exp; + } + } + }, + + _assignWork: function(msg, callback){ + // can we immediately assign this work? + if(!this._handleMessage.length && this._unemployed.length){ + // get an unemployed worker + var workerID = this._unemployed.shift().substring(1); // remove _ + + // list this worker as employed + this._employed["_" + workerID] = callback; + + // do the worke + this._manager.sendMessage(msg, workerID); + }else{ + // we have to queue it up + this._handleMessage ={msg: msg, callback: callback}; + } + }, + + _workerHandler: function(msg, sender){ + + /* Begin AES Implementation */ + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + // Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [§5.1.1] + var Sbox = [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, + 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, + 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, + 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, + 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, + 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, + 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, + 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, + 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, + 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, + 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, + 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, + 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, + 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, + 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, + 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16]; + + // Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [§5.2] + var Rcon = [ [0x00, 0x00, 0x00, 0x00], + [0x01, 0x00, 0x00, 0x00], + [0x02, 0x00, 0x00, 0x00], + [0x04, 0x00, 0x00, 0x00], + [0x08, 0x00, 0x00, 0x00], + [0x10, 0x00, 0x00, 0x00], + [0x20, 0x00, 0x00, 0x00], + [0x40, 0x00, 0x00, 0x00], + [0x80, 0x00, 0x00, 0x00], + [0x1b, 0x00, 0x00, 0x00], + [0x36, 0x00, 0x00, 0x00] ]; + + /* + * AES Cipher function: encrypt 'input' with Rijndael algorithm + * + * takes byte-array 'input' (16 bytes) + * 2D byte-array key schedule 'w' (Nr+1 x Nb bytes) + * + * applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage + * + * returns byte-array encrypted value (16 bytes) + */ + function Cipher(input, w) { // main Cipher function [§5.1] + var Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES) + var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys + + var state = [[],[],[],[]]; // initialise 4xNb byte-array 'state' with input [§3.4] + for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i]; + + state = AddRoundKey(state, w, 0, Nb); + + for (var round=1; round 6 && i%Nk == 4) { + temp = SubWord(temp); + } + for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t]; + } + + return w; + } + + function SubWord(w) { // apply SBox to 4-byte word w + for (var i=0; i<4; i++) w[i] = Sbox[w[i]]; + return w; + } + + function RotWord(w) { // rotate 4-byte word w left by one byte + w[4] = w[0]; + for (var i=0; i<4; i++) w[i] = w[i+1]; + return w; + } + + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ + + /* + * Use AES to encrypt 'plaintext' with 'password' using 'nBits' key, in 'Counter' mode of operation + * - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + * for each block + * - outputblock = cipher(counter, key) + * - cipherblock = plaintext xor outputblock + */ + function AESEncryptCtr(plaintext, password, nBits) { + if (!(nBits==128 || nBits==192 || nBits==256)) return ''; // standard allows 128/192/256 bit keys + + // for this example script, generate the key by applying Cipher to 1st 16/24/32 chars of password; + // for real-world applications, a more secure approach would be to hash the password e.g. with SHA-1 + var nBytes = nBits/8; // no bytes in key + var pwBytes = new Array(nBytes); + for (var i=0; i>> i*8) & 0xff; + for (var i=0; i<4; i++) counterBlock[i+4] = (nonce/0x100000000 >>> i*8) & 0xff; + + // generate key schedule - an expansion of the key into distinct Key Rounds for each round + var keySchedule = KeyExpansion(key); + + var blockCount = Math.ceil(plaintext.length/blockSize); + var ciphertext = new Array(blockCount); // ciphertext as array of strings + + for (var b=0; b>> c*8) & 0xff; + for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8) + + var cipherCntr = Cipher(counterBlock, keySchedule); // -- encrypt counter block -- + + // calculate length of final block: + var blockLength = b>> c*8) & 0xff; + for (var c=0; c<4; c++) counterBlock[15-c-4] = ((b/0x100000000-1) >>> c*8) & 0xff; + + var cipherCntr = Cipher(counterBlock, keySchedule); // encrypt counter block + + ciphertext[b] = unescCtrlChars(ciphertext[b]); + + var pt = ''; + for (var i=0; i 63){ + this.dbName = this.dbName.substring(0, 63); + } + } + + if(!dbName){ + dbName = this.dbName; + } + + try{ + this._initDb(); + this.db.open(dbName); + this._dbOpen = true; + }catch(exp){ + throw exp.message||exp; + } + }, + + close: function(dbName){ + // on Internet Explorer, Google Gears throws an exception + // "Object not a collection", when we try to close the + // database -- just don't close it on this platform + // since we are running into a Gears bug; the Gears team + // said it's ok to not close a database connection + if(dojo.isIE){ return; } + + if(!this._dbOpen && (!dbName || dbName == this.dbName)){ + return; + } + + if(!dbName){ + dbName = this.dbName; + } + + try{ + this.db.close(dbName); + this._dbOpen = false; + }catch(exp){ + throw exp.message||exp; + } + }, + + _exec: function(params){ + try{ + // get the Gears Database object + this._initDb(); + + // see if we need to open the db; if programmer + // manually called dojox.sql.open() let them handle + // it; otherwise we open and close automatically on + // each SQL execution + if(!this._dbOpen){ + this.open(); + this._autoClose = true; + } + + // determine our parameters + var sql = null; + var callback = null; + var password = null; + + var args = dojo._toArray(params); + + sql = args.splice(0, 1)[0]; + + // does this SQL statement use the ENCRYPT or DECRYPT + // keywords? if so, extract our callback and crypto + // password + if(this._needsEncrypt(sql) || this._needsDecrypt(sql)){ + callback = args.splice(args.length - 1, 1)[0]; + password = args.splice(args.length - 1, 1)[0]; + } + + // 'args' now just has the SQL parameters + + // print out debug SQL output if the developer wants that + if(this.debug){ + this._printDebugSQL(sql, args); + } + + // handle SQL that needs encryption/decryption differently + // do we have an ENCRYPT SQL statement? if so, handle that first + if(this._needsEncrypt(sql)){ + var crypto = new dojox.sql._SQLCrypto("encrypt", sql, + password, args, + callback); + return; // encrypted results will arrive asynchronously + }else if(this._needsDecrypt(sql)){ // otherwise we have a DECRYPT statement + var crypto = new dojox.sql._SQLCrypto("decrypt", sql, + password, args, + callback); + return; // decrypted results will arrive asynchronously + } + + // execute the SQL and get the results + var rs = this.db.execute(sql, args); + + // Gears ResultSet object's are ugly -- normalize + // these into something JavaScript programmers know + // how to work with, basically an array of + // JavaScript objects where each property name is + // simply the field name for a column of data + rs = this._normalizeResults(rs); + + if(this._autoClose){ + this.close(); + } + + return rs; + }catch(exp){ + exp = exp.message||exp; + + console.debug("SQL Exception: " + exp); + + if(this._autoClose){ + try{ + this.close(); + }catch(e){ + console.debug("Error closing database: " + + e.message||e); + } + } + + throw exp; + } + }, + + _initDb: function(){ + if(!this.db){ + try{ + this.db = google.gears.factory.create('beta.database', '1.0'); + }catch(exp){ + dojo.setObject("google.gears.denied", true); + dojox.off.onFrameworkEvent("coreOperationFailed"); + throw "Google Gears must be allowed to run"; + } + } + }, + + _printDebugSQL: function(sql, args){ + var msg = "dojox.sql(\"" + sql + "\""; + for(var i = 0; i < args.length; i++){ + if(typeof args[i] == "string"){ + msg += ", \"" + args[i] + "\""; + }else{ + msg += ", " + args[i]; + } + } + msg += ")"; + + console.debug(msg); + }, + + _normalizeResults: function(rs){ + var results = []; + if(!rs){ return []; } + + while(rs.isValidRow()){ + var row = {}; + + for(var i = 0; i < rs.fieldCount(); i++){ + var fieldName = rs.fieldName(i); + var fieldValue = rs.field(i); + row[fieldName] = fieldValue; + } + + results.push(row); + + rs.next(); + } + + rs.close(); + + return results; + }, + + _needsEncrypt: function(sql){ + return /encrypt\([^\)]*\)/i.test(sql); + }, + + _needsDecrypt: function(sql){ + return /decrypt\([^\)]*\)/i.test(sql); + } +}); + +// summary: +// A private class encapsulating any cryptography that must be done +// on a SQL statement. We instantiate this class and have it hold +// it's state so that we can potentially have several encryption +// operations happening at the same time by different SQL statements. +dojo.declare("dojox.sql._SQLCrypto", null, { + constructor: function(action, sql, password, args, callback){ + if(action == "encrypt"){ + this._execEncryptSQL(sql, password, args, callback); + }else{ + this._execDecryptSQL(sql, password, args, callback); + } + }, + + _execEncryptSQL: function(sql, password, args, callback){ + // strip the ENCRYPT/DECRYPT keywords from the SQL + var strippedSQL = this._stripCryptoSQL(sql); + + // determine what arguments need encryption + var encryptColumns = this._flagEncryptedArgs(sql, args); + + // asynchronously encrypt each argument that needs it + var self = this; + this._encrypt(strippedSQL, password, args, encryptColumns, function(finalArgs){ + // execute the SQL + var error = false; + var resultSet = []; + var exp = null; + try{ + resultSet = dojox.sql.db.execute(strippedSQL, finalArgs); + }catch(execError){ + error = true; + exp = execError.message||execError; + } + + // was there an error during SQL execution? + if(exp != null){ + if(dojox.sql._autoClose){ + try{ dojox.sql.close(); }catch(e){} + } + + callback(null, true, exp.toString()); + return; + } + + // normalize SQL results into a JavaScript object + // we can work with + resultSet = dojox.sql._normalizeResults(resultSet); + + if(dojox.sql._autoClose){ + dojox.sql.close(); + } + + // are any decryptions necessary on the result set? + if(dojox.sql._needsDecrypt(sql)){ + // determine which of the result set columns needs decryption + var needsDecrypt = self._determineDecryptedColumns(sql); + + // now decrypt columns asynchronously + // decrypt columns that need it + self._decrypt(resultSet, needsDecrypt, password, function(finalResultSet){ + callback(finalResultSet, false, null); + }); + }else{ + callback(resultSet, false, null); + } + }); + }, + + _execDecryptSQL: function(sql, password, args, callback){ + // strip the ENCRYPT/DECRYPT keywords from the SQL + var strippedSQL = this._stripCryptoSQL(sql); + + // determine which columns needs decryption; this either + // returns the value *, which means all result set columns will + // be decrypted, or it will return the column names that need + // decryption set on a hashtable so we can quickly test a given + // column name; the key is the column name that needs + // decryption and the value is 'true' (i.e. needsDecrypt["someColumn"] + // would return 'true' if it needs decryption, and would be 'undefined' + // or false otherwise) + var needsDecrypt = this._determineDecryptedColumns(sql); + + // execute the SQL + var error = false; + var resultSet = []; + var exp = null; + try{ + resultSet = dojox.sql.db.execute(strippedSQL, args); + }catch(execError){ + error = true; + exp = execError.message||execError; + } + + // was there an error during SQL execution? + if(exp != null){ + if(dojox.sql._autoClose){ + try{ dojox.sql.close(); }catch(e){} + } + + callback(resultSet, true, exp.toString()); + return; + } + + // normalize SQL results into a JavaScript object + // we can work with + resultSet = dojox.sql._normalizeResults(resultSet); + + if(dojox.sql._autoClose){ + dojox.sql.close(); + } + + // decrypt columns that need it + this._decrypt(resultSet, needsDecrypt, password, function(finalResultSet){ + callback(finalResultSet, false, null); + }); + }, + + _encrypt: function(sql, password, args, encryptColumns, callback){ + //console.debug("_encrypt, sql="+sql+", password="+password+", encryptColumns="+encryptColumns+", args="+args); + + this._totalCrypto = 0; + this._finishedCrypto = 0; + this._finishedSpawningCrypto = false; + this._finalArgs = args; + + for(var i = 0; i < args.length; i++){ + if(encryptColumns[i]){ + // we have an encrypt() keyword -- get just the value inside + // the encrypt() parantheses -- for now this must be a ? + var sqlParam = args[i]; + var paramIndex = i; + + // update the total number of encryptions we know must be done asynchronously + this._totalCrypto++; + + // FIXME: This currently uses DES as a proof-of-concept since the + // DES code used is quite fast and was easy to work with. Modify dojox.sql + // to be able to specify a different encryption provider through a + // a SQL-like syntax, such as dojox.sql("SET ENCRYPTION BLOWFISH"), + // and modify the dojox.crypto.Blowfish code to be able to work using + // a Google Gears Worker Pool + + // do the actual encryption now, asychronously on a Gears worker thread + dojox._sql._crypto.encrypt(sqlParam, password, dojo.hitch(this, function(results){ + // set the new encrypted value + this._finalArgs[paramIndex] = results; + this._finishedCrypto++; + // are we done with all encryption? + if(this._finishedCrypto >= this._totalCrypto + && this._finishedSpawningCrypto){ + callback(this._finalArgs); + } + })); + } + } + + this._finishedSpawningCrypto = true; + }, + + _decrypt: function(resultSet, needsDecrypt, password, callback){ + //console.debug("decrypt, resultSet="+resultSet+", needsDecrypt="+needsDecrypt+", password="+password); + + this._totalCrypto = 0; + this._finishedCrypto = 0; + this._finishedSpawningCrypto = false; + this._finalResultSet = resultSet; + + for(var i = 0; i < resultSet.length; i++){ + var row = resultSet[i]; + + // go through each of the column names in row, + // seeing if they need decryption + for(var columnName in row){ + if(needsDecrypt == "*" || needsDecrypt[columnName]){ + this._totalCrypto++; + var columnValue = row[columnName]; + + // forming a closure here can cause issues, with values not cleanly + // saved on Firefox/Mac OS X for some of the values above that + // are needed in the callback below; call a subroutine that will form + // a closure inside of itself instead + this._decryptSingleColumn(columnName, columnValue, password, i, + function(finalResultSet){ + callback(finalResultSet); + }); + } + } + } + + this._finishedSpawningCrypto = true; + }, + + _stripCryptoSQL: function(sql){ + // replace all DECRYPT(*) occurrences with a * + sql = sql.replace(/DECRYPT\(\*\)/ig, "*"); + + // match any ENCRYPT(?, ?, ?, etc) occurrences, + // then replace with just the question marks in the + // middle + var matches = sql.match(/ENCRYPT\([^\)]*\)/ig); + if(matches != null){ + for(var i = 0; i < matches.length; i++){ + var encryptStatement = matches[i]; + var encryptValue = encryptStatement.match(/ENCRYPT\(([^\)]*)\)/i)[1]; + sql = sql.replace(encryptStatement, encryptValue); + } + } + + // match any DECRYPT(COL1, COL2, etc) occurrences, + // then replace with just the column names + // in the middle + matches = sql.match(/DECRYPT\([^\)]*\)/ig); + if(matches != null){ + for(var i = 0; i < matches.length; i++){ + var decryptStatement = matches[i]; + var decryptValue = decryptStatement.match(/DECRYPT\(([^\)]*)\)/i)[1]; + sql = sql.replace(decryptStatement, decryptValue); + } + } + + return sql; + }, + + _flagEncryptedArgs: function(sql, args){ + // capture literal strings that have question marks in them, + // and also capture question marks that stand alone + var tester = new RegExp(/([\"][^\"]*\?[^\"]*[\"])|([\'][^\']*\?[^\']*[\'])|(\?)/ig); + var matches; + var currentParam = 0; + var results = []; + while((matches = tester.exec(sql)) != null){ + var currentMatch = RegExp.lastMatch+""; + + // are we a literal string? then ignore it + if(/^[\"\']/.test(currentMatch)){ + continue; + } + + // do we have an encrypt keyword to our left? + var needsEncrypt = false; + if(/ENCRYPT\([^\)]*$/i.test(RegExp.leftContext)){ + needsEncrypt = true; + } + + // set the encrypted flag + results[currentParam] = needsEncrypt; + + currentParam++; + } + + return results; + }, + + _determineDecryptedColumns: function(sql){ + var results = {}; + + if(/DECRYPT\(\*\)/i.test(sql)){ + results = "*"; + }else{ + var tester = /DECRYPT\((?:\s*\w*\s*\,?)*\)/ig; + var matches; + while(matches = tester.exec(sql)){ + var lastMatch = new String(RegExp.lastMatch); + var columnNames = lastMatch.replace(/DECRYPT\(/i, ""); + columnNames = columnNames.replace(/\)/, ""); + columnNames = columnNames.split(/\s*,\s*/); + dojo.forEach(columnNames, function(column){ + if(/\s*\w* AS (\w*)/i.test(column)){ + column = column.match(/\s*\w* AS (\w*)/i)[1]; + } + results[column] = true; + }); + } + } + + return results; + }, + + _decryptSingleColumn: function(columnName, columnValue, password, currentRowIndex, + callback){ + //console.debug("decryptSingleColumn, columnName="+columnName+", columnValue="+columnValue+", currentRowIndex="+currentRowIndex) + dojox._sql._crypto.decrypt(columnValue, password, dojo.hitch(this, function(results){ + // set the new decrypted value + this._finalResultSet[currentRowIndex][columnName] = results; + this._finishedCrypto++; + + // are we done with all encryption? + if(this._finishedCrypto >= this._totalCrypto + && this._finishedSpawningCrypto){ + //console.debug("done with all decrypts"); + callback(this._finalResultSet); + } + })); + } +}); + +} + +if(!dojo._hasResource["dojox.sql"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sql"] = true; + +dojo.provide("dojox.sql"); + +} + +if(!dojo._hasResource["dojox.storage.GearsStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.storage.GearsStorageProvider"] = true; +dojo.provide("dojox.storage.GearsStorageProvider"); + + + + +if(dojo.isGears){ + + (function(){ + // make sure we don't define the gears provider if we're not gears + // enabled + + dojo.declare("dojox.storage.GearsStorageProvider", dojox.storage.Provider, { + // summary: + // Storage provider that uses the features of Google Gears + // to store data (it is saved into the local SQL database + // provided by Gears, using dojox.sql) + // description: + // You can disable this storage provider with the following djConfig + // variable: + // var djConfig = { disableGearsStorage: true }; + // + // Authors of this storage provider- + // Brad Neuberg, bkn3@columbia.edu + constructor: function(){ + }, + // instance methods and properties + TABLE_NAME: "__DOJO_STORAGE", + initialized: false, + + _available: null, + + initialize: function(){ + //console.debug("dojox.storage.GearsStorageProvider.initialize"); + if(dojo.config["disableGearsStorage"] == true){ + return; + } + + // partition our storage data so that multiple apps + // on the same host won't collide + this.TABLE_NAME = "__DOJO_STORAGE"; + + // create the table that holds our data + try{ + dojox.sql("CREATE TABLE IF NOT EXISTS " + this.TABLE_NAME + "( " + + " namespace TEXT, " + + " key TEXT, " + + " value TEXT " + + ")" + ); + dojox.sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index" + + " ON " + this.TABLE_NAME + + " (namespace, key)"); + }catch(e){ + console.debug("dojox.storage.GearsStorageProvider.initialize:", e); + + this.initialized = false; // we were unable to initialize + dojox.storage.manager.loaded(); + return; + } + + // indicate that this storage provider is now loaded + this.initialized = true; + dojox.storage.manager.loaded(); + }, + + isAvailable: function(){ + // is Google Gears available and defined? + return this._available = dojo.isGears; + }, + + put: function(key, value, resultsHandler, namespace){ + if(this.isValidKey(key) == false){ + throw new Error("Invalid key given: " + key); + } + namespace = namespace||this.DEFAULT_NAMESPACE; + + // serialize the value; + // handle strings differently so they have better performance + if(dojo.isString(value)){ + value = "string:" + value; + }else{ + value = dojo.toJson(value); + } + + // try to store the value + try{ + dojox.sql("DELETE FROM " + this.TABLE_NAME + + " WHERE namespace = ? AND key = ?", + namespace, key); + dojox.sql("INSERT INTO " + this.TABLE_NAME + + " VALUES (?, ?, ?)", + namespace, key, value); + }catch(e){ + // indicate we failed + console.debug("dojox.storage.GearsStorageProvider.put:", e); + resultsHandler(this.FAILED, key, e.toString()); + return; + } + + if(resultsHandler){ + resultsHandler(dojox.storage.SUCCESS, key, null); + } + }, + + get: function(key, namespace){ + if(this.isValidKey(key) == false){ + throw new Error("Invalid key given: " + key); + } + namespace = namespace||this.DEFAULT_NAMESPACE; + + // try to find this key in the database + var results = dojox.sql("SELECT * FROM " + this.TABLE_NAME + + " WHERE namespace = ? AND " + + " key = ?", + namespace, key); + if(!results.length){ + return null; + }else{ + results = results[0].value; + } + + // destringify the content back into a + // real JavaScript object; + // handle strings differently so they have better performance + if(dojo.isString(results) && (/^string:/.test(results))){ + results = results.substring("string:".length); + }else{ + results = dojo.fromJson(results); + } + + return results; + }, + + getNamespaces: function(){ + var results = [ dojox.storage.DEFAULT_NAMESPACE ]; + + var rs = dojox.sql("SELECT namespace FROM " + this.TABLE_NAME + + " DESC GROUP BY namespace"); + for(var i = 0; i < rs.length; i++){ + if(rs[i].namespace != dojox.storage.DEFAULT_NAMESPACE){ + results.push(rs[i].namespace); + } + } + + return results; + }, + + getKeys: function(namespace){ + namespace = namespace||this.DEFAULT_NAMESPACE; + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + + var rs = dojox.sql("SELECT key FROM " + this.TABLE_NAME + + " WHERE namespace = ?", + namespace); + + var results = []; + for(var i = 0; i < rs.length; i++){ + results.push(rs[i].key); + } + + return results; + }, + + clear: function(namespace){ + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + namespace = namespace||this.DEFAULT_NAMESPACE; + + dojox.sql("DELETE FROM " + this.TABLE_NAME + + " WHERE namespace = ?", + namespace); + }, + + remove: function(key, namespace){ + namespace = namespace||this.DEFAULT_NAMESPACE; + + dojox.sql("DELETE FROM " + this.TABLE_NAME + + " WHERE namespace = ? AND" + + " key = ?", + namespace, + key); + }, + + putMultiple: function(keys, values, resultsHandler, namespace) { + if(this.isValidKeyArray(keys) === false + || ! values instanceof Array + || keys.length != values.length){ + throw new Error("Invalid arguments: keys = [" + + keys + "], values = [" + values + "]"); + } + + if(namespace == null || typeof namespace == "undefined"){ + namespace = dojox.storage.DEFAULT_NAMESPACE; + } + + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + + this._statusHandler = resultsHandler; + + // try to store the value + try{ + dojox.sql.open(); + dojox.sql.db.execute("BEGIN TRANSACTION"); + var _stmt = "REPLACE INTO " + this.TABLE_NAME + " VALUES (?, ?, ?)"; + for(var i=0;i 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
                        , + // 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["dojox.flash._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.flash._base"] = true; +dojo.provide("dojox.flash._base"); + +// for dijit.getViewport(), needed by dojox.flash.Embed.center() + + +dojox.flash = function(){ + // summary: + // The goal of dojox.flash is to make it easy to extend Flash's capabilities + // into an Ajax/DHTML environment. + // + // dojox.flash provides an easy object for interacting with the Flash plugin. + // This object provides methods to determine the current version of the Flash + // plugin (dojox.flash.info); write out the necessary markup to + // dynamically insert a Flash object into the page (dojox.flash.Embed; and + // do dynamic installation and upgrading of the current Flash plugin in + // use (dojox.flash.Install). If you want to call methods on the Flash object + // embedded into the page it is your responsibility to use Flash's ExternalInterface + // API and get a reference to the Flash object yourself. + // + // To use dojox.flash, you must first wait until Flash is finished loading + // and initializing before you attempt communication or interaction. + // To know when Flash is finished use dojo.connect: + // + // dojo.connect(dojox.flash, "loaded", myInstance, "myCallback"); + // + // Then, while the page is still loading provide the file name: + // + // dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf")); + // + // If no SWF files are specified, then Flash is not initialized. + // + // Your Flash must use Flash's ExternalInterface to expose Flash methods and + // to call JavaScript. + // + // setSwf can take an optional 'visible' attribute to control whether + // the Flash object is visible or not on the page; the default is visible: + // + // dojox.flash.setSwf(dojo.moduleUrl("dojox", "_storage/storage.swf"), + // false); + // + // Once finished, you can query Flash version information: + // + // dojox.flash.info.version + // + // Or can communicate with Flash methods that were exposed: + // + // var f = dojox.flash.get(); + // var results = f.sayHello("Some Message"); + // + // Your Flash files should use DojoExternalInterface.as to register methods; + // this file wraps Flash's normal ExternalInterface but correct various + // serialization bugs that ExternalInterface has. + // + // Note that dojox.flash is not meant to be a generic Flash embedding + // mechanism; it is as generic as necessary to make Dojo Storage's + // Flash Storage Provider as clean and modular as possible. If you want + // a generic Flash embed mechanism see SWFObject + // (http://blog.deconcept.com/swfobject/). + // + // Notes: + // Note that dojox.flash can currently only work with one Flash object + // on the page; it does not yet support multiple Flash objects on + // the same page. + // + // Your code can detect whether the Flash player is installing or having + // its version revved in two ways. First, if dojox.flash detects that + // Flash installation needs to occur, it sets dojox.flash.info.installing + // to true. Second, you can detect if installation is necessary with the + // following callback: + // + // dojo.connect(dojox.flash, "installing", myInstance, "myCallback"); + // + // You can use this callback to delay further actions that might need Flash; + // when installation is finished the full page will be refreshed and the + // user will be placed back on your page with Flash installed. + // + // ------------------- + // Todo/Known Issues + // ------------------- + // * On Internet Explorer, after doing a basic install, the page is + // not refreshed or does not detect that Flash is now available. The way + // to fix this is to create a custom small Flash file that is pointed to + // during installation; when it is finished loading, it does a callback + // that says that Flash installation is complete on IE, and we can proceed + // to initialize the dojox.flash subsystem. + // * Things aren't super tested for sending complex objects to Flash + // methods, since Dojo Storage only needs strings + // + // Author- Brad Neuberg, http://codinginparadise.org +} + +dojox.flash = { + ready: false, + url: null, + + _visible: true, + _loadedListeners: new Array(), + _installingListeners: new Array(), + + setSwf: function(/* String */ url, /* boolean? */ visible){ + // summary: Sets the SWF files and versions we are using. + // url: String + // The URL to this Flash file. + // visible: boolean? + // Whether the Flash file is visible or not. If it is not visible we hide it off the + // screen. This defaults to true (i.e. the Flash file is visible). + this.url = url; + + if(typeof visible != "undefined"){ + this._visible = visible; + } + + // initialize ourselves + this._initialize(); + }, + + addLoadedListener: function(/* Function */ listener){ + // summary: + // Adds a listener to know when Flash is finished loading. + // Useful if you don't want a dependency on dojo.event. + // listener: Function + // A function that will be called when Flash is done loading. + + this._loadedListeners.push(listener); + }, + + addInstallingListener: function(/* Function */ listener){ + // summary: + // Adds a listener to know if Flash is being installed. + // Useful if you don't want a dependency on dojo.event. + // listener: Function + // A function that will be called if Flash is being + // installed + + this._installingListeners.push(listener); + }, + + loaded: function(){ + // summary: Called back when the Flash subsystem is finished loading. + // description: + // A callback when the Flash subsystem is finished loading and can be + // worked with. To be notified when Flash is finished loading, add a + // loaded listener: + // + // dojox.flash.addLoadedListener(loadedListener); + + dojox.flash.ready = true; + if(dojox.flash._loadedListeners.length > 0){ + for(var i = 0;i < dojox.flash._loadedListeners.length; i++){ + dojox.flash._loadedListeners[i].call(null); + } + } + }, + + installing: function(){ + // summary: Called if Flash is being installed. + // description: + // A callback to know if Flash is currently being installed or + // having its version revved. To be notified if Flash is installing, connect + // your callback to this method using the following: + // + // dojo.event.connect(dojox.flash, "installing", myInstance, "myCallback"); + + if(dojox.flash._installingListeners.length > 0){ + for(var i = 0; i < dojox.flash._installingListeners.length; i++){ + dojox.flash._installingListeners[i].call(null); + } + } + }, + + // Initializes dojox.flash. + _initialize: function(){ + //console.debug("dojox.flash._initialize"); + // see if we need to rev or install Flash on this platform + var installer = new dojox.flash.Install(); + dojox.flash.installer = installer; + + if(installer.needed() == true){ + installer.install(); + }else{ + // write the flash object into the page + dojox.flash.obj = new dojox.flash.Embed(this._visible); + dojox.flash.obj.write(); + + // setup the communicator + dojox.flash.comm = new dojox.flash.Communicator(); + } + } +}; + + +dojox.flash.Info = function(){ + // summary: A class that helps us determine whether Flash is available. + // description: + // A class that helps us determine whether Flash is available, + // it's major and minor versions, and what Flash version features should + // be used for Flash/JavaScript communication. Parts of this code + // are adapted from the automatic Flash plugin detection code autogenerated + // by the Macromedia Flash 8 authoring environment. + // + // An instance of this class can be accessed on dojox.flash.info after + // the page is finished loading. + // + // This constructor must be called before the page is finished loading. + + // Visual basic helper required to detect Flash Player ActiveX control + // version information on Internet Explorer + if(dojo.isIE){ + document.write([ + ' + // + // Note that inline styles on elements are not handled (i.e. + // if you somehow have an inline style that uses a URL); + // object and embed tags are not scanned since their format + // differs based on type; and elements created by JavaScript + // after page load are not found. For these you must manually + // add them with a dojox.off.files.cache() method call. + + // just schedule the slurp once the page is loaded and + // Dojo Offline is ready to slurp; dojox.off will call + // our _slurp() method before indicating it is finished + // loading + this._doSlurp = true; + }, + + cache: function(urlOrList){ /* void */ + // summary: + // Caches a file or list of files to be available offline. This + // can either be a full URL, such as http://foobar.com/index.html, + // or a relative URL, such as ../index.html. This URL is not + // actually cached until dojox.off.sync.synchronize() is called. + // urlOrList: String or Array[] + // A URL of a file to cache or an Array of Strings of files to + // cache + + //console.debug("dojox.off.files.cache, urlOrList="+urlOrList); + + if(dojo.isString(urlOrList)){ + var url = this._trimAnchor(urlOrList+""); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }else if(urlOrList instanceof dojo._Url){ + var url = this._trimAnchor(urlOrList.uri); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }else{ + dojo.forEach(urlOrList, function(url){ + url = this._trimAnchor(url); + if(!this.isAvailable(url)){ + this.listOfURLs.push(url); + } + }, this); + } + }, + + printURLs: function(){ + // summary: + // A helper function that will dump and print out + // all of the URLs that are cached for offline + // availability. This can help with debugging if you + // are trying to make sure that all of your URLs are + // available offline + console.debug("The following URLs are cached for offline use:"); + dojo.forEach(this.listOfURLs, function(i){ + console.debug(i); + }); + }, + + remove: function(url){ /* void */ + // summary: + // Removes a URL from the list of files to cache. + // description: + // Removes a URL from the list of URLs to cache. Note that this + // does not actually remove the file from the offline cache; + // instead, it just prevents us from refreshing this file at a + // later time, so that it will naturally time out and be removed + // from the offline cache + // url: String + // The URL to remove + for(var i = 0; i < this.listOfURLs.length; i++){ + if(this.listOfURLs[i] == url){ + this.listOfURLs = this.listOfURLs.splice(i, 1); + break; + } + } + }, + + isAvailable: function(url){ /* boolean */ + // summary: + // Determines whether the given resource is available offline. + // url: String + // The URL to check + for(var i = 0; i < this.listOfURLs.length; i++){ + if(this.listOfURLs[i] == url){ + return true; + } + } + + return false; + }, + + refresh: function(callback){ /* void */ + //console.debug("dojox.off.files.refresh"); + // summary: + // For advanced usage; most developers can ignore this. + // Refreshes our list of offline resources, + // making them available offline. + // callback: Function + // A callback that receives two arguments: whether an error + // occurred, which is a boolean; and an array of error message strings + // with details on errors encountered. If no error occured then message is + // empty array with length 0. + try{ + if(dojo.config.isDebug){ + this.printURLs(); + } + + this.refreshing = true; + + if(this.versionURL){ + this._getVersionInfo(function(oldVersion, newVersion, justDebugged){ + //console.warn("getVersionInfo, oldVersion="+oldVersion+", newVersion="+newVersion + // + ", justDebugged="+justDebugged+", isDebug="+dojo.config.isDebug); + if(dojo.config.isDebug || !newVersion || justDebugged + || !oldVersion || oldVersion != newVersion){ + console.warn("Refreshing offline file list"); + this._doRefresh(callback, newVersion); + }else{ + console.warn("No need to refresh offline file list"); + callback(false, []); + } + }); + }else{ + console.warn("Refreshing offline file list"); + this._doRefresh(callback); + } + }catch(e){ + this.refreshing = false; + + // can't refresh files -- core operation -- + // fail fast + dojox.off.coreOpFailed = true; + dojox.off.enabled = false; + dojox.off.onFrameworkEvent("coreOperationFailed"); + } + }, + + abortRefresh: function(){ + // summary: + // For advanced usage; most developers can ignore this. + // Aborts and cancels a refresh. + if(!this.refreshing){ + return; + } + + this._store.abortCapture(this._cancelID); + this.refreshing = false; + }, + + _slurp: function(){ + if(!this._doSlurp){ + return; + } + + var handleUrl = dojo.hitch(this, function(url){ + if(this._sameLocation(url)){ + this.cache(url); + } + }); + + handleUrl(window.location.href); + + dojo.query("script").forEach(function(i){ + try{ + handleUrl(i.getAttribute("src")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'script' error: " + // + exp.message||exp); + } + }); + + dojo.query("link").forEach(function(i){ + try{ + if(!i.getAttribute("rel") + || i.getAttribute("rel").toLowerCase() != "stylesheet"){ + return; + } + + handleUrl(i.getAttribute("href")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'link' error: " + // + exp.message||exp); + } + }); + + dojo.query("img").forEach(function(i){ + try{ + handleUrl(i.getAttribute("src")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'img' error: " + // + exp.message||exp); + } + }); + + dojo.query("a").forEach(function(i){ + try{ + handleUrl(i.getAttribute("href")); + }catch(exp){ + //console.debug("dojox.off.files.slurp 'a' error: " + // + exp.message||exp); + } + }); + + // FIXME: handle 'object' and 'embed' tag + + // parse our style sheets for inline URLs and imports + dojo.forEach(document.styleSheets, function(sheet){ + try{ + if(sheet.cssRules){ // Firefox + dojo.forEach(sheet.cssRules, function(rule){ + var text = rule.cssText; + if(text){ + var matches = text.match(/url\(\s*([^\) ]*)\s*\)/i); + if(!matches){ + return; + } + + for(var i = 1; i < matches.length; i++){ + handleUrl(matches[i]) + } + } + }); + }else if(sheet.cssText){ // IE + var matches; + var text = sheet.cssText.toString(); + // unfortunately, using RegExp.exec seems to be flakey + // for looping across multiple lines on IE using the + // global flag, so we have to simulate it + var lines = text.split(/\f|\r|\n/); + for(var i = 0; i < lines.length; i++){ + matches = lines[i].match(/url\(\s*([^\) ]*)\s*\)/i); + if(matches && matches.length){ + handleUrl(matches[1]); + } + } + } + }catch(exp){ + //console.debug("dojox.off.files.slurp stylesheet parse error: " + // + exp.message||exp); + } + }); + + //this.printURLs(); + }, + + _sameLocation: function(url){ + if(!url){ return false; } + + // filter out anchors + if(url.length && url.charAt(0) == "#"){ + return false; + } + + // FIXME: dojo._Url should be made public; + // it's functionality is very useful for + // parsing URLs correctly, which is hard to + // do right + url = new dojo._Url(url); + + // totally relative -- ../../someFile.html + if(!url.scheme && !url.port && !url.host){ + return true; + } + + // scheme relative with port specified -- brad.com:8080 + if(!url.scheme && url.host && url.port + && window.location.hostname == url.host + && window.location.port == url.port){ + return true; + } + + // scheme relative with no-port specified -- brad.com + if(!url.scheme && url.host && !url.port + && window.location.hostname == url.host + && window.location.port == 80){ + return true; + } + + // else we have everything + return window.location.protocol == (url.scheme + ":") + && window.location.hostname == url.host + && (window.location.port == url.port || !window.location.port && !url.port); + }, + + _trimAnchor: function(url){ + return url.replace(/\#.*$/, ""); + }, + + _doRefresh: function(callback, newVersion){ + // get our local server + var localServer; + try{ + localServer = google.gears.factory.create("beta.localserver", "1.0"); + }catch(exp){ + dojo.setObject("google.gears.denied", true); + dojox.off.onFrameworkEvent("coreOperationFailed"); + throw "Google Gears must be allowed to run"; + } + + var storeName = "dot_store_" + + window.location.href.replace(/[^0-9A-Za-z_]/g, "_"); + + // clip at 64 characters, the max length of a resource store name + if(storeName.length >= 64){ + storeName = storeName.substring(0, 63); + } + + // refresh everything by simply removing + // any older stores + localServer.removeStore(storeName); + + // open/create the resource store + localServer.openStore(storeName); + var store = localServer.createStore(storeName); + this._store = store; + + // add our list of files to capture + var self = this; + this._currentFileIndex = 0; + this._cancelID = store.capture(this.listOfURLs, function(url, success, captureId){ + //console.debug("store.capture, url="+url+", success="+success); + if(!success && self.refreshing){ + self._cancelID = null; + self.refreshing = false; + var errorMsgs = []; + errorMsgs.push("Unable to capture: " + url); + callback(true, errorMsgs); + return; + }else if(success){ + self._currentFileIndex++; + } + + if(success && self._currentFileIndex >= self.listOfURLs.length){ + self._cancelID = null; + self.refreshing = false; + if(newVersion){ + dojox.storage.put("oldVersion", newVersion, null, + dojox.off.STORAGE_NAMESPACE); + } + dojox.storage.put("justDebugged", dojo.config.isDebug, null, + dojox.off.STORAGE_NAMESPACE); + callback(false, []); + } + }); + }, + + _getVersionInfo: function(callback){ + var justDebugged = dojox.storage.get("justDebugged", + dojox.off.STORAGE_NAMESPACE); + var oldVersion = dojox.storage.get("oldVersion", + dojox.off.STORAGE_NAMESPACE); + var newVersion = null; + + callback = dojo.hitch(this, callback); + + dojo.xhrGet({ + url: this.versionURL + "?browserbust=" + new Date().getTime(), + timeout: 5 * 1000, + handleAs: "javascript", + error: function(err){ + //console.warn("dojox.off.files._getVersionInfo, err=",err); + dojox.storage.remove("oldVersion", dojox.off.STORAGE_NAMESPACE); + dojox.storage.remove("justDebugged", dojox.off.STORAGE_NAMESPACE); + callback(oldVersion, newVersion, justDebugged); + }, + load: function(data){ + //console.warn("dojox.off.files._getVersionInfo, load=",data); + + // some servers incorrectly return 404's + // as a real page + if(data){ + newVersion = data; + } + + callback(oldVersion, newVersion, justDebugged); + } + }); + } +} + +} + +if(!dojo._hasResource["dojox.off.sync"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off.sync"] = true; +dojo.provide("dojox.off.sync"); + + + + + +// Author: Brad Neuberg, bkn3@columbia.edu, http://codinginparadise.org + +// summary: +// Exposes syncing functionality to offline applications +dojo.mixin(dojox.off.sync, { + // isSyncing: boolean + // Whether we are in the middle of a syncing session. + isSyncing: false, + + // cancelled: boolean + // Whether we were cancelled during our last sync request or not. If + // we are cancelled, then successful will be false. + cancelled: false, + + // successful: boolean + // Whether the last sync was successful or not. If false, an error + // occurred. + successful: true, + + // details: String[] + // Details on the sync. If the sync was successful, this will carry + // any conflict or merging messages that might be available; if the + // sync was unsuccessful, this will have an error message. For both + // of these, this should be an array of Strings, where each string + // carries details on the sync. + // Example: + // dojox.off.sync.details = ["The document 'foobar' had conflicts - yours one", + // "The document 'hello world' was automatically merged"]; + details: [], + + // error: boolean + // Whether an error occurred during the syncing process. + error: false, + + // actions: dojox.off.sync.ActionLog + // Our ActionLog that we store offline actions into for later + // replaying when we go online + actions: null, + + // autoSync: boolean + // For advanced usage; most developers can ignore this. + // Whether we do automatically sync on page load or when we go online. + // If true we do, if false syncing must be manually initiated. + // Defaults to true. + autoSync: true, + + // summary: + // An event handler that is called during the syncing process with + // the state of syncing. It is important that you connect to this + // method and respond to certain sync events, especially the + // "download" event. + // description: + // This event handler is called during the syncing process. You can + // do a dojo.connect to receive sync feedback: + // + // dojo.connect(dojox.off.sync, "onSync", someFunc); + // + // You will receive one argument, which is the type of the event + // and which can have the following values. + // + // The most common two types that you need to care about are "download" + // and "finished", especially if you are using the default + // Dojo Offline UI widget that does the hard work of informing + // the user through the UI about what is occuring during syncing. + // + // If you receive the "download" event, you should make a network call + // to retrieve and store your data somehow for offline access. The + // "finished" event indicates that syncing is done. An example: + // + // dojo.connect(dojox.off.sync, "onSync", function(type){ + // if(type == "download"){ + // // make a network call to download some data + // // for use offline + // dojo.xhrGet({ + // url: "downloadData.php", + // handleAs: "javascript", + // error: function(err){ + // dojox.off.sync.finishedDownloading(false, "Can't download data"); + // }, + // load: function(data){ + // // store our data + // dojox.storage.put("myData", data); + // + // // indicate we are finished downloading + // dojox.off.sync.finishedDownloading(true); + // } + // }); + // }else if(type == "finished"){ + // // update UI somehow to indicate we are finished, + // // such as using the download data to change the + // // available data + // } + // }) + // + // Here is the full list of event types if you want to do deep + // customization, such as updating your UI to display the progress + // of syncing (note that the default Dojo Offline UI widget does + // this for you if you choose to pull that in). Most of these + // are only appropriate for advanced usage and can be safely + // ignored: + // + // * "start" + // syncing has started + // * "refreshFiles" + // syncing will begin refreshing + // our offline file cache + // * "upload" + // syncing will begin uploading + // any local data changes we have on the client. + // This event is fired before we fire + // the dojox.off.sync.actions.onReplay event for + // each action to replay; use it to completely + // over-ride the replaying behavior and prevent + // it entirely, perhaps rolling your own sync + // protocol if needed. + // * "download" + // syncing will begin downloading any new data that is + // needed into persistent storage. Applications are required to + // implement this themselves, storing the required data into + // persistent local storage using Dojo Storage. + // * "finished" + // syncing is finished; this + // will be called whether an error ocurred or not; check + // dojox.off.sync.successful and dojox.off.sync.error for sync details + // * "cancel" + // Fired when canceling has been initiated; canceling will be + // attempted, followed by the sync event "finished". + onSync: function(/* String */ type){}, + + synchronize: function(){ /* void */ + // summary: Starts synchronizing + + //dojo.debug("synchronize"); + if(this.isSyncing || dojox.off.goingOnline || (!dojox.off.isOnline)){ + return; + } + + this.isSyncing = true; + this.successful = false; + this.details = []; + this.cancelled = false; + + this.start(); + }, + + cancel: function(){ /* void */ + // summary: + // Attempts to cancel this sync session + + if(!this.isSyncing){ return; } + + this.cancelled = true; + if(dojox.off.files.refreshing){ + dojox.off.files.abortRefresh(); + } + + this.onSync("cancel"); + }, + + finishedDownloading: function(successful /* boolean? */, + errorMessage /* String? */){ + // summary: + // Applications call this method from their + // after getting a "download" event in + // dojox.off.sync.onSync to signal that + // they are finished downloading any data + // that should be available offline + // successful: boolean? + // Whether our downloading was successful or not. + // If not present, defaults to true. + // errorMessage: String? + // If unsuccessful, a message explaining why + if(typeof successful == "undefined"){ + successful = true; + } + + if(!successful){ + this.successful = false; + this.details.push(errorMessage); + this.error = true; + } + + this.finished(); + }, + + start: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Called at the start of the syncing process. Advanced + // developers can over-ride this method to use their + // own sync mechanism to start syncing. + + if(this.cancelled){ + this.finished(); + return; + } + this.onSync("start"); + this.refreshFiles(); + }, + + refreshFiles: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Called when we are going to refresh our list + // of offline files during syncing. Advanced developers + // can over-ride this method to do some advanced magic related to + // refreshing files. + + //dojo.debug("refreshFiles"); + if(this.cancelled){ + this.finished(); + return; + } + + this.onSync("refreshFiles"); + + dojox.off.files.refresh(dojo.hitch(this, function(error, errorMessages){ + if(error){ + this.error = true; + this.successful = false; + for(var i = 0; i < errorMessages.length; i++){ + this.details.push(errorMessages[i]); + } + + // even if we get an error while syncing files, + // keep syncing so we can upload and download + // data + } + + this.upload(); + })); + }, + + upload: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Called when syncing wants to upload data. Advanced + // developers can over-ride this method to completely + // throw away the Action Log and replaying system + // and roll their own advanced sync mechanism if needed. + + if(this.cancelled){ + this.finished(); + return; + } + + this.onSync("upload"); + + // when we are done uploading start downloading + dojo.connect(this.actions, "onReplayFinished", this, this.download); + + // replay the actions log + this.actions.replay(); + }, + + download: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Called when syncing wants to download data. Advanced + // developers can over-ride this method to use their + // own sync mechanism. + + if(this.cancelled){ + this.finished(); + return; + } + + // apps should respond to the "download" + // event to download their data; when done + // they must call dojox.off.sync.finishedDownloading() + this.onSync("download"); + }, + + finished: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Called when syncing is finished. Advanced + // developers can over-ride this method to clean + // up after finishing their own sync + // mechanism they might have rolled. + this.isSyncing = false; + + this.successful = (!this.cancelled && !this.error); + + this.onSync("finished"); + }, + + _save: function(callback){ + this.actions._save(function(){ + callback(); + }); + }, + + _load: function(callback){ + this.actions._load(function(){ + callback(); + }); + } +}); + + +// summary: +// A class that records actions taken by a user when they are offline, +// suitable for replaying when the network reappears. +// description: +// The basic idea behind this method is to record user actions that would +// normally have to contact a server into an action log when we are +// offline, so that later when we are online we can simply replay this log +// in the order user actions happened so that they can be executed against +// the server, causing synchronization to happen. +// +// When we replay, for each of the actions that were added, we call a +// method named onReplay that applications should connect to and +// which will be called over and over for each of our actions -- +// applications should take the offline action +// information and use it to talk to a server to have this action +// actually happen online, 'syncing' themselves with the server. +// +// For example, if the action was "update" with the item that was updated, we +// might call some RESTian server API that exists for updating an item in +// our application. The server could either then do sophisticated merging +// and conflict resolution on the server side, for example, allowing you +// to pop up a custom merge UI, or could do automatic merging or nothing +// of the sort. When you are finished with this particular action, your +// application is then required to call continueReplay() on the actionLog object +// passed to onReplay() to continue replaying the action log, or haltReplay() +// with the reason for halting to completely stop the syncing/replaying +// process. +// +// For example, imagine that we have a web application that allows us to add +// contacts. If we are offline, and we update a contact, we would add an action; +// imagine that the user has to click an Update button after changing the values +// for a given contact: +// +// dojox.off.whenOffline(dojo.byId("updateButton"), "onclick", function(evt){ +// // get the updated customer values +// var customer = getCustomerValues(); +// +// // we are offline -- just record this action +// var action = {name: "update", customer: customer}; +// dojox.off.sync.actions.add(action) +// +// // persist this customer data into local storage as well +// dojox.storage.put(customer.name, customer); +// }) +// +// Then, when we go back online, the dojox.off.sync.actions.onReplay event +// will fire over and over, once for each action that was recorded while offline: +// +// dojo.connect(dojox.off.sync.actions, "onReplay", function(action, actionLog){ +// // called once for each action we added while offline, in the order +// // they were added +// if(action.name == "update"){ +// var customer = action.customer; +// +// // call some network service to update this customer +// dojo.xhrPost({ +// url: "updateCustomer.php", +// content: {customer: dojo.toJson(customer)}, +// error: function(err){ +// actionLog.haltReplay(err); +// }, +// load: function(data){ +// actionLog.continueReplay(); +// } +// }) +// } +// }) +// +// Note that the actions log is always automatically persisted locally while using it, so +// that if the user closes the browser or it crashes the actions will safely be stored +// for later replaying. +dojo.declare("dojox.off.sync.ActionLog", null, { + // entries: Array + // An array of our action entries, where each one is simply a custom + // object literal that were passed to add() when this action entry + // was added. + entries: [], + + // reasonHalted: String + // If we halted, the reason why + reasonHalted: null, + + // isReplaying: boolean + // If true, we are in the middle of replaying a command log; if false, + // then we are not + isReplaying: false, + + // autoSave: boolean + // Whether we automatically save the action log after each call to + // add(); defaults to true. For applications that are rapidly adding + // many action log entries in a short period of time, it can be + // useful to set this to false and simply call save() yourself when + // you are ready to persist your command log -- otherwise performance + // could be slow as the default action is to attempt to persist the + // actions log constantly with calls to add(). + autoSave: true, + + add: function(action /* Object */){ /* void */ + // summary: + // Adds an action to our action log + // description: + // This method will add an action to our + // action log, later to be replayed when we + // go from offline to online. 'action' + // will be available when this action is + // replayed and will be passed to onReplay. + // + // Example usage: + // + // dojox.off.sync.log.add({actionName: "create", itemType: "document", + // {title: "Message", content: "Hello World"}}); + // + // The object literal is simply a custom object appropriate + // for our application -- it can be anything that preserves the state + // of a user action that will be executed when we go back online + // and replay this log. In the above example, + // "create" is the name of this action; "documents" is the + // type of item this command is operating on, such as documents, contacts, + // tasks, etc.; and the final argument is the document that was created. + + if(this.isReplaying){ + throw "Programming error: you can not call " + + "dojox.off.sync.actions.add() while " + + "we are replaying an action log"; + } + + this.entries.push(action); + + // save our updated state into persistent + // storage + if(this.autoSave){ + this._save(); + } + }, + + onReplay: function(action /* Object */, + actionLog /* dojox.off.sync.ActionLog */){ /* void */ + // summary: + // Called when we replay our log, for each of our action + // entries. + // action: Object + // A custom object literal representing an action for this + // application, such as + // {actionName: "create", item: {title: "message", content: "hello world"}} + // actionLog: dojox.off.sync.ActionLog + // A reference to the dojox.off.sync.actions log so that developers + // can easily call actionLog.continueReplay() or actionLog.haltReplay(). + // description: + // This callback should be connected to by applications so that + // they can sync themselves when we go back online: + // + // dojo.connect(dojox.off.sync.actions, "onReplay", function(action, actionLog){ + // // do something + // }) + // + // When we replay our action log, this callback is called for each + // of our action entries in the order they were added. The + // 'action' entry that was passed to add() for this action will + // also be passed in to onReplay, so that applications can use this information + // to do their syncing, such as contacting a server web-service + // to create a new item, for example. + // + // Inside the method you connected to onReplay, you should either call + // actionLog.haltReplay(reason) if an error occurred and you would like to halt + // action replaying or actionLog.continueReplay() to have the action log + // continue replaying its log and proceed to the next action; + // the reason you must call these is the action you execute inside of + // onAction will probably be asynchronous, since it will be talking on + // the network, and you should call one of these two methods based on + // the result of your network call. + }, + + length: function(){ /* Number */ + // summary: + // Returns the length of this + // action log + return this.entries.length; + }, + + haltReplay: function(reason /* String */){ /* void */ + // summary: Halts replaying this command log. + // reason: String + // The reason we halted. + // description: + // This method is called as we are replaying an action log; it + // can be called from dojox.off.sync.actions.onReplay, for + // example, for an application to indicate an error occurred + // while replaying this action, halting further processing of + // the action log. Note that any action log entries that + // were processed before have their effects retained (i.e. + // they are not rolled back), while the action entry that was + // halted stays in our list of actions to later be replayed. + if(!this.isReplaying){ + return; + } + + if(reason){ + this.reasonHalted = reason.toString(); + } + + // save the state of our action log, then + // tell anyone who is interested that we are + // done when we are finished saving + if(this.autoSave){ + var self = this; + this._save(function(){ + self.isReplaying = false; + self.onReplayFinished(); + }); + }else{ + this.isReplaying = false; + this.onReplayFinished(); + } + }, + + continueReplay: function(){ /* void */ + // summary: + // Indicates that we should continue processing out list of + // actions. + // description: + // This method is called by applications that have overridden + // dojox.off.sync.actions.onReplay() to continue replaying our + // action log after the application has finished handling the + // current action. + if(!this.isReplaying){ + return; + } + + // shift off the old action we just ran + this.entries.shift(); + + // are we done? + if(!this.entries.length){ + // save the state of our action log, then + // tell anyone who is interested that we are + // done when we are finished saving + if(this.autoSave){ + var self = this; + this._save(function(){ + self.isReplaying = false; + self.onReplayFinished(); + }); + return; + }else{ + this.isReplaying = false; + this.onReplayFinished(); + return; + } + } + + // get the next action + var nextAction = this.entries[0]; + this.onReplay(nextAction, this); + }, + + clear: function(){ /* void */ + // summary: + // Completely clears this action log of its entries + + if(this.isReplaying){ + return; + } + + this.entries = []; + + // save our updated state into persistent + // storage + if(this.autoSave){ + this._save(); + } + }, + + replay: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Replays all of the commands that have been + // cached in this command log when we go back online; + // onCommand will be called for each command we have + + if(this.isReplaying){ + return; + } + + this.reasonHalted = null; + + if(!this.entries.length){ + this.onReplayFinished(); + return; + } + + this.isReplaying = true; + + var nextAction = this.entries[0]; + this.onReplay(nextAction, this); + }, + + // onReplayFinished: Function + // For advanced usage; most developers can ignore this. + // Called when we are finished replaying our commands; + // called if we have successfully exhausted all of our + // commands, or if an error occurred during replaying. + // The default implementation simply continues the + // synchronization process. Connect to this to register + // for the event: + // + // dojo.connect(dojox.off.sync.actions, "onReplayFinished", + // someFunc) + onReplayFinished: function(){ + }, + + toString: function(){ + var results = ""; + results += "["; + + for(var i = 0; i < this.entries.length; i++){ + results += "{"; + for(var j in this.entries[i]){ + results += j + ": \"" + this.entries[i][j] + "\""; + results += ", "; + } + results += "}, "; + } + + results += "]"; + + return results; + }, + + _save: function(callback){ + if(!callback){ + callback = function(){}; + } + + try{ + var self = this; + var resultsHandler = function(status, key, message){ + //console.debug("resultsHandler, status="+status+", key="+key+", message="+message); + if(status == dojox.storage.FAILED){ + dojox.off.onFrameworkEvent("save", + {status: dojox.storage.FAILED, + isCoreSave: true, + key: key, + value: message, + namespace: dojox.off.STORAGE_NAMESPACE}); + callback(); + }else if(status == dojox.storage.SUCCESS){ + callback(); + } + }; + + dojox.storage.put("actionlog", this.entries, resultsHandler, + dojox.off.STORAGE_NAMESPACE); + }catch(exp){ + console.debug("dojox.off.sync._save: " + exp.message||exp); + dojox.off.onFrameworkEvent("save", + {status: dojox.storage.FAILED, + isCoreSave: true, + key: "actionlog", + value: this.entries, + namespace: dojox.off.STORAGE_NAMESPACE}); + callback(); + } + }, + + _load: function(callback){ + var entries = dojox.storage.get("actionlog", dojox.off.STORAGE_NAMESPACE); + + if(!entries){ + entries = []; + } + + this.entries = entries; + + callback(); + } + } +); + +dojox.off.sync.actions = new dojox.off.sync.ActionLog(); + +} + +if(!dojo._hasResource["dojox.off._common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off._common"] = true; +dojo.provide("dojox.off._common"); + + + + + +// Author: Brad Neuberg, bkn3@columbia.edu, http://codinginparadise.org + +// summary: +// dojox.off is the main object for offline applications. +dojo.mixin(dojox.off, { + // isOnline: boolean + // true if we are online, false if not + isOnline: false, + + // NET_CHECK: int + // For advanced usage; most developers can ignore this. + // Time in seconds on how often we should check the status of the + // network with an automatic background timer. The current default + // is 5 seconds. + NET_CHECK: 5, + + // STORAGE_NAMESPACE: String + // For advanced usage; most developers can ignore this. + // The namespace we use to save core data into Dojo Storage. + STORAGE_NAMESPACE: "_dot", + + // enabled: boolean + // For advanced usage; most developers can ignore this. + // Whether offline ability is enabled or not. Defaults to true. + enabled: true, + + // availabilityURL: String + // For advanced usage; most developers can ignore this. + // The URL to check for site availability. We do a GET request on + // this URL to check for site availability. By default we check for a + // simple text file in src/off/network_check.txt that has one value + // it, the value '1'. + availabilityURL: dojo.moduleUrl("dojox", "off/network_check.txt"), + + // goingOnline: boolean + // For advanced usage; most developers can ignore this. + // True if we are attempting to go online, false otherwise + goingOnline: false, + + // coreOpFailed: boolean + // For advanced usage; most developers can ignore this. + // A flag set by the Dojo Offline framework that indicates that the + // user denied some operation that required the offline cache or an + // operation failed in some critical way that was unrecoverable. For + // example, if the offline cache is Google Gears and we try to get a + // Gears database, a popup window appears asking the user whether they + // will approve or deny this request. If the user denies the request, + // and we are doing some operation that is core to Dojo Offline, then + // we set this flag to 'true'. This flag causes a 'fail fast' + // condition, turning off offline ability. + coreOpFailed: false, + + // doNetChecking: boolean + // For advanced usage; most developers can ignore this. + // Whether to have a timing interval in the background doing automatic + // network checks at regular intervals; the length of time between + // checks is controlled by dojox.off.NET_CHECK. Defaults to true. + doNetChecking: true, + + // hasOfflineCache: boolean + // For advanced usage; most developers can ignore this. + // Determines if an offline cache is available or installed; an + // offline cache is a facility that can truely cache offline + // resources, such as JavaScript, HTML, etc. in such a way that they + // won't be removed from the cache inappropriately like a browser + // cache would. If this is false then an offline cache will be + // installed. Only Google Gears is currently supported as an offline + // cache. Future possible offline caches include Firefox 3. + hasOfflineCache: null, + + // browserRestart: boolean + // For advanced usage; most developers can ignore this. + // If true, the browser must be restarted to register the existence of + // a new host added offline (from a call to addHostOffline); if false, + // then nothing is needed. + browserRestart: false, + + _STORAGE_APP_NAME: window.location.href.replace(/[^0-9A-Za-z_]/g, "_"), + + _initializeCalled: false, + _storageLoaded: false, + _pageLoaded: false, + + onLoad: function(){ + // summary: + // Called when Dojo Offline can be used. + // description: + // Do a dojo.connect to this to know when you can + // start using Dojo Offline: + // dojo.connect(dojox.off, "onLoad", myFunc); + }, + + onNetwork: function(type){ + // summary: + // Called when our on- or offline- status changes. + // description: + // If we move online, then this method is called with the + // value "online". If we move offline, then this method is + // called with the value "offline". You can connect to this + // method to do add your own behavior: + // + // dojo.connect(dojox.off, "onNetwork", someFunc) + // + // Note that if you are using the default Dojo Offline UI + // widget that most of the on- and off-line notification + // and syncing is automatically handled and provided to the + // user. + // type: String + // Either "online" or "offline". + }, + + initialize: function(){ /* void */ + // summary: + // Called when a Dojo Offline-enabled application is finished + // configuring Dojo Offline, and is ready for Dojo Offline to + // initialize itself. + // description: + // When an application has finished filling out the variables Dojo + // Offline needs to work, such as dojox.off.ui.appName, it must + // this method to tell Dojo Offline to initialize itself. + + // Note: + // This method is needed for a rare edge case. In some conditions, + // especially if we are dealing with a compressed Dojo build, the + // entire Dojo Offline subsystem might initialize itself and be + // running even before the JavaScript for an application has had a + // chance to run and configure Dojo Offline, causing Dojo Offline + // to have incorrect initialization parameters for a given app, + // such as no value for dojox.off.ui.appName. This method is + // provided to prevent this scenario, to slightly 'slow down' Dojo + // Offline so it can be configured before running off and doing + // its thing. + + //console.debug("dojox.off.initialize"); + this._initializeCalled = true; + + if(this._storageLoaded && this._pageLoaded){ + this._onLoad(); + } + }, + + goOffline: function(){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Manually goes offline, away from the network. + if((dojox.off.sync.isSyncing)||(this.goingOnline)){ return; } + + this.goingOnline = false; + this.isOnline = false; + }, + + goOnline: function(callback){ /* void */ + // summary: + // For advanced usage; most developers can ignore this. + // Attempts to go online. + // description: + // Attempts to go online, making sure this web application's web + // site is available. 'callback' is called asychronously with the + // result of whether we were able to go online or not. + // callback: Function + // An optional callback function that will receive one argument: + // whether the site is available or not and is boolean. If this + // function is not present we call dojo.xoff.onOnline instead if + // we are able to go online. + + //console.debug("goOnline"); + + if(dojox.off.sync.isSyncing || dojox.off.goingOnline){ + return; + } + + this.goingOnline = true; + this.isOnline = false; + + // see if can reach our web application's web site + this._isSiteAvailable(callback); + }, + + onFrameworkEvent: function(type /* String */, saveData /* Object? */){ + // summary: + // For advanced usage; most developers can ignore this. + // A standard event handler that can be attached to to find out + // about low-level framework events. Most developers will not need to + // attach to this method; it is meant for low-level information + // that can be useful for updating offline user-interfaces in + // exceptional circumstances. The default Dojo Offline UI + // widget takes care of most of these situations. + // type: String + // The type of the event: + // + // * "offlineCacheInstalled" + // An event that is fired when a user + // has installed an offline cache after the page has been loaded. + // If a user didn't have an offline cache when the page loaded, a + // UI of some kind might have prompted them to download one. This + // method is called if they have downloaded and installed an + // offline cache so a UI can reinitialize itself to begin using + // this offline cache. + // * "coreOperationFailed" + // Fired when a core operation during interaction with the + // offline cache is denied by the user. Some offline caches, such + // as Google Gears, prompts the user to approve or deny caching + // files, using the database, and more. If the user denies a + // request that is core to Dojo Offline's operation, we set + // dojox.off.coreOpFailed to true and call this method for + // listeners that would like to respond some how to Dojo Offline + // 'failing fast'. + // * "save" + // Called whenever the framework saves data into persistent + // storage. This could be useful for providing save feedback + // or providing appropriate error feedback if saving fails + // due to a user not allowing the save to occur + // saveData: Object? + // If the type was 'save', then a saveData object is provided with + // further save information. This object has the following properties: + // + // * status - dojox.storage.SUCCESS, dojox.storage.PENDING, dojox.storage.FAILED + // Whether the save succeeded, whether it is pending based on a UI + // dialog asking the user for permission, or whether it failed. + // + // * isCoreSave - boolean + // If true, then this save was for a core piece of data necessary + // for the functioning of Dojo Offline. If false, then it is a + // piece of normal data being saved for offline access. Dojo + // Offline will 'fail fast' if some core piece of data could not + // be saved, automatically setting dojox.off.coreOpFailed to + // 'true' and dojox.off.enabled to 'false'. + // + // * key - String + // The key that we are attempting to persist + // + // * value - Object + // The object we are trying to persist + // + // * namespace - String + // The Dojo Storage namespace we are saving this key/value pair + // into, such as "default", "Documents", "Contacts", etc. + // Optional. + if(type == "save"){ + if(saveData.isCoreSave && (saveData.status == dojox.storage.FAILED)){ + dojox.off.coreOpFailed = true; + dojox.off.enabled = false; + + // FIXME: Stop the background network thread + dojox.off.onFrameworkEvent("coreOperationFailed"); + } + }else if(type == "coreOperationFailed"){ + dojox.off.coreOpFailed = true; + dojox.off.enabled = false; + // FIXME: Stop the background network thread + } + }, + + _checkOfflineCacheAvailable: function(callback){ + // is a true, offline cache running on this machine? + this.hasOfflineCache = dojo.isGears; + + callback(); + }, + + _onLoad: function(){ + //console.debug("dojox.off._onLoad"); + + // both local storage and the page are finished loading + + // cache the Dojo JavaScript -- just use the default dojo.js + // name for the most common scenario + // FIXME: TEST: Make sure syncing doesn't break if dojo.js + // can't be found, or report an error to developer + dojox.off.files.cache(dojo.moduleUrl("dojo", "dojo.js")); + + // pull in the files needed by Dojo + this._cacheDojoResources(); + + // FIXME: need to pull in the firebug lite files here! + // workaround or else we will get an error on page load + // from Dojo that it can't find 'console.debug' for optimized builds + // dojox.off.files.cache(dojo.config.baseRelativePath + "src/debug.js"); + + // make sure that resources needed by all of our underlying + // Dojo Storage storage providers will be available + // offline + dojox.off.files.cache(dojox.storage.manager.getResourceList()); + + // slurp the page if the end-developer wants that + dojox.off.files._slurp(); + + // see if we have an offline cache; when done, move + // on to the rest of our startup tasks + this._checkOfflineCacheAvailable(dojo.hitch(this, "_onOfflineCacheChecked")); + }, + + _onOfflineCacheChecked: function(){ + // this method is part of our _onLoad series of startup tasks + + // if we have an offline cache, see if we have been added to the + // list of available offline web apps yet + if(this.hasOfflineCache && this.enabled){ + // load framework data; when we are finished, continue + // initializing ourselves + this._load(dojo.hitch(this, "_finishStartingUp")); + }else if(this.hasOfflineCache && !this.enabled){ + // we have an offline cache, but it is disabled for some reason + // perhaps due to the user denying a core operation + this._finishStartingUp(); + }else{ + this._keepCheckingUntilInstalled(); + } + }, + + _keepCheckingUntilInstalled: function(){ + // this method is part of our _onLoad series of startup tasks + + // kick off a background interval that keeps + // checking to see if an offline cache has been + // installed since this page loaded + + // FIXME: Gears: See if we are installed somehow after the + // page has been loaded + + // now continue starting up + this._finishStartingUp(); + }, + + _finishStartingUp: function(){ + //console.debug("dojox.off._finishStartingUp"); + + // this method is part of our _onLoad series of startup tasks + + if(!this.hasOfflineCache){ + this.onLoad(); + }else if(this.enabled){ + // kick off a thread to check network status on + // a regular basis + this._startNetworkThread(); + + // try to go online + this.goOnline(dojo.hitch(this, function(){ + //console.debug("Finished trying to go online"); + // indicate we are ready to be used + dojox.off.onLoad(); + })); + }else{ // we are disabled or a core operation failed + if(this.coreOpFailed){ + this.onFrameworkEvent("coreOperationFailed"); + }else{ + this.onLoad(); + } + } + }, + + _onPageLoad: function(){ + //console.debug("dojox.off._onPageLoad"); + this._pageLoaded = true; + + if(this._storageLoaded && this._initializeCalled){ + this._onLoad(); + } + }, + + _onStorageLoad: function(){ + //console.debug("dojox.off._onStorageLoad"); + this._storageLoaded = true; + + // were we able to initialize storage? if + // not, then this is a core operation, and + // let's indicate we will need to fail fast + if(!dojox.storage.manager.isAvailable() + && dojox.storage.manager.isInitialized()){ + this.coreOpFailed = true; + this.enabled = false; + } + + if(this._pageLoaded && this._initializeCalled){ + this._onLoad(); + } + }, + + _isSiteAvailable: function(callback){ + // summary: + // Determines if our web application's website is available. + // description: + // This method will asychronously determine if our web + // application's web site is available, which is a good proxy for + // network availability. The URL dojox.off.availabilityURL is + // used, which defaults to this site's domain name (ex: + // foobar.com). We check for dojox.off.AVAILABILITY_TIMEOUT (in + // seconds) and abort after that + // callback: Function + // An optional callback function that will receive one argument: + // whether the site is available or not and is boolean. If this + // function is not present we call dojox.off.onNetwork instead if we + // are able to go online. + dojo.xhrGet({ + url: this._getAvailabilityURL(), + handleAs: "text", + timeout: this.NET_CHECK * 1000, + error: dojo.hitch(this, function(err){ + //console.debug("dojox.off._isSiteAvailable.error: " + err); + this.goingOnline = false; + this.isOnline = false; + if(callback){ callback(false); } + }), + load: dojo.hitch(this, function(data){ + //console.debug("dojox.off._isSiteAvailable.load, data="+data); + this.goingOnline = false; + this.isOnline = true; + + if(callback){ callback(true); + }else{ this.onNetwork("online"); } + }) + }); + }, + + _startNetworkThread: function(){ + //console.debug("startNetworkThread"); + + // kick off a thread that does periodic + // checks on the status of the network + if(!this.doNetChecking){ + return; + } + + window.setInterval(dojo.hitch(this, function(){ + var d = dojo.xhrGet({ + url: this._getAvailabilityURL(), + handleAs: "text", + timeout: this.NET_CHECK * 1000, + error: dojo.hitch(this, + function(err){ + if(this.isOnline){ + this.isOnline = false; + + // FIXME: xhrGet() is not + // correctly calling abort + // on the XHR object when + // it times out; fix inside + // there instead of externally + // here + try{ + if(typeof d.ioArgs.xhr.abort == "function"){ + d.ioArgs.xhr.abort(); + } + }catch(e){} + + // if things fell in the middle of syncing, + // stop syncing + dojox.off.sync.isSyncing = false; + + this.onNetwork("offline"); + } + } + ), + load: dojo.hitch(this, + function(data){ + if(!this.isOnline){ + this.isOnline = true; + this.onNetwork("online"); + } + } + ) + }); + + }), this.NET_CHECK * 1000); + }, + + _getAvailabilityURL: function(){ + var url = this.availabilityURL.toString(); + + // bust the browser's cache to make sure we are really talking to + // the server + if(url.indexOf("?") == -1){ + url += "?"; + }else{ + url += "&"; + } + url += "browserbust=" + new Date().getTime(); + + return url; + }, + + _onOfflineCacheInstalled: function(){ + this.onFrameworkEvent("offlineCacheInstalled"); + }, + + _cacheDojoResources: function(){ + // if we are a non-optimized build, then the core Dojo bootstrap + // system was loaded as separate JavaScript files; + // add these to our offline cache list. these are + // loaded before the dojo.require() system exists + + // FIXME: create a better mechanism in the Dojo core to + // expose whether you are dealing with an optimized build; + // right now we just scan the SCRIPT tags attached to this + // page and see if there is one for _base/_loader/bootstrap.js + var isOptimizedBuild = true; + dojo.forEach(dojo.query("script"), function(i){ + var src = i.getAttribute("src"); + if(!src){ return; } + + if(src.indexOf("_base/_loader/bootstrap.js") != -1){ + isOptimizedBuild = false; + } + }); + + if(!isOptimizedBuild){ + dojox.off.files.cache(dojo.moduleUrl("dojo", "_base.js").uri); + dojox.off.files.cache(dojo.moduleUrl("dojo", "_base/_loader/loader.js").uri); + dojox.off.files.cache(dojo.moduleUrl("dojo", "_base/_loader/bootstrap.js").uri); + + // FIXME: pull in the host environment file in a more generic way + // for other host environments + dojox.off.files.cache(dojo.moduleUrl("dojo", "_base/_loader/hostenv_browser.js").uri); + } + + // add anything that was brought in with a + // dojo.require() that resulted in a JavaScript + // URL being fetched + + // FIXME: modify dojo/_base/_loader/loader.js to + // expose a public API to get this information + + for(var i = 0; i < dojo._loadedUrls.length; i++){ + dojox.off.files.cache(dojo._loadedUrls[i]); + } + + // FIXME: add the standard Dojo CSS file + }, + + _save: function(){ + // summary: + // Causes the Dojo Offline framework to save its configuration + // data into local storage. + }, + + _load: function(callback){ + // summary: + // Causes the Dojo Offline framework to load its configuration + // data from local storage + dojox.off.sync._load(callback); + } +}); + + +// wait until the storage system is finished loading +dojox.storage.manager.addOnLoad(dojo.hitch(dojox.off, "_onStorageLoad")); + +// wait until the page is finished loading +dojo.addOnLoad(dojox.off, "_onPageLoad"); + +} + +if(!dojo._hasResource["dojox.off"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off"] = true; +dojo.provide("dojox.off"); + + +} + +if(!dojo._hasResource["dojox.off.ui"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off.ui"] = true; +dojo.provide("dojox.off.ui"); + + + + + +// Author: Brad Neuberg, bkn3@columbia.edu, http://codinginparadise.org + +// summary: +// dojox.off.ui provides a standard, +// default user-interface for a +// Dojo Offline Widget that can easily +// be dropped into applications that would +// like to work offline. +dojo.mixin(dojox.off.ui, { + // appName: String + // This application's name, such as "Foobar". Note that + // this is a string, not HTML, so embedded markup will + // not work, including entities. Only the following + // characters are allowed: numbers, letters, and spaces. + // You must set this property. + appName: "setme", + + // autoEmbed: boolean + // For advanced usage; most developers can ignore this. + // Whether to automatically auto-embed the default Dojo Offline + // widget into this page; default is true. + autoEmbed: true, + + // autoEmbedID: String + // For advanced usage; most developers can ignore this. + // The ID of the DOM element that will contain our + // Dojo Offline widget; defaults to the ID 'dot-widget'. + autoEmbedID: "dot-widget", + + // runLink: String + // For advanced usage; most developers can ignore this. + // The URL that should be navigated to to run this + // application offline; this will be placed inside of a + // link that the user can drag to their desktop and double + // click. Note that this URL must exactly match the URL + // of the main page of our resource that is offline for + // it to be retrieved from the offline cache correctly. + // For example, if you have cached your main page as + // http://foobar.com/index.html, and you set this to + // http://www.foobar.com/index.html, the run link will + // not work. By default this value is automatically set to + // the URL of this page, so it does not need to be set + // manually unless you have unusual needs. + runLink: window.location.href, + + // runLinkTitle: String + // For advanced usage; most developers can ignore this. + // The text that will be inside of the link that a user + // can drag to their desktop to run this application offline. + // By default this is automatically set to "Run " plus your + // application's name. + runLinkTitle: "Run Application", + + // learnHowPath: String + // For advanced usage; most developers can ignore this. + // The path to a web page that has information on + // how to use this web app offline; defaults to + // src/off/ui-template/learnhow.html, relative to + // your Dojo installation. Make sure to set + // dojo.to.ui.customLearnHowPath to true if you want + // a custom Learn How page. + learnHowPath: dojo.moduleUrl("dojox", "off/resources/learnhow.html"), + + // customLearnHowPath: boolean + // For advanced usage; most developers can ignore this. + // Whether the developer is using their own custom page + // for the Learn How instructional page; defaults to false. + // Use in conjunction with dojox.off.ui.learnHowPath. + customLearnHowPath: false, + + htmlTemplatePath: dojo.moduleUrl("dojox", "off/resources/offline-widget.html").uri, + cssTemplatePath: dojo.moduleUrl("dojox", "off/resources/offline-widget.css").uri, + onlineImagePath: dojo.moduleUrl("dojox", "off/resources/greenball.png").uri, + offlineImagePath: dojo.moduleUrl("dojox", "off/resources/redball.png").uri, + rollerImagePath: dojo.moduleUrl("dojox", "off/resources/roller.gif").uri, + checkmarkImagePath: dojo.moduleUrl("dojox", "off/resources/checkmark.png").uri, + learnHowJSPath: dojo.moduleUrl("dojox", "off/resources/learnhow.js").uri, + + _initialized: false, + + onLoad: function(){ + // summary: + // A function that should be connected to allow your + // application to know when Dojo Offline, the page, and + // the Offline Widget are all initialized and ready to be + // used: + // + // dojo.connect(dojox.off.ui, "onLoad", someFunc) + }, + + _initialize: function(){ + //console.debug("dojox.off.ui._initialize"); + + // make sure our app name is correct + if(this._validateAppName(this.appName) == false){ + alert("You must set dojox.off.ui.appName; it can only contain " + + "letters, numbers, and spaces; right now it " + + "is incorrectly set to '" + dojox.off.ui.appName + "'"); + dojox.off.enabled = false; + return; + } + + // set our run link text to its default + this.runLinkText = "Run " + this.appName; + + // setup our event listeners for Dojo Offline events + // to update our UI + dojo.connect(dojox.off, "onNetwork", this, "_onNetwork"); + dojo.connect(dojox.off.sync, "onSync", this, "_onSync"); + + // cache our default UI resources + dojox.off.files.cache([ + this.htmlTemplatePath, + this.cssTemplatePath, + this.onlineImagePath, + this.offlineImagePath, + this.rollerImagePath, + this.checkmarkImagePath + ]); + + // embed the offline widget UI + if(this.autoEmbed){ + this._doAutoEmbed(); + } + }, + + _doAutoEmbed: function(){ + // fetch our HTML for the offline widget + + // dispatch the request + dojo.xhrGet({ + url: this.htmlTemplatePath, + handleAs: "text", + error: function(err){ + dojox.off.enabled = false; + err = err.message||err; + alert("Error loading the Dojo Offline Widget from " + + this.htmlTemplatePath + ": " + err); + }, + load: dojo.hitch(this, this._templateLoaded) + }); + }, + + _templateLoaded: function(data){ + //console.debug("dojox.off.ui._templateLoaded"); + // inline our HTML + var container = dojo.byId(this.autoEmbedID); + if(container){ container.innerHTML = data; } + + // fill out our image paths + this._initImages(); + + // update our network indicator status ball + this._updateNetIndicator(); + + // update our 'Learn How' text + this._initLearnHow(); + + this._initialized = true; + + // check offline cache settings + if(!dojox.off.hasOfflineCache){ + this._showNeedsOfflineCache(); + return; + } + + // check to see if we need a browser restart + // to be able to use this web app offline + if(dojox.off.hasOfflineCache && dojox.off.browserRestart){ + this._needsBrowserRestart(); + return; + }else{ + var browserRestart = dojo.byId("dot-widget-browser-restart"); + if(browserRestart){ browserRestart.style.display = "none"; } + } + + // update our sync UI + this._updateSyncUI(); + + // register our event listeners for our main buttons + this._initMainEvtHandlers(); + + // if offline functionality is disabled, disable everything + this._setOfflineEnabled(dojox.off.enabled); + + // update our UI based on the state of the network + this._onNetwork(dojox.off.isOnline ? "online" : "offline"); + + // try to go online + this._testNet(); + }, + + _testNet: function(){ + dojox.off.goOnline(dojo.hitch(this, function(isOnline){ + //console.debug("testNet callback, isOnline="+isOnline); + + // display our online/offline results + this._onNetwork(isOnline ? "online" : "offline"); + + // indicate that our default UI + // and Dojo Offline are now ready to + // be used + this.onLoad(); + })); + }, + + _updateNetIndicator: function(){ + var onlineImg = dojo.byId("dot-widget-network-indicator-online"); + var offlineImg = dojo.byId("dot-widget-network-indicator-offline"); + var titleText = dojo.byId("dot-widget-title-text"); + + if(onlineImg && offlineImg){ + if(dojox.off.isOnline == true){ + onlineImg.style.display = "inline"; + offlineImg.style.display = "none"; + }else{ + onlineImg.style.display = "none"; + offlineImg.style.display = "inline"; + } + } + + if(titleText){ + if(dojox.off.isOnline){ + titleText.innerHTML = "Online"; + }else{ + titleText.innerHTML = "Offline"; + } + } + }, + + _initLearnHow: function(){ + var learnHow = dojo.byId("dot-widget-learn-how-link"); + + if(!learnHow){ return; } + + if(!this.customLearnHowPath){ + // add parameters to URL so the Learn How page + // can customize itself and display itself + // correctly based on framework settings + var dojoPath = dojo.config.baseRelativePath; + this.learnHowPath += "?appName=" + encodeURIComponent(this.appName) + + "&hasOfflineCache=" + dojox.off.hasOfflineCache + + "&runLink=" + encodeURIComponent(this.runLink) + + "&runLinkText=" + encodeURIComponent(this.runLinkText) + + "&baseRelativePath=" + encodeURIComponent(dojoPath); + + // cache our Learn How JavaScript page and + // the HTML version with full query parameters + // so it is available offline without a cache miss + dojox.off.files.cache(this.learnHowJSPath); + dojox.off.files.cache(this.learnHowPath); + } + + learnHow.setAttribute("href", this.learnHowPath); + + var appName = dojo.byId("dot-widget-learn-how-app-name"); + + if(!appName){ return; } + + appName.innerHTML = ""; + appName.appendChild(document.createTextNode(this.appName)); + }, + + _validateAppName: function(appName){ + if(!appName){ return false; } + + return (/^[a-z0-9 ]*$/i.test(appName)); + }, + + _updateSyncUI: function(){ + var roller = dojo.byId("dot-roller"); + var checkmark = dojo.byId("dot-success-checkmark"); + var syncMessages = dojo.byId("dot-sync-messages"); + var details = dojo.byId("dot-sync-details"); + var cancel = dojo.byId("dot-sync-cancel"); + + if(dojox.off.sync.isSyncing){ + this._clearSyncMessage(); + + if(roller){ roller.style.display = "inline"; } + + if(checkmark){ checkmark.style.display = "none"; } + + if(syncMessages){ + dojo.removeClass(syncMessages, "dot-sync-error"); + } + + if(details){ details.style.display = "none"; } + + if(cancel){ cancel.style.display = "inline"; } + }else{ + if(roller){ roller.style.display = "none"; } + + if(cancel){ cancel.style.display = "none"; } + + if(syncMessages){ + dojo.removeClass(syncMessages, "dot-sync-error"); + } + } + }, + + _setSyncMessage: function(message){ + var syncMessage = dojo.byId("dot-sync-messages"); + if(syncMessage){ + // when used with Google Gears pre-release in Firefox/Mac OS X, + // the browser would crash when testing in Moxie + // if we set the message this way for some reason. + // Brad Neuberg, bkn3@columbia.edu + //syncMessage.innerHTML = message; + + while(syncMessage.firstChild){ + syncMessage.removeChild(syncMessage.firstChild); + } + syncMessage.appendChild(document.createTextNode(message)); + } + }, + + _clearSyncMessage: function(){ + this._setSyncMessage(""); + }, + + _initImages: function(){ + var onlineImg = dojo.byId("dot-widget-network-indicator-online"); + if(onlineImg){ + onlineImg.setAttribute("src", this.onlineImagePath); + } + + var offlineImg = dojo.byId("dot-widget-network-indicator-offline"); + if(offlineImg){ + offlineImg.setAttribute("src", this.offlineImagePath); + } + + var roller = dojo.byId("dot-roller"); + if(roller){ + roller.setAttribute("src", this.rollerImagePath); + } + + var checkmark = dojo.byId("dot-success-checkmark"); + if(checkmark){ + checkmark.setAttribute("src", this.checkmarkImagePath); + } + }, + + _showDetails: function(evt){ + // cancel the button's default behavior + evt.preventDefault(); + evt.stopPropagation(); + + if(!dojox.off.sync.details.length){ + return; + } + + // determine our HTML message to display + var html = ""; + html += "Sync Details"; + html += "

                        Sync Details

                        \n"; + html += "
                          \n"; + for(var i = 0; i < dojox.off.sync.details.length; i++){ + html += "
                        • "; + html += dojox.off.sync.details[i]; + html += "
                        • "; + } + html += "
                        \n"; + html += "" + + "Close Window" + + "\n"; + html += ""; + + // open a popup window with this message + var windowParams = "height=400,width=600,resizable=true," + + "scrollbars=true,toolbar=no,menubar=no," + + "location=no,directories=no,dependent=yes"; + + var popup = window.open("", "SyncDetails", windowParams); + + if(!popup){ // aggressive popup blocker + alert("Please allow popup windows for this domain; can't display sync details window"); + return; + } + + popup.document.open(); + popup.document.write(html); + popup.document.close(); + + // put the focus on the popup window + if(popup.focus){ + popup.focus(); + } + }, + + _cancel: function(evt){ + // cancel the button's default behavior + evt.preventDefault(); + evt.stopPropagation(); + + dojox.off.sync.cancel(); + }, + + _needsBrowserRestart: function(){ + var browserRestart = dojo.byId("dot-widget-browser-restart"); + if(browserRestart){ + dojo.addClass(browserRestart, "dot-needs-browser-restart"); + } + + var appName = dojo.byId("dot-widget-browser-restart-app-name"); + if(appName){ + appName.innerHTML = ""; + appName.appendChild(document.createTextNode(this.appName)); + } + + var status = dojo.byId("dot-sync-status"); + if(status){ + status.style.display = "none"; + } + }, + + _showNeedsOfflineCache: function(){ + var widgetContainer = dojo.byId("dot-widget-container"); + if(widgetContainer){ + dojo.addClass(widgetContainer, "dot-needs-offline-cache"); + } + }, + + _hideNeedsOfflineCache: function(){ + var widgetContainer = dojo.byId("dot-widget-container"); + if(widgetContainer){ + dojo.removeClass(widgetContainer, "dot-needs-offline-cache"); + } + }, + + _initMainEvtHandlers: function(){ + var detailsButton = dojo.byId("dot-sync-details-button"); + if(detailsButton){ + dojo.connect(detailsButton, "onclick", this, this._showDetails); + } + var cancelButton = dojo.byId("dot-sync-cancel-button"); + if(cancelButton){ + dojo.connect(cancelButton, "onclick", this, this._cancel); + } + }, + + _setOfflineEnabled: function(enabled){ + var elems = []; + elems.push(dojo.byId("dot-sync-status")); + + for(var i = 0; i < elems.length; i++){ + if(elems[i]){ + elems[i].style.visibility = + (enabled ? "visible" : "hidden"); + } + } + }, + + _syncFinished: function(){ + this._updateSyncUI(); + + var checkmark = dojo.byId("dot-success-checkmark"); + var details = dojo.byId("dot-sync-details"); + + if(dojox.off.sync.successful == true){ + this._setSyncMessage("Sync Successful"); + if(checkmark){ checkmark.style.display = "inline"; } + }else if(dojox.off.sync.cancelled == true){ + this._setSyncMessage("Sync Cancelled"); + + if(checkmark){ checkmark.style.display = "none"; } + }else{ + this._setSyncMessage("Sync Error"); + + var messages = dojo.byId("dot-sync-messages"); + if(messages){ + dojo.addClass(messages, "dot-sync-error"); + } + + if(checkmark){ checkmark.style.display = "none"; } + } + + if(dojox.off.sync.details.length && details){ + details.style.display = "inline"; + } + }, + + _onFrameworkEvent: function(type, saveData){ + if(type == "save"){ + if(saveData.status == dojox.storage.FAILED && !saveData.isCoreSave){ + alert("Please increase the amount of local storage available " + + "to this application"); + if(dojox.storage.hasSettingsUI()){ + dojox.storage.showSettingsUI(); + } + + // FIXME: Be able to know if storage size has changed + // due to user configuration + } + }else if(type == "coreOperationFailed"){ + console.log("Application does not have permission to use Dojo Offline"); + + if(!this._userInformed){ + alert("This application will not work if Google Gears is not allowed to run"); + this._userInformed = true; + } + }else if(type == "offlineCacheInstalled"){ + // clear out the 'needs offline cache' info + this._hideNeedsOfflineCache(); + + // check to see if we need a browser restart + // to be able to use this web app offline + if(dojox.off.hasOfflineCache == true + && dojox.off.browserRestart == true){ + this._needsBrowserRestart(); + return; + }else{ + var browserRestart = dojo.byId("dot-widget-browser-restart"); + if(browserRestart){ + browserRestart.style.display = "none"; + } + } + + // update our sync UI + this._updateSyncUI(); + + // register our event listeners for our main buttons + this._initMainEvtHandlers(); + + // if offline is disabled, disable everything + this._setOfflineEnabled(dojox.off.enabled); + + // try to go online + this._testNet(); + } + }, + + _onSync: function(type){ + //console.debug("ui, onSync="+type); + switch(type){ + case "start": + this._updateSyncUI(); + break; + + case "refreshFiles": + this._setSyncMessage("Downloading UI..."); + break; + + case "upload": + this._setSyncMessage("Uploading new data..."); + break; + + case "download": + this._setSyncMessage("Downloading new data..."); + break; + + case "finished": + this._syncFinished(); + break; + + case "cancel": + this._setSyncMessage("Canceling Sync..."); + break; + + default: + dojo.warn("Programming error: " + + "Unknown sync type in dojox.off.ui: " + type); + break; + } + }, + + _onNetwork: function(type){ + // summary: + // Called when we go on- or off-line + // description: + // When we go online or offline, this method is called to update + // our UI. Default behavior is to update the Offline + // Widget UI and to attempt a synchronization. + // type: String + // "online" if we just moved online, and "offline" if we just + // moved offline. + + if(!this._initialized){ return; } + + // update UI + this._updateNetIndicator(); + + if(type == "offline"){ + this._setSyncMessage("You are working offline"); + + // clear old details + var details = dojo.byId("dot-sync-details"); + if(details){ details.style.display = "none"; } + + // if we fell offline during a sync, hide + // the sync info + this._updateSyncUI(); + }else{ // online + // synchronize, but pause for a few seconds + // so that the user can orient themselves + if(dojox.off.sync.autoSync){ + if(dojo.isAIR){ + window.setTimeout(function(){dojox.off.sync.synchronize();}, 1000); + }else{ + window.setTimeout(dojox._scopeName + ".off.sync.synchronize()", 1000); + } + } + } + } +}); + +// register ourselves for low-level framework events +dojo.connect(dojox.off, "onFrameworkEvent", dojox.off.ui, "_onFrameworkEvent"); + +// start our magic when the Dojo Offline framework is ready to go +dojo.connect(dojox.off, "onLoad", dojox.off.ui, dojox.off.ui._initialize); + +} + +if(!dojo._hasResource["dojox.off.offline"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.off.offline"] = true; +dojo.provide("dojox.off.offline"); + + + + + + + +} + diff --git a/includes/js/dojox/off/resources/checkmark.png b/includes/js/dojox/off/resources/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ffbb19ea4ef56c2baa631296474b00fa10fc3b GIT binary patch literal 27329 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 XXd?z%umt~iEmc`wU9MKfH0*x>S_Yr_ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/off/resources/greenball.png b/includes/js/dojox/off/resources/greenball.png new file mode 100644 index 0000000000000000000000000000000000000000..520b6a69368fd30067c9a478f3d05f561a280893 GIT binary patch literal 27414 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�b(9*bGX1xn%83dY5}E^lj;4A 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 + + + + + + + +
                        +

                        Want to use Application offline?

                        + +

                        It's simple with Dojo Offline! Dojo Offline is a free open source utility that makes it easy + for this web application to work, even if you're offline. Now you can + access your data even when away from the network!

                        + +

                        Dojo Offline is an open source project brought to you by + Dojo, SitePen, + and Brad Neuberg. It incorporates + technologies created by Google.

                        + +

                        To get started:

                        + +
                          +
                        1. + Download Gears, a small, open source utility created by Google that allows this web site + to work offline. This tool is safe and secure for your machine, and only takes + a few seconds to download. +
                        2. +
                        3. + Once downloaded, run the installer. Restart your web browser when finished installing. +
                        4. + + +
                        +
                        + + \ No newline at end of file diff --git a/includes/js/dojox/off/resources/learnhow.js b/includes/js/dojox/off/resources/learnhow.js new file mode 100644 index 0000000..82d5506 --- /dev/null +++ b/includes/js/dojox/off/resources/learnhow.js @@ -0,0 +1,43 @@ +window.onload = function(){ + // get the app name from our URL + var href = window.location.href; + var matches = href.match(/appName=([a-z0-9 \%]*)/i); + var appName = "Application"; + if(matches && matches.length > 0){ + appName = decodeURIComponent(matches[1]); + } + + // set it in our UI + var appNameSpan = document.getElementById("dot-learn-how-app-name"); + appNameSpan.innerHTML = ""; + appNameSpan.appendChild(document.createTextNode(appName)); + + // if we need an offline cache, and we already have one installed, + // update the UI + matches = href.match(/hasOfflineCache=(true|false)/); + var hasOfflineCache = false; + if(matches && matches.length > 0){ + hasOfflineCache = matches[1]; + // convert to boolean + hasOfflineCache = (hasOfflineCache == "true") ? true : false; + } + if(hasOfflineCache == true){ + // delete the download and install steps + var downloadStep = document.getElementById("dot-download-step"); + var installStep = document.getElementById("dot-install-step"); + downloadStep.parentNode.removeChild(downloadStep); + installStep.parentNode.removeChild(installStep); + } + + // get our run link info and update the UI + matches = href.match(/runLink=([^\&]*)\&runLinkText=([^\&]*)/); + if(matches && matches.length > 0){ + var runLink = decodeURIComponent(matches[1]); + var runLinkElem = document.getElementById("dot-learn-how-run-link"); + runLinkElem.setAttribute("href", runLink); + + var runLinkText = decodeURIComponent(matches[2]); + runLinkElem.innerHTML = ""; + runLinkElem.appendChild(document.createTextNode(runLinkText)); + } +} diff --git a/includes/js/dojox/off/resources/offline-widget.css b/includes/js/dojox/off/resources/offline-widget.css new file mode 100644 index 0000000..3d095e9 --- /dev/null +++ b/includes/js/dojox/off/resources/offline-widget.css @@ -0,0 +1,88 @@ + +#dot-widget-container{ + + width: 13em; + height: auto; + border: 2px solid #CDDDE9; + position: relative; + visibility: visible !important; +} +#dot-widget-title-bar{ + background-color: #CDDDE9; + padding-top: 0.2em; + padding-bottom: 0.2em; +} +#dot-widget-network-indicator{ + height: 8px; + width: 8px; + padding-left: 0.3em; +} +#dot-widget-title-text{ + vertical-align: middle; + font-weight: bold; + font-size: 14pt; + padding-left: 2px; +} +#dot-widget-contents{ + padding: 8px 5px 8px 5px; +} +#dot-widget-learn-how{ + font-size: 11pt; +} +#dot-sync-cancel, +#dot-sync-status{ + font-size: 11pt; +} +#dot-success-checkmark{ + display: none; +} +#dot-roller{ + display: none; + padding-right: 4px; +} +.dot-sync-error{ + color: red; +} +#dot-sync-details{ + display: none; + padding-left: 0.2em; +} +#dot-sync-status{ + height: 2em; + margin-top: 0.8em; + margin-bottom: 0.8em; +} +.dot-needs-offline-cache #dot-widget-learn-how, +.dot-needs-browser-restart{ + text-align: center; + line-height: 1.2; + font-size: 16pt !important; +} +.dot-needs-offline-cache #dot-sync-status, +.dot-needs-offline-cache #dot-widget-browser-restart{ + display: none; +} +.dot-needs-browser-restart{ + font-size: 14pt !important; + padding-bottom: 1em; + padding-top: 1em; +} +#dot-learn-how-body{ + padding: 3em; + background-color: #CDDDE9; +} +#dot-learn-how-contents{ + border: 1px solid black; + background-color: white; + padding: 0.4em 0.6em 0.4em 0.6em; + font-size: 16pt; +} +#dot-learn-how-contents h1{ + font-size: 24pt; +} +#dot-learn-how-contents h2{ + font-size: 18pt; +} +#dot-learn-how-contents li{ + padding-bottom: 0.6em; +} diff --git a/includes/js/dojox/off/resources/offline-widget.css.commented.css b/includes/js/dojox/off/resources/offline-widget.css.commented.css new file mode 100644 index 0000000..374a43b --- /dev/null +++ b/includes/js/dojox/off/resources/offline-widget.css.commented.css @@ -0,0 +1,112 @@ +/** Offline Widget Styles */ + +#dot-widget-container{ + /** + Keep these as EMs so widget reflows fluidly based on + user-font size settings + */ + width: 13em; + height: auto; + border: 2px solid #CDDDE9; /* light tundra blue */ + position: relative; + visibility: visible !important; +} + +#dot-widget-title-bar{ + background-color: #CDDDE9; /* light tundra blue */ + padding-top: 0.2em; + padding-bottom: 0.2em; +} + +#dot-widget-network-indicator{ + height: 8px; + width: 8px; + padding-left: 0.3em; +} + +#dot-widget-title-text{ + vertical-align: middle; + font-weight: bold; + font-size: 14pt; + padding-left: 2px; +} + +#dot-widget-contents{ + padding: 8px 5px 8px 5px; +} + +#dot-widget-learn-how{ + font-size: 11pt; +} + +#dot-sync-cancel, +#dot-sync-status{ + font-size: 11pt; +} + +#dot-success-checkmark{ + display: none; +} + +#dot-roller{ + display: none; + padding-right: 4px; +} + +.dot-sync-error{ + color: red; +} + +#dot-sync-details{ + display: none; + padding-left: 0.2em; +} + +#dot-sync-status{ + height: 2em; + margin-top: 0.8em; + margin-bottom: 0.8em; +} + +.dot-needs-offline-cache #dot-widget-learn-how, +.dot-needs-browser-restart{ + text-align: center; + line-height: 1.2; + font-size: 16pt !important; +} + +.dot-needs-offline-cache #dot-sync-status, +.dot-needs-offline-cache #dot-widget-browser-restart{ + display: none; +} + +.dot-needs-browser-restart{ + font-size: 14pt !important; + padding-bottom: 1em; + padding-top: 1em; +} + +/** Learn How Page Styles */ +#dot-learn-how-body{ + padding: 3em; + background-color: #CDDDE9; /* light tundra blue */ +} + +#dot-learn-how-contents{ + border: 1px solid black; + background-color: white; + padding: 0.4em 0.6em 0.4em 0.6em; + font-size: 16pt; +} + +#dot-learn-how-contents h1{ + font-size: 24pt; +} + +#dot-learn-how-contents h2{ + font-size: 18pt; +} + +#dot-learn-how-contents li{ + padding-bottom: 0.6em; +} diff --git a/includes/js/dojox/off/resources/offline-widget.html b/includes/js/dojox/off/resources/offline-widget.html new file mode 100644 index 0000000..5791644 --- /dev/null +++ b/includes/js/dojox/off/resources/offline-widget.html @@ -0,0 +1,40 @@ + + + \ No newline at end of file diff --git a/includes/js/dojox/off/resources/redball.png b/includes/js/dojox/off/resources/redball.png new file mode 100644 index 0000000000000000000000000000000000000000..cc224c390b33cfdc20db8428364cb154b0c59782 GIT binary patch literal 27409 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 XU^+`efOh}ihN`l>x?G)%S@{0|621^m literal 0 HcmV?d00001 diff --git a/includes/js/dojox/off/resources/roller.gif b/includes/js/dojox/off/resources/roller.gif new file mode 100644 index 0000000000000000000000000000000000000000..24a3a24a304908d3d8795b79f6776bc13f97c8e3 GIT binary patch literal 7462 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 nTsv02" + + "Close Window" + + "\n"; + html += ""; + + // open a popup window with this message + var windowParams = "height=400,width=600,resizable=true," + + "scrollbars=true,toolbar=no,menubar=no," + + "location=no,directories=no,dependent=yes"; + + var popup = window.open("", "SyncDetails", windowParams); + + if(!popup){ // aggressive popup blocker + alert("Please allow popup windows for this domain; can't display sync details window"); + return; + } + + popup.document.open(); + popup.document.write(html); + popup.document.close(); + + // put the focus on the popup window + if(popup.focus){ + popup.focus(); + } + }, + + _cancel: function(evt){ + // cancel the button's default behavior + evt.preventDefault(); + evt.stopPropagation(); + + dojox.off.sync.cancel(); + }, + + _needsBrowserRestart: function(){ + var browserRestart = dojo.byId("dot-widget-browser-restart"); + if(browserRestart){ + dojo.addClass(browserRestart, "dot-needs-browser-restart"); + } + + var appName = dojo.byId("dot-widget-browser-restart-app-name"); + if(appName){ + appName.innerHTML = ""; + appName.appendChild(document.createTextNode(this.appName)); + } + + var status = dojo.byId("dot-sync-status"); + if(status){ + status.style.display = "none"; + } + }, + + _showNeedsOfflineCache: function(){ + var widgetContainer = dojo.byId("dot-widget-container"); + if(widgetContainer){ + dojo.addClass(widgetContainer, "dot-needs-offline-cache"); + } + }, + + _hideNeedsOfflineCache: function(){ + var widgetContainer = dojo.byId("dot-widget-container"); + if(widgetContainer){ + dojo.removeClass(widgetContainer, "dot-needs-offline-cache"); + } + }, + + _initMainEvtHandlers: function(){ + var detailsButton = dojo.byId("dot-sync-details-button"); + if(detailsButton){ + dojo.connect(detailsButton, "onclick", this, this._showDetails); + } + var cancelButton = dojo.byId("dot-sync-cancel-button"); + if(cancelButton){ + dojo.connect(cancelButton, "onclick", this, this._cancel); + } + }, + + _setOfflineEnabled: function(enabled){ + var elems = []; + elems.push(dojo.byId("dot-sync-status")); + + for(var i = 0; i < elems.length; i++){ + if(elems[i]){ + elems[i].style.visibility = + (enabled ? "visible" : "hidden"); + } + } + }, + + _syncFinished: function(){ + this._updateSyncUI(); + + var checkmark = dojo.byId("dot-success-checkmark"); + var details = dojo.byId("dot-sync-details"); + + if(dojox.off.sync.successful == true){ + this._setSyncMessage("Sync Successful"); + if(checkmark){ checkmark.style.display = "inline"; } + }else if(dojox.off.sync.cancelled == true){ + this._setSyncMessage("Sync Cancelled"); + + if(checkmark){ checkmark.style.display = "none"; } + }else{ + this._setSyncMessage("Sync Error"); + + var messages = dojo.byId("dot-sync-messages"); + if(messages){ + dojo.addClass(messages, "dot-sync-error"); + } + + if(checkmark){ checkmark.style.display = "none"; } + } + + if(dojox.off.sync.details.length && details){ + details.style.display = "inline"; + } + }, + + _onFrameworkEvent: function(type, saveData){ + if(type == "save"){ + if(saveData.status == dojox.storage.FAILED && !saveData.isCoreSave){ + alert("Please increase the amount of local storage available " + + "to this application"); + if(dojox.storage.hasSettingsUI()){ + dojox.storage.showSettingsUI(); + } + + // FIXME: Be able to know if storage size has changed + // due to user configuration + } + }else if(type == "coreOperationFailed"){ + console.log("Application does not have permission to use Dojo Offline"); + + if(!this._userInformed){ + alert("This application will not work if Google Gears is not allowed to run"); + this._userInformed = true; + } + }else if(type == "offlineCacheInstalled"){ + // clear out the 'needs offline cache' info + this._hideNeedsOfflineCache(); + + // check to see if we need a browser restart + // to be able to use this web app offline + if(dojox.off.hasOfflineCache == true + && dojox.off.browserRestart == true){ + this._needsBrowserRestart(); + return; + }else{ + var browserRestart = dojo.byId("dot-widget-browser-restart"); + if(browserRestart){ + browserRestart.style.display = "none"; + } + } + + // update our sync UI + this._updateSyncUI(); + + // register our event listeners for our main buttons + this._initMainEvtHandlers(); + + // if offline is disabled, disable everything + this._setOfflineEnabled(dojox.off.enabled); + + // try to go online + this._testNet(); + } + }, + + _onSync: function(type){ + //console.debug("ui, onSync="+type); + switch(type){ + case "start": + this._updateSyncUI(); + break; + + case "refreshFiles": + this._setSyncMessage("Downloading UI..."); + break; + + case "upload": + this._setSyncMessage("Uploading new data..."); + break; + + case "download": + this._setSyncMessage("Downloading new data..."); + break; + + case "finished": + this._syncFinished(); + break; + + case "cancel": + this._setSyncMessage("Canceling Sync..."); + break; + + default: + dojo.warn("Programming error: " + + "Unknown sync type in dojox.off.ui: " + type); + break; + } + }, + + _onNetwork: function(type){ + // summary: + // Called when we go on- or off-line + // description: + // When we go online or offline, this method is called to update + // our UI. Default behavior is to update the Offline + // Widget UI and to attempt a synchronization. + // type: String + // "online" if we just moved online, and "offline" if we just + // moved offline. + + if(!this._initialized){ return; } + + // update UI + this._updateNetIndicator(); + + if(type == "offline"){ + this._setSyncMessage("You are working offline"); + + // clear old details + var details = dojo.byId("dot-sync-details"); + if(details){ details.style.display = "none"; } + + // if we fell offline during a sync, hide + // the sync info + this._updateSyncUI(); + }else{ // online + // synchronize, but pause for a few seconds + // so that the user can orient themselves + if(dojox.off.sync.autoSync){ + if(dojo.isAIR){ + window.setTimeout(function(){dojox.off.sync.synchronize();}, 1000); + }else{ + window.setTimeout(dojox._scopeName + ".off.sync.synchronize()", 1000); + } + } + } + } +}); + +// register ourselves for low-level framework events +dojo.connect(dojox.off, "onFrameworkEvent", dojox.off.ui, "_onFrameworkEvent"); + +// start our magic when the Dojo Offline framework is ready to go +dojo.connect(dojox.off, "onLoad", dojox.off.ui, dojox.off.ui._initialize); + +} diff --git a/includes/js/dojox/presentation.js b/includes/js/dojox/presentation.js new file mode 100644 index 0000000..a1c1a8a --- /dev/null +++ b/includes/js/dojox/presentation.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.presentation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.presentation"] = true; +dojo.provide("dojox.presentation"); +dojo.require("dojox.presentation._base"); + +} diff --git a/includes/js/dojox/presentation/README b/includes/js/dojox/presentation/README new file mode 100644 index 0000000..4be60f5 --- /dev/null +++ b/includes/js/dojox/presentation/README @@ -0,0 +1,72 @@ +------------------------------------------------------------------------------- +dojox.presentation +------------------------------------------------------------------------------- +Version 0.9 +Release date: 10/31/2007 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + pete higgins (dante) +------------------------------------------------------------------------------- + +Project description + +This is the presentation base class. It provides a mechanism for various +display-oriented tasks. It includes a powerpoint-esque engine [prototype]. +The SlideShow aspect of this project has been deprecated and lives now +in dojox.image project. + +------------------------------------------------------------------------------- + +Dependencies: + +dojox.presentation requires both Dojo Base, Dojo FX Core, and Dijit system(s). + +------------------------------------------------------------------------------- + +Documentation + +See the Dojo API tool (http://dojotoolkit.org/api) + +------------------------------------------------------------------------------- + +Installation instructions + +This package is self-contained, but needs Dijit sytem. + +Grab the following from the Dojo SVN Repository: + +svn co http://svn.dojotoolkit.org/dojo/dojox/trunk/presentation* +svn co http://svn.dojotoolkit.org/dojo/dijit/* + +into your: +/dojo root folder [checkout/release root] + +and require in dependancies via dojo.require('dojox.presentation'); + +see /dojox/presentation/tests/test_presentation.html for example usage, but +basically the structure is this: + +presentation /> + Slide /> + Slide /> + Text Outside of Part is Static + Part /> + Part /> + Action forPart/> + Action forPart/> + Slide href="remote.html" /> + Slide /> + Part /> + Action forPart/> +/presentation> + +NOTE: project marked experimental, and API has a planned deprecation. To +participate in the formation of the new presentation class, visit +the dojotoolkit forums at: + +http://dojotoolkit.org/forums + + diff --git a/includes/js/dojox/presentation/_base.js b/includes/js/dojox/presentation/_base.js new file mode 100644 index 0000000..2077a4e --- /dev/null +++ b/includes/js/dojox/presentation/_base.js @@ -0,0 +1,557 @@ +if(!dojo._hasResource["dojox.presentation._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.presentation._base"] = true; +dojo.provide("dojox.presentation._base"); +dojo.experimental("dojox.presentation"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Container"); +dojo.require("dijit._Templated"); +dojo.require("dijit.layout.StackContainer"); +dojo.require("dijit.layout.ContentPane"); +dojo.require("dojo.fx"); + +dojo.declare("dojox.presentation.Deck", [ dijit.layout.StackContainer, dijit._Templated ], { + // summary: + // dojox.presentation class + // basic powerpoint esque engine for handling transitons and control + // in a page-by-page and part-by-part way + // + // FIXME: parsing part(s)/widget(s) in href="" Slides not working + // TODO: make auto actions progress. + // FIXME: Safari keydown/press/up listener not working. + // noClick=true prevents progression of slides in that broweser + // + // fullScreen: Boolean + // unsupported (that i know of) just yet. Default it to take control + // of window. Would be nice to be able to contain presentation in a + // styled container, like StackContainer ... theoretically possible. + // [and may not need this variable?] + fullScreen: true, + + // useNav: Boolean + // true to allow navigation popup, false to disallow + useNav: true, + + // navDuration: Integer + // time in MS fadein/out of popup nav [default: 250] + navDuration: 250, + + // noClick: Boolean + // if true, prevents _any_ click events to propagate actions + // (limiting control to keyboard and/or action.on="auto" or action.delay="" + // actions. + noClick: false, + + // setHash: Boolean + // if true, window location bar will get a #link to slide for direct + // access to a particular slide number. + setHash: true, + + // just to over-ride: + templateString: null, + templateString:"
                        \n\t
                        \n\t
                        \n\t\t\n\t\t\n\t\t\n\t
                        \n\t
                        \n\t
                        \n
                        \n", + + // nextIcon: String + // icon for navigation "next" button + nextIcon: dojo.moduleUrl('dojox.presentation','resources/icons/next.png'), + + // prevIcon: String + // icon for navigation "previous" button + prevIcon: dojo.moduleUrl('dojox.presentation','resources/icons/prev.png'), + + _navOpacMin: 0, + _navOpacMax: 0.85, + _slideIndex: 0, + + // Private: + _slides: [], + _navShowing: true, + _inNav: false, + + startup: function(){ + // summary: connect to the various handlers and controls for this presention + this.inherited(arguments); + + if(this.useNav){ + this._hideNav(); + }else{ + this.showNav.style.display = "none"; + } + + this.connect(document,'onclick', '_onEvent'); + this.connect(document,'onkeypress', '_onEvent'); + + // only if this.fullScreen == true? + this.connect(window, 'onresize', '_resizeWindow'); + this._resizeWindow(); + + this._updateSlides(); + + this._readHash(); + this._setHash(); + }, + + moveTo: function(/* Integer */ number){ + // summary: jump to slide based on param + var slideIndex = number - 1; + + if(slideIndex < 0) + slideIndex = 0; + + if(slideIndex > this._slides.length - 1) + slideIndex = this._slides.length - 1; + + this._gotoSlide(slideIndex); + }, + + onMove: function (number){ + // summary: stub function? TODOC: ? + }, + + nextSlide: function(/*Event*/ evt){ + // summary: transition to the next slide. + if (!this.selectedChildWidget.isLastChild) { + this._gotoSlide(this._slideIndex+1); + } + if (evt) { evt.stopPropagation(); } + }, + + previousSlide: function(/*Event*/ evt){ + // summary: transition to the previous slide + if (!this.selectedChildWidget.isFirstChild) { + + this._gotoSlide(this._slideIndex-1); + + } else { this.selectedChildWidget._reset(); } + if (evt) { evt.stopPropagation();} + }, + + getHash: function(id){ + // summary: get the current hash to set in localtion + return this.id+"_SlideNo_"+id; + }, + + _hideNav: function(evt){ + // summary: hides navigation + if(this._navAnim){ this._navAnim.stop(); } + this._navAnim = dojo.animateProperty({ + node:this.showNav, + duration:this.navDuration, + properties: { + opacity: { end:this._navOpacMin } + } + }).play(); + }, + + _showNav: function(evt){ + // summary: shows navigation + if(this._navAnim){ this._navAnim.stop(); } + this._navAnim = dojo.animateProperty({ + node:this.showNav, + duration:this.navDuration, + properties: { + opacity: { end:this._navOpacMax } + } + }).play(); + }, + + _handleNav: function(evt){ + // summary: does nothing? _that_ seems useful. + evt.stopPropagation(); + }, + + _updateSlides: function(){ + // summary: + // populate navigation select list with refs to slides call this + // if you add a node to your presentation dynamically. + this._slides = this.getChildren(); + if(this.useNav){ + // populate the select box with top-level slides + var i=0; + dojo.forEach(this._slides,dojo.hitch(this,function(slide){ + i++; + var tmp = this._option.cloneNode(true); + tmp.text = slide.title+" ("+i+") "; + this._option.parentNode.insertBefore(tmp,this._option); + })); + if(this._option.parentNode){ + this._option.parentNode.removeChild(this._option); + } + // dojo._destroyElement(this._option); + } + }, + + _onEvent: function(/* Event */ evt){ + // summary: + // main presentation function, determines next 'best action' for a + // specified event. + var _node = evt.target; + var _type = evt.type; + + if(_type == "click" || _type == "change"){ + if(_node.index && _node.parentNode == this.select){ + this._gotoSlide(_node.index); + }else if(_node == this.select){ + this._gotoSlide(_node.selectedIndex); + }else{ + if (this.noClick || this.selectedChildWidget.noClick || this._isUnclickable(evt)) return; + this.selectedChildWidget._nextAction(evt); + } + }else if(_type=="keydown" || _type == "keypress"){ + + // FIXME: safari doesn't report keydown/keypress? + + var key = (evt.charCode == dojo.keys.SPACE ? dojo.keys.SPACE : evt.keyCode); + switch(key){ + case dojo.keys.DELETE: + case dojo.keys.BACKSPACE: + case dojo.keys.LEFT_ARROW: + case dojo.keys.UP_ARROW: + case dojo.keys.PAGE_UP: + case 80: // key 'p' + this.previousSlide(evt); + break; + + case dojo.keys.ENTER: + case dojo.keys.SPACE: + case dojo.keys.RIGHT_ARROW: + case dojo.keys.DOWN_ARROW: + case dojo.keys.PAGE_DOWN: + case 78: // key 'n' + this.selectedChildWidget._nextAction(evt); + break; + + case dojo.keys.HOME: this._gotoSlide(0); + } + } + this._resizeWindow(); + evt.stopPropagation(); + }, + + _gotoSlide: function(/* Integer */ slideIndex){ + // summary: goes to slide + this.selectChild(this._slides[slideIndex]); + this.selectedChildWidget._reset(); + + this._slideIndex = slideIndex; + + if(this.useNav){ + this.select.selectedIndex = slideIndex; + } + + if(this.setHash){ + this._setHash(); + } + this.onMove(this._slideIndex+1); + }, + + _isUnclickable: function(/* Event */ evt){ + // summary: returns true||false base of a nodes click-ability + var nodeName = evt.target.nodeName.toLowerCase(); + // TODO: check for noClick='true' in target attrs & return true + // TODO: check for relayClick='true' in target attrs & return false + switch(nodeName){ + case 'a' : + case 'input' : + case 'textarea' : return true; break; + } + return false; + }, + + _readHash: function(){ + var th = window.location.hash; + if (th.length && this.setHash) { + var parts = (""+window.location).split(this.getHash('')); + if(parts.length>1){ + this._gotoSlide(parseInt(parts[1])-1); + } + } + }, + + _setHash: function(){ + // summary: sets url #mark to direct slide access + if(this.setHash){ + var slideNo = this._slideIndex+1; + window.location.href = "#"+this.getHash(slideNo); + } + }, + + _resizeWindow: function(/*Event*/ evt){ + // summary: resize this and children to fix this window/container + + // only if this.fullScreen? + dojo.body().style.height = "auto"; + var wh = dijit.getViewport(); + var h = Math.max( + document.documentElement.scrollHeight || dojo.body().scrollHeight, + wh.h); + var w = wh.w; + this.selectedChildWidget.domNode.style.height = h +'px'; + this.selectedChildWidget.domNode.style.width = w +'px'; + }, + + _transition: function(newWidget,oldWidget){ + // summary: over-ride stackcontainers _transition method + // but atm, i find it to be ugly with not way to call + // _showChild() without over-riding it too. hopefull + // basic toggles in superclass._transition will be available + // in dijit, and this won't be necessary. + var anims = []; + if(oldWidget){ + /* + anims.push(dojo.fadeOut({ node: oldWidget.domNode, + duration:250, + onEnd: dojo.hitch(this,function(){ + this._hideChild(oldWidget); + }) + })); + */ + this._hideChild(oldWidget); + } + if(newWidget){ + /* + anims.push(dojo.fadeIn({ + node:newWidget.domNode, start:0, end:1, + duration:300, + onEnd: dojo.hitch(this,function(){ + this._showChild(newWidget); + newWidget._reset(); + }) + }) + ); + */ + this._showChild(newWidget); + newWidget._reset(); + } + //dojo.fx.combine(anims).play(); + } +}); + +dojo.declare( + "dojox.presentation.Slide", + [dijit.layout.ContentPane,dijit._Contained,dijit._Container,dijit._Templated], + { + // summary: + // a Comonent of a dojox.presentation, and container for each 'Slide' + // made up of direct HTML (no part/action relationship), and dojox.presentation.Part(s), + // and their attached Actions. + + // templatPath: String + // make a ContentPane templated, and style the 'titleNode' + templateString:"
                        \n\t

                        ${title}

                        \n\t
                        \n
                        \n", + + // title: String + // string to insert into titleNode, title of Slide + title: "", + + // inherited from ContentPane FIXME: don't seem to work ATM? + refreshOnShow: true, + preLoad: false, + doLayout: true, + parseContent: true, + + // noClick: Boolean + // true on slide tag prevents clicking, false allows + // (can also be set on base presentation for global control) + noClick: false, + + // private holders: + _parts: [], + _actions: [], + _actionIndex: 0, + _runningDelay: false, + + startup: function(){ + // summary: setup this slide with actions and components (Parts) + this.inherited(arguments); + this.slideTitleText.innerHTML = this.title; + var children = this.getChildren(); + this._actions = []; + dojo.forEach(children,function(child){ + var tmpClass = child.declaredClass.toLowerCase(); + switch(tmpClass){ + case "dojox.presentation.part" : this._parts.push(child); break; + case "dojox.presentation.action" : this._actions.push(child); break; + } + },this); + }, + + + _nextAction: function(evt){ + // summary: gotoAndPlay current cached action + var tmpAction = this._actions[this._actionIndex] || 0; + if (tmpAction){ + // is this action a delayed action? [auto? thoughts?] + if(tmpAction.on == "delay"){ + this._runningDelay = setTimeout( + dojo.hitch(tmpAction,"_runAction"),tmpAction.delay + ); + console.debug('started delay action',this._runningDelay); + }else{ + tmpAction._runAction(); + } + + // FIXME: it gets hairy here. maybe runAction should + // call _actionIndex++ onEnd? if a delayed action is running, do + // we want to prevent action++? + var tmpNext = this._getNextAction(); + this._actionIndex++; + + if(tmpNext.on == "delay"){ + // FIXME: yeah it looks like _runAction() onend should report + // _actionIndex++ + console.debug('started delay action',this._runningDelay); + setTimeout(dojo.hitch(tmpNext,"_runAction"),tmpNext.delay); + } + }else{ + // no more actions in this slide + this.getParent().nextSlide(evt); + } + }, + + _getNextAction: function(){ + // summary: returns the _next action in this sequence + return this._actions[this._actionIndex+1] || 0; + }, + + _reset: function(){ + // summary: set action chain back to 0 and re-init each Part + this._actionIndex = [0]; + dojo.forEach(this._parts,function(part){ + part._reset(); + },this); + } +}); + +dojo.declare("dojox.presentation.Part", [dijit._Widget,dijit._Contained], { + // summary: + // a node in a presentation.Slide that inherits control from a + // dojox.presentation.Action + // can be any element type, and requires styling before parsing + // + // as: String + // like an ID, attach to Action via (part) as="" / (action) forSlide="" tags + // this should be unique identifier? + as: "", + + // startVisible: boolean + // true to leave in page on slide startup/reset + // false to hide on slide startup/reset + startVisible: false, + + // isShowing: Boolean, + // private holder for _current_ state of Part + _isShowing: false, + + postCreate: function(){ + // summary: override and init() this component + this._reset(); + }, + + _reset: function(){ + // summary: set part back to initial calculate state + // these _seem_ backwards, but quickToggle flips it + this._isShowing =! this.startVisible; + this._quickToggle(); + }, + + _quickToggle: function(){ + // summary: ugly [unworking] fix to test setting state of component + // before/after an animation. display:none prevents fadeIns? + if(this._isShowing){ + dojo.style(this.domNode,'display','none'); + dojo.style(this.domNode,'visibility','hidden'); + dojo.style(this.domNode,'opacity',0); + }else{ + dojo.style(this.domNode,'display',''); + dojo.style(this.domNode,'visibility','visible'); + dojo.style(this.domNode,'opacity',1); + } + this._isShowing =! this._isShowing; + } +}); + +dojo.declare("dojox.presentation.Action", [dijit._Widget,dijit._Contained], { + // summary: + // a widget to attach to a dojox.presentation.Part to control + // it's properties based on an inherited chain of events ... + // + // + // on: String + // FIXME: only 'click' supported ATM. plans include on="delay", + // on="end" of="", and on="auto". those should make semantic sense + // to you. + on: 'click', + + // forSlide: String + // attach this action to a dojox.presentation.Part with a matching 'as' attribute + forSlide: "", + + // toggle: String + // will toggle attached [matching] node(s) via forSlide/as relationship(s) + toggle: 'fade', + + // delay: Integer + // + delay: 0, + + // duration: Integer + // default time in MS to run this action effect on it's 'forSlide' node + duration: 1000, + + // private holders: + _attached: [], + _nullAnim: false, + + _runAction: function(){ + // summary: runs this action on attached node(s) + + var anims = []; + // executes the action for each attached 'Part' + dojo.forEach(this._attached,function(node){ + // FIXME: this is ugly, and where is toggle class? :( + var dir = (node._isShowing) ? "Out" : "In"; + // node._isShowing =! node._isShowing; + //var _anim = dojox.fx[ this.toggle ? this.toggle+dir : "fade"+dir]({ + var _anim = dojo.fadeIn({ + node:node.domNode, + duration: this.duration, + beforeBegin: dojo.hitch(node,"_quickToggle") + }); + anims.push(_anim); + },this); + var _anim = dojo.fx.combine(anims); + if(_anim){ _anim.play(); } + }, + + _getSiblingsByType: function(/* String */ declaredClass){ + // summary: quick replacement for getChildrenByType("class"), but in + // a child here ... so it's getSiblings. courtesy bill in #dojo + // could be moved into parent, and just call this.getChildren(), + // which makes more sense. + var siblings = dojo.filter( this.getParent().getChildren(), function(widget){ + return widget.declaredClass==declaredClass; + } + ); + return siblings; // dijit._Widget + }, + + postCreate: function(){ + // summary: run this once, should this be startup: function()? + + this.inherited(arguments); + // prevent actions from being visible, _always_ + dojo.style(this.domNode,"display","none"); + var parents = this._getSiblingsByType('dojox.presentation.Part'); + // create a list of "parts" we are attached to via forSlide/as + this._attached = []; + dojo.forEach(parents,function(parentPart){ + if(this.forSlide == parentPart.as){ + this._attached.push(parentPart); + } + },this); + } + +}); + +} diff --git a/includes/js/dojox/presentation/resources/Show.css b/includes/js/dojox/presentation/resources/Show.css new file mode 100644 index 0000000..8610675 --- /dev/null +++ b/includes/js/dojox/presentation/resources/Show.css @@ -0,0 +1,100 @@ +@media screen { + html, body { + margin: 0px; + padding: 0px; + } + + h1.showTitle { + margin:0; + margin-left:0; + padding:0; + font-size: 60px; + background:transparent; + border-bottom:1px solid #000; + } + p, li { + font-size: 17pt; + } + .dojoShowNav { + border-top:1px solid #ccc; + background: #ededed; + overflow: hidden; + position: absolute; + bottom: 0px; + left: 0px; + width: 100%; + text-align: center; + z-index:420; + padding:0; + margin-bttom:5px; height:34px; + } + .dojoShowNav img { cursor:pointer; } + + .dojoShowSlide { + + } + .dojoShowNav option { font:6pt; color:#333; } + .dojoShowNav select { + margin: 0px; + color: #999; + margin-top: 5px; + padding: 2px; + border: 1px solid #ccc; + -moz-border-radius:6pt 6pt; + } + .dojoShowHider { + height: 5px; + overflow: hidden; + width: 100%; + z-index:421; + } + .dojoShowPrint { + position: absolute; + left: 0px; + top: 0px; + width:100%; + } + .dojoShowBody { + background:#fff url('../../../dijit/themes/tundra/images/testBodyBg.gif') repeat-x top left; + padding:10px; + } + .dojoShow { + width:100%; height:100%; + overflow:hidden; + } +} +@media print { + .dojoShow { + display: none !important; + } + .dojoShowPrint { + display: block !important; + } + .dojoShowPrintSlide { + border: 1px solid #aaa; + padding: 10px; + margin-bottom: 15px; + } + .dojoShowPrintSlide, ul { + page-break-inside: avoid; + } + h1 { + margin-top: 0; + page-break-after: avoid; + } +} +.dojoShowSlideTitle { + height: 100px; + width:100%; + display:block; + background-color: #ededed; + border-bottom:1px solid #666; +} +.dojoShowSlideTitle h1 { + margin-top: 0; + +} +.dojoShowSlideBody { + margin: 15px; + background:#fff url('../../../dijit/themes/tundra/images/testBodyBg.gif') repeat-x top left; +} diff --git a/includes/js/dojox/presentation/resources/Show.css.commented.css b/includes/js/dojox/presentation/resources/Show.css.commented.css new file mode 100644 index 0000000..ee205e4 --- /dev/null +++ b/includes/js/dojox/presentation/resources/Show.css.commented.css @@ -0,0 +1,110 @@ +@media screen { + html, body { + margin: 0px; + padding: 0px; + } + + h1.showTitle { + margin:0; + margin-left:0; + padding:0; + font-size: 60px; + background:transparent; + border-bottom:1px solid #000; + } + + p, li { + font-size: 17pt; + } + + .dojoShowNav { + border-top:1px solid #ccc; + background: #ededed; + overflow: hidden; + position: absolute; + bottom: 0px; + left: 0px; + width: 100%; + text-align: center; + z-index:420; + padding:0; + margin-bttom:5px; height:34px; + } + + .dojoShowNav img { cursor:pointer; } + + .dojoShowSlide { + /* width:100%; height:100%; */ + } + + .dojoShowNav option { font:6pt; color:#333; } + .dojoShowNav select { + margin: 0px; + color: #999; + margin-top: 5px; + padding: 2px; + border: 1px solid #ccc; + -moz-border-radius:6pt 6pt; + } + + .dojoShowHider { + height: 5px; + overflow: hidden; + width: 100%; + z-index:421; + } + .dojoShowPrint { + position: absolute; + left: 0px; + top: 0px; + width:100%; + } + + .dojoShowBody { + background:#fff url('../../../dijit/themes/tundra/images/testBodyBg.gif') repeat-x top left; + padding:10px; + } + + .dojoShow { + width:100%; height:100%; + overflow:hidden; + } +} + +@media print { + .dojoShow { + display: none !important; + } + .dojoShowPrint { + display: block !important; + } + .dojoShowPrintSlide { + border: 1px solid #aaa; + padding: 10px; + margin-bottom: 15px; + } + .dojoShowPrintSlide, ul { + page-break-inside: avoid; + } + h1 { + margin-top: 0; + page-break-after: avoid; + } +} + +.dojoShowSlideTitle { + height: 100px; + width:100%; + display:block; + background-color: #ededed; + border-bottom:1px solid #666; +} +.dojoShowSlideTitle h1 { + margin-top: 0; + /* line-height: 100px; + margin-left: 30px; */ +} +.dojoShowSlideBody { + margin: 15px; + background:#fff url('../../../dijit/themes/tundra/images/testBodyBg.gif') repeat-x top left; +} diff --git a/includes/js/dojox/presentation/resources/Show.html b/includes/js/dojox/presentation/resources/Show.html new file mode 100644 index 0000000..33672db --- /dev/null +++ b/includes/js/dojox/presentation/resources/Show.html @@ -0,0 +1,12 @@ +
                        +
                        +
                        + + + +
                        +
                        +
                        +
                        diff --git a/includes/js/dojox/presentation/resources/Slide.html b/includes/js/dojox/presentation/resources/Slide.html new file mode 100644 index 0000000..dc4627b --- /dev/null +++ b/includes/js/dojox/presentation/resources/Slide.html @@ -0,0 +1,4 @@ +
                        +

                        ${title}

                        +
                        +
                        diff --git a/includes/js/dojox/presentation/resources/icons/down.png b/includes/js/dojox/presentation/resources/icons/down.png new file mode 100644 index 0000000000000000000000000000000000000000..46bf9ba8fe88e3b3468a973bb8ae133f3ed04fe0 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k&H|6fVg?3oVGw3ym^DWND9DoT z=}1{rUgjo|$7!%+4S&4_4-l)&kPT4hJF??r|Q;K79DFd@~CJQ-|OZ z#uYb&PUx{G)w8`xP!=d>GL>cLP)PIj^__5XtwRp)5t$4w$;Kb-0^JN74_#dy-p|A$ zzr>JiNV)U%Y&2$gq~}^VY3fCGYL6KK|j&&CUA*e2+0O9%*`VPyYJ) z_~!{}X>8goj1$}zB&A480G-MyRbsH+Xivq*CPtB>_3``DD*pYk^mt)CX<<4eNcNn- zT^}DFdAph)}1{rUgjo|$7!%+4S&4_4-l)&kPT4hJF??r|Q;K79DFd@~CJQ-|OZ z#uYb&PUx{G)w8`xP!=d>GL>cLP)PIj^__5XtwRpqkv9%!SdP>$G~vl$*m&aV>hOLh z76IWak_wYq8)i&xZf*|r^6Fw;^}$+MS=mR}!`Hxp!O-z850i|;pLkc-)`QosO>=a2 zZ+DD{m?6C4q5dS_cMOb2nw~gLc>h0sXAx`8l5N|}nrFeTjdCd!A0M$EZs(W(r^tFBvVkF~ zsm=I|$hZ3c{|sYxm2@(`FljT-zh}Vk^TfIvoB|FC($|}1{rUgjo|$7!%+4S&4_4-l)&kPT4hJF??r|Q;K79DFd@~CJQ-|OZ z#uYb&PUx{G)w8`xP!=d>GL>cLP)PIj^__5XZAMo;gCX~nzw8}H8zSDly1Lq(k*S08 z70-qwH8r&vYj0T;W;G z_jj_)9L}Q6PQA=a#1tAF{Gzyd)7dgqikdpo&(Hh&^W$T7j|b)g^$n{cxdj}2E=as- v$#g2#J5ds*V8_|J<2cX<9$A+dI1CuhaAoD537)kD81f9Bu6{1-oD!M<+oGE4 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/presentation/resources/icons/up.png b/includes/js/dojox/presentation/resources/icons/up.png new file mode 100644 index 0000000000000000000000000000000000000000..d77816a71daa1096bf18cc2ff0a2675676665d09 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k&H|6fVg?3oVGw3ym^DWND9DoT z=}1{rUgjo|$7!%+4S&4_4-l)&kPT4hJF??r|Q;K79DFd@~CJQ-|OZ z#uYb&PUx{G)w8`xP!=d>GL>cLP)PIj^__5XZG=eknzWWprVSBKUR_=7&dAik`if^m zlAD{Gz&~wW-Lq#-pFUmj`r6uhhXX7}cmhn>fhKakO6!>T|9`!>h)7CUXlUw%ix(3G z1Oys1+Zf9m7?PYmDR2~cd3hOibagf5PM$EKq4R&krDF_?N1B%W=$|r0qjDey%Dq!d{c)I$ztaD0e0stWy Bs<{9F literal 0 HcmV?d00001 diff --git a/includes/js/dojox/presentation/tests/_ext1.html b/includes/js/dojox/presentation/tests/_ext1.html new file mode 100644 index 0000000..d56be0e --- /dev/null +++ b/includes/js/dojox/presentation/tests/_ext1.html @@ -0,0 +1,21 @@ +

                        WARNING:

                        + +

                        +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. +

                        + +

                        +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. +

                        + + diff --git a/includes/js/dojox/presentation/tests/test_presentation.html b/includes/js/dojox/presentation/tests/test_presentation.html new file mode 100644 index 0000000..d9e86b5 --- /dev/null +++ b/includes/js/dojox/presentation/tests/test_presentation.html @@ -0,0 +1,162 @@ + + + + dojox.presentation - Presentation Mechanism + + + + + + + + + + + + + + +
                        +
                        + +

                        This is a brief overview of what this presentation widget is capable of.

                        + +
                        ... it's new, and completely different, so watch close
                        + + + + +
                        + +
                        +

                        Click, and more text will appear

                        + +
                        +

                        Lorem something something. I am text, hear me _roar_.

                        +
                        + + +
                        + I am here to make sure click-advancing is disabled on normal input type elements: + + +
                        + + + +
                        +
                        + +

                        First You See me ...

                        +

                        Then you see ME ...

                        +

                        oh yeah!

                        + + + + + + +
                        + +
                        +

                        You cannot click on this page

                        +

                        I told you that you can't click ...

                        + click here to move the title + + + +
                        + +
                        +

                        There is a widget in this page:

                        +

                        clicking has been stopped on this page to demonstrate the usage ..

                        +
                        + There _should_ be a _Calendar widget here
                        +
                        +
                        +
                        + I am a titlepane, you can do cool things with me. + +
                        +
                        +

                        ... so I'm providing a next button:

                        +
                        + +
                        + +
                        +

                        Thanks for watching!

                        +
                        +
                        + + diff --git a/includes/js/dojox/resources/README.template b/includes/js/dojox/resources/README.template new file mode 100644 index 0000000..293f2b7 --- /dev/null +++ b/includes/js/dojox/resources/README.template @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------- +Project Name +------------------------------------------------------------------------------- +Version X.XXX +Release date: MM/DD/YYYY +------------------------------------------------------------------------------- +Project state: +prototype | experimental | beta | stable | production +------------------------------------------------------------------------------- +Credits + Author one (author contact info) + Author two (author contact info) +------------------------------------------------------------------------------- +Project description + +Describe the point of the project here. +------------------------------------------------------------------------------- +Dependencies: + +List any dependencies here. +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + +Use this to explain in detail what a person needs to do in order to use this +project. Include URLs for grabbing source, URLs for any dependencies, etc. +Also be sure to include any additional information, such as where to place +CSS files, images, other media, etc. The goal is that someone reading this +file can follow your instructions and be using this project within minutes. +------------------------------------------------------------------------------- +Additional Notes + +Anything else you think is of interest (for example, object hierarchy) should +be placed here. diff --git a/includes/js/dojox/resources/_modules.js b/includes/js/dojox/resources/_modules.js new file mode 100644 index 0000000..d894a91 --- /dev/null +++ b/includes/js/dojox/resources/_modules.js @@ -0,0 +1,204 @@ +/*===== +// this file is in place as a quick way to give summaries to all available dojox projects. + +dojox = { + // summary: + // DojoX: the home for Dojo eXtensions + // + // description: + // DojoX is a collection of subprojects provided by Dojo committers and subject to + // the generous licensing and policies of the [Dojo CLA](http://dojotoolkit.org/cla) + // Each subproject in DojoX has its own top-level directory and a README file with + // status information and project status and a stability rating (experimental, beta, stable) + // + // Projects may or may not depend on other top-level Dojo projects, like Dojo or Dijit. + // Unlike Dojo and Dijit, code is not subject to i18n and a11y restrictions and may vary + // in quality (experimental code is encouraged in DojoX, but currently prohibited in Dojo + // and Dijit) + // + // DojoX projects may mature to a stable state and stay in DojoX, or on occasion + // after proving themselves may migrate to Dojo Core or Dijit. Dojo and Dijit projects + // are constrained both by development resources as well as design goals, so DojoX is + // a natural place to provide enhanced behavior or extend Dojo Core or Dijit primitives. + // DojoX can also be an incubator for entirely new projects. +} + +dojox._sql = { + // summary: objects to support Dojo Offline (dojox.off) +}; + +dojox.charting = { + // summary: Vector graphic, data-driven graphs and charts +}; + +dojox.collections = { + // summary: A set of lists and hashes for easy use within your applications. +}; + +dojox.color = { + // summary: Advanced color methods, including HSV, HSL, and CMYK conversion, a color generator and advanced colorspace calculations. +}; + +dojox.cometd = { + // summary: A cometd client written in Dojo +}; + +dojox.crypto = { + // summary: Cryptography in JS. DEPRECATED: use dojox.encoding instead. +}; + +dojox.data = { + // summary: Additional dojo.data data stores and demos +}; + +dojox.date = { + // summary: Additional date manipulation functions +}; + +dojox.dtl = { + // summary: Django Templating Language implementation +}; + +dojox.encoding = { + // summary: Various encoding algorithms, including crypto and digests. +}; + +dojox.flash = { + // summary: Utilities to embed and communicate with Flash-based objects +}; + +dojox.fx = { + // summary: Extension animations to the core dojo FX project + // + // description: + // A package of animations, and FX-related code, extending Dojo Core fx. + // Including this package includes all the Base and Core fx packages. + // + + style: { // summary: Module to provide CSS animations + }, + + scroll: { // summary: Module to provide scroll-related FX + } +}; +dojox.fx["ext-dojo"] = { + // summary: Direct extensions to dojo.fx namespace + NodeList: { + // summary: module to include to support dojox.fx animations in dojo.query() + } +}; + +dojox.gfx = { + // summary: Cross-browser vector graphics API + // description: + // + // dojox.gfx is an advanced API providing normalized vector drawing + // in a variety of browsers. It has individual renderers for SVG, VML, + // Canvas, and Silverlight. +}; + +dojox.gfx3d = { + // summary: A 3d API for dojox.gfx +}; + +dojox.grid = { + // summary: An advanced Grid widget with virtual scrolling, cell editing, and much more +}; + +dojox.highlight = { + // summary: A client-side syntax highlighting engine. + // description: + // This project parses pre > code nodes, and applies syntax highlighting for + // a wide variety of languages. Simply dojo.require() in all the + // dojox.highlight.languages you wish to include in your highlighingting, + // and customize colors in the highlight.css. + // + // It is provided as a dojo package, contributed under CLA + // by Ivan Sagalaev and is available originally from: + // http://softwaremaniacs.org/soft/highlight/en/ + // +}; + +dojox.image = { + // summary: A collection of image related widgets +}; + +dojox.io = { + // summary: Extensions to the Core dojo.io transports +}; + +dojox.jsonPath = { + // summary: A query system for JavaScript objects +}; + +dojox.layout = { + // summary: A collection of layout related Widgets +}; + +dojox.lang = { + // summary: Language specific extensions + functional: { + // summary: Functional language constructs, including currying and lambda. + } +}; + +dojox.math = { + // summary: A collection of various advanced math functions. +}; + +dojox.off = { + // summary: the Dojo Offline project +}; + +dojox.presentation = { + // summary: A simple, experimental PowerPoint-like presentation project +}; + +dojox.regexp = { + // summary: Additional pre-made regular expressions for use +}; + +dojox.storage = { + // summary: Objects for mass storage within the browser. For when cookies just aren't enough. +}; + +dojox.string = { + // summary: A collection of various objects for advanced string manipulation, including a Builder and a tokenizer. +}; + +dojox.timing = { + // summary: A set of objects to perform advanced time-based tasks, including a basic Timer. +}; + +dojox.uuid = { + // summary: Universally Unique Identifier (UUID) implementations, including an implementation of UUID 2 +}; + +dojox.validate = { + // summary: Additional input validation methods + ca : { + // summary: Methods specific to the Canadian provinces + }, + creditCard : { + // summary: Validate various credit card types + } +}; + +dojox.widget = { + // summary: A collection of un-categorized widgets, or code not requiring it's own package. + // + // description: + // These are standalone widgets with varying levels of stability. Some are useful, + // some were created for demonstration purposes, and learning tools. The each maintain + // their own .css file (typically dojox/widget/WidgetName/WidgetName.css) +}; + +dojox.wire = { + // summary: + // Declarative data binding and action tags for simplified MVC +}; + +dojox.xml = { + // summary: XML utilities. Currently only includes a DomParser, which returns a psuedo-XML document in JSON-like form. +}; +=====*/ diff --git a/includes/js/dojox/resources/manualTests.html b/includes/js/dojox/resources/manualTests.html new file mode 100644 index 0000000..1cdda13 --- /dev/null +++ b/includes/js/dojox/resources/manualTests.html @@ -0,0 +1,12 @@ + + + + Dojox Manual Test Runner + + + Redirecting to D.O.H runner + + + diff --git a/includes/js/dojox/resources/manualTests.js b/includes/js/dojox/resources/manualTests.js new file mode 100644 index 0000000..3a6d947 --- /dev/null +++ b/includes/js/dojox/resources/manualTests.js @@ -0,0 +1,211 @@ +if(!dojo._hasResource["dojox.tests.manualTests"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.tests.manualTests"] = true; +dojo.provide("dojox.tests.manualTests"); + +try{ +if(dojo.isBrowser){ + var userArgs = window.location.search.replace(/[\?&](dojoUrl|testUrl|testModule)=[^&]*/g,"").replace(/^&/,"?"); + doh.registerUrl("dojox/analytics/tests/test_analytics.html", dojo.moduleUrl("dojox","analytics/tests/test_analytics.html"+userArgs), 99999999); + doh.registerUrl("dojox/av/tests/flash.html", dojo.moduleUrl("dojox","av/tests/flash.html"+userArgs), 99999999); + doh.registerUrl("dojox/av/tests/quicktime.html", dojo.moduleUrl("dojox","av/tests/quicktime.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_bars.html", dojo.moduleUrl("dojox","charting/tests/test_bars.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_chart2d.html", dojo.moduleUrl("dojox","charting/tests/test_chart2d.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_chart2d_updating.html", dojo.moduleUrl("dojox","charting/tests/test_chart2d_updating.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_cylinders.html", dojo.moduleUrl("dojox","charting/tests/test_cylinders.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_labels2d.html", dojo.moduleUrl("dojox","charting/tests/test_labels2d.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_pie2d.html", dojo.moduleUrl("dojox","charting/tests/test_pie2d.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_scaler.html", dojo.moduleUrl("dojox","charting/tests/test_scaler.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_sparklines.html", dojo.moduleUrl("dojox","charting/tests/test_sparklines.html"+userArgs), 99999999); + doh.registerUrl("dojox/charting/tests/test_widget2d.html", dojo.moduleUrl("dojox","charting/tests/test_widget2d.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_DataDemoTable.html", dojo.moduleUrl("dojox","data/demos/demo_DataDemoTable.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_FlickrRestStore.html", dojo.moduleUrl("dojox","data/demos/demo_FlickrRestStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_FlickrStore.html", dojo.moduleUrl("dojox","data/demos/demo_FlickrStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_LazyLoad.html", dojo.moduleUrl("dojox","data/demos/demo_LazyLoad.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_MultiStores.html", dojo.moduleUrl("dojox","data/demos/demo_MultiStores.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_PicasaStore.html", dojo.moduleUrl("dojox","data/demos/demo_PicasaStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_QueryReadStore.html", dojo.moduleUrl("dojox","data/demos/demo_QueryReadStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_QueryReadStore_filter.html", dojo.moduleUrl("dojox","data/demos/demo_QueryReadStore_filter.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/demos/demo_QueryReadStore_sort.html", dojo.moduleUrl("dojox","data/demos/demo_QueryReadStore_sort.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/tests/QueryReadStore.html", dojo.moduleUrl("dojox","data/tests/QueryReadStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/data/tests/test_Tree_vs_jsonPathStore.html", dojo.moduleUrl("dojox","data/tests/test_Tree_vs_jsonPathStore.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Animation.html", dojo.moduleUrl("dojox","dtl/demos/demo_Animation.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Blog.html", dojo.moduleUrl("dojox","dtl/demos/demo_Blog.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Data.html", dojo.moduleUrl("dojox","dtl/demos/demo_Data.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Dijitless.html", dojo.moduleUrl("dojox","dtl/demos/demo_Dijitless.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Events.html", dojo.moduleUrl("dojox","dtl/demos/demo_Events.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_HtmlTemplated.html", dojo.moduleUrl("dojox","dtl/demos/demo_HtmlTemplated.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Inline.html", dojo.moduleUrl("dojox","dtl/demos/demo_Inline.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_NodeList.html", dojo.moduleUrl("dojox","dtl/demos/demo_NodeList.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Table.html", dojo.moduleUrl("dojox","dtl/demos/demo_Table.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Templated.html", dojo.moduleUrl("dojox","dtl/demos/demo_Templated.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/demos/demo_Tree.html", dojo.moduleUrl("dojox","dtl/demos/demo_Tree.html"+userArgs), 99999999); + doh.registerUrl("dojox/dtl/tests/demo_Templated_Jaxer.html", dojo.moduleUrl("dojox","dtl/tests/demo_Templated_Jaxer.html"+userArgs), 99999999); + doh.registerUrl("dojox/encoding/tests/compression/colors2.html", dojo.moduleUrl("dojox","encoding/tests/compression/colors2.html"+userArgs), 99999999); + doh.registerUrl("dojox/encoding/tests/compression/colors3.html", dojo.moduleUrl("dojox","encoding/tests/compression/colors3.html"+userArgs), 99999999); + doh.registerUrl("dojox/encoding/tests/compression/test.html", dojo.moduleUrl("dojox","encoding/tests/compression/test.html"+userArgs), 99999999); + doh.registerUrl("dojox/encoding/tests/compression/vq.html", dojo.moduleUrl("dojox","encoding/tests/compression/vq.html"+userArgs), 99999999); + doh.registerUrl("dojox/flash/tests/test_flash.html", dojo.moduleUrl("dojox","flash/tests/test_flash.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/example_backgroundPosition.html", dojo.moduleUrl("dojox","fx/tests/example_backgroundPosition.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/example_dojoAnimations.html", dojo.moduleUrl("dojox","fx/tests/example_dojoAnimations.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/example_easingChart2D.html", dojo.moduleUrl("dojox","fx/tests/example_easingChart2D.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/example_Line.html", dojo.moduleUrl("dojox","fx/tests/example_Line.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_animateClass.html", dojo.moduleUrl("dojox","fx/tests/test_animateClass.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_crossFade.html", dojo.moduleUrl("dojox","fx/tests/test_crossFade.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_easing.html", dojo.moduleUrl("dojox","fx/tests/test_easing.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_highlight.html", dojo.moduleUrl("dojox","fx/tests/test_highlight.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_Nodelist-fx.html", dojo.moduleUrl("dojox","fx/tests/test_Nodelist-fx.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_scroll.html", dojo.moduleUrl("dojox","fx/tests/test_scroll.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_Shadow.html", dojo.moduleUrl("dojox","fx/tests/test_Shadow.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_sizeTo.html", dojo.moduleUrl("dojox","fx/tests/test_sizeTo.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_slideBy.html", dojo.moduleUrl("dojox","fx/tests/test_slideBy.html"+userArgs), 99999999); + doh.registerUrl("dojox/fx/tests/test_wipeTo.html", dojo.moduleUrl("dojox","fx/tests/test_wipeTo.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/beautify.html", dojo.moduleUrl("dojox","gfx/demos/beautify.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/butterfly.html", dojo.moduleUrl("dojox","gfx/demos/butterfly.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/career_test.html", dojo.moduleUrl("dojox","gfx/demos/career_test.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/circles.html", dojo.moduleUrl("dojox","gfx/demos/circles.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/clock.html", dojo.moduleUrl("dojox","gfx/demos/clock.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/clockWidget.html", dojo.moduleUrl("dojox","gfx/demos/clockWidget.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/clock_black.html", dojo.moduleUrl("dojox","gfx/demos/clock_black.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/creator.html", dojo.moduleUrl("dojox","gfx/demos/creator.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/inspector.html", dojo.moduleUrl("dojox","gfx/demos/inspector.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/lion.html", dojo.moduleUrl("dojox","gfx/demos/lion.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/roundedPane.html", dojo.moduleUrl("dojox","gfx/demos/roundedPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/tiger.html", dojo.moduleUrl("dojox","gfx/demos/tiger.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/demos/tooltip.html", dojo.moduleUrl("dojox","gfx/demos/tooltip.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_arc.html", dojo.moduleUrl("dojox","gfx/tests/test_arc.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_bezier.html", dojo.moduleUrl("dojox","gfx/tests/test_bezier.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_decompose.html", dojo.moduleUrl("dojox","gfx/tests/test_decompose.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_fill.html", dojo.moduleUrl("dojox","gfx/tests/test_fill.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_fx.html", dojo.moduleUrl("dojox","gfx/tests/test_fx.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_gfx.html", dojo.moduleUrl("dojox","gfx/tests/test_gfx.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_gradient.html", dojo.moduleUrl("dojox","gfx/tests/test_gradient.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_group.html", dojo.moduleUrl("dojox","gfx/tests/test_group.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_image1.html", dojo.moduleUrl("dojox","gfx/tests/test_image1.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_image2.html", dojo.moduleUrl("dojox","gfx/tests/test_image2.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_linearGradient.html", dojo.moduleUrl("dojox","gfx/tests/test_linearGradient.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_linestyle.html", dojo.moduleUrl("dojox","gfx/tests/test_linestyle.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_pattern.html", dojo.moduleUrl("dojox","gfx/tests/test_pattern.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_poly.html", dojo.moduleUrl("dojox","gfx/tests/test_poly.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_resize.html", dojo.moduleUrl("dojox","gfx/tests/test_resize.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_setPath.html", dojo.moduleUrl("dojox","gfx/tests/test_setPath.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_tbbox.html", dojo.moduleUrl("dojox","gfx/tests/test_tbbox.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_text.html", dojo.moduleUrl("dojox","gfx/tests/test_text.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_textpath.html", dojo.moduleUrl("dojox","gfx/tests/test_textpath.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx/tests/test_transform.html", dojo.moduleUrl("dojox","gfx/tests/test_transform.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_camerarotate.html", dojo.moduleUrl("dojox","gfx3d/tests/test_camerarotate.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_camerarotate_shaded.html", dojo.moduleUrl("dojox","gfx3d/tests/test_camerarotate_shaded.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_cube.html", dojo.moduleUrl("dojox","gfx3d/tests/test_cube.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_cylinder.html", dojo.moduleUrl("dojox","gfx3d/tests/test_cylinder.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_drawer.html", dojo.moduleUrl("dojox","gfx3d/tests/test_drawer.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_edges.html", dojo.moduleUrl("dojox","gfx3d/tests/test_edges.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_matrix.html", dojo.moduleUrl("dojox","gfx3d/tests/test_matrix.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_orbit.html", dojo.moduleUrl("dojox","gfx3d/tests/test_orbit.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_overlap.html", dojo.moduleUrl("dojox","gfx3d/tests/test_overlap.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_polygon.html", dojo.moduleUrl("dojox","gfx3d/tests/test_polygon.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_quads.html", dojo.moduleUrl("dojox","gfx3d/tests/test_quads.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_rotate.html", dojo.moduleUrl("dojox","gfx3d/tests/test_rotate.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_scene.html", dojo.moduleUrl("dojox","gfx3d/tests/test_scene.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_triangles.html", dojo.moduleUrl("dojox","gfx3d/tests/test_triangles.html"+userArgs), 99999999); + doh.registerUrl("dojox/gfx3d/tests/test_vector.html", dojo.moduleUrl("dojox","gfx3d/tests/test_vector.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_change_structure.html", dojo.moduleUrl("dojox","grid/tests/test_change_structure.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_custom_sort.html", dojo.moduleUrl("dojox","grid/tests/test_custom_sort.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_edit.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_edit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_model.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_model.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_model_EmptyResultSet.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_model_multiStores.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_model_multiStores.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_model_processError.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_model_processError.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_dojo_data_notification.html", dojo.moduleUrl("dojox","grid/tests/test_dojo_data_notification.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_edit.html", dojo.moduleUrl("dojox","grid/tests/test_edit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_edit_canEdit.html", dojo.moduleUrl("dojox","grid/tests/test_edit_canEdit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_edit_dijit.html", dojo.moduleUrl("dojox","grid/tests/test_edit_dijit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_events.html", dojo.moduleUrl("dojox","grid/tests/test_events.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_expand.html", dojo.moduleUrl("dojox","grid/tests/test_expand.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid.html", dojo.moduleUrl("dojox","grid/tests/test_grid.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_dlg.html", dojo.moduleUrl("dojox","grid/tests/test_grid_dlg.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_headerHeight.html", dojo.moduleUrl("dojox","grid/tests/test_grid_headerHeight.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_layout.html", dojo.moduleUrl("dojox","grid/tests/test_grid_layout.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_layout_borderContainer.html", dojo.moduleUrl("dojox","grid/tests/test_grid_layout_borderContainer.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_layout_LayoutContainer.html", dojo.moduleUrl("dojox","grid/tests/test_grid_layout_LayoutContainer.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_object_model_change.html", dojo.moduleUrl("dojox","grid/tests/test_grid_object_model_change.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_programmatic.html", dojo.moduleUrl("dojox","grid/tests/test_grid_programmatic.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_programmatic_layout.html", dojo.moduleUrl("dojox","grid/tests/test_grid_programmatic_layout.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_rtl.html", dojo.moduleUrl("dojox","grid/tests/test_grid_rtl.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_themes.html", dojo.moduleUrl("dojox","grid/tests/test_grid_themes.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_grid_tooltip_menu.html", dojo.moduleUrl("dojox","grid/tests/test_grid_tooltip_menu.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_keyboard.html", dojo.moduleUrl("dojox","grid/tests/test_keyboard.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_markup.html", dojo.moduleUrl("dojox","grid/tests/test_markup.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_mysql_edit.html", dojo.moduleUrl("dojox","grid/tests/test_mysql_edit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_sizing.html", dojo.moduleUrl("dojox","grid/tests/test_sizing.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_sizing_100rows.html", dojo.moduleUrl("dojox","grid/tests/test_sizing_100rows.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_sizing_ResizeHandle.html", dojo.moduleUrl("dojox","grid/tests/test_sizing_ResizeHandle.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_styling.html", dojo.moduleUrl("dojox","grid/tests/test_styling.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_subgrid.html", dojo.moduleUrl("dojox","grid/tests/test_subgrid.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_tundra_edit.html", dojo.moduleUrl("dojox","grid/tests/test_tundra_edit.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_yahoo_images.html", dojo.moduleUrl("dojox","grid/tests/test_yahoo_images.html"+userArgs), 99999999); + doh.registerUrl("dojox/grid/tests/test_yahoo_search.html", dojo.moduleUrl("dojox","grid/tests/test_yahoo_search.html"+userArgs), 99999999); + doh.registerUrl("dojox/help/demos/demo_Console.html", dojo.moduleUrl("dojox","help/demos/demo_Console.html"+userArgs), 99999999); + doh.registerUrl("dojox/highlight/tests/test_highlight.html", dojo.moduleUrl("dojox","highlight/tests/test_highlight.html"+userArgs), 99999999); + doh.registerUrl("dojox/highlight/tests/test_pygments.html", dojo.moduleUrl("dojox","highlight/tests/test_pygments.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_Gallery.html", dojo.moduleUrl("dojox","image/tests/test_Gallery.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_Lightbox.html", dojo.moduleUrl("dojox","image/tests/test_Lightbox.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_Magnifier.html", dojo.moduleUrl("dojox","image/tests/test_Magnifier.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_MagnifierLite.html", dojo.moduleUrl("dojox","image/tests/test_MagnifierLite.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_SlideShow.html", dojo.moduleUrl("dojox","image/tests/test_SlideShow.html"+userArgs), 99999999); + doh.registerUrl("dojox/image/tests/test_ThumbnailPicker.html", dojo.moduleUrl("dojox","image/tests/test_ThumbnailPicker.html"+userArgs), 99999999); + doh.registerUrl("dojox/io/proxy/tests/xip.html", dojo.moduleUrl("dojox","io/proxy/tests/xip.html"+userArgs), 99999999); + doh.registerUrl("dojox/lang/tests/fun_perf.html", dojo.moduleUrl("dojox","lang/tests/fun_perf.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_DragPane.html", dojo.moduleUrl("dojox","layout/tests/test_DragPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ExpandoPane.html", dojo.moduleUrl("dojox","layout/tests/test_ExpandoPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ExpandoPane_code.html", dojo.moduleUrl("dojox","layout/tests/test_ExpandoPane_code.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ExpandoPane_more.html", dojo.moduleUrl("dojox","layout/tests/test_ExpandoPane_more.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_FloatingPane.html", dojo.moduleUrl("dojox","layout/tests/test_FloatingPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_RadioGroup.html", dojo.moduleUrl("dojox","layout/tests/test_RadioGroup.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ResizeHandle.html", dojo.moduleUrl("dojox","layout/tests/test_ResizeHandle.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ScrollPane.html", dojo.moduleUrl("dojox","layout/tests/test_ScrollPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_ScrollPaneSingle.html", dojo.moduleUrl("dojox","layout/tests/test_ScrollPaneSingle.html"+userArgs), 99999999); + doh.registerUrl("dojox/layout/tests/test_SizingPane.html", dojo.moduleUrl("dojox","layout/tests/test_SizingPane.html"+userArgs), 99999999); + doh.registerUrl("dojox/off/demos/editor/editor.html", dojo.moduleUrl("dojox","off/demos/editor/editor.html"+userArgs), 99999999); + doh.registerUrl("dojox/off/demos/helloworld/helloworld.html", dojo.moduleUrl("dojox","off/demos/helloworld/helloworld.html"+userArgs), 99999999); + doh.registerUrl("dojox/presentation/tests/test_presentation.html", dojo.moduleUrl("dojox","presentation/tests/test_presentation.html"+userArgs), 99999999); + doh.registerUrl("dojox/rpc/demos/demo_JsonRestStore_CouchDB.html", dojo.moduleUrl("dojox","rpc/demos/demo_JsonRestStore_CouchDB.html"+userArgs), 99999999); + doh.registerUrl("dojox/rpc/demos/demo_JsonRestStore_Persevere.html", dojo.moduleUrl("dojox","rpc/demos/demo_JsonRestStore_Persevere.html"+userArgs), 99999999); + doh.registerUrl("dojox/rpc/demos/documentation.html", dojo.moduleUrl("dojox","rpc/demos/documentation.html"+userArgs), 99999999); + doh.registerUrl("dojox/rpc/demos/yahoo.html", dojo.moduleUrl("dojox","rpc/demos/yahoo.html"+userArgs), 99999999); + doh.registerUrl("dojox/rpc/tests/test_dojo_data_model_persevere.html", dojo.moduleUrl("dojox","rpc/tests/test_dojo_data_model_persevere.html"+userArgs), 99999999); + doh.registerUrl("dojox/sketch/tests/test_full.html", dojo.moduleUrl("dojox","sketch/tests/test_full.html"+userArgs), 99999999); + doh.registerUrl("dojox/storage/demos/helloworld.html", dojo.moduleUrl("dojox","storage/demos/helloworld.html"+userArgs), 99999999); + doh.registerUrl("dojox/storage/tests/test_storage.html", dojo.moduleUrl("dojox","storage/tests/test_storage.html"+userArgs), 99999999); + doh.registerUrl("dojox/string/tests/BuilderPerf.html", dojo.moduleUrl("dojox","string/tests/BuilderPerf.html"+userArgs), 99999999); + doh.registerUrl("dojox/string/tests/peller.html", dojo.moduleUrl("dojox","string/tests/peller.html"+userArgs), 99999999); + doh.registerUrl("dojox/string/tests/PerfFun.html", dojo.moduleUrl("dojox","string/tests/PerfFun.html"+userArgs), 99999999); + doh.registerUrl("dojox/timing/tests/test_Sequence.html", dojo.moduleUrl("dojox","timing/tests/test_Sequence.html"+userArgs), 99999999); + doh.registerUrl("dojox/timing/tests/test_ThreadPool.html", dojo.moduleUrl("dojox","timing/tests/test_ThreadPool.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/demo_FisheyeList-orig.html", dojo.moduleUrl("dojox","widget/tests/demo_FisheyeList-orig.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/demo_FisheyeList.html", dojo.moduleUrl("dojox","widget/tests/demo_FisheyeList.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/demo_FisheyeLite.html", dojo.moduleUrl("dojox","widget/tests/demo_FisheyeLite.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_ColorPicker.html", dojo.moduleUrl("dojox","widget/tests/test_ColorPicker.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_FileInput.html", dojo.moduleUrl("dojox","widget/tests/test_FileInput.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_FisheyeList.html", dojo.moduleUrl("dojox","widget/tests/test_FisheyeList.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_FisheyeLite.html", dojo.moduleUrl("dojox","widget/tests/test_FisheyeLite.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_Iterator.html", dojo.moduleUrl("dojox","widget/tests/test_Iterator.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_Loader.html", dojo.moduleUrl("dojox","widget/tests/test_Loader.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_MultiComboBox.html", dojo.moduleUrl("dojox","widget/tests/test_MultiComboBox.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_Rating.html", dojo.moduleUrl("dojox","widget/tests/test_Rating.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_SortList.html", dojo.moduleUrl("dojox","widget/tests/test_SortList.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_TimeSpinner.html", dojo.moduleUrl("dojox","widget/tests/test_TimeSpinner.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_Toaster.html", dojo.moduleUrl("dojox","widget/tests/test_Toaster.html"+userArgs), 99999999); + doh.registerUrl("dojox/widget/tests/test_Wizard.html", dojo.moduleUrl("dojox","widget/tests/test_Wizard.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_ActionChaining.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_ActionChaining.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_ActionWiring.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_ActionWiring.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_BasicChildWire.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_BasicChildWire.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_BasicColumnWiring.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_BasicColumnWiring.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_ConditionalActions.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_ConditionalActions.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_FlickrStoreWire.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_FlickrStoreWire.html"+userArgs), 99999999); + doh.registerUrl("dojox/wire/demos/markup/demo_TopicWiring.html", dojo.moduleUrl("dojox","wire/demos/markup/demo_TopicWiring.html"+userArgs), 99999999); + doh.registerUrl("dojox/_sql/demos/customers/customers.html", dojo.moduleUrl("dojox","_sql/demos/customers/customers.html"+userArgs), 99999999); +} +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/rpc/CouchDBRestStore.js b/includes/js/dojox/rpc/CouchDBRestStore.js new file mode 100644 index 0000000..f61836c --- /dev/null +++ b/includes/js/dojox/rpc/CouchDBRestStore.js @@ -0,0 +1,87 @@ +if(!dojo._hasResource["dojox.data.CouchDBRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.CouchDBRestStore"] = true; +dojo.provide("dojox.data.CouchDBRestStore"); +dojo.require("dojox.data.JsonRestStore"); +dojo.require("dojox.json.ref"); // TODO: Make it work without this dependency + +// A CouchDBRestStore is an extension of JsonRestStore to handle CouchDB's idiosyncrasies, special features, +// and deviations from standard HTTP Rest. +// NOTE: CouchDB is not designed to be run on a public facing network. There is no access control +// on database documents, and you should NOT rely on client side control to implement security. + + +dojo.declare("dojox.data.CouchDBRestStore", + dojox.data.JsonRestStore, + { + _commitAppend: function(listId,item) { + var deferred = this.service.post(listId,item); + var prefix = this.service.serviceName + '/'; + deferred.addCallback(function(result) { + item._id = prefix + result.id; // update the object with the results of the post + item._rev = result.rev; + return result; + //TODO: Need to go down the graph assigned _id based on path, so that sub items can be modified and properly reflected to the root item (being careful of circular references) + }); + return deferred; + }, + fetch: function(args) { + // summary: + // This only differs from JsonRestStore in that it, will put the query string the query part of the URL and it handles start and count + if (typeof args == 'string') { + args = {query: '_all_docs?' + args}; + } + else if (typeof args.query == 'string') { + args.query = '_all_docs?' + args.query; + } + else + args.query = '_all_docs?'; + if (args.start) { + args.query = (args.query ? (args.query + '&') : '') + 'skip=' + args.start; + delete args.start; + } + if (args.count) { + args.query = (args.query ? (args.query + '&') : '') + 'count=' + args.count; + delete args.count; + } + var prefix = this.service.serviceName + '/'; + var oldOnComplete = args.onComplete; + args.onComplete=function(results) { + if (results.rows) { + for (var i = 0; i < results.rows.length; i++) { + var row = results.rows[i]; // make it into a reference + row._id = prefix + (row.$ref = row.id); + } + } + if (oldOnComplete) + oldOnComplete.apply(this,arguments); + }; + return dojox.data.JsonRestStore.prototype.fetch.call(this,args); + } + } +); + + +dojox.data.CouchDBRestStore.generateSMD = function(couchServerUrl) { + var couchSMD = {contentType:"application/json", + transport:"REST", + envelope:"PATH", + services:{}, + target: couchServerUrl, + }; + var def = dojo.xhrGet({ + url: couchServerUrl+"_all_dbs", + handleAs: "json", + sync: true + }); + def.addCallback(function(dbs) { + for (var i = 0; i < dbs.length; i++) + couchSMD.services[dbs[i]] = { + target:dbs[i], + returns:{}, + parameters:[{type:"string"}] + } + }); + return couchSMD; +} + +} diff --git a/includes/js/dojox/rpc/JsonRPC.js b/includes/js/dojox/rpc/JsonRPC.js new file mode 100644 index 0000000..1710b31 --- /dev/null +++ b/includes/js/dojox/rpc/JsonRPC.js @@ -0,0 +1,58 @@ +if(!dojo._hasResource["dojox.rpc.JsonRPC"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.JsonRPC"] = true; +dojo.provide("dojox.rpc.JsonRPC"); + +dojox.rpc.envelopeRegistry.register( + "JSON-RPC-1.0",function(str){return str == "JSON-RPC-1.0"},{ + serialize: function(smd, method, data, options){ + //not converted to json it self. This will be done, if appropriate, at the + //transport level + var d = dojox.rpc.toOrdered(method, data); + d = dojox.rpc.toJson({id: this._requestId++, method: method.name, params: d}); + + return { + data: d, + contentType: 'application/json', + transport:"POST" + } + }, + + deserialize: function(results){ + var obj = dojox.rpc.resolveJson(results); + if (obj.error) { + var e = new Error(obj.error); + e._rpcErrorObject = obj.error; + return e; + } + return obj.result || true; + } + } +); + +dojox.rpc.envelopeRegistry.register( + "JSON-RPC-1.2",function(str){return str == "JSON-RPC-1.2"},{ + serialize: function(smd, method, data, options){ + var trans = method.transport || smd.transport || "POST"; + var d = dojox.rpc.toNamed(method, data); + + d = dojox.rpc.toJson({id: this._requestId++, method: method.name, params: data}); + return { + data: d, + contentType: 'application/json', + transport:"POST" + } + }, + + deserialize: function(results){ + var obj = dojox.rpc.resolveJson(results); + if (obj.error) { + var e = new Error(obj.error.message); + e._rpcErrorObject = obj.error; + return e; + } + return obj.result || true; + } + } +); + +} diff --git a/includes/js/dojox/rpc/JsonReferencing.js b/includes/js/dojox/rpc/JsonReferencing.js new file mode 100644 index 0000000..618ea06 --- /dev/null +++ b/includes/js/dojox/rpc/JsonReferencing.js @@ -0,0 +1,265 @@ +if(!dojo._hasResource["dojox.rpc.JsonReferencing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.JsonReferencing"] = true; +dojo.provide("dojox.rpc.JsonReferencing"); +dojo.require("dojo.date.stamp"); +dojo.require("dojo._base.Deferred"); + +// summary: +// Adds advanced JSON {de}serialization capabilities to the base json library. +// This enhances the capabilities of dojo.toJson and dojo.fromJson, +// adding referencing support, date handling, and other extra format handling. +// On parsing, references are resolved. When references are made to +// ids/objects that have been loaded yet, a Deferred object will be used as the +// value and as soon as a callback is added to the Deferred object, the target +// object will be loaded. + + + +dojox.rpc._index={}; // the global map of id->object +dojox.rpc.onUpdate = function(/*Object*/ object, /* attribute-name-string */ attribute, /* any */ oldValue, /* any */ newValue){ + // summary: + // This function is called when an existing object in the system is updated. Existing objects are found by id. +}; + +dojox.rpc.resolveJson = function(/*Object*/ root,/*Object?*/ schema){ + // summary: + // Indexes and resolves references in the JSON object. + // A JSON Schema object that can be used to advise the handling of the JSON (defining ids, date properties, urls, etc) + // + // root: + // The root object of the object graph to be processed + // + // schema: A JSON Schema object that can be used to advise the parsing of the JSON (defining ids, date properties, urls, etc) // + // Currently this provides a means for context based id handling + // + // return: + // An object, the result of the processing + var ref,reWalk=[]; + function makeIdInfo(schema){ // find out what attribute and what id prefix to use + if (schema){ + var attr; + if (!(attr = schema._idAttr)){ + for (var i in schema.properties){ + if (schema.properties[i].unique){ + schema._idAttr = attr = i; + } + } + } + if (attr || schema._idPrefix){ + return {attr:attr || 'id',prefix:schema._idPrefix}; + } + } + + return false; + } + function walk(it,stop,schema,idInfo,defaultId){ + // this walks the new graph, resolving references and making other changes + var val,i; + var id = it[idInfo.attr]; + id = (id && (idInfo.prefix + id)) || defaultId; // if there is an id, prefix it, otherwise inherit + var target = it; + + if (id){ // if there is an id available... + it._id = id; + if (dojox.rpc._index[id]){ // if the id already exists in the system, we should use the existing object, and just update it + target = dojox.rpc._index[id]; + delete target.$ref; // remove this artifact + } + dojox.rpc._index[id] = target; // add the prefix, set _id, and index it + if (schema && dojox.validate && dojox.validate.jsonSchema){ // if json schema is activated, we can load it in the registry of instance schemas map + dojox.validate.jsonSchema._schemas[id] = schema; + } + + } + for (i in it){ + if (it.hasOwnProperty(i) && (typeof (val=it[i]) =='object') && val){ + ref=val.$ref; + if (ref){ // a reference was found + var stripped = ref.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');// trim it + if(/[\w\[\]\.\$ \/\r\n\t]/.test(stripped) && !/=|((^|\W)new\W)/.test(stripped)){ // make sure it is a safe reference + var path = ref.match(/(^\.*[^\.\[]+)([\.\[].*)?/); // divide along the path + if ((ref=path[1]=='$' ? root:dojox.rpc._index[new dojo._Url(idInfo.prefix,path[1])]) && // a $ indicates to start with the root, otherwise start with an id + (ref = path[2] ? eval('ref' + path[2]) : ref)){// starting point was found, use eval to resolve remaining property references + // otherwise, no starting point was found (id not found), if stop is set, it does not exist, we have + // unloaded reference, if stop is not set, it may be in a part of the graph not walked yet, + // we will wait for the second loop + val = ref; + } + else{ + if (!stop){ + if (!rewalking) + reWalk.push(it); // we need to rewalk it to resolve references + var rewalking = true; // we only want to add it once + } + else { + ref = val.$ref; + val = new dojo.Deferred(); + val._id = idInfo.prefix + ref; + (function(val,ref){ + var connectId = dojo.connect(val,"addCallbacks",function(){ + dojo.disconnect(connectId); + dojox.rpc.services[idInfo.prefix.substring(0,idInfo.prefix.length-1)](ref) // otherwise call by looking up the service + .addCallback(dojo.hitch(val,val.callback)); + + }); + })(val,ref); + } + } + } + } + else { + if (!stop){ // if we are in stop, that means we are in the second loop, and we only need to check this current one, + // further walking may lead down circular loops + var valSchema = val.schema || // a schema can be self-defined by the object, + (schema && schema.properties && schema.properties[i]); // or it can from the schema sub-object definition + if (valSchema){ + idInfo = makeIdInfo(valSchema)||idInfo; + } + val = walk(val,reWalk==it,valSchema,idInfo,id && (id + ('[' + dojo._escapeString(i) + ']'))); + } + } + } + if (dojo.isString(val) && schema && schema.properties && schema.properties[i] && schema.properties[i].format=='date-time'){// parse the date string + val = dojo.date.stamp.fromISOString(val); // create a date object + } + it[i] = val; + var old = target[i]; + if (val !== old){ // only update if it changed + target[i] = val; // update the target + propertyChange(i,old,val); + } + } + function propertyChange(key,old,newValue){ + setTimeout(function(){ + dojox.rpc.onUpdate(target,i,old,newValue); // call the listener for each update + }); + } + if (target != it){ // this means we are updating, we need to remove deleted + for (i in target){ + if (!it.hasOwnProperty(i) && i != '_id' && !(target instanceof Array && isNaN(i))){ + propertyChange(i,target[i],undefined); + delete target[i]; + } + } + } + return target; + } + var idInfo = makeIdInfo(schema)||{attr:'id',prefix:''}; + if (!root){ return root; } + root = walk(root,false,schema,idInfo,dojox._newId && (new dojo._Url(idInfo.prefix,dojox._newId) +'')); // do the main walk through + walk(reWalk,false,schema,idInfo); // re walk any parts that were not able to resolve references on the first round + return root; +}; +dojox.rpc.fromJson = function(/*String*/ str,/*Object?*/ schema){ + // summary: + // evaluates the passed string-form of a JSON object. + // A JSON Schema object that can be used to advise the parsing of the JSON (defining ids, date properties, urls, etc) + // which may defined by setting dojox.currentSchema to the current schema you want to use for this evaluation + // + // json: + // a string literal of a JSON item, for instance: + // '{ "foo": [ "bar", 1, { "baz": "thud" } ] }' + // schema: A JSON Schema object that can be used to advise the parsing of the JSON (defining ids, date properties, urls, etc) // + // Currently this provides a means for context based id handling + // + // return: + // An object, the result of the evaluation + root = eval('(' + str + ')'); // do the eval + if (root){ + return this.resolveJson(root,schema); + } + return root; +} +dojox.rpc.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*Object?*/ schema){ + // summary: + // Create a JSON serialization of an object. + // This has support for referencing, including circular references, duplicate references, and out-of-message references + // id and path-based referencing is supported as well and is based on http://www.json.com/2007/10/19/json-referencing-proposal-and-library/. + // + // it: + // an object to be serialized. + // + // prettyPrint: + // if true, we indent objects and arrays to make the output prettier. + // The variable dojo.toJsonIndentStr is used as the indent string + // -- to use something other than the default (tab), + // change that variable before calling dojo.toJson(). + // + // schema: A JSON Schema object that can be used to advise the parsing of the JSON (defining ids, date properties, urls, etc) // + // Currently this provides a means for context based id handling + // + // return: + // a String representing the serialized version of the passed object. + + var idPrefix = (schema&& schema._idPrefix) || ''; // the id prefix for this context + var paths={}; + function serialize(it,path,_indentStr){ + if (it && dojo.isObject(it)){ + var value; + if (it instanceof Date){ // properly serialize dates + return '"' + dojo.date.stamp.toISOString(it,{zulu:true}) + '"'; + } + var id = it._id; + if (id){ // we found an identifiable object, we will just serialize a reference to it... unless it is the root + + if (path != '$'){ + return serialize({$ref:id.charAt(0)=='$' ? id : // a pure path based reference, leave it alone + id.substring(0,idPrefix.length)==idPrefix ? // see if the reference is in the current context + id.substring(idPrefix.length): // a reference with a prefix matching the current context, the prefix should be removed + '../' + id});// a reference to a different context, assume relative url based referencing + } + path = id; + } + else { + it._id = path; // we will create path ids for other objects in case they are circular + paths[path] = it;// save it here so they can be deleted at the end + } + _indentStr = _indentStr || ""; + var nextIndent = prettyPrint ? _indentStr + dojo.toJsonIndentStr : ""; + var newLine = prettyPrint ? "\n" : ""; + var sep = prettyPrint ? " " : ""; + + if (it instanceof Array){ + var res = dojo.map(it, function(obj,i){ + var val = serialize(obj, path + '[' + i + ']', nextIndent); + if(!dojo.isString(val)){ + val = "undefined"; + } + return newLine + nextIndent + val; + }); + return "[" + res.join("," + sep) + newLine + _indentStr + "]"; + } + + var output = []; + for(var i in it){ + var keyStr; + if(typeof i == "number"){ + keyStr = '"' + i + '"'; + }else if(dojo.isString(i) && i != '_id'){ + keyStr = dojo._escapeString(i); + }else{ + // skip non-string or number keys + continue; + } + var val = serialize(it[i],path+(i.match(/^[a-zA-Z]\w*$/) ? // can we use simple .property syntax? + ('.' + i) : // yes, otherwise we have to escape it + ('[' + dojo._escapeString(i) + ']')),nextIndent); + if(!dojo.isString(val)){ + // skip non-serializable values + continue; + } + output.push(newLine + nextIndent + keyStr + ":" + sep + val); + } + return "{" + output.join("," + sep) + newLine + _indentStr + "}"; + } + + return dojo.toJson(it); // use the default serializer for primitives + } + var json = serialize(it,'$',''); + for (i in paths){ // cleanup the temporary path-generated ids + delete paths[i]._id; + } + return json; +} + +} diff --git a/includes/js/dojox/rpc/JsonRestStore.js b/includes/js/dojox/rpc/JsonRestStore.js new file mode 100644 index 0000000..dd14874 --- /dev/null +++ b/includes/js/dojox/rpc/JsonRestStore.js @@ -0,0 +1,661 @@ +if(!dojo._hasResource["dojox.data.JsonRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.JsonRestStore"] = true; +dojo.provide("dojox.data.JsonRestStore"); +dojo.require("dojox.rpc.Rest"); +dojo.require("dojox.rpc.JsonReferencing"); // TODO: Make it work without this dependency + +// A JsonRestStore takes a REST service and uses it the remote communication for a +// read/write dojo.data implementation. To use a JsonRestStore you should create a +// service with a REST transport. This can be configured with an SMD: +//{ +// services: { +// jsonRestStore: { +// transport: "REST", +// envelope: "URL", +// target: "store.php", +// contentType:"application/json", +// parameters: [ +// {name: "location", type: "string", optional: true} +// ] +// } +// } +//} +// The SMD can then be used to create service, and the service can be passed to a JsonRestStore. For example: +// var myServices = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.tests.resources", "test.smd")); +// var jsonStore = new dojox.data.JsonRestStore({service:myServices.jsonRestStore}); +// +// The JsonRestStore will then cause all saved modifications to be server using Rest commands (PUT, POST, or DELETE). +// The JsonRestStore also supports lazy loading. References can be made to objects that have not been loaded. +// For example if a service returned: +// {"name":"Example","lazyLoadedObject":{"$ref":"obj2"}} +// +// And this object has accessed using the dojo.data API: +// var obj = jsonStore.getValue(myObject,"lazyLoadedObject"); +// The object would automatically be requested from the server (with an object id of "obj2"). +// +// When using a Rest store on a public network, it is important to implement proper security measures to +// control access to resources + +dojox.data.ASYNC_MODE = 0; +dojox.data.SYNC_MODE = 1; +dojo.declare("dojox.data.JsonRestStore", + null, + { + mode: dojox.data.ASYNC_MODE, + constructor: function(options){ + //summary: + // JsonRestStore constructor, instantiate a new JsonRestStore + // A JsonRestStore can be configured from a JSON Schema. Queries are just + // passed through as URLs for XHR requests, + // so there is nothing to configure, just plug n play. + // Of course there are some options to fiddle with if you want: + // + // jsonSchema: /* object */ + // + // service: /* function */ + // This is the service object that is used to retrieve lazy data and save results + // The function should be directly callable with a single parameter of an object id to be loaded + // The function should also have the following methods: + // put(id,value) - puts the value at the given id + // post(id,value) - posts (appends) the value at the given id + // delete(id) - deletes the value corresponding to the given id + // + // idAttribute: /* string */ + // Defaults to 'id'. The name of the attribute that holds an objects id. + // This can be a preexisting id provided by the server. + // If an ID isn't already provided when an object + // is fetched or added to the store, the autoIdentity system + // will generate an id for it and add it to the index. + + // mode: dojox.data.ASYNC_MODE || dojox.data.SYNC_MODE + // Defaults to ASYNC_MODE. This option sets the default mode for this store. + // Sync calls return their data immediately from the calling function + // instead of calling the callback functions. Functions such as + // fetchItemByIdentity() and fetch() both accept a string parameter in addtion + // to the normal keywordArgs parameter. When passed this option, SYNC_MODE will + // automatically be used even when the default mode of the system is ASYNC_MODE. + // A normal request to fetch or fetchItemByIdentity (with kwArgs object) can also + // include a mode property to override this setting for that one request. + + //setup a byId alias to the api call + this.byId=this.fetchItemByIdentity; + // if the advanced json parser is enabled, we can pass through object updates as onSet events + dojo.connect(dojox.rpc,"onUpdate",this,function(obj,attrName,oldValue,newValue){ + var prefix = this.service.serviceName + '/'; + if (!obj._id){ + console.log("no id on updated object ", obj); + } + else if (obj._id.substring(0,prefix.length) == prefix) + this.onSet(obj,attrName,oldValue,newValue); + }); + if (options){ + dojo.mixin(this,options); + } + if (!this.service) + throw Error("A service is required for JsonRestStore"); + if (!(this.service.contentType + '').match(/application\/json/)) + throw Error("A service must use a contentType of 'application/json' in order to be used in a JsonRestStore"); + this.idAttribute = (this.service._schema && this.service._schema._idAttr) || 'id'; + var arrayModifyingMethodNames = ["splice","push","pop","unshift","shift","reverse","sort"]; + this._arrayModifyingMethods = {}; + var array = []; + var _this = this; + // setup array augmentation, for catching mods and setting arrays as dirty + for (var i = 0; i < arrayModifyingMethodNames.length; i++){ + (function(key){ // closure for the method to be bound correctly + var method = array[key]; + _this._arrayModifyingMethods[key] = function(){ + _this._setDirty(this); // set the array as dirty before the native modifying operation + return method.apply(this,arguments); + } + _this._arrayModifyingMethods[key]._augmented = 1; + })(arrayModifyingMethodNames[i]); + } + this._deletedItems=[]; + this._dirtyItems=[]; + //given a url, load json data from as the store + }, + + _loadById: function(id,callback){ + var slashIndex = id.indexOf('/'); + var serviceName = id.substring(0,slashIndex); + var id = id.substring(slashIndex + 1); + (this.service.serviceName == serviceName ? + this.service : // use the current service if it is the right one + dojox.rpc.services[serviceName])(id) // otherwise call by looking up the service + .addCallback(callback); + }, + getValue: function(item, property,lazyCallback){ + // summary: + // Gets the value of an item's 'property' + // + // item: /* object */ + // property: /* string */ + // property to look up value for + // lazyCallback: /* function*/ + // not part of the API, but if you are using lazy loading properties, you may provide a callback to resume, in order to have asynchronous loading + var value = item[property]; + if (value && value.$ref){ + dojox.rpc._sync = !lazyCallback; // tell the service to operate synchronously (I have some concerns about the "thread" safety with FF3, as I think it does event stacking on sync calls) + this._loadById((value && value._id) || (item._id + '.' + property),lazyCallback); + delete dojox.rpc._sync; // revert to normal async behavior + } else if (lazyCallback){lazyCallback(value);} + return value; + }, + + getValues: function(item, property){ + // summary: + // Gets the value of an item's 'property' and returns + // it. If this value is an array it is just returned, + // if not, the value is added to an array and that is returned. + // + // item: /* object */ + // property: /* string */ + // property to look up value for + + var val = this.getValue(item,property); + return dojo.isArray(val) ? val : [val]; + }, + + getAttributes: function(item){ + // summary: + // Gets the available attributes of an item's 'property' and returns + // it as an array. + // + // item: /* object */ + + var res = []; + for (var i in item){ + res.push(i); + } + return res; + }, + + hasAttribute: function(item,attribute){ + // summary: + // Checks to see if item has attribute + // + // item: /* object */ + // attribute: /* string */ + return attribute in item; + }, + + containsValue: function(item, attribute, value){ + // summary: + // Checks to see if 'item' has 'value' at 'attribute' + // + // item: /* object */ + // attribute: /* string */ + // value: /* anything */ + return getValue(item,attribute)==value; + }, + + + isItem: function(item){ + // summary: + // Checks to see if a passed 'item' + // is really a JsonRestStore item. + // + // item: /* object */ + // attribute: /* string */ + + return !!(dojo.isObject(item) && item._id); + }, + + isItemLoaded: function(item){ + // summary: + // returns isItem() :) + // + // item: /* object */ + + return !item.$ref; + }, + + loadItem: function(item){ + // summary: + // Loads an item that has not been loaded yet. Lazy loading should happen through getValue, and if used properly, this should never need to be called + // returns true. Note this does not work with lazy loaded primitives! + if (item.$ref){ + dojox.rpc._sync = true; // tell the service to operate synchronously + this._loadById(item._id) + delete dojox.rpc._sync; // revert to normal async behavior + } + + return true; + }, + + _walk : function(value,forEach){ + // walk the graph, avoiding duplication + var walked=[]; + function walk(value){ + if (value && typeof value == 'object' && !value.__walked){ + value.__walked = true; + walked.push(value); + for (var i in value){ + if (walk(value[i])){ + forEach(value,i,value[i]); + } + } + return true; + } + } + walk(value); + forEach({},null,value); + for (var i = 0; i < walked.length;i++) + delete walked[i].__walked; + }, + fetch: function(args){ + //console.log("fetch() ", args); + // summary + // + // fetch takes either a string argument or a keywordArgs + // object containing the parameters for the search. + // If passed a string, fetch will interpret this string + // as the query to be performed and will do so in + // SYNC_MODE returning the results immediately. + // If an object is supplied as 'args', its options will be + // parsed and then contained query executed. + // + // query: /* string or object */ + // Defaults to "". This is basically passed to the XHR request as the URL to get the data + // + // start: /* int */ + // Starting item in result set + // + // count: /* int */ + // Maximum number of items to return + // + // cache: /* boolean */ + // + // sort: /* function */ + // Not Implemented yet + // + // The following only apply to ASYNC requests (the default) + // + // onBegin: /* function */ + // called before any results are returned. Parameters + // will be the count and the original fetch request + // + // onItem: /*function*/ + // called for each returned item. Parameters will be + // the item and the fetch request + // + // onComplete: /* function */ + // called on completion of the request. Parameters will + // be the complete result set and the request + // + // onError: /* function */ + // colled in the event of an error + + if(dojo.isString(args)){ + query = args; + args={query: query, mode: dojox.data.SYNC_MODE}; + + } + + var query; + if (!args || !args.query){ + if (!args){ + var args={}; + } + + if (!args.query){ + args.query=""; + query=args.query; + } + + } + + if (dojo.isObject(args.query)){ + if (args.query.query){ + query = args.query.query; + }else{ + query = args.query = ""; + } + if (args.query.queryOptions){ + args.queryOptions=args.query.queryOptions + } + }else{ + query=args.query; + } + if (args.start || args.count){ + query += '[' + (args.start ? args.start : '') + ':' + (args.count ? ((args.start || 0) + args.count) : '') + ']'; + } + var results = dojox.rpc._index[this.service.serviceName + '/' + query]; + if (!args.mode){args.mode = this.mode;} + var _this = this; + var defResult; + dojox.rpc._sync = this.mode; + dojox._newId = query; + if (results && !("cache" in args && !args.cache)){ // TODO: Add TTL maybe? + defResult = new dojo.Deferred; + defResult.callback(results); + } + else { + defResult = this.service(query); + } + defResult.addCallback(function(results){ + delete dojox._newId; // cleanup + if (args.onBegin){ + args["onBegin"].call(_this, results.length, args); + } + _this._walk(results,function(obj,i,value){ + if (value instanceof Array){ + for (var i in _this._arrayModifyingMethods){ + if (!value[i]._augmented){ + value[i] = _this._arrayModifyingMethods[i]; + } + } + + } + }); + if (args.onItem){ + for (var i=0; i 0){ + var dirty = this._dirtyItems.pop(); + var item = dirty.item; + var append = false; + left++; + var deferred; + if (item instanceof Array && dirty.old instanceof Array){ + // see if we can just append the item with a post + append = true; + for (var i = 0, l = dirty.old.length; i < l; i++){ + if (item[i] != dirty.old[i]){ + append = false; + } + } + if (append){ // if we can, we will do posts to add from here + for (;i 0){ + left++; + this.service['delete'](this.getIdentity(this._deletedItems.pop())).addCallback(finishOne); + } + }, + + + revert: function(){ + // summary + // returns any modified data to its original state prior to a save(); + + while (this._dirtyItems.length>0){ + var i; + var d = this._dirtyItems.pop(); + for (i in d.old){ + d.item[i] = d.old[i]; + } + for (i in d.item){ + if (!d.old.hasOwnProperty(i)) + delete d.item[i] + } + } + this.onRevert(); + }, + + + isDirty: function(item){ + // summary + // returns true if the item is marked as dirty. + for (var i=0, l=this._dirtyItems.length; i 0; j--) + arguments[j] = arguments[j-1]; // shift them over + arguments[0] = dojo.mixin({restMethod: restMethod},method); + return svc._executeMethod.apply(svc,arguments); + } + })(); + + } + executor.contentType = method.contentType || svc._smd.contentType; // this is so a Rest service can be examined to know what type of content type to expect + return executor; + }, + restMethods:dojox.rpc._restMethods + } +); + +} diff --git a/includes/js/dojox/rpc/SMDLibrary/yahoo.smd b/includes/js/dojox/rpc/SMDLibrary/yahoo.smd new file mode 100644 index 0000000..cf08ee7 --- /dev/null +++ b/includes/js/dojox/rpc/SMDLibrary/yahoo.smd @@ -0,0 +1,493 @@ +{ + "SMDVersion": "2.0", + // FIXME: is this the kind of value we're supposed to use here? + "id": "http://developer.yahoo.com/search/", + "description": "Yahoo's search API", + + transport: "JSONP", + envelope: "URL", + additionalParameters: true, + parameters: [ + { name: "appid", optional: false, "default": "dojotoolkit" }, + { name: "output", optional: false, "default": "json" } + ], + + // FIXME: Quite a few of these APIs can take multiple entries for the same parameter, to behave + // as multi-select options. How should we handle these? + + services: { + // + // ANSWERS + // + // FIXME: Some of these API endpoints' names only make sense when you know they're in the + // Yahoo Answers part of the API; just reading a flat listing of methods in this SMD + // likely won't have enough information about what they do. Should we split this up? + + // http://developer.yahoo.com/answers/V1/questionSearch.html + questionSearch: { + target: "http://answers.yahooapis.com/AnswersService/V1/questionSearch", + parameters: [ + { name: "query", type: "string", optional: false, "default": "" }, + { name: "search_in", type: "string", optional: true, "default": "all" }, // can be "all", "question", "best_answer" + { name: "category_id", type: "integer", optional: true, "default": null }, // one of (category_id, category_name) is required + { name: "category_name", type: "string", optional: true, "default": null }, + { name: "region", type: "string", optional: true, "default": "us" }, // can be "us", "uk", "ca", "au", "in", "es", "br", "ar", "mx", "e1", "it", "de", "fr", "sg" + { name: "date_range", type: "string", optional: true, "default": "all" }, // can be "all", "7", "7-30", "30-60", "60-90", "more90" + { name: "sort", type: "string", optional: true, "default": "relevance" }, // can be "relevance", "date_desc", "date_asc" + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "resolved", "open", "undecided" + { name: "start", type: "integer", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 } // max 50 + ] + }, + + // http://developer.yahoo.com/answers/V1/getByCategory.html + getByCategory: { + target: "http://answers.yahooapis.com/AnswersService/V1/getByCategory", + parameters: [ + { name: "category_id", type: "integer", optional: true, "default": null }, // one of (category_id, category_name) is required + { name: "category_name", type: "string", optional: true, "default": null }, + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "resolved", "open", "undecided" + { name: "region", type: "string", optional: true, "default": "us" }, // can be "us", "uk", "ca", "au", "in", "es", "br", "ar", "mx", "e1", "it", "de", "fr", "sg" + { name: "sort", type: "string", optional: true, "default": "date_desc" }, // can be "date_desc", "date_asc", "ans_count_desc", "ans_count_asc" + { name: "start", type: "integer", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 } // max 50 + ] + }, + + // http://developer.yahoo.com/answers/V1/getQuestion.html + getQuestion: { + target: "http://answers.yahooapis.com/AnswersService/V1/getQuestion", + parameters: [ + { name: "question_id", type: "string", optional: true, "default": null } + ] + }, + + // http://developer.yahoo.com/answers/V1/getByUser.html + getByUser: { + target: "http://answers.yahooapis.com/AnswersService/V1/getByUser", + parameters: [ + { name: "user_id", type: "string", optional: false, "default": "" }, + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "resolved", "open", "undecided" + { name: "filter", type: "string", optional: true, "default": "question" }, // can be "question", "answer", "best_answer" + { name: "sort", type: "string", optional: true, "default": "date_desc" }, // can be "date_desc", "date_asc", "ans_count_desc", "ans_count_asc" + { name: "start", type: "integer", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 } // max 50 + ] + }, + + // + // AUDIO SEARCH + // + + // http://developer.yahoo.com/search/audio/V1/artistSearch.html + artistSearch: { + target: "http://search.yahooapis.com/AudioSearchService/V1/artistSearch", + parameters: [ + { name: "artist", type: "string", optional: true, "default": "" }, // one of (artist, artistid) is required + { name: "artistid", type: "string", optional: true, "default": "" }, + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "any", "phrase" + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/search/audio/V1/albumSearch.html + albumSearch: { + target: "http://search.yahooapis.com/AudioSearchService/V1/albumSearch", + parameters: [ + { name: "artist", type: "string", optional: true, "default": "" }, + { name: "artistid", type: "string", optional: true, "default": "" }, + { name: "album", type: "string", optional: true, "default": "" }, + { name: "albumid", type: "string", optional: true, "default": "" }, + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "any", "phrase" + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/search/audio/V1/songSearch.html + songSearch: { + // beware, this method has returned many a JSON string containing syntax error(s) + target: "http://search.yahooapis.com/AudioSearchService/V1/songSearch", + parameters: [ + { name: "artist", type: "string", optional: true, "default": "" }, + { name: "artistid", type: "string", optional: true, "default": "" }, + { name: "album", type: "string", optional: true, "default": "" }, + { name: "albumid", type: "string", optional: true, "default": "" }, + { name: "song", type: "string", optional: true, "default": "" }, + { name: "songid", type: "string", optional: true, "default": "" }, + { name: "type", type: "string", optional: true, "default": "all" }, // can be "all", "any", "phrase" + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/search/audio/V1/songDownloadLocation.html + songDownloadLocation: { + target: "http://search.yahooapis.com/AudioSearchService/V1/songDownloadLocation", + parameters: [ + { name: "songid", type: "string", optional: false, "default": "" }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "source", type: "string", optional: true, "default": "" } // can be "audiolunchbox", "artistdirect", "buymusic", "dmusic", "emusic", "epitonic", "garageband", "itunes", "yahoo", "livedownloads", "mp34u", "msn", "musicmatch", "mapster", "passalong", "rhapsody", "soundclick", "theweb" + ] + }, + + // + // CONTENT ANALYSIS + // + + // http://developer.yahoo.com/search/content/V1/termExtraction.html + contextSearch: { + // FIXME: the API docs say to submit this as a POST, but we need JSONP for cross-domain, right? + // transport: "POST", + target: "http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction", + parameters: [ + { name: "context", type: "string", optional: false, "default": "" }, + { name: "query", type: "string", optional: true, "default": "" } + ] + }, + + // + // IMAGE SEARCH + // + + // http://developer.yahoo.com/search/image/V1/imageSearch.html + imageSearch: { + target: "http://search.yahooapis.com/ImageSearchService/V1/imageSearch", + parameters: [ + { name: "query", type: "string", optional: false, "default": "" }, + { name: "type", type: "string", optional: true, "default": "any" }, // can be "all", "any", "phrase" + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "format", type: "string", optional: true, "default": "any" }, // can be "any", "bmp", "gif", "jpeg", "png" + { name: "adult_ok", type: "boolean", optional: true, "default": null }, + { name: "coloration", type: "string", optional: true, "default": "any" }, // can be "any", "color", "bw" + { name: "site", type: "string", optional: true, "default": null } + ] + }, + + // + // LOCAL SEARCH + // + + // http://developer.yahoo.com/search/local/V3/localSearch.html + localSearch: { + target: "http://local.yahooapis.com/LocalSearchService/V3/localSearch", + parameters: [ + { name: "query", type: "string", optional: true, "default": "" }, // optional, but one of (query, listing_id) is required + { name: "listing_id", type: "string", optional: true, "default": "" }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 20 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "sort", type: "string", optional: true, "default": "relevance" }, // can be "relevance", "title", "distance", "rating" + { name: "radius", type: "float", optional: true }, // the default varies according to location + { name: "street", type: "string", optional: true, "default": null }, + { name: "city", type: "string", optional: true, "default": null }, + { name: "state", type: "string", optional: true, "default": null }, // full name or two-letter abbreviation + { name: "zip", type: "any", optional: true, "default": null }, // ddddd or ddddd-dddd format + { name: "location", type: "string", optional: true, "default": null }, // free text, supersedes the street, city, state, zip fields + { name: "latitude", type: "float", optional: true }, // -90 to 90 + { name: "longitude", type: "float", optional: true }, // -180 to 180 + { name: "category", type: "integer", optional: true }, + { name: "omit_category", type: "integer", optional: true }, + { name: "minimum_rating", type: "integer", optional: true } + ] + }, + + // http://developer.yahoo.com/local/V1/collectionSearch.html + collectionSearch: { + target: "http://collections.local.yahooapis.com/LocalSearchService/V1/collectionSearch", + parameters: [ + { name: "query", type: "string", optional: true, "default": "" }, // optional, but at least one of (query, username) is required + { name: "username", type: "string", optional: true, "default": "" }, + { name: "city", type: "string", optional: true, "default": null }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/local/V1/getCollection.html + getCollection: { + target: "http://collections.local.yahooapis.com/LocalSearchService/V1/getCollection", + parameters: [ + { name: "collection_id", type: "integer", optional: false, "default": "" } + ] + }, + + // + // MY WEB 2.0 + // + + // http://developer.yahoo.com/search/myweb/V1/urlSearch.html + urlSearch: { + target: "http://search.yahooapis.com/MyWebService/V1/urlSearch", + parameters: [ + { name: "tag", type: "string", optional: true, "default": "" }, + { name: "yahooid", type: "string", optional: true, "default": "" }, + { name: "sort", type: "string", optional: true, "default": "date" }, // can be "date", "title", "url" + { name: "reverse_sort", type: "boolean", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/search/myweb/V1/tagSearch.html + tagSearch: { + target: "http://search.yahooapis.com/MyWebService/V1/tagSearch", + parameters: [ + { name: "url", type: "string", optional: true, "default": "" }, + { name: "yahooid", type: "string", optional: true, "default": "" }, + { name: "sort", type: "string", optional: true, "default": "popularity" }, // can be "popularity", "tag", "date" + { name: "reverse_sort", type: "boolean", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/search/myweb/V1/relatedTags.html + relatedTags: { + target: "http://search.yahooapis.com/MyWebService/V1/relatedTags", + parameters: [ + { name: "tag", type: "string", optional: false, "default": "" }, + { name: "yahooid", type: "string", optional: true, "default": "" }, + { name: "sort", type: "string", optional: true, "default": "popularity" }, // can be "popularity", "tag", "date" + { name: "reverse_sort", type: "boolean", optional: true, "default": 0 }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // + // NEWS SEARCH + // + + // http://developer.yahoo.com/search/news/V1/newsSearch.html + newsSearch: { + target: "http://search.yahooapis.com/NewsSearchService/V1/newsSearch", + parameters: [ + { name: "query", type: "string", optional: false, "default": "" }, + { name: "type", type: "string", optional: true, "default": "any" }, // can be "all", "any", "phrase" + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "sort", type: "string", optional: true, "default": "rank" }, // can be "rank", "date" + { name: "language", type: "string", optional: true, "default": null }, + { name: "site", type: "string", optional: true, "default": null } + ] + }, + + // + // SHOPPING + // + + // http://developer.yahoo.com/shopping/V2/catalogListing.html + catalogListing: { + target: "http://shopping.yahooapis.com/ShoppingService/V2/catalogListing", + parameters: [ + { name: "catalogid", type: "integer", optional: true, "default": null }, // required if idtype,idvalue are not specified + { name: "getlisting", type: "boolean", optional: true, "default": 1 }, + { name: "getreview", type: "boolean", optional: true, "default": 0 }, + { name: "getspec", type: "boolean", optional: true, "default": 0 }, + { name: "idtype", type: "string", optional: true, "default": null }, // can be "upc", "brand,model", "brand,partnum"; required if catalogid is not specified + { name: "idvalue", type: "string", optional: true, "default": null }, // required if catalogid is not specified + { name: "onlynew", type: "boolean", optional: true, "default": 1 }, + { name: "reviewstart", type: "integer", optional: true, "default": 1 }, + { name: "reviewsort", type: "string", optional: true, "default": "mostRecommended_descending" }, // can be "mostRecommended_descending", "mostRecommended_ascending", "latest_descending", "latest_ascending", "highestRated_descending", "highestRated_ascending" + { name: "zip", type: "string", optional: true, "default": null } + ] + }, + + + // http://developer.yahoo.com/shopping/V1/merchantSearch.html + merchantSearch: { + target: "http://api.shopping.yahoo.com/ShoppingService/V1/merchantSearch", + parameters: [ + { name: "merchantid", type: "integer", optional: false, "default": null } + ] + }, + + + // http://developer.yahoo.com/shopping/V3/productSearch.html + productSearch: { + target: "http://shopping.yahooapis.com/ShoppingService/V3/productSearch", + parameters: [ + { name: "query", type: "string", optional: true, "default": "" }, // required if category is not specified + { name: "category", type: "any", optional: true, "default": "" }, // required if query is not specified + { name: "class", type: "string", optional: true, "default": null }, // can be "catalogs", "freeoffers", "paidoffers"; defaults to all three of these + { name: "department", type: "integer", optional: true, "default": null }, + { name: "highestprice", type: "float", optional: true, "default": null }, + { name: "lowestprice", type: "float", optional: true, "default": null }, + { name: "merchantId", type: "integer", optional: true, "default": null }, + { name: "refinement", type: "string", optional: true, "default": null }, // used only if category is specified + { name: "results", type: "integer", optional: true, "default": 10 }, // 1-50 + { name: "show_numratings", type: "boolean", optional: true, "default": 0 }, + { name: "show_narrowing", type: "boolean", optional: true, "default": 1 }, + { name: "sort", type: "string", optional: true }, // can be "price_ascending", "price_descending", "userrating_ascending", "userrating_descending"; omitted, the default is to sort by relevance + { name: "start", type: "integer", optional: true, "default": 1 } // 1-300 + ] + }, + + // + // SITE EXPLORER + // + + // http://developer.yahoo.com/search/siteexplorer/V1/inlinkData.html + inlinkData: { + target: "http://search.yahooapis.com/SiteExplorerService/V1/inlinkData", + parameters: [ + { name: "query", type: "string", optional: false, "default": "" }, + { name: "results", type: "integer", optional: true, "default": 50 }, // max 100 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "entire_site", type: "boolean", optional: true, "default": null }, + { name: "omit_inlinks", type: "string", optional: true, "default": "none" } // can be "none", "domain", "subdomain" + ] + }, + + // http://developer.yahoo.com/search/siteexplorer/V1/pageData.html + pageData: { + target: "http://search.yahooapis.com/SiteExplorerService/V1/pageData", + parameters: [ + { name: "query", type: "string", optional: false, "default": "" }, + { name: "results", type: "integer", optional: true, "default": 50 }, // max 100 + { name: "start", type: "integer", optional: true, "default": 1 }, + { name: "domain_only", type: "boolean", optional: true, "default": null } + ] + }, + + // http://developer.yahoo.com/search/siteexplorer/V1/ping.html + ping: { + target: "http://search.yahooapis.com/SiteExplorerService/V1/ping", + parameters: [ + { name: "sitemap", type: "string", optional: false, "default": "" } + ] + }, + + // http://developer.yahoo.com/search/siteexplorer/V1/updateNotification.html + updateNotification: { + target: "http://search.yahooapis.com/SiteExplorerService/V1/updateNotification", + parameters: [ + { name: "url", type: "string", optional: false, "default": "" } + ] + }, + + // + // TRAFFIC + // + + // http://developer.yahoo.com/traffic/rest/V1/index.html + trafficData: { + target: "http://local.yahooapis.com/MapsService/V1/trafficData", + parameters: [ + { name: "street", type: "string", optional: true, "default": "" }, + { name: "city", type: "string", optional: true, "default": "" }, + { name: "state", type: "string", optional: true, "default": null }, // full name or two-letter abbreviation + { name: "zip", type: "any", optional: true, "default": null }, // ddddd or ddddd-dddd format + { name: "location", type: "string", optional: true, "default": null }, // free text, supersedes the street, city, state, zip fields + { name: "latitude", type: "float", optional: true }, // -90 to 90 + { name: "longitude", type: "float", optional: true }, // -180 to 180 + { name: "severity", type: "integer", optional: true, "default": 1 }, // can be 1-5 + { name: "zoom", type: "integer", optional: true, "default": 6 }, // can be 1-12 + { name: "radius", type: "float", optional: true }, // in miles, default varies with location; ignored if zoom is specified + { name: "include_map", type: "boolean", optional: true, "default": 0 }, + { name: "image_type", type: "string", optional: true, "default": "png" }, // can be "png" or "gif" + { name: "image_height", type: "integer", optional: true, "default": 500 }, // in pixels, can be 10-2000 + { name: "image_width", type: "integer", optional: true, "default": 620 } // in pixels, can be 10-2000 + ] + }, + + // + // TRAVEL + // + + // http://developer.yahoo.com/travel/tripservice/V1.1/tripSearch.html + tripSearch: { + target: "http://travel.yahooapis.com/TripService/V1.1/tripSearch", + parameters: [ + { name: "query", type: "string", optional: true, "default": "" }, + { name: "results", type: "integer", optional: true, "default": 10 }, // max 50 + { name: "start", type: "integer", optional: true, "default": 1 } + ] + }, + + // http://developer.yahoo.com/travel/tripservice/V1.1/getTrip.html + getTrip: { + target: "http://travel.yahooapis.com/TripService/V1.1/getTrip", + parameters: [ + { name: "id", type: "integer", optional: false, "default": null } + ] + }, + + // + // UTILITY SERVICES + // + + // http://developer.yahoo.com/util/timeservice/V1/getTime.html + /* RGG: commented out because it refuses to return JSON format even when you tell it + to do so (it returns a + + + + + + + + + +

                        + + DEMO: JsonRestStore Search + +

                        + +
                        + +

                        + + Description: + +

                        + +

                        + + This simple demo shows how JsonRestStore can be used with Persevere. + +

                        + +

                        + +

                        + + + +
                        + + + + + + + + + + + + + + + + + +
                        + + + +
                        + +
                        + + + + + diff --git a/includes/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html b/includes/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html new file mode 100644 index 0000000..40c6bac --- /dev/null +++ b/includes/js/dojox/rpc/demos/demo_JsonRestStore_Persevere.html @@ -0,0 +1,65 @@ + + + + Demo of JsonRestStore + + + + + + + +

                        + DEMO: JsonRestStore Search +

                        +
                        +

                        + Description: +

                        +

                        + This simple demo shows how JsonRestStore can be used with Persevere. +

                        +

                        +

                        + +
                        + + + + + + + + +
                        + +
                        +
                        + + diff --git a/includes/js/dojox/rpc/demos/documentation.html b/includes/js/dojox/rpc/demos/documentation.html new file mode 100644 index 0000000..4c28103 --- /dev/null +++ b/includes/js/dojox/rpc/demos/documentation.html @@ -0,0 +1,33 @@ + + + + + + +
                        + + \ No newline at end of file diff --git a/includes/js/dojox/rpc/demos/templates/documentation.html b/includes/js/dojox/rpc/demos/templates/documentation.html new file mode 100644 index 0000000..d14cf16 --- /dev/null +++ b/includes/js/dojox/rpc/demos/templates/documentation.html @@ -0,0 +1,8 @@ +
                        + +
                          + {% for result in results %} +
                        • {% if result.type %}{{ result.type }} {% endif %}{% ifequal result.type "Function" %}{% if not result.resources %}function {% endif %}{% endifequal %}{{ result.name }}{% ifequal result.type "Function" %}{% if not result.resources %}({% for parameter in result.parameters %}{% if not forloop.first %}, {% endif %}{% if parameter.types %}{% for type in parameter.types %}{% if not forloop.first %}|{% endif %}{{ type.title }}{% endfor %}{% if parameter.optional %}?{% endif %}{% if parameter.repeating %}...{% endif %} {% endif %}{{ parameter.name }}{% endfor %}{% endif %}{% endifequal %}{% ifequal result.type "Function" %}{% if not result.resources %}){% endif %}{% endifequal %}
                        • + {% endfor %} +
                        +
                        \ No newline at end of file diff --git a/includes/js/dojox/rpc/demos/templates/yahoo.html b/includes/js/dojox/rpc/demos/templates/yahoo.html new file mode 100644 index 0000000..04339d2 --- /dev/null +++ b/includes/js/dojox/rpc/demos/templates/yahoo.html @@ -0,0 +1,31 @@ +
                        + +
                          + {% for result in results.Result %} +
                        • {{ result.Title }}
                          {{ result.Summary }}
                        • + {% endfor %} +
                        + + {% if results.firstResultPosition %} + + + + + {% endif %}{% if results.totalResultsAvailable %} + + + + + {% endif %}{% if results.totalResultsReturned %} + + + + + {% endif %}{% if results.type %} + + + + + {% endif %} +
                        First Result{{ results.firstResultPosition }}
                        Total Results Available{{ results.totalResultsAvailable }}
                        Results Returned{{ results.totalResultsReturned }}
                        Type{{ results.type }}
                        +
                        diff --git a/includes/js/dojox/rpc/demos/yahoo.html b/includes/js/dojox/rpc/demos/yahoo.html new file mode 100644 index 0000000..39cee00 --- /dev/null +++ b/includes/js/dojox/rpc/demos/yahoo.html @@ -0,0 +1,39 @@ + + + + Yahoo Search Demo + + + + + +

                        Yahoo Web Search

                        +
                        + + diff --git a/includes/js/dojox/rpc/documentation.smd b/includes/js/dojox/rpc/documentation.smd new file mode 100644 index 0000000..3ff1623 --- /dev/null +++ b/includes/js/dojox/rpc/documentation.smd @@ -0,0 +1,30 @@ +{ + envelope: "URL", + transport: "JSONP", + callbackParamName: "callback", + services: { + get: { + target: "http://redesign.dojotoolkit.org/jsdoc/jsonp", + parameters: [ + { name: "name", type: "string", optional: false }, + { name: "exact", type: "boolean", optional: true }, + { name: "recursion", type: "boolean", optional: true }, + { name: "resource", type: "string", optional: true }, + { name: "project", type: "string", optional: true }, + { name: "version", type: "string", optional: true }, + { name: "attributes", type: "array", optional: true } + ] + }, + batch: { + target: "http://redesign.dojotoolkit.org/jsdoc/jsonp/batch", + parameters: [ + { name: "names", type: "array", optional: false }, + { name: "exact", type: "boolean", optional: true }, + { name: "recursion", type: "boolean", optional: true }, + { name: "project", type: "string", optional: true }, + { name: "version", type: "string", optional: true }, + { name: "attributes", type: "array", optional: false } + ] + } + } +} \ No newline at end of file diff --git a/includes/js/dojox/rpc/test.txt b/includes/js/dojox/rpc/test.txt new file mode 100644 index 0000000..e69de29 diff --git a/includes/js/dojox/rpc/tests/JsonReferencing.js b/includes/js/dojox/rpc/tests/JsonReferencing.js new file mode 100644 index 0000000..69a6782 --- /dev/null +++ b/includes/js/dojox/rpc/tests/JsonReferencing.js @@ -0,0 +1,30 @@ +if(!dojo._hasResource["dojox.rpc.tests.JsonReferencing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.tests.JsonReferencing"] = true; +dojo.provide("dojox.rpc.tests.JsonReferencing"); +dojo.require("dojox.rpc.JsonReferencing"); + + +doh.register("dojox.rpc.tests.JsonReferencing", [ + function fromRefJson(t) { + var testStr = '{a:{$ref:"$"},id:"root",c:{d:"e",f:{$ref:"root.c"}},b:{$ref:"$.c"}}'; + + var mirrorObj = dojox.rpc.fromJson(testStr); + t.assertEqual(mirrorObj, mirrorObj.a); + t.assertEqual(mirrorObj.c, mirrorObj.c.f); + t.assertEqual(mirrorObj.c, mirrorObj.b); + }, + function toAndFromRefJson(t) { + var testObj = {a:{},b:{c:{}}}; + testObj.a.d= testObj; + testObj.b.g=testObj.a; + testObj.b.c.f = testObj.b; + testObj.b.h=testObj.a; + var mirrorObj = dojox.rpc.fromJson(dojox.rpc.toJson(testObj)); + t.assertEqual(mirrorObj.a.d, mirrorObj); + t.assertEqual(mirrorObj.b.g, mirrorObj.a); + t.assertEqual(mirrorObj.b.c.f, mirrorObj.b); + t.assertEqual(mirrorObj.b.h, mirrorObj.a); + } +]); + +} diff --git a/includes/js/dojox/rpc/tests/Service.js b/includes/js/dojox/rpc/tests/Service.js new file mode 100644 index 0000000..353519e --- /dev/null +++ b/includes/js/dojox/rpc/tests/Service.js @@ -0,0 +1,702 @@ +if(!dojo._hasResource["dojox.rpc.tests.Service"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.tests.Service"] = true; +dojo.provide("dojox.rpc.tests.Service"); +dojo.require("dojo.io.script"); +dojo.require("dojox.rpc.Service"); +dojo.require("dojox.rpc.JsonRPC"); +dojo.require("dojox.rpc.Rest"); +//this is a copy of our smd in js form, so we can just share it easily +//dojo.require("dojox.rpc.tests.resources.testSmd"); + + +dojox.rpc.tests.service = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.tests.resources", "test.smd")); + +doh.register("dojox.rpc.tests.echo", + [ + { + name: "#1 POST,URL,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + //test when given named params + var td = this.svc.postEcho({message: this.name,foo:2}); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#2 POST,URL,Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postEcho(this.name,2); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#3 GET,URL,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getEcho({message: this.name}); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + + { + name: "#3.1 REST PUT,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + res = this.name + Math.random(); + //test when given named params + var td = this.svc.restStore.put({location: "res"},res); + td.addCallback(this, function(result){ + var td = this.svc.restStore({location: "res"}); + td.addCallback(this, function(result){ + if (result==res){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + }); + + return d; + } + }, + { + name: "#3.2 REST POST,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + var newRes = this.name + Math.random(); + res += newRes; + //test when given named params + var td = this.svc.restStore.post({location: "res"},newRes); + td.addCallback(this, function(result){ + var td = this.svc.restStore({location: "res"}); + td.addCallback(this, function(result){ + if (result==res){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + }); + + return d; + } + }, + { + name: "#3.3 REST DELETE,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.restStore['delete']({location: "res"}); + td.addCallback(this, function(result){ + var td = this.svc.restStore({location: "res"}); + td.addCallback(this, function(result){ + if (result=="deleted"){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + }); + + return d; + } + }, + { + name: "#3.4 GET,URL,Named Parameters, Returning Json", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getEchoJson({message:'{"foo":"bar"}'}); + td.addCallback(this, function(result){ + if (result.foo=='bar'){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#3.5 GET,PATH,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getPathEcho({path: "pathname"}); + td.addCallback(this, function(result){ + if (result=="/path/pathname"){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + + { + name: "#4 GET,URL,Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getEcho(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + + { + name: "#5 POST,URL,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonEcho({message: this.name}); + td.addCallback(this, function(res){ + var result = dojo.fromJson(res); + if (result && result.message && result.message==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + + { + name: "#6 POST,JSON,Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonEcho(this.name); + td.addCallback(this, function(res){ + var result = dojo.fromJson(res); + if (result && result.message && result.message==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#7 JSONP,URL,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.jsonpEcho({message: this.name}); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#8 JSONP,URL, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.jsonpEcho(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#9 POST,JSON-RPC-1.0,Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc10Echo(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#10 POST,JSON-RPC-1.0,Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc10EchoNamed(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#11 POST,JSON-RPC 1.2, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc12Echo(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#12 POST,JSON-RPC 1.2, Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc12Echo({message: this.name}); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + } + /* + ,{ + name: "#13 GET,JSON-RPC 1.2, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getJsonRpc12Echo(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + { + name: "#14 GET,JSON-RPC 1.2, Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.getJsonRpc12EchoNamed({message: this.name}); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + }, + ,{ + name: "#15 JSONP,JSON-RPC 1.2, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.jsonpJsonRpc12Echo(this.name); + td.addCallback(this, function(result){ + if (result==this.name){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + + return d; + } + } + */ + ] +); + +doh.register("dojox.rpc.tests.jsonRpcForcedError", [ + { + name: "POST,JSON-RPC 1.0, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc10ForcedError(this.name); + + td.addErrback(this, function(error){ + d.callback(true); + }); + + return d; + } + }, + { + name: "POST,JSON-RPC 1.2, Ordered Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc12ForcedError(this.name); + + td.addErrback(this, function(error){ + d.callback(true); + }); + + return d; + } + }, + { + name: "POST,JSON-RPC 1.2, Named Parameters", + timeout: 4000, + setUp: function(){ + //this.svc = new dojox.rpc.Service(dojox.rpc.tests.resources.testSmd); + this.svc = dojox.rpc.tests.service; + }, + runTest: function(){ + var d = new doh.Deferred(); + + if (window.location.protocol=="file:") { + var err= new Error("This Test requires a webserver and will fail intentionally if loaded from file://"); + d.errback(err); + return d; + } + + //test when given named params + var td = this.svc.postJsonRpc12ForcedError({message: this.name}); + + td.addErrback(this, function(error){ + d.callback(true); + }); + + return d; + } + } +]); + +} diff --git a/includes/js/dojox/rpc/tests/Yahoo.js b/includes/js/dojox/rpc/tests/Yahoo.js new file mode 100644 index 0000000..7e5dbfa --- /dev/null +++ b/includes/js/dojox/rpc/tests/Yahoo.js @@ -0,0 +1,317 @@ +if(!dojo._hasResource["dojox.rpc.tests.Yahoo"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.tests.Yahoo"] = true; +dojo.provide("dojox.rpc.tests.Yahoo"); +dojo.require("dojo.io.script"); +dojo.require("dojox.rpc.Service"); + +dojox.rpc.tests.yahooService = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd")); + +dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT = 8000; +dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT = 30000; + +dojox.rpc.tests.yahooService._testMethod = function(method){ + return function(m){ + var d = new doh.Deferred(); + + if (method.name && method.parameters && method.expectedResult) { + var yd = dojox.rpc.tests.yahooService[method.name](method.parameters); + yd.addCallback(this, function(result){ + if (result[method.expectedResult]){ + d.callback(true); + }else{ + d.errback(new Error("Unexpected Return Value: ", result)); + } + }); + } + + return d; + } +}; + +doh.register("dojox.rpc.tests.yahoo", + [ + { + name: "#1, Yahoo Answers::questionSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "questionSearch", + parameters: {query: "dojo toolkit"}, + expectedResult: "all" + }) + }, + { + name: "#2, Yahoo Answers::getByCategory", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "getByCategory", + parameters: {category_name: "Computers+%26+Internet%3ESoftware"}, + expectedResult: "all" + }) + }, + { + name: "#3, Yahoo Answers::getQuestion", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "getQuestion", + parameters: {question_id: "1005120800412"}, + expectedResult: "all" + }) + }, + { + name: "#4, Yahoo Answers::getByUser", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "getByUser", + parameters: {user_id: "AA10001397"}, + expectedResult: "all" + }) + }, + { + name: "#5, Yahoo Audio::artistSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "artistSearch", + parameters: {artist: "The Beatles"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#6, Yahoo Audio::albumSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "albumSearch", + parameters: {artist: "The Beatles", album: "Magical Mystery Tour"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#7, Yahoo Audio::songSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "songSearch", + parameters: {artist: "The Beatles", album: "Magical Mystery Tour", song: "Penny Lane"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#8, Yahoo Audio::songDownloadLocation", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "songDownloadLocation", + parameters: {songid: "XXXXXXT000995691"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#9, Yahoo ContentAnalysis::contextSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "contextSearch", + parameters: { + context: "Welcome to the Book of Dojo. This book covers both versions 0.9 and 1.0, and all 1.0 extensions and changes are clearly marked for your enjoyment. Please use the forums for support questions, but if you see something missing, incomplete, or just plain wrong in this book, please leave a comment.", + query: "dojo" + }, + expectedResult: "ResultSet" + }) + }, + { + name: "#10, Yahoo Image::imageSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "imageSearch", + parameters: {query: "dojo"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#11, Yahoo Local::localSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "localSearch", + parameters: {query: "pizza", zip: "98201"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#12, Yahoo Local::collectionSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "collectionSearch", + parameters: {query: "dojo"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#13, Yahoo Local::getCollection", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + expectedResult: "getCollection", + parameters: {collection_id: "1000031487"}, + expectedResult: "Result" + }) + }, + { + name: "#14, Yahoo Local::trafficData", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "trafficData", + parameters: {street: "1600 Pennsylvania Ave", city: "Washington, DC"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#15, Yahoo MyWebs::urlSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "urlSearch", + parameters: {tag: "javascript"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#16, Yahoo MyWebs::tagSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "tagSearch", + parameters: {url: "dojotoolkit.org"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#17, Yahoo MyWebs::relatedTags", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_LONG_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "relatedTags", + parameters: {tag: "javascript"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#18, Yahoo NewsSearch::newsSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "newsSearch", + parameters: {query: "dojo toolkit"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#19, Yahoo Shopping::catalogListing", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "catalogListing", + parameters: {idtype: "brand,partnum", idvalue: "canon,1079B001", getspec: 1}, + expectedResult: "Catalog" + }) + }, + { + name: "#20, Yahoo Shopping::merchantSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "merchantSearch", + parameters: {merchantid: "1021849"}, + expectedResult: "Merchant" + }) + }, + { + name: "#21, Yahoo Shopping::productSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "productSearch", + parameters: {query: "dojo"}, + expectedResult: "Categories" + }) + }, + { + name: "#22, Yahoo SiteExplorer::inlinkData", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "inlinkData", + parameters: {query: "dojotoolkit.org"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#23, Yahoo SiteExplorer::pageData", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "pageData", + parameters: {query: "dojotoolkit.org"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#24, Yahoo SiteExplorer::ping", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "ping", + parameters: {sitemap: "http://www.yahoo.com"}, + expectedResult: "Success" + }) + }, + { + name: "#25, Yahoo SiteExplorer::updateNotification", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "updateNotification", + parameters: {url: "http://www.yahoo.com"}, + expectedResult: "Success" + }) + }, + { + name: "#26, Yahoo Trip::tripSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "tripSearch", + parameters: {query: "eiffel tower"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#27, Yahoo Trip::getTrip", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "getTrip", + parameters: {id: "546303"}, + expectedResult: "Result" + }) + }, + { + name: "#28, Yahoo Video::videoSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "videoSearch", + parameters: {query: "star wars kid"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#29, Yahoo Web::webSearch", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "webSearch", + parameters: {query: "dojo toolkit"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#30, Yahoo Web::spellingSuggestion", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "spellingSuggestion", + parameters: {query: "beatls"}, + expectedResult: "ResultSet" + }) + }, + { + name: "#31, Yahoo Web::relatedSuggestion", + timeout: dojox.rpc.tests.yahooService.TEST_METHOD_TIMEOUT, + runTest: dojox.rpc.tests.yahooService._testMethod({ + name: "relatedSuggestion", + parameters: {query: "dojo toolkit"}, + expectedResult: "ResultSet" + }) + } +]); + +} diff --git a/includes/js/dojox/rpc/tests/libraryTests.js b/includes/js/dojox/rpc/tests/libraryTests.js new file mode 100644 index 0000000..7af2ae6 --- /dev/null +++ b/includes/js/dojox/rpc/tests/libraryTests.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.rpc.tests.libraryTests"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.tests.libraryTests"] = true; +dojo.provide("dojox.rpc.tests.libraryTests"); + +try{ + dojo.require("dojox.rpc.tests.Yahoo"); +}catch(e){ + doh.debug(e); +} + + +} diff --git a/includes/js/dojox/rpc/tests/module.js b/includes/js/dojox/rpc/tests/module.js new file mode 100644 index 0000000..038a9ad --- /dev/null +++ b/includes/js/dojox/rpc/tests/module.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojox.rpc.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.rpc.tests.module"] = true; +dojo.provide("dojox.rpc.tests.module"); + +try{ + dojo.require("dojox.rpc.tests.Service"); + dojo.require("dojox.rpc.tests.JsonReferencing"); +}catch(e){ + doh.debug(e); +} + + +} diff --git a/includes/js/dojox/rpc/tests/resources/JSON.php b/includes/js/dojox/rpc/tests/resources/JSON.php new file mode 100644 index 0000000..4a21ce7 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/JSON.php @@ -0,0 +1,724 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 8); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 10); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_STRICT_TYPE', 11); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior: when encoding or decoding, + * be loose or strict about object/array usage + * + * possible values: + * - SERVICES_JSON_STRICT_TYPE: strict typing, default. + * "{...}" syntax creates objects in decode(). + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays in decode(). + */ + function Services_JSON($use = SERVICES_JSON_STRICT_TYPE) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $ut8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return string JSON string representation of input var + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($var), + array_values($var))) + . '}'; + } + + // treat it like a regular array + return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; + + case 'object': + $vars = get_object_vars($var); + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars))) + . '}'; + + default: + return ''; + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + return $this->encode(strval($name)) . ':' . $this->encode($value); + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + (($chrs{$c - 1} != '\\') || + ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) { + // found a quote, we're in a string, and it's not escaped + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + +} + +?> \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery b/includes/js/dojox/rpc/tests/resources/bigQuery new file mode 100644 index 0000000..e8f9429 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery @@ -0,0 +1 @@ +[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery5 b/includes/js/dojox/rpc/tests/resources/bigQuery5 new file mode 100644 index 0000000..e77ca8d --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery5 @@ -0,0 +1 @@ +[1,2,3,4,5] \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/echo.php b/includes/js/dojox/rpc/tests/resources/echo.php new file mode 100644 index 0000000..b38a3ee --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echo.php @@ -0,0 +1,7 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/echoJson.php b/includes/js/dojox/rpc/tests/resources/echoJson.php new file mode 100644 index 0000000..52b5d03 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echoJson.php @@ -0,0 +1,8 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/fakestore.php b/includes/js/dojox/rpc/tests/resources/fakestore.php new file mode 100644 index 0000000..075926a --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/fakestore.php @@ -0,0 +1,36 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc10.php b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php new file mode 100644 index 0000000..fc99b75 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php @@ -0,0 +1,47 @@ + sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "postJsonRpc10EchoNamed": + case "postJsonRpc10Echo": + $results['result']=$params[0]; + break; + default: + $results['result']=""; + $results['error']="JSON-RPC 1.0 METHOD NOT FOUND"; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc11.php b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php new file mode 100644 index 0000000..1c91e51 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php @@ -0,0 +1,52 @@ + sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "rawPostJsonRpc11Echo": + if (is_array($params)){ + $results['result']=$params; + }else{ + $results['result']=$params->message; + } + break; + default: + $results['result']=""; + $results['error']=array(); + $results['error']['code']=-32601; + $results['error']["message"]="The requested remote-procedure does not exist / is not available."; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc12.php b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php new file mode 100644 index 0000000..8fad2e5 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php @@ -0,0 +1,53 @@ + sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "postJsonRpc12Echo": + case "postJsonRpc12EchoNamed": + if (is_array($params)){ + $results['result']=$params; + }else{ + $results['result']=$params->message; + } + break; + default: + $results['result']=""; + $results['error']=array(); + $results['error']['code']=-32601; + $results['error']["message"]="The requested remote-procedure does not exist / is not available."; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php new file mode 100644 index 0000000..7db9153 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php @@ -0,0 +1,38 @@ +decode($params); + $result = "{id:" . $id . ", 'result':'" . $p[0]. "', error:''}"; + break; + case "postJsonRpc12Echo": + case "getJsonRpc12Echo": + case "postJsonRpc12EchoNamed": + case "getJsonRpc12EchoNamed": + $p = $json->decode($params); + + if ($p->message){ + $d = $p->message; + }else{ + $d=$p[0]; + } + $result = "{id:" . $id . ", 'result':'" . $d . "'}"; + break; + default: + $result = "{id:'1','error':'Unknown Method', 'result':'this result only here for this test, shouldnt be here in real code'}"; + break; + } + + print $result; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php @@ -0,0 +1,23 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps @@ -0,0 +1,23 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php new file mode 100644 index 0000000..251f38e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php @@ -0,0 +1,37 @@ +decode($_REQUEST['params']); + $callback = $_REQUEST["callback"]; + + switch($method){ + case "jsonpJsonRpc10EchoNamed": + case "jsonpJsonRpc11Echo": + case "jsonpJsonRpc11EchoNamed": + case "jsonpJsonRpc10Echo": + if ( ($method=="jsonpJsonRpc10EchoNamed")||($method=="jsonpJsonRpc11EchoNamed")){ + $message = $params->message; + }else{ + $message = $params[0]; + } + if ($message){ + switch($method){ + case "jsonpJsonRpc11Echo": + case "jsonpJsonRpc11EchoNamed": + $res = "{'id': '$id', result: '$message'}"; + break; + default: + $res = "{'id': '$id', result: '$message', 'error':''}"; + break; + } + }else{ + $res = "{'id': '$id', error: {'code': 100, 'message':'no message provided'}}"; + } + } + + print "$callback($res)"; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/obj1 b/includes/js/dojox/rpc/tests/resources/obj1 new file mode 100644 index 0000000..ff02ba8 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1 @@ -0,0 +1 @@ +{"id":"obj1","name":"Object 1","updated":1202755814406,"obj":{"foo":"bar"},"obj dup":{"$ref":"obj1.obj"},"testArray":[1,2,3,4]} \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj1testArray b/includes/js/dojox/rpc/tests/resources/obj1testArray new file mode 100644 index 0000000..0c624c1 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1testArray @@ -0,0 +1 @@ +[1,2,3,undefined,4] \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj3 b/includes/js/dojox/rpc/tests/resources/obj3 new file mode 100644 index 0000000..21cb328 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj3 @@ -0,0 +1 @@ +{"id":"obj3","name":"Object 3"} \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj4 b/includes/js/dojox/rpc/tests/resources/obj4 new file mode 100644 index 0000000..a429ecf --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj4 @@ -0,0 +1 @@ +{"id":"obj4","name":"Object 4"} \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/query b/includes/js/dojox/rpc/tests/resources/query new file mode 100644 index 0000000..cd18d6e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/query @@ -0,0 +1,6 @@ +[ + {id:"obj1",name:"Object 1"}, + {id:"obj2",name:"Object 2"}, + {$ref:"obj3"}, + {$ref:"obj4"} +] \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/rawEcho.php b/includes/js/dojox/rpc/tests/resources/rawEcho.php new file mode 100644 index 0000000..e0c15c0 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/rawEcho.php @@ -0,0 +1,5 @@ + + diff --git a/includes/js/dojox/rpc/tests/resources/res b/includes/js/dojox/rpc/tests/resources/res new file mode 100644 index 0000000..3c22137 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/res @@ -0,0 +1 @@ +deleted \ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/store.php b/includes/js/dojox/rpc/tests/resources/store.php new file mode 100644 index 0000000..941e113 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/store.php @@ -0,0 +1,24 @@ + diff --git a/includes/js/dojox/rpc/tests/resources/test.smd b/includes/js/dojox/rpc/tests/resources/test.smd new file mode 100644 index 0000000..6ad56be --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/test.smd @@ -0,0 +1,189 @@ +{ + transport: "POST", + envelope: "URL", + strictParameters: false, + parameters: { + appId: {}, + outputType: { + default: "json" + }, + + ignoreErrors: { + optional: true + } + }, + + services: { + postEcho: { + target: "echo.php", + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + getEcho: { + transport: "GET", + target: "echo.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + getEchoJson: { + transport: "GET", + target: "echoJson.php", + contentType:"application/json", + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + getPathEcho: { + transport: "GET", + envelope: "PATH", + target: "echo.php?message=", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + restStore: { + transport: "REST", + contentType:"text/plain", + target: "fakestore.php", + parameters: [ + {name: "location", type: "string", optional: true} + ] + }, + jsonRestStore: { + transport: "REST", + target: "fakestore.php", + contentType:"application/json", + parameters: [ + {name: "location", type: "string", optional: true} + ] + }, + + + + postJsonEcho: { + transport: "POST", + envelope: "JSON", + target: "rawEcho.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + jsonpEcho: { + transport: "JSONP", + target: "jsonpEcho.php", + callbackParamName: "testCallbackParam", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + postJsonRpc10Echo: { + transport: "POST", + envelope: "JSON-RPC-1.0", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc10EchoNamed: { + transport: "POST", + envelope: "JSON-RPC-1.0", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + jsonpJsonRpc12Echo: { + transport: "JSONP", + envelope: "JSON-RPC-2.0", + target: "jsonpJsonRpcEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + jsonpJsonRpc12EchoNamed: { + transport: "JSONP", + envelope: "JSON-RPC-2.0", + target: "jsonpJsonRpcEcho.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + postJsonRpc10ForcedError: { + envelope: "JSON-RPC-1.0", + transport: "POST", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc12Echo: { + transport: "POST", + envelope: "JSON-RPC-2.0", + target: "jsonRpc12.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + getJsonRpc12Echo: { + transport: "GET", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc12EchoNamed: { + transport: "POST", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + getJsonRpc12EchoNamed: { + transport: "GET", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + + postJsonRpc12ForcedError: { + envelope: "JSON-RPC-2.0", + transport: "POST", + target: "jsonRpc12.php", + + parameters: [ + {type: "string", optional: true} + ] + } + } +} diff --git a/includes/js/dojox/rpc/tests/runLibraryTests.html b/includes/js/dojox/rpc/tests/runLibraryTests.html new file mode 100644 index 0000000..25c88a7 --- /dev/null +++ b/includes/js/dojox/rpc/tests/runLibraryTests.html @@ -0,0 +1,9 @@ + + + + Dojox Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/rpc/tests/runTests.html b/includes/js/dojox/rpc/tests/runTests.html new file mode 100644 index 0000000..bb937c6 --- /dev/null +++ b/includes/js/dojox/rpc/tests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/rpc/tests/stores/JsonRestStore.js b/includes/js/dojox/rpc/tests/stores/JsonRestStore.js new file mode 100644 index 0000000..25e0fc7 --- /dev/null +++ b/includes/js/dojox/rpc/tests/stores/JsonRestStore.js @@ -0,0 +1,237 @@ +if(!dojo._hasResource["dojox.data.tests.stores.JsonRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.tests.stores.JsonRestStore"] = true; +dojo.provide("dojox.data.tests.stores.JsonRestStore"); +dojo.require("dojox.data.JsonRestStore"); +dojo.require("dojo.data.api.Read"); +dojo.require("dojox.rpc.Service"); + +dojox.data.tests.stores.JsonRestStore.error = function(t, d, errData){ + // summary: + // The error callback function to be used for all of the tests. + d.errback(errData); +} +var testServices = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.tests.resources", "test.smd")); +var jsonStore = new dojox.data.JsonRestStore({service:testServices.jsonRestStore}); + +doh.register("dojox.data.tests.stores.JsonRestStore", + [ + { + name: "Fetch some items", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // Simple test of a basic fetch on JsonRestStore of a simple query. + var d = new doh.Deferred(); + jsonStore.fetch({query:"query", + onComplete: function(items, request){ + t.is(4, items.length); + d.callback(true); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "fetch by id", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // Simple test of a basic fetch on JsonRestStore of a single item. + var d = new doh.Deferred(); + jsonStore.fetch({query:"obj1", + onComplete: function(item, request){ + t.is("Object 1", item.name); + t.t(jsonStore.hasAttribute(item,"name")); + t.is(jsonStore.getValues(item,"name").length,1); + t.t(jsonStore.isItem(item)); + d.callback(true); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "Modify,save, check by id", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // Fetch an item from a query, modify and save it, and check to see if it was modified correctly + var d = new doh.Deferred(); + jsonStore.fetch({query:"query", + onComplete: function(items, request){ + var now = new Date().getTime(); + jsonStore.setValue(items[0],"updated",now); + jsonStore.setValue(items[0],"obj",{foo:'bar'}); + jsonStore.setValue(items[0],"obj dup",items[0].obj); + jsonStore.setValue(items[0],"testArray",[1,2,3,4]); + jsonStore.save(); + jsonStore.fetch({query:"obj1", + onComplete: function(item, request){ + t.is("Object 1", item.name); + t.is(now, item.updated); + t.is("bar", item.obj.foo); + t.is(item.obj, item['obj dup']); + d.callback(true); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "Post, delete, and put", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // append/post an item, delete it, sort the lists, resort the list, saving each time. + var d = new doh.Deferred(); + jsonStore.fetch({query:"obj1", + onComplete: function(item, request){ + var now = new Date().getTime(); + var testArray = item.testArray; + var newObject = {"name":"new object"}; + testArray.push(newObject); + jsonStore.save(); + jsonStore.deleteItem(newObject,{parent:testArray}); + jsonStore.save(); + testArray.sort(function(obj1,obj2) { return obj1 < obj2; }); + jsonStore.save(); + testArray.sort(function(obj1,obj2) { return obj1 > obj2; }); + jsonStore.save(); + d.callback(true); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "Revert", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // append/post an item, delete it, sort the lists, resort the list, saving each time. + var d = new doh.Deferred(); + jsonStore.fetch({query:"obj1", + onComplete: function(item, request){ + jsonStore.setValue(item,"name","new name"); + jsonStore.setValue(item,"newProp","new value"); + jsonStore.unsetAttribute(item,"updated"); + t.is(jsonStore.getValue(item,"name"),"new name"); + t.is(jsonStore.getValue(item,"newProp"),"new value"); + t.is(jsonStore.getValue(item,"updated"),undefined); + jsonStore.revert(); + t.is(jsonStore.getValue(item,"name"),"Object 1"); + t.is(jsonStore.getValue(item,"newProp"),undefined); + t.t(typeof jsonStore.getValue(item,"updated") == 'number'); + d.callback(true); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "Lazy loading", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // test lazy loading + var d = new doh.Deferred(); + jsonStore.fetch({query:"query", + onComplete: function(items, request){ + /*var item = jsonStore.getValue(items,2); // sync lazy loading + t.is(item.name == 'Object 3');*/ + jsonStore.getValue(items,3,function(item) { // async lazy loading + t.is(item.name,'Object 4'); + d.callback(true); + }); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + { + name: "Array manipulation", + timeout: 10000, //10 seconds. + runTest: function(t) { + // summary: + // test array manipulation + var d = new doh.Deferred(); + jsonStore.fetch({query:"obj1", + onComplete: function(item, request){ + var testArray = item.testArray; + testArray.reverse(); + testArray.unshift(testArray.pop()); + jsonStore.onSave = function(data) { + t.is(data.length,1); + d.callback(true); + jsonStore.onSave = function(){}; + }; + jsonStore.save(); + }, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, doh, d)}); + return d; //Object + } + }, + + { + name: "ReadAPI: Fetch_20_Streaming", + timeout: 10000, //10 seconds. Json can sometimes be slow. + runTest: function(t) { + // summary: + // fetching with paging + + var d = new doh.Deferred(); + var count = 0; + + function onItem(item, requestObj){ + t.assertTrue(typeof item == 'number'); + count++; + } + function onComplete(items, request){ + t.is(5, count); + + t.is(null, items); + d.callback(true); + } + //Get everything... + jsonStore.fetch({ + query: "bigQuery", + onBegin: null, + count: 5, + onItem: onItem, + onComplete: onComplete, + onError: dojo.partial(dojox.data.tests.stores.JsonRestStore.error, t, d) + }); + return d; //Object + } + }, + function testReadAPI_functionConformance(t){ + // summary: + // Simple test read API conformance. Checks to see all declared functions are actual functions on the instances. + // description: + // Simple test read API conformance. Checks to see all declared functions are actual functions on the instances. + + var readApi = new dojo.data.api.Read(); + var passed = true; + + for(i in readApi){ + if(i.toString().charAt(0) !== '_') + { + var member = readApi[i]; + //Check that all the 'Read' defined functions exist on the test store. + if(typeof member === "function"){ + var testStoreMember = jsonStore [i]; + if(!(typeof testStoreMember === "function")){ + passed = false; + break; + } + } + } + } + } + ] +); + + +} diff --git a/includes/js/dojox/rpc/tests/test_dojo_data_model_persevere.html b/includes/js/dojox/rpc/tests/test_dojo_data_model_persevere.html new file mode 100644 index 0000000..063dc9b --- /dev/null +++ b/includes/js/dojox/rpc/tests/test_dojo_data_model_persevere.html @@ -0,0 +1,146 @@ + + + + dojox.Grid with Dojo.Data via binding + + + + + + + +
                        dojox.Grid using interactive PersevereRestStore
                        +
                        + + +     + +     + + + +
                        + +
                        +
                        + + diff --git a/includes/js/dojox/sketch.js b/includes/js/dojox/sketch.js new file mode 100644 index 0000000..6da3443 --- /dev/null +++ b/includes/js/dojox/sketch.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojox.sketch"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch"] = true; +dojo.provide("dojox.sketch"); +try{ + // fix IE image caching issue + document.execCommand("BackgroundImageCache", false, true); +}catch(e){ } +dojo.require("dojox.xml.DomParser"); +dojo.require("dojox.sketch.UndoStack"); +dojo.require("dojox.sketch.Figure"); +dojo.require("dojox.sketch.Toolbar"); + +} diff --git a/includes/js/dojox/sketch/Anchor.js b/includes/js/dojox/sketch/Anchor.js new file mode 100644 index 0000000..de72ac0 --- /dev/null +++ b/includes/js/dojox/sketch/Anchor.js @@ -0,0 +1,61 @@ +if(!dojo._hasResource["dojox.sketch.Anchor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.Anchor"] = true; +dojo.provide("dojox.sketch.Anchor"); +dojo.require("dojox.gfx"); + +(function(){ + var ta=dojox.sketch; + ta.Anchor=function(an, id, isControl){ + var self=this; + var size=4; // .5 * size of anchor. + var rect=null; + + this.type=function(){ return "Anchor"; }; + this.annotation=an; + + this.id=id; + this._key="anchor-" + ta.Anchor.count++; + this.shape=null; + this.isControl=(isControl!=null)?isControl:true; + + this.beginEdit=function(){ + this.annotation.beginEdit(ta.CommandTypes.Modify); + }; + this.endEdit=function(){ + this.annotation.endEdit(); + }; + this.doChange=function(pt){ + if(this.isControl) this.shape.applyTransform(pt); + else{ + an.transform.dx+=pt.dx; + an.transform.dy+=pt.dy; + } + }; + this.setBinding=function(pt){ + an[id]={ x: an[id].x+pt.dx, y:an[id].y+pt.dy }; + an.draw(); + an.drawBBox(); + }; + this.setUndo=function(){ an.setUndo(); }; + + this.enable=function(){ + if(!an.shape) return; + an.figure._add(this); + rect={ x:an[id].x-size, y:an[id].y-size, width:size*2, height:size*2 }; + this.shape=an.shape.createRect(rect) + .setStroke({ color:"black", width:1 }) + .setFill([255,255,255,0.35]); + this.shape.getEventSource().setAttribute("id", self._key); + this.shape.getEventSource().setAttribute("shape-rendering", "crispEdges"); + }; + this.disable=function(){ + an.figure._remove(this); + if(an.shape) an.shape.remove(this.shape); + this.shape=null; + rect=null; + }; + }; + ta.Anchor.count=0; +})(); + +} diff --git a/includes/js/dojox/sketch/Annotation.js b/includes/js/dojox/sketch/Annotation.js new file mode 100644 index 0000000..ea260ca --- /dev/null +++ b/includes/js/dojox/sketch/Annotation.js @@ -0,0 +1,223 @@ +if(!dojo._hasResource["dojox.sketch.Annotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.Annotation"] = true; +dojo.provide("dojox.sketch.Annotation"); +dojo.require("dojox.sketch.Anchor"); +dojo.require("dojox.sketch._Plugin"); + +(function(){ + var ta=dojox.sketch; + dojo.declare("dojox.sketch.AnnotationTool", ta._Plugin, { +// constructor: function(){ +//// console.log('this.shape',this.shape); +//// this.annotation=ta.tools[this.shape]; +// }, + onMouseMove: function(e,rect){ + if(this._cshape){ + this._cshape.setShape(rect); + } else { + this._cshape=this.figure.surface.createRect(rect) + .setStroke({color:"#999", width:1, style:"ShortDot"}) + .setFill([255,255,255,0.7]); + this._cshape.getEventSource().setAttribute("shape-rendering","crispEdges"); + } + }, + onMouseUp: function(e){ + var f=this.figure; + if(!(f._startPoint.x==e.pageX&&f._startPoint.y==e.pageY)){ + if(this._cshape){ + // The minimum number of pixels one has to travel before a shape + // gets drawn. + var limit=40; + if(Math.max( + limit, + Math.abs(f._absEnd.x-f._start.x), + Math.abs(f._absEnd.y-f._start.y) + )>limit){ + this._create(f._start, f._end); + } + } + } + if(this._cshape) f.surface.remove(this._cshape); + }, + _create: function(start,end){ + // create a new shape, needs to be accessible from the + // dragging functions. + var f=this.figure; + var _=f.nextKey(); + var a=new (this.annotation)(f, "annotation-"+_); + a.transform={dx:start.x/f.zoomFactor, dy:start.y/f.zoomFactor}; + a.end={ x:end.x/f.zoomFactor, y:end.y/f.zoomFactor }; + if(a.control){ + a.control={ x:Math.round((end.x/2)/f.zoomFactor),y:Math.round((end.y/2)/f.zoomFactor) }; + } + f.onBeforeCreateShape(a); + a.initialize(); + f.select(a); + f.onCreateShape(a); + f.history.add(ta.CommandTypes.Create,a); + } + }); + ta.Annotation=function(figure, id){ + // for editing stuff. + this.id=this._key=id; + this.figure=figure; + this.mode=ta.Annotation.Modes.View; + this.shape=null; // dojox.gfx.Group + this.boundingBox=null; // rect for boundaries + this.hasAnchors=true; + this.anchors={}; // ta.Anchor + this._properties={ + 'stroke':{ color:"blue", width:2 }, + 'fill': "blue", + 'label': "" + }; + + if(this.figure) this.figure.add(this); + }; + var p=ta.Annotation.prototype; + p.constructor=ta.Annotation; + p.type=function(){ return ''; }; + p.getType=function(){ return ta.Annotation; }; + + p.remove=function(){ + this.figure.history.add(ta.CommandTypes.Delete, this, this.serialize()); + }; + p.property=function(name,/*?*/value){ + var r; + name=name.toLowerCase(); + if(this._properties[name]!==undefined){ + r=this._properties[name]; + } + if(arguments.length>1){ + this._properties[name]=value; + } + if(r!=value){ + this.onPropertyChange(name,r); + } + return r; + }; + p.onPropertyChange=function(name,oldvalue){}; + p.onCreate=function(){ + this.figure.history.add(ta.CommandTypes.Create,this); + } + p.onDblClick=function(event){ + var l=prompt('Set new text:',this.property('label')); + if(l!==false){ + this.beginEdit(ta.CommandTypes.Modify); + this.property('label',l); + this.draw(); + this.endEdit(); + } + } + p.initialize=function(){ }; + p.destroy=function(){ }; + p.draw=function(){ }; + p.apply=function(obj){ }; + p.serialize=function(){ }; + p.getBBox=function(){ }; + p.beginEdit=function(type){ + this._type=type||ta.CommandTypes.Move; + this._prevState=this.serialize(); + }; + p.endEdit=function(){ + var newstep=true; + if(this._type==ta.CommandTypes.Move){ + var f=this.figure; + if(f._absEnd.x==f._start.x&&f._absEnd.y==f._start.y){ + newstep=false; + } + } + if(newstep){ + this.figure.history.add(this._type,this,this._prevState); + } + this._type=this._prevState=''; + }; + p.calculate={ + slope:function(p1, p2){ + if(!(p1.x-p2.x)) return 0; + return ((p1.y-p2.y)/(p1.x-p2.x)); + }, + dx:function(p1, p2, dy){ + var s=this.slope(p1,p2); + if(s==0) return s; + return dy/s; + }, + dy:function(p1, p2, dx){ return this.slope(p1,p2)*dx; } + }; + p.drawBBox=function(){ + var r=this.getBBox(); + if(!this.boundingBox){ + this.boundingBox=this.shape.createRect(r) + .moveToBack() + .setStroke({color:"#999", width:1, style:"Dash"}) + .setFill([238,238,238,0.3]); + this.boundingBox.getEventSource().setAttribute("id",this.id+"-boundingBox"); + this.boundingBox.getEventSource().setAttribute("shape-rendering","crispEdges"); + this.figure._add(this); + } else this.boundingBox.setShape(r); + }; + p.setBinding=function(pt){ + this.transform.dx+=pt.dx; + this.transform.dy+=pt.dy; + this.draw(); + }; + p.doChange=function(pt){ }; + p.getTextBox=function(){ + return dojox.gfx._base._getTextBox(this.property('label'),ta.Annotation.labelFont); + }; + p.setMode=function(m){ + if(this.mode==m) return; + this.mode=m; + var method="disable"; + if(m==ta.Annotation.Modes.Edit) method="enable"; + if(method=="enable"){ + // draw the bounding box + this.drawBBox(); + this.figure._add(this); + } else { + if(this.boundingBox){ + if(this.shape) this.shape.remove(this.boundingBox); + this.boundingBox=null; + } + } + for(var p in this.anchors){ this.anchors[p][method](); } + }; +// p.writeProperties=function(){ +// var ps=this._properties; +// return ""; +// }; + p.writeCommonAttrs=function(){ + return 'id="' + this.id + '" dojoxsketch:type="' + this.type() + '"' + + ' transform="translate('+ this.transform.dx + "," + this.transform.dy + ')"' + + (this.data?(' >=this.end.x) rot+=Math.PI; + var endRot=dojox.gfx.matrix.rotateAt(rot, this.end.x, this.end.y); + + // draw the shapes + this.shape=this.figure.group.createGroup(); + this.shape.getEventSource().setAttribute("id", this.id); + if(this.transform.dx||this.transform.dy) this.shape.setTransform(this.transform); + this.pathShape=this.shape.createPath( + "M"+this.start.x+" "+this.start.y+"Q"+this.control.x+" "+this.control.y+" "+this.end.x+" "+this.end.y + " l0,0" + ).setStroke(this.property('stroke')); + + this.startArrowGroup=this.shape.createGroup().setTransform({ dx:this.start.x, dy:this.start.y }); + this.startArrowGroup.applyTransform(startRot); +// console.log('startArrow',this.property('fill')); + this.startArrow=this.startArrowGroup.createPath("M0,0 l20,-5 -3,5 3,5 Z").setFill(this.property('fill')); + + this.endArrowGroup=this.shape.createGroup().setTransform(endRot); + this.endArrow=this.endArrowGroup.createPath( + "M" + this.end.x + "," + this.end.y + " l-20,-5 3,5 -3,5 Z" + ).setFill(this.property('fill')); + this.labelShape=this.shape.createText({ + x:this.textPosition.x, y:this.textPosition.y, text:this.property('label'), align:this.textAlign + }).setFont(font).setFill(this.property('fill')); + }; + p.destroy=function(){ + if(!this.shape) return; + this.startArrowGroup.remove(this.startArrow); + this.endArrowGroup.remove(this.endArrow); + this.shape.remove(this.startArrowGroup); + this.shape.remove(this.endArrowGroup); + this.shape.remove(this.pathShape); + this.shape.remove(this.labelShape); + this.figure.group.remove(this.shape); + this.shape=this.pathShape=this.labelShape=this.startArrowGroup=this.startArrow=this.endArrowGroup=this.endArrow=null; + }; + p.draw=function(obj){ + this.apply(obj); + this._rot(); + this._pos(); + // rotation matrix + var rot=this.startRotation; + if(this.control.x=this.end.x) rot+=Math.PI; + var endRot=dojox.gfx.matrix.rotateAt(rot, this.end.x, this.end.y); + + this.shape.setTransform(this.transform); + this.pathShape.setShape( + "M"+this.start.x+" "+this.start.y+" Q"+this.control.x+" "+this.control.y+" "+this.end.x+" "+this.end.y + " l0,0" + ).setStroke(this.property('stroke')); + this.startArrowGroup.setTransform({ dx:this.start.x, dy:this.start.y }); + this.startArrowGroup.applyTransform(startRot); + this.startArrow.setFill(this.property('fill')); + + this.endArrowGroup.setTransform(endRot); + this.endArrow.setShape( + "M" + this.end.x + "," + this.end.y + " l-20,-5 3,5 -3,5 Z" + ).setFill(this.property('fill')); + this.labelShape.setShape({x:this.textPosition.x, y:this.textPosition.y, text:this.property('label')}).setFill(this.property('fill')); + }; + p.getBBox=function(){ + var x=Math.min(this.start.x, this.control.x, this.end.x); + var y=Math.min(this.start.y, this.control.y, this.end.y); + var w=Math.max(this.start.x, this.control.x, this.end.x)-x; + var h=Math.max(this.start.y, this.control.y, this.end.y)-y; + return { x:x, y:y, width:w, height:h }; + }; + p.serialize=function(){ + var s=this.property('stroke'); + return '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + this.property('label') + + '' + + ''; + }; + + ta.Annotation.register("DoubleArrow"); +})(); + +} diff --git a/includes/js/dojox/sketch/Figure.js b/includes/js/dojox/sketch/Figure.js new file mode 100644 index 0000000..ae573bb --- /dev/null +++ b/includes/js/dojox/sketch/Figure.js @@ -0,0 +1,493 @@ +if(!dojo._hasResource["dojox.sketch.Figure"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.Figure"] = true; +dojo.provide("dojox.sketch.Figure"); +dojo.experimental("dojox.sketch"); + +dojo.require("dojox.gfx"); +dojo.require("dojox.sketch.UndoStack"); + +(function(){ + var ta=dojox.sketch; + ta.tools={}; + ta.registerTool=function(type, fn){ ta.tools[type]=fn; }; + ta.Figure = function(){ + var self=this; + var annCounter=1; + + this.shapes=[]; + this.image=null; + this.imageSrc=null; + this.size={ w:0, h:0 }; + this.surface=null; + this.group=null; + this.node=null; + + this.zoomFactor=1; // multiplier for zooming. + + this.tools=null; // toolbar reference. + this.nextKey=function(){ return annCounter++; }; + + this.obj={}; // lookup table for shapes. Not keen on this solution. + + this.initUndoStack(); + + // what is selected. + this.selected=[]; + this.hasSelections=function(){ return this.selected.length>0 }; + this.isSelected=function(obj){ + for(var i=0; i-1){ + obj.setMode(ta.Annotation.Modes.View); + self.selected.splice(idx,1); + } + return obj; + }; + this.clearSelections=function(){ + for(var i=0; i-1){ + self.selected.splice(idx,1,n); + } + }; + + // for the drag and drop handlers. + this._c=null; // current shape + this._ctr=null; // container measurements + this._lp=null; // last position + this._action=null; + this._prevState=null; + this._startPoint=null; // test to record a move. + + // if an object isn't selected and we're dragging anyways. + this._ctool=null; // hard code it. + this._start=null; + this._end=null; + this._absEnd=null; + this._cshape=null; + + this._click=function(e){ + if(self._c){ + dojo.stopEvent(e); + return; + } + var o=self._fromEvt(e); + if(!o){ + self.clearSelections(); + dojo.stopEvent(e); + } else if(!o.setMode){ + // skip me. + } else self.select(o); + }; + this._dblclick=function(e){ + var o=self._fromEvt(e); + if(o){ + self.onDblClickShape(o,e); + } + }; + + this._keydown=function(e){ + var prevent=false; + if(e.ctrlKey){ + if(e.keyCode==90){ //ctrl+z + self.undo(); + prevent = true; + }else if(e.keyCode==89){ //ctrl+y + self.redo(); + prevent = true; + } + } + + if(e.keyCode==46 || e.keyCode==8){ //delete or backspace + self._delete(self.selected); + prevent = true; + } + + if(prevent){ + dojo.stopEvent(e); + } + }; + + // drag handlers. + this._md=function(e){ + var o=self._fromEvt(e); + self._startPoint={ x:e.pageX, y:e.pageY }; + var win = dijit.getDocumentWindow(self.node.ownerDocument); + // figure out the coordinates within the iframe + self._ctr=dojo._abs(self.node); + var scroll=dojo.withGlobal(win,dojo._docScroll); + self._ctr={x:self._ctr.x-scroll.x, y:self._ctr.y-scroll.y}; + var X=e.clientX-self._ctr.x, Y=e.clientY-self._ctr.y; + self._lp={ x:X, y:Y }; + + // capture it separately + self._start={ x:X, y:Y }; + self._end={ x:X, y:Y }; + self._absEnd={ x:X, y:Y }; + if(!o){ + self.clearSelections(); + self._ctool.onMouseDown(e); + }else{ + if(o.type && o.type()!="Anchor"){ + self.select(o); + } + o.beginEdit(); + self._c=o; + } + }; + this._mm=function(e){ + if(!self._ctr) return; + var x=e.clientX-self._ctr.x; + var y=e.clientY-self._ctr.y; + var dx=x-self._lp.x; + var dy=y-self._lp.y; + self._absEnd={x:x, y:y}; + if(self._c){ + self._c.doChange({dx:Math.round(dx/self.zoomFactor), dy:Math.round(dy/self.zoomFactor)}); + self._c.setBinding({dx:Math.round(dx/self.zoomFactor), dy:Math.round(dy/self.zoomFactor)}); + self._lp={x:x, y:y}; + } + else { + self._end={x:dx, y:dy}; + var rect={ + x:Math.min(self._start.x,self._absEnd.x), + y:Math.min(self._start.y,self._absEnd.y), + width:Math.abs(self._start.x-self._absEnd.x), + height:Math.abs(self._start.y-self._absEnd.y) + } + self._ctool.onMouseMove(e,rect); + } + }; + this._mu=function(e){ + if(self._c){ + // record the event. + self._c.endEdit(); + }else{ + self._ctool.onMouseUp(e); + } + + // clear the stuff out. + self._c=self._ctr=self._lp=self._action=self._prevState=self._startPoint=null; + self._cshape=self._start=self._end=self._absEnd=null; + }; + + this._delete=function(arr,noundo){ + for(var i=0; i + this.group.createRect({ x:0, y:0, width:this.size.w, height:this.size.h }); + this.image=this.group.createImage({ width:this.size.w, height:this.size.h, src:this.imageSrc }); + }; + p.destroy=function(isLoading){ + if(!this.node){ + return; + } + if(!isLoading){ + if(this.history) this.history.destroy(); + if(this._subscribed){ + dojo.unsubscribe(this._subscribed); + delete this._subscribed; + } + } + dojo.forEach(this._cons,dojo.disconnect); + this._cons=[]; + + this.node.removeChild(this.surface.getEventSource()); + this.group=this.surface=null; + this.obj={}; + this.shapes=[]; + }; + p.draw=function(){ }; + p.zoom=function(pct){ + // first get the new dimensions + this.zoomFactor=pct/100; + var w=this.size.w*this.zoomFactor; + var h=this.size.h*this.zoomFactor; + this.surface.setDimensions(w, h); + // then scale it. + this.group.setTransform(dojox.gfx.matrix.scale(this.zoomFactor, this.zoomFactor)); + if(dojo.isIE){ + this.image.rawNode.style.width=Math.max(w,this.size.w); + this.image.rawNode.style.height=Math.max(h,this.size.h); + } + //this.rect.setShape({width:w,height:h}); + }; + p.getFit=function(){ + // assume fitting the parent node. +// var box=dojo.html.getContentBox(this.node.parentNode); + //the following should work under IE and FF, not sure about others though + var wF=(this.node.parentNode.clientWidth-5)/this.size.w; + var hF=(this.node.parentNode.clientHeight-5)/this.size.h; + return Math.min(wF, hF)*100; + }; + p.unzoom=function(){ + // restore original size. + this.zoomFactor=1; + this.surface.setDimensions(this.size.w, this.size.h); + this.group.setTransform(); + }; + + // object registry for drag handling. + p._add=function(obj){ this.obj[obj._key]=obj; }; + p._remove=function(obj){ + if(this.obj[obj._key]){ + delete this.obj[obj._key]; + } + }; + p._get=function(key){ + if(key&&key.indexOf("bounding")>-1) key=key.replace("-boundingBox",""); + return this.obj[key]; + }; + p._fromEvt=function(e){ + var key=e.target.id+""; + if(key.length==0){ + // ancestor tree until you get to the end (meaning this.surface) + var p=e.target.parentNode; + var node=this.surface.getEventSource(); + while(p && p.id.length==0 && p!=node){ + p=p.parentNode; + } + key=p.id; + } + return this._get(key); + }; + + p.add=function(annotation){ + for(var i=0; i-1) this.shapes.splice(idx, 1); + return annotation; + }; + p.get=function(id){ + for(var i=0; i' + + '' + + ''; + for(var i=0; i=1){ + x=this.end.x+this.calculate.dx(this.control, this.end, offset); + if(this.control.y>this.end.y) y=this.end.y-offset; + else y=this.end.y+offset+this.textYOffset; + } else if(slope==0){ + x=this.end.x+offset; + y=this.end.y+this.textYOffset; + } else { + if(this.start.x>this.end.x){ + x=this.end.x-offset; + this.textAlign="end"; + } else { + x=this.end.x+offset; + this.textAlign="start"; + } + if(this.start.y' + + '' + + '' + + this.property('label') + + '' + + ''; + }; + + ta.Annotation.register("Lead"); +})(); + +} diff --git a/includes/js/dojox/sketch/PreexistingAnnotation.js b/includes/js/dojox/sketch/PreexistingAnnotation.js new file mode 100644 index 0000000..a8c123e --- /dev/null +++ b/includes/js/dojox/sketch/PreexistingAnnotation.js @@ -0,0 +1,121 @@ +if(!dojo._hasResource["dojox.sketch.PreexistingAnnotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.PreexistingAnnotation"] = true; +dojo.provide("dojox.sketch.PreexistingAnnotation"); + +dojo.require("dojox.sketch.Annotation"); +dojo.require("dojox.sketch.Anchor"); + +(function(){ + var ta=dojox.sketch; + ta.PreexistingAnnotation=function(figure, id){ + ta.Annotation.call(this, figure, id); + this.transform={dx:0, dy:0}; + this.start={ x:0, y:0 }; + this.end={ x:200, y:200 }; + this.radius=8; + this.textPosition={ x:196, y:196 }; + this.textOffset=4; + this.textAlign="end"; + + this.property('label',this.id); + this.rectShape=null; + this.labelShape=null; + + this.anchors.start=new ta.Anchor(this, "start"); + this.anchors.end=new ta.Anchor(this, "end"); + }; + ta.PreexistingAnnotation.prototype=new ta.Annotation; + var p=ta.PreexistingAnnotation.prototype; + p.constructor=ta.PreexistingAnnotation; + + p.type=function(){ return 'Preexisting' }; + p.getType=function(){ return ta.PreexistingAnnotation; }; + + p._pos=function(){ + var x=Math.min(this.start.x, this.end.x); + var y=Math.min(this.start.y, this.end.y); + var w=Math.max(this.start.x, this.end.x); + var h=Math.max(this.start.y, this.end.y); + this.start={ x:x, y:y }; + this.end={ x:w, y:h }; + this.textPosition={ x:this.end.x-this.textOffset, y:this.end.y-this.textOffset }; + }; + p.apply=function(obj){ + if(!obj) return; + if(obj.documentElement) obj=obj.documentElement; + this.readCommonAttrs(obj); + + for(var i=0; i' + + '' + + '' + + this.property('label') + + '' + + ''; + }; + + ta.Annotation.register("Preexisting"); +})(); + +} diff --git a/includes/js/dojox/sketch/README b/includes/js/dojox/sketch/README new file mode 100644 index 0000000..85b2264 --- /dev/null +++ b/includes/js/dojox/sketch/README @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------- +dojox.sketch +------------------------------------------------------------------------------- +Version 0.1 +Release date: 28/01/2008 +------------------------------------------------------------------------------- +Project state: +experimental +------------------------------------------------------------------------------- +Credits + Contributed by TeamPatent (supported by National Science Foundation grant 638334) + Tom Trenka (ttrenka@gmail.com) + Heng Liu/LiuCougar (heng@teampatent.com) +------------------------------------------------------------------------------- +Project description + +A cross-browser drawing editor based on dojox.gfx. +------------------------------------------------------------------------------- +Dependencies: + +dijit (Toolbar, Button, Slider) +dojox.gfx +dojox.xml +------------------------------------------------------------------------------- +Documentation + +Currently, 5 shapes are supported: line, single arrow line, double arrow line, +underline text and text. The first 3 shapes can have optinal text associated. + +Shapes can be added, deleted, moved and modified. All of these operations can +be undo-ed or redo-ed. + +TODO: + * provide UI to change various properties on shapes (fill, stroke, text) and +allow changing of background image + * serialize/unserialize in dojox.gfx to svg (and maybe vml as well?) (or another +simplier format? such as a json based one, which is easier to parse, and then +write a convertor to convert the json format to svg or any other format?) + * Move mousedown/up/move to each shape (to prepare for the following) + * Add shapes for other primitive shapes (needs to decide which primitive +dojox.gfx.shapes are useful), and add in support for user to group any +shapes/groups to form a single "compound shape" (need to add support to set +fill/stroke properties on the entire compound shape, which shallpropagate to +all children shapes) +------------------------------------------------------------------------------- +Installation instructions + +Install dijit, dojox.gfx and dojox.xml first + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/sketch.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/sketch/* + +Install into the following directory structure: +/dojox/sketch/ + +...which should be at the same level as your Dojo checkout. +------------------------------------------------------------------------------- diff --git a/includes/js/dojox/sketch/SingleArrowAnnotation.js b/includes/js/dojox/sketch/SingleArrowAnnotation.js new file mode 100644 index 0000000..29ad7f0 --- /dev/null +++ b/includes/js/dojox/sketch/SingleArrowAnnotation.js @@ -0,0 +1,183 @@ +if(!dojo._hasResource["dojox.sketch.SingleArrowAnnotation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.SingleArrowAnnotation"] = true; +dojo.provide("dojox.sketch.SingleArrowAnnotation"); +dojo.require("dojox.sketch.Annotation"); +dojo.require("dojox.sketch.Anchor"); + +(function(){ + var ta=dojox.sketch; + ta.SingleArrowAnnotation=function(figure, id){ + ta.Annotation.call(this, figure, id); + this.transform={ dx:0, dy:0 }; + this.start={x:0, y:0}; + this.control={x:100, y:-50}; + this.end={x:200, y:0}; + this.textPosition={ x:0, y:0 }; + this.textOffset=4; + this.textAlign="middle"; + this.textYOffset=10; + this.rotation=0; + +// this.property('label',this.id); +// this.label=this.id; + this.pathShape=null; + this.arrowhead=null; + this.arrowheadGroup=null; + this.labelShape=null; + + this.anchors.start=new ta.Anchor(this, "start"); + this.anchors.control=new ta.Anchor(this, "control"); + this.anchors.end=new ta.Anchor(this, "end"); + }; + ta.SingleArrowAnnotation.prototype=new ta.Annotation; + var p=ta.SingleArrowAnnotation.prototype; + p.constructor=ta.SingleArrowAnnotation; + + p.type=function(){ return 'SingleArrow'; }; + p.getType=function(){ return ta.SingleArrowAnnotation; }; + + // helper functions + p._rot=function(){ + // arrowhead rotation + var opp=this.start.y-this.control.y; + var adj=this.start.x-this.control.x; + if(!adj) adj=1; + this.rotation=Math.atan(opp/adj); + }; + p._pos=function(){ + // text position + var offset=this.textOffset, x=0, y=0; + var slope=this.calculate.slope(this.control, this.end); + if(Math.abs(slope)>=1){ + x=this.end.x+this.calculate.dx(this.control, this.end, offset); + if(this.control.y>this.end.y) y=this.end.y-offset; + else y=this.end.y+offset+this.textYOffset; + } else if(slope==0){ + x=this.end.x+offset; + y=this.end.y+this.textYOffset; + } else { + if(this.start.x>this.end.x){ + x=this.end.x-offset; + this.textAlign="end"; + } else { + x=this.end.x+offset; + this.textAlign="start"; + } + if(this.start.y=this.end.x&&this.control.xthis.end.x) r-=180; + r=Math.round(r*Math.pow(10,4))/Math.pow(10,4); + return '' + + '' + + '' + + '' + + '' + + '' + + this.property('label') + + '' + + ''; + }; + + ta.Annotation.register("SingleArrow"); +})(); + +} diff --git a/includes/js/dojox/sketch/Slider.js b/includes/js/dojox/sketch/Slider.js new file mode 100644 index 0000000..e014e78 --- /dev/null +++ b/includes/js/dojox/sketch/Slider.js @@ -0,0 +1,31 @@ +if(!dojo._hasResource["dojox.sketch.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.Slider"] = true; +dojo.provide("dojox.sketch.Slider"); + +dojo.require("dijit.form.Slider"); +dojo.declare("dojox.sketch.Slider",dojox.sketch._Plugin,{ + _initButton: function(){ + this.slider=new dijit.form.HorizontalSlider({minimum:20,maximum:200,value:20,style:"width:200px;float:right"}); + this.connect(this.slider,'onChange','_setZoom'); + this.connect(this.slider.sliderHandle,'ondblclick','_zoomToFit'); + }, + _zoomToFit: function(){ + this.slider.setValue(this.figure.getFit(),true); + }, + _setZoom: function(v){ + if(this.figure){ + this.figure.zoom(v); + } + }, + setToolbar: function(t){ + t.addChild(this.slider); + if(!t._reset2Zoom){ + t._reset2Zoom=true; + this.connect(t,'reset','_zoomToFit'); + } + } +}); + +dojox.sketch.registerTool("Slider", dojox.sketch.Slider); + +} diff --git a/includes/js/dojox/sketch/Toolbar.js b/includes/js/dojox/sketch/Toolbar.js new file mode 100644 index 0000000..73dc82c --- /dev/null +++ b/includes/js/dojox/sketch/Toolbar.js @@ -0,0 +1,96 @@ +if(!dojo._hasResource["dojox.sketch.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.Toolbar"] = true; +dojo.provide("dojox.sketch.Toolbar"); + +dojo.require("dojox.sketch.Annotation"); +dojo.require("dijit.Toolbar"); +dojo.require("dijit.form.Button"); +dojo.require("dijit.form.Slider"); + +dojo.declare("dojox.sketch.ButtonGroup", null, { + constructor: function(){ + this._childMaps={}; + this._children=[]; + }, + add: function(/*_Plugin*/ plugin){ + this._childMaps[plugin]=plugin.connect(plugin,'onActivate',dojo.hitch(this,'_resetGroup',plugin)); + this._children.push(plugin); + }, +// remove: function(/*_Plugin*/ plugin){ +// widget.disconnect(this._childMaps[widget.id]); +// delete this._childMaps[widget.id]; +// this._children.splice(this._children.indexOf(widget.id),1); +// }, + _resetGroup: function(p){ + var cs=this._children; + dojo.forEach(cs,function(c){ + if(p!=c && c['attr']){ + c.attr('checked',false); + } + }); + } +}); + +dojo.declare("dojox.sketch.Toolbar", dijit.Toolbar, { + figure: null, + plugins: null, + postCreate: function(){ + this.inherited(arguments); + this.shapeGroup=new dojox.sketch.ButtonGroup; + + this.connect(this.figure,'onLoad','reset'); + if(!this.plugins){ + this.plugins=['Slider','Lead','SingleArrow','DoubleArrow','Underline','Preexisting']; + } + this._plugins=[]; + + dojo.forEach(this.plugins,function(obj){ + var name=dojo.isString(obj)?obj:obj.name; + var p=new dojox.sketch.tools[name](obj.args||{}); + this._plugins.push(p); + p.setFigure(this.figure); + p.setToolbar(this); + if(!this._defaultTool && p.button){ + this._defaultTool=p; + } + },this); + }, + destroy: function(){ + dojo.forEach(this._plugins,function(p){ + p.destroy(); + }); + this.inherited(arguments); + delete this._defaultTool; + delete this._plugins; + }, + addGroupItem: function(/*_Plugin*/item,group){ + if(group!='toolsGroup'){ + console.error('not supported group '+group); + return; + } + + this.shapeGroup.add(item); + }, + reset: function(){ + this._defaultTool.activate(); + }, + _setShape: function(s){ + if(!this.figure.surface) return; + // now do the action. + if(this.figure.hasSelections()){ + for(var i=0; i' + + '' + + '' + + this.property('label') + + '' + + ''; + }; + + ta.Annotation.register("Underline"); +})(); + +} diff --git a/includes/js/dojox/sketch/UndoStack.js b/includes/js/dojox/sketch/UndoStack.js new file mode 100644 index 0000000..e711557 --- /dev/null +++ b/includes/js/dojox/sketch/UndoStack.js @@ -0,0 +1,104 @@ +if(!dojo._hasResource["dojox.sketch.UndoStack"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch.UndoStack"] = true; +dojo.provide("dojox.sketch.UndoStack"); +dojo.require("dojox.xml.DomParser"); + +(function(){ + var ta=dojox.sketch; + ta.CommandTypes={ Create:"Create", Move:"Move", Modify:"Modify", Delete:"Delete", Convert:"Convert"}; + + dojo.declare("dojox.sketch.UndoStack",null,{ + constructor: function(figure){ + this.figure=figure; + this._steps=[]; + this._undoedSteps=[]; + }, + apply: function(state, from, to){ + // the key here is to neutrally move from one state to another. + // we let the individual functions (i.e. undo and redo) actually + // determine the from and to; all we do here is implement it. + + // check whether this is a fullText step + if(!from && !to && state.fullText){ + this.figure.setValue(state.fullText); + return; + } + + var fromText=from.shapeText; + var toText=to.shapeText; + + if(fromText.length==0&&toText.length==0){ + // nothing to reapply? + return; + } + if(fromText.length==0){ + // We are creating. + var o=dojox.xml.DomParser.parse(toText).documentElement; + var a=this.figure._loadAnnotation(o); + if(a) this.figure._add(a); + return; + } + if(toText.length==0){ + // we are deleting. + var ann=this.figure.get(from.shapeId); + this.figure._delete([ann],true); + return; + } + + // we can simply reinit and draw from the shape itself, + // regardless of the actual command. + var nann=this.figure.get(to.shapeId); + var no=dojox.xml.DomParser.parse(toText).documentElement; + nann.draw(no); + this.figure.select(nann); + return; + }, + // stack methods. + add: function(/*String*/cmd, /*ta.Annotation?*/ann, /*String?*/before){ + var id=ann?ann.id:''; + //var bbox=ann?ann.getBBox():{}; + var after=ann?ann.serialize():""; + if(cmd==ta.CommandTypes.Delete) after=""; + + /*if(ann){ + // fix the bbox x/y coords + var t=ann.transform; + bbox.x+=t.dx; + bbox.y+=t.dy; + }*/ + var state={ + cmdname:cmd, + //bbox:bbox, +// fullText:fullText, + before:{ + shapeId: id, + shapeText:before||'' + }, + after:{ + shapeId: id, + shapeText:after + } + }; + //console.log('dojox.sketch history add',state); + this._steps.push(state); + this._undoedSteps = []; + }, + destroy: function(){}, + undo: function(){ + var state=this._steps.pop(); + if(state){ + this._undoedSteps.push(state); + this.apply(state,state.after,state.before); + } + }, + redo: function(){ + var state=this._undoedSteps.pop(); + if(state){ + this._steps.push(state); + this.apply(state,state.before,state.after); + } + } + }); +})(); + +} diff --git a/includes/js/dojox/sketch/_Plugin.js b/includes/js/dojox/sketch/_Plugin.js new file mode 100644 index 0000000..fb7cb93 --- /dev/null +++ b/includes/js/dojox/sketch/_Plugin.js @@ -0,0 +1,83 @@ +if(!dojo._hasResource["dojox.sketch._Plugin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sketch._Plugin"] = true; +dojo.provide("dojox.sketch._Plugin"); +//dojo.require("dojox.sketch"); +dojo.require("dijit.form.Button"); + +dojo.declare("dojox.sketch._Plugin", null, { + // summary + // This represents a "plugin" to the dojox.sketch.Figure, which is basically + // a single button on the Toolbar and some associated code + constructor: function(/*Object?*/args){ + if(args){ + dojo.mixin(this, args); + } + this._connects=[]; + }, + + figure: null, + iconClassPrefix: "dojoxSketchIcon", + itemGroup: 'toolsGroup', + button: null, + queryCommand: null, + shape: "", + useDefaultCommand: true, + buttonClass: dijit.form.ToggleButton, + _initButton: function(){ + if(this.shape.length){ + //TODO: i18n +// var label = dojox.sketch.shapes[this.shape]; + var className = this.iconClassPrefix+" "+this.iconClassPrefix + this.shape.charAt(0).toUpperCase() + this.shape.substr(1); + if(!this.button){ + var props = { + label: this.shape, + showLabel: false, + iconClass: className, + dropDown: this.dropDown, + tabIndex: "-1" + }; + this.button = new this.buttonClass(props); + this.connect(this.button,'onClick','activate'); + } + } + }, + attr: function(name,/*?*/value){ + if(arguments.length>1){ + this.button.setAttribute(name,value); + }else{ + this.button.getAttribute(name); + } + }, + onActivate: function(){}, + activate: function(/*?*/e){ + this.onActivate(); + this.figure.setTool(this); + this.attr('checked',true); + }, + onMouseDown: function(e){}, + onMouseMove: function(e){}, + onMouseUp: function(e){}, + destroy: function(f){ + dojo.forEach(this._connects,dojo.disconnect); + }, + connect: function(o,f,tf){ + this._connects.push(dojo.connect(o,f,this,tf)); + }, + setFigure: function(/*Widget*/figure){ + // FIXME: detatch from previous figure!! + this.figure = figure; + + // FIXME: prevent creating this if we don't need to (i.e., figure can't handle our command) + this._initButton(); + }, + setToolbar: function(/*Widget*/toolbar){ + if(this.button){ + toolbar.addChild(this.button); + } + if(this.itemGroup){ + toolbar.addGroupItem(this,this.itemGroup); + } + } +}); + +} diff --git a/includes/js/dojox/sketch/resources/images/icons.gif b/includes/js/dojox/sketch/resources/images/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab33b0aefd238b5738e86049decfbd1c87c79545 GIT binary patch literal 600 zcmZ?wbhEHb6kwRha8-@L#l@wgqvPGXcX#jJJ#*&F?%liR&71f7^=o5e5`I? zQh9mIyLUUEJ$qJMTr4RmxoTC*|NqAr7#L>GoSBxE_W%EXAe&l1@h1x-1A`ia4#+@| zpBUKwJ4`O{(2?ptv1H>CooVv|UQE0x6SR8Sin1=zxYf5ZKHXN)KKyK5)!Dq=_thMk zv>g~$eZ3ev^ZIo6hHB5+re==1in7?Eg5JLV2`;QEv8>8dLZ?li*)ZE{Rs-|=xidUx zEnPOxck;xw>wKBA_}R1Aw#07Rx;Lw%q$*k8`X-r4twycF*2N6;lX$|LG^;K z3N!P?^>^=i9yk%NySr(R>Y<9hSDtZ)Hzk3Y=#tEV zW|ypaCs(#CzqomVN5_KgVY=pm1&>elE(?1XQ&A*c(r|$xPjI)4OUnyy^LI?_?UHMb nW=9-p+EM@5tz$xk;ly1^5)KUuZhR6rQ}*{!s<&0V0E0CEi<$9< literal 0 HcmV?d00001 diff --git a/includes/js/dojox/sketch/resources/sketch.css b/includes/js/dojox/sketch/resources/sketch.css new file mode 100644 index 0000000..7451395 --- /dev/null +++ b/includes/js/dojox/sketch/resources/sketch.css @@ -0,0 +1,17 @@ +.dojoxSketchIcon{ + background-repeat:no-repeat; + height:16px; + min-width:16px; + text-align:center; + width:16px; +} +.dojoxSketchIcon { background-image:url(images/icons.gif); } +.ShowCallouts{ background-position:0px 0px; } +.PreviousCallout{ background-position:0px -16px; } +.NextCallout{ background-position:0px -32px; } +.dojoxSketchIconLead{ background-position:0px -48px; } +.dojoxSketchIconUnderline{ background-position:0px -64px; } +.dojoxSketchIconSingleArrow{ background-position:0px -80px; } +.dojoxSketchIconBrace{ background-position:0px -96px; } +.dojoxSketchIconDoubleArrow{ background-position:0px -112px; } +.dojoxSketchIconPreexisting{ background-position:0px -128px; } diff --git a/includes/js/dojox/sketch/resources/sketch.css.commented.css b/includes/js/dojox/sketch/resources/sketch.css.commented.css new file mode 100644 index 0000000..7451395 --- /dev/null +++ b/includes/js/dojox/sketch/resources/sketch.css.commented.css @@ -0,0 +1,17 @@ +.dojoxSketchIcon{ + background-repeat:no-repeat; + height:16px; + min-width:16px; + text-align:center; + width:16px; +} +.dojoxSketchIcon { background-image:url(images/icons.gif); } +.ShowCallouts{ background-position:0px 0px; } +.PreviousCallout{ background-position:0px -16px; } +.NextCallout{ background-position:0px -32px; } +.dojoxSketchIconLead{ background-position:0px -48px; } +.dojoxSketchIconUnderline{ background-position:0px -64px; } +.dojoxSketchIconSingleArrow{ background-position:0px -80px; } +.dojoxSketchIconBrace{ background-position:0px -96px; } +.dojoxSketchIconDoubleArrow{ background-position:0px -112px; } +.dojoxSketchIconPreexisting{ background-position:0px -128px; } diff --git a/includes/js/dojox/sketch/tests/annotation.svg b/includes/js/dojox/sketch/tests/annotation.svg new file mode 100644 index 0000000..9638588 --- /dev/null +++ b/includes/js/dojox/sketch/tests/annotation.svg @@ -0,0 +1 @@ +12345 \ No newline at end of file diff --git a/includes/js/dojox/sketch/tests/images/figure2.gif b/includes/js/dojox/sketch/tests/images/figure2.gif new file mode 100644 index 0000000000000000000000000000000000000000..7218a4ce076d3dc19582b6fbd4a7e668ee570b3c GIT binary patch literal 40349 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 + + + Annotator/Figure Testing + + + + + + + + + +

                        Annotator/Figure Testing Platform

                        +

                        This is a generic test to create a figure from an existing SVG file, to edit that figure, and to test the undo stack. Double click a shape to set new text for it.

                        +
                        +
                        +
                        +
                        +

                        Serialized output

                        + + + diff --git a/includes/js/dojox/sql.js b/includes/js/dojox/sql.js new file mode 100644 index 0000000..d4a77ef --- /dev/null +++ b/includes/js/dojox/sql.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.sql"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.sql"] = true; +dojo.require("dojox._sql.common"); +dojo.provide("dojox.sql"); + +} diff --git a/includes/js/dojox/storage.js b/includes/js/dojox/storage.js new file mode 100644 index 0000000..0fed636 --- /dev/null +++ b/includes/js/dojox/storage.js @@ -0,0 +1,6 @@ +if(!dojo._hasResource["dojox.storage"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.storage"] = true; +dojo.provide("dojox.storage"); +dojo.require("dojox.storage._common"); + +} diff --git a/includes/js/dojox/storage/AirDBStorageProvider.js b/includes/js/dojox/storage/AirDBStorageProvider.js new file mode 100644 index 0000000..a846b94 --- /dev/null +++ b/includes/js/dojox/storage/AirDBStorageProvider.js @@ -0,0 +1,252 @@ +if(!dojo._hasResource["dojox.storage.AirDBStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.storage.AirDBStorageProvider"] = true; +dojo.provide("dojox.storage.AirDBStorageProvider"); +dojo.require("dojox.storage.manager"); +dojo.require("dojox.storage.Provider"); + +if (dojo.isAIR) { + (function(){ + + if (!air) { + var air = {}; + } + air.File = window.runtime.flash.filesystem.File; + air.SQLConnection = window.runtime.flash.data.SQLConnection; + air.SQLStatement = window.runtime.flash.data.SQLStatement; + + // summary: + // Storage provider that uses features in the Adobe AIR runtime to achieve + // permanent storage + dojo.declare("dojox.storage.AirDBStorageProvider", [ dojox.storage.Provider ], { + DATABASE_FILE: "dojo.db", + TABLE_NAME: "__DOJO_STORAGE", + initialized: false, + + _db: null, + + initialize: function(){ + this.initialized = false; + + // need to initialize our storage database + try{ + this._db = new air.SQLConnection(); + this._db.open(air.File.applicationStorageDirectory.resolvePath(this.DATABASE_FILE)); + + this._sql("CREATE TABLE IF NOT EXISTS " + this.TABLE_NAME + "(namespace TEXT, key TEXT, value TEXT)"); + this._sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index ON " + this.TABLE_NAME + " (namespace, key)"); + + this.initialized = true; + }catch(e){ + console.debug("dojox.storage.AirDBStorageProvider.initialize:", e); + } + + // indicate that this storage provider is now loaded + dojox.storage.manager.loaded(); + }, + + _sql: function(query, params){ + var stmt = new air.SQLStatement(); + stmt.sqlConnection = this._db; + stmt.text = query; + if (params){ + for (var param in params){ + stmt.parameters[param] = params[param]; + } + } + stmt.execute(); + return stmt.getResult(); + }, + + _beginTransaction: function(){ + this._db.begin(); + }, + + _commitTransaction: function(){ + this._db.commit(); + }, + + isAvailable: function(){ + return true; + }, + + put: function(key, value, resultsHandler, namespace){ + if(this.isValidKey(key) == false){ + throw new Error("Invalid key given: " + key); + } + namespace = namespace||this.DEFAULT_NAMESPACE; + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + + // try to store the value + try{ + this._sql("DELETE FROM " + this.TABLE_NAME + " WHERE namespace = :namespace AND key = :key", + { ":namespace":namespace, ":key":key }); + this._sql("INSERT INTO " + this.TABLE_NAME + " VALUES (:namespace, :key, :value)", + { ":namespace":namespace, ":key":key, ":value":value }); + }catch(e){ + // indicate we failed + console.debug("dojox.storage.AirDBStorageProvider.put:", e); + resultsHandler(this.FAILED, key, e.toString()); + return; + } + + if(resultsHandler){ + resultsHandler(this.SUCCESS, key, null); + } + }, + + get: function(key, namespace){ + if(this.isValidKey(key) == false){ + throw new Error("Invalid key given: " + key); + } + namespace = namespace||this.DEFAULT_NAMESPACE; + + var results = this._sql("SELECT * FROM " + this.TABLE_NAME + " WHERE namespace = :namespace AND key = :key", + { ":namespace":namespace, ":key":key }); + + if(results.data && results.data.length){ + return results.data[0].value; + } + + return null; + }, + + getNamespaces: function(){ + var results = [ this.DEFAULT_NAMESPACE ]; + var rs = this._sql("SELECT namespace FROM " + this.TABLE_NAME + " DESC GROUP BY namespace"); + if (rs.data){ + for(var i = 0; i < rs.data.length; i++){ + if(rs.data[i].namespace != this.DEFAULT_NAMESPACE){ + results.push(rs.data[i].namespace); + } + } + } + return results; + }, + + getKeys: function(namespace){ + namespace = namespace||this.DEFAULT_NAMESPACE; + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + + var results = []; + var rs = this._sql("SELECT key FROM " + this.TABLE_NAME + " WHERE namespace = :namespace", { ":namespace":namespace }); + if (rs.data){ + for(var i = 0; i < rs.data.length; i++){ + results.push(rs.data[i].key); + } + } + return results; + }, + + clear: function(namespace){ + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + this._sql("DELETE FROM " + this.TABLE_NAME + " WHERE namespace = :namespace", { ":namespace":namespace }); + }, + + remove: function(key, namespace){ + namespace = namespace||this.DEFAULT_NAMESPACE; + this._sql("DELETE FROM " + this.TABLE_NAME + " WHERE namespace = :namespace AND key = :key", + { ":namespace":namespace, ":key":key }); + }, + + putMultiple: function(keys, values, resultsHandler, namespace) { + if(this.isValidKeyArray(keys) === false + || ! values instanceof Array + || keys.length != values.length){ + throw new Error("Invalid arguments: keys = [" + keys + "], values = [" + values + "]"); + } + + if(namespace == null || typeof namespace == "undefined"){ + namespace = this.DEFAULT_NAMESPACE; + } + + if(this.isValidKey(namespace) == false){ + throw new Error("Invalid namespace given: " + namespace); + } + + this._statusHandler = resultsHandler; + + // try to store the value + try{ + this._beginTransaction(); + for(var i=0;i 0 : Wait until 'newDelay' ms have passed without any "put" request to flush + // -1 : Do not automatically flush + setFlushDelay: function(newDelay){ + if(newDelay === null || typeof newDelay === "undefined" || isNaN(newDelay)){ + throw new Error("Invalid argunment: " + newDelay); + } + + dojox.flash.comm.setFlushDelay(String(newDelay)); + }, + + getFlushDelay: function(){ + return Number(dojox.flash.comm.getFlushDelay()); + }, + + flush: function(namespace){ + //FIXME: is this test necessary? Just use !namespace + if(namespace == null || typeof namespace == "undefined"){ + namespace = dojox.storage.DEFAULT_NAMESPACE; + } + dojox.flash.comm.flush(namespace); + }, + + isAvailable: function(){ + return (this._available = !dojo.config["disableFlashStorage"]); + }, + + put: function(key, value, resultsHandler, namespace){ + if(!this.isValidKey(key)){ + throw new Error("Invalid key given: " + key); + } + + if(!namespace){ + namespace = dojox.storage.DEFAULT_NAMESPACE; + } + + if(!this.isValidKey(namespace)){ + throw new Error("Invalid namespace given: " + namespace); + } + + this._statusHandler = resultsHandler; + + // serialize the value; + // handle strings differently so they have better performance + if(dojo.isString(value)){ + value = "string:" + value; + }else{ + value = dojo.toJson(value); + } + + dojox.flash.comm.put(key, value, namespace); + }, + + putMultiple: function(keys, values, resultsHandler, namespace){ + if(!this.isValidKeyArray(keys) || ! values instanceof Array + || keys.length != values.length){ + throw new Error("Invalid arguments: keys = [" + keys + "], values = [" + values + "]"); + } + + if(!namespace){ + namespace = dojox.storage.DEFAULT_NAMESPACE; + } + + if(!this.isValidKey(namespace)){ + throw new Error("Invalid namespace given: " + namespace); + } + + this._statusHandler = resultsHandler; + + // Convert the arguments on strings we can pass along to Flash + var metaKey = keys.join(","); + var lengths = []; + for(var i=0;i
                        ', + + _isNode: function(/* object */wh){ + // summary: + // checks to see if wh is actually a node. + if(typeof Element == "function") { + try{ + return wh instanceof Element; // boolean + }catch(e){} + }else{ + // best-guess + return wh && !isNaN(wh.nodeType); // boolean + } + }, + + _hasParent: function(/*Node*/node){ + // summary: + // returns whether or not node is a child of another node. + return Boolean(node && node.parentNode && this._isNode(node.parentNode)); // boolean + }, + + postCreate: function() { + + // set image + if((this.iconSrc.toLowerCase().substring(this.iconSrc.length-4)==".png")&&(dojo.isIE)&&(dojo.isIE<7)){ + /* we set the id of the new fisheyeListItem to the id of the div defined in the HTML */ + if(this._hasParent(this.imgNode) && this.id != ""){ + var parent = this.imgNode.parentNode; + parent.setAttribute("id", this.id); + } + this.imgNode.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.iconSrc+"', sizingMethod='scale')"; + this.imgNode.src = this._blankImgPath.toString(); + }else{ + if(this._hasParent(this.imgNode) && this.id != ""){ + var parent = this.imgNode.parentNode; + parent.setAttribute("id", this.id); + } + this.imgNode.src = this.iconSrc; + } + + // Label + if(this.lblNode){ + this.lblNode.appendChild(document.createTextNode(this.label)); + } + dojo.setSelectable(this.domNode, false); + this.startup(); + }, + + startup: function(){ + this.parent = this.getParent(); + }, + + onMouseOver: function(/*Event*/ e){ + // summary: callback when user moves mouse over this menu item + // in conservative mode, don't activate the menu until user mouses over an icon + if(!this.parent.isOver){ + this.parent._setActive(e); + } + if(this.label != "" ){ + dojo.addClass(this.lblNode, "dojoxFishSelected"); + this.parent._positionLabel(this); + } + }, + + onMouseOut: function(/*Event*/ e){ + // summary: callback when user moves mouse off of this menu item + dojo.removeClass(this.lblNode, "dojoxFishSelected"); + }, + + onClick: function(/*Event*/ e){ + // summary: user overridable callback when user clicks this menu item + } +}); + +} diff --git a/includes/js/dojox/widget/FisheyeList/FisheyeList.css b/includes/js/dojox/widget/FisheyeList/FisheyeList.css new file mode 100644 index 0000000..c9b78a9 --- /dev/null +++ b/includes/js/dojox/widget/FisheyeList/FisheyeList.css @@ -0,0 +1,24 @@ +.dojoxFisheyeListItemLabel { + font-family: Arial, Helvetica, sans-serif; + background-color: #eee; + border: 2px solid #666; + padding: 2px; + text-align: center; + position: absolute; + display: none; + white-space:pre; +} +.dojoxFisheyeListItemLabel.dojoxFishSelected { + display: block; +} +.dojoxFisheyeListItemImage { + border: 0px; + position: absolute; +} +.dojoxFisheyeListItem { + position: absolute; + z-index: 2; +} +.dojoxFisheyeListBar { + position: relative; +} diff --git a/includes/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css b/includes/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css new file mode 100644 index 0000000..82469d8 --- /dev/null +++ b/includes/js/dojox/widget/FisheyeList/FisheyeList.css.commented.css @@ -0,0 +1,28 @@ +.dojoxFisheyeListItemLabel { + font-family: Arial, Helvetica, sans-serif; + background-color: #eee; + border: 2px solid #666; + padding: 2px; + text-align: center; + position: absolute; + display: none; + white-space:pre; +} + +.dojoxFisheyeListItemLabel.dojoxFishSelected { + display: block; +} + +.dojoxFisheyeListItemImage { + border: 0px; + position: absolute; +} + +.dojoxFisheyeListItem { + position: absolute; + z-index: 2; +} + +.dojoxFisheyeListBar { + position: relative; +} diff --git a/includes/js/dojox/widget/FisheyeLite.js b/includes/js/dojox/widget/FisheyeLite.js new file mode 100644 index 0000000..34818ae --- /dev/null +++ b/includes/js/dojox/widget/FisheyeLite.js @@ -0,0 +1,135 @@ +if(!dojo._hasResource["dojox.widget.FisheyeLite"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.FisheyeLite"] = true; +dojo.provide("dojox.widget.FisheyeLite"); +dojo.experimental("dojox.widget.FisheyeLite"); + +dojo.require("dijit._Widget"); +dojo.require("dojox.fx.easing"); + +dojo.declare("dojox.widget.FisheyeLite", + dijit._Widget, + { + // summary: A Light-weight Fisheye Component, or an exhanced version + // of dojo.fx.Toggler ... + // + // description: + // A Simple FisheyeList-like widget which (in the interest of + // performance) relies on well-styled content for positioning, + // and natural page layout for rendering. + // + // use position:absolute/relative nodes to prevent layout + // changes, and use caution when seleting properties to + // scale. Negative scaling works, but some properties + // react poorly to being set to negative values, IE being + // particularly annoying in that regard. + // + // quirk: uses the domNode as the target of the animation + // unless it finds a node class="fisheyeTarget" in the container + // being turned into a FisheyeLite instance + // + // example: + // | // make all the LI's in a node Fisheye's: + // | dojo.query("#node li").forEach(function(n){ + // | new dojox.widget.FisheyeLite({},n); + // | }); + // + // duationIn: Integer + // The time (in ms) the run the show animation + durationIn: 350, + + // easeIn: Function + // An easing function to use for the show animation + easeIn: dojox.fx.easing.backOut, + + // durationOut: Integer + // The Time (in ms) to run the hide animation + durationOut: 1420, + + // easeOut: Function + // An easing function to use for the hide animation + easeOut: dojox.fx.easing.elasticOut, + + // properties: Object + // An object of "property":scale pairs + // defaults to font-size with a scale of 2.75 + properties: { + fontSize: 2.75 + }, + + // unit: String + // Sometimes, you need to specify a unit. Should be part of + // properties attrib, but was trying to shorthand the logic there + unit:"px", + + postCreate: function(){ + + this.inherited(arguments); + this._target = dojo.query(".fisheyeTarget",this.domNode)[0] || this.domNode; + this._makeAnims(); + + this.connect(this.domNode,"onmouseover","show"); + this.connect(this.domNode,"onmouseout","hide"); + this.connect(this._target,"onclick","onClick"); + + }, + + show: function(){ + // summary: + // Show this Fisheye item. + this._runningOut.stop(); + this._runningIn.play(); + }, + + hide: function(){ + // summary: + // Hide this fisheye item on mouse leave + this._runningIn.stop(); + this._runningOut.play(); + }, + + _makeAnims: function(){ + // summary: + // Pre-generate the animations + + // create two properties: objects, one for each "state" + var _in = {}; + var _out = {}; + var cs = dojo.getComputedStyle(this._target); + for(var p in this.properties){ + var v = parseInt(cs[p]); + // note: do not set negative scale for [a list of properties] for IE support + // note: filter:'s are your own issue, too ;) + _out[p] = { end: v, unit:this.unit }; + _in[p] = { end: (this.properties[p]*v), unit:this.unit }; + } + + this._runningIn = dojo.animateProperty({ + node: this._target, + easing: this.easeIn, + duration: this.durationIn, + properties: _in + }); + + this._runningOut = dojo.animateProperty({ + node: this._target, + duration: this.durationOut, + easing: this.easeOut, + properties: _out + }); + + this.connect(this._runningIn,"onEnd",dojo.hitch(this,"onSelected",this)); + }, + + onClick: function(/* Event */e){ + // summary: stub function fired when target is clicked + // connect or override to use. + }, + + onSelected: function(/* Object */e){ + // summary: stub function fired when Fisheye Item is fully visible and + // hovered. connect or override use. + } + +}); + +} diff --git a/includes/js/dojox/widget/Iterator.js b/includes/js/dojox/widget/Iterator.js new file mode 100644 index 0000000..c2f510d --- /dev/null +++ b/includes/js/dojox/widget/Iterator.js @@ -0,0 +1,177 @@ +if(!dojo._hasResource["dojox.widget.Iterator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.Iterator"] = true; +dojo.provide("dojox.widget.Iterator"); +dojo.require("dijit.Declaration"); + +dojo.experimental("dojox.widget.Iterator"); // level: prototype, designed for dijit.chat.demo + +/* + example: + from markup: + | + | + |
                        + |
                        + | ${name} is a ${type} + |
                        + |
                        + + example: + programmatic: + | var store = new dojo.data.ItemFileReadStore({ url: "countries.json" }); + | + | var iter = new dojox.widget.Iterator({ + | store: store, + | template: "" + | }); + | + + example: + programmatic from an array of objects: + | var dataArr = [ + | { name: "foo", valueAttr: "bar" }, + | { name: "thinger", valueAttr: "blah" } + | ]; + | + | var iter = new dojox.widget.Iterator({ + | data: dataArr, + | template: "" + | }); + + example: + programmatic from an array of strings: + | var dataArr = [ + | { name: "foo", valueAttr: "bar" }, + | { name: "thinger", valueAttr: "blah" } + | ]; + | + | var iter = new dojox.widget.Iterator({ + | data: dataArr, + | template: "" + | }); + +*/ + + +dojo.declare("dojox.widget.Iterator", + [ dijit.Declaration ], + { + + constructor: (function(){ + var ctr = 0; + return function(){ + this.attrs = []; + this.children = []; + this.widgetClass = "dojox.widget.Iterator._classes._"+(ctr++); + } + })(), + + start: 0, + fetchMax: 1000, + query: { name: "*" }, + attrs: [], + defaultValue: "", + widgetCtor: null, + dataValues: [], // an array of strings + data: null, // should be a reference to an Array + store: null, + _srcIndex: 0, + _srcParent: null, + + _setSrcIndex: function(s){ + this._srcIndex = 0; + this._srcParent = s.parentNode; + var ts = s; + while(ts.previousSibling){ + this._srcIndex++; + ts = ts.previousSibling; + }; + }, + + postscript: function(p, s){ + // figure out the position of the source node in it's parent + this._setSrcIndex(s); + // this._srcIndex = dojo.query(">", this._srcParent).indexOf(s); + + this.inherited("postscript", arguments); + var wc = this.widgetCtor = dojo.getObject(this.widgetClass); + + this.attrs = dojo.map( + wc.prototype.templateString.match(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g), + function(s){ return s.slice(2, -1); } + ); + dojo.forEach( + this.attrs, + function(m){ wc.prototype[m] = ""; } + ); + this.update(); + }, + + clear: function(){ + if(this.children.length){ + this._setSrcIndex(this.children[0].domNode); + } + dojo.forEach(this.children, "item.destroy();"); + this.children = []; + }, + + update: function(){ + if(this.store){ + // we're executing a query + this.fetch(); + }else{ + // we came from an array of objects. Easier! + this.onDataAvailable(this.data||this.dataValues); + } + }, + + _addItem: function(/*Object*/config, idx){ + if(dojo.isString(config)){ + config = { value: config }; + } + var widget = new this.widgetCtor(config); + this.children.push(widget); + dojo.place(widget.domNode, this._srcParent, this._srcIndex+idx); + }, + + getAttrValuesObj: function(item){ + var obj = {}; + if(dojo.isString(item)){ + dojo.forEach(this.attrs, function(attr){ + obj[attr] = (attr == "value") ? item : this.defaultValue; + }, this); + }else{ + dojo.forEach(this.attrs, function(attr){ + if(this.store){ + obj[attr] = this.store.getValue(item, attr)||this.defaultValue; + }else{ + obj[attr] = item[attr]||this.defaultValue; + } + }, this); + } + return obj; + }, + + onDataAvailable: function(data){ + this.clear(); + // console.debug(data); + dojo.forEach(data, function(item, idx){ + this._addItem(this.getAttrValuesObj(item), idx); + }, this); + }, + + fetch: function(query, start, end){ + this.store.fetch({ + query: query||this.query, + start: start||this.start, + count: end||this.fetchMax, + onComplete: dojo.hitch(this,"onDataAvailable") + }); + } +}); + +dojox.widget.Iterator._classes = {}; + +} diff --git a/includes/js/dojox/widget/Loader.js b/includes/js/dojox/widget/Loader.js new file mode 100644 index 0000000..2493d5a --- /dev/null +++ b/includes/js/dojox/widget/Loader.js @@ -0,0 +1,103 @@ +if(!dojo._hasResource["dojox.widget.Loader"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.Loader"] = true; +dojo.provide("dojox.widget.Loader"); +dojo.experimental("dojox.widget.Loader"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); + +dojo.declare("dojox.widget.Loader", [dijit._Widget,dijit._Templated], { + // summary: a configurable global xhr-listener to display + // a loading message during running xhr's or to simply provide + // base-level topic to subscribe to for custom loading messages + + // loadIcon: String + // location to the icon used. + loadIcon: dojo.moduleUrl("dojox.widget.Loader","icons/loading.gif"), + + // loadMessage: String + // string to use for progress loading + loadMessage: 'Loading ...', + + // hasVisuals: Boolean + // true to display a fixed loading message in TR cornder, false to unly provide + // "Loader" topic to subscribe to for your own custom loading message. + hasVisuals: true, + + // attachToPointer + // true to use visual indicator where cursor is + attachToPointer: true, + + // duration: Integer + // time in ms to toggle in/out the visual load indicator + duration: 125, + + // _offset: Integer + // distance in px from the mouse pointer to show attachToPointer avatar + _offset: 16, + + // holder for mousemove connection + _pointerConnect: null, + _xhrStart: null, + _xhrEnd: null, + + templateString: '
                        ' + +' ' + +'
                        ', + + postCreate: function(){ + // summary: setup the loader + + if(!this.hasVisuals){ + this.loadNode.style.display = "none"; // _destroy()? + }else{ + if(this.attachToPointer){ + dojo.removeClass(this.loadNode,"dojoxLoader"); + dojo.addClass(this.loadNode,"dojoxLoaderPointer"); + } + this._hide(); + } + this._setMessage(this.loadMessage); + + // FIXME: create our connections. would be easier, and this might be redundant + // if Deferred published something + this._xhrStart = dojo.connect(dojo,"_ioSetArgs",this,"_show"); + this._xhrEnd = dojo.connect(dojo.Deferred.prototype,"_fire",this,"_hide"); + + }, + + _setMessage: function(/* String */ message){ + // summary: set's the message in the loader + this.loadMessageNode.innerHTML = message; + }, + + _putLoader: function(/* Event */ e){ + // summary: place the floating loading element based on mousemove connection position + dijit.placeOnScreen(this.loadNode,{ x: e.clientX+this._offset, y:e.clientY+this._offset }, ["TL","BR"]); + }, + + _show: function(){ + // summary: publish and show progress indicator + dojo.publish("Loader",[{ message: 'started' }]); + if(this.hasVisuals){ + if(this.attachToPointer){ + this._pointerConnect = dojo.connect(document,"onmousemove",this,"_putLoader"); + } + dojo.fadeIn({ node: this.loadNode, duration:this.duration }).play(); + } + }, + + _hide: function(){ + // summary: publish "xhr ended" and hide progress indicator + dojo.publish("Loader",[{ message: 'ended' }]); + if(this.hasVisuals){ + if(this.attachToPointer){ + dojo.disconnect(this._pointerConnect); + } + dojo.fadeOut({ node: this.loadNode, duration:this.duration }).play(); + } + } + +}); + +} diff --git a/includes/js/dojox/widget/Loader/Loader.css b/includes/js/dojox/widget/Loader/Loader.css new file mode 100644 index 0000000..f209d70 --- /dev/null +++ b/includes/js/dojox/widget/Loader/Loader.css @@ -0,0 +1,24 @@ +.dojoxLoaderPointer { + position:absolute; + z-index:999; +} +.dojoxLoader { + float:right; + position:fixed; + height:25px; + width:100px; + top:0; + right:0; + padding:3px; + border:1px solid #ccc; + background:#fff; + min-width:42px; +} +.dojoxLoaderIcon { + height:22px; width:22px; + vertical-align:middle; +} +.dojoxLoaderMessage { + font:8pt Arial,san-serif; + color:#666; +} diff --git a/includes/js/dojox/widget/Loader/Loader.css.commented.css b/includes/js/dojox/widget/Loader/Loader.css.commented.css new file mode 100644 index 0000000..4b2d19c --- /dev/null +++ b/includes/js/dojox/widget/Loader/Loader.css.commented.css @@ -0,0 +1,27 @@ +.dojoxLoaderPointer { + position:absolute; + z-index:999; +} + +.dojoxLoader { + float:right; + position:fixed; + height:25px; + width:100px; + top:0; + right:0; + padding:3px; + border:1px solid #ccc; + background:#fff; + min-width:42px; +} + +.dojoxLoaderIcon { + height:22px; width:22px; + vertical-align:middle; +} + +.dojoxLoaderMessage { + font:8pt Arial,san-serif; + color:#666; +} diff --git a/includes/js/dojox/widget/Loader/README b/includes/js/dojox/widget/Loader/README new file mode 100644 index 0000000..df6c73d --- /dev/null +++ b/includes/js/dojox/widget/Loader/README @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------- +dojox.widget.Loader +------------------------------------------------------------------------------- +Version 0.1 +Release date: 07/15/2007 +------------------------------------------------------------------------------- +Project state: +prototype / expermental +------------------------------------------------------------------------------- +Credits: Pete Higgins (phiggins@gmail.com) +------------------------------------------------------------------------------- +Description: + a class to indicatie some xhr request + is going on via topics, with optional + eye-candy indicators either offset + from mouse pointer, or in a fixed position + node. + +------------------------------------------------------------------------------- +Dependencies: + widget: none. + test page: to enhance visual effect, a .php + file is used to slowly pass data to an xhr + request. You will need a php-enabled + webserver to view /dojox/tests/test_Loader.html + +------------------------------------------------------------------------------- +Documentation + +------------------------------------------------------------------------------- +Installation instructions + + simply dojo.require("dojox.widget.Loader") and + attach to a div: +
                        + + Configuration options can be found in the API tool. + + diff --git a/includes/js/dojox/widget/Loader/honey.php b/includes/js/dojox/widget/Loader/honey.php new file mode 100644 index 0000000..aeb7776 --- /dev/null +++ b/includes/js/dojox/widget/Loader/honey.php @@ -0,0 +1,27 @@ +"; + $dataSent += $blockSize; + sleep(1); +} + +?> diff --git a/includes/js/dojox/widget/Loader/icons/loading.gif b/includes/js/dojox/widget/Loader/icons/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e7c8e5ec279bf04593c5f6bd253fc1d5aacbfb1 GIT binary patch literal 751 zcmZ?wbhEHblwgoxI3mUH{Q2|0fB$~{`t|MGx4(Y<`uFeO@87>)zkdDm=g$uxKD>JM z>cxu}|NsC0`0?ZC&!6ADd-vtbmv7&`y?pud&!0cvzkmPq>C>AxZ{ELu|KrDxXV0Di zRWhIg#sA!Xt|7tBjsdPldIrplKv~6~ESwAsQVcpEl^|y@ux2b!>r2U;m$7PH&g*G` zO6noEWZZ+*BIk#$bj;uI`ES$VMf@GRo=&lS<}Ez?>arVa#8?f!F)V6G@Zp=WD{ceZ z!?P0Sa!qgl)?3*7scde^_opulGL?$ms+DWwo2wctlvr6NOk|CoGF3+ro8=8~%QM;b z5L;sJp-EGGoC^~%2vFBw<$d>3onfm#rH(UGB%ZA&9cP5;PEcbcmCy-&X z(4g&$2ut9Bi7Ubd)Xn+$Z0?9fs#clTNU_zKHB{yowslB$sWqFmw%0eROqOhAWa1U& z-)V-cfU4)$RAQ8WQtoT=^iv%-+nKr!36E z!Q!OO#BIskrX<=gCalpnVUiRlgCy7V-hPXTD!lX97pe&+aWja|77^tY=uu-6WZEUM ztzzH)0|zU>4rN7)x_NMizBwu4C?lTkz{w=yn{+{A(gUSJB_1*EhNeRoSmb7AdcRwFPuA~MFA17zI(u`ReB3yw2CQ^%YH3Yc>`Btro)sSFz5ZpX-t-67* V@T%2&w)Sla>OXnvw5lS5H2|lfH!J`E literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/MultiComboBox.js b/includes/js/dojox/widget/MultiComboBox.js new file mode 100644 index 0000000..6239d8a --- /dev/null +++ b/includes/js/dojox/widget/MultiComboBox.js @@ -0,0 +1,61 @@ +if(!dojo._hasResource["dojox.widget.MultiComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.MultiComboBox"] = true; +dojo.provide("dojox.widget.MultiComboBox"); +dojo.experimental("dojox.widget.MultiComboBox"); +dojo.require("dijit.form.ComboBox"); +dojo.require("dijit.form.ValidationTextBox"); + +dojo.declare("dojox.widget.MultiComboBox", + [dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],{ + // + // summary: A ComboBox that accpets multiple inputs on a single line? + // + // delimiter: String + // The character to use to separate items in the ComboBox input + delimiter: ",", + _previousMatches: false, + + setValue: function(value){ + if (this.delimiter && value.length != 0){ + value = value+this.delimiter+" "; + arguments[0] = this._addPreviousMatches(value); + } + this.inherited(arguments); + }, + + _addPreviousMatches: function(/* String */text){ + if(this._previousMatches){ + if(!text.match(new RegExp("^"+this._previousMatches))){ + text = this._previousMatches+text; + } + text = this._cleanupDelimiters(text); + } + return text; // String + }, + + _cleanupDelimiters: function(/* String */text){ + if(this.delimiter){ + text = text.replace(new RegExp(" +"), " "); + text = text.replace(new RegExp("^ *"+this.delimiter+"* *"), ""); + text = text.replace(new RegExp(this.delimiter+" *"+this.delimiter), this.delimiter); + } + return text; + }, + + _autoCompleteText: function(/* String */text){ + arguments[0] = this._addPreviousMatches(text); + this.inherited(arguments); + }, + + _startSearch: function(/* String */text){ + text = this._cleanupDelimiters(text); + var re = new RegExp("^.*"+this.delimiter+" *"); + + if(this._previousMatches = text.match(re)){ + arguments[0] = text.replace(re, ""); + } + this.inherited(arguments); + } +}); + +} diff --git a/includes/js/dojox/widget/README b/includes/js/dojox/widget/README new file mode 100644 index 0000000..8e8cb60 --- /dev/null +++ b/includes/js/dojox/widget/README @@ -0,0 +1,84 @@ +------------------------------------------------------------------------------- +dojox.widget Collection +------------------------------------------------------------------------------- +Version 1.0 +Release date: 10/31/2007 +------------------------------------------------------------------------------- +Project state: +experimental | beta +------------------------------------------------------------------------------- +Credits + Peter Higgins (dante) + Karl Tiedt (ktiedt@gmail.com) + Wolfram Kriesing (http://wolfram.kriesing.de/blog/): Rating +------------------------------------------------------------------------------- +Project description + + This is a collection of standalone widgets for use in + your website. Each individual widget is independant + of the others. +------------------------------------------------------------------------------- +Dependencies: + + Each widget has it's own requirements and dependencies. + Most inherit from dijit base-classes such as dijit._Widget, + dijit._Templated, etc ... So we will assume the availablility + of dojo (core), and dijit packages. +------------------------------------------------------------------------------- +Documentation + + Please refer to the API-tool, or in-line documentation. +------------------------------------------------------------------------------- +Installation instructions + + These are standalone Widgets, so putting the [widget].js file + in your dojox/widget folder, and copying any files in the + /dojox/widget/[widget]/ folder as supplements/templates/etc + should be all you need to do. + + eg: FisheyeList: + /dojox/widget/FisheyeList.js + /dojox/widget/FisheyeList/blank.gif + /dojox/widget/FisheyeList/FisheyeList.css + + should be all you need to use the Fisheye widget. + + you can safely import the whole widget project into your + dojox/ root directory from the following SVN url: + + http://svn.dojotoolkit.org/dojo/dojox/widget + +------------------------------------------------------------------------------- +Other Notes (Brief widget list): + + * ColorPicker - Photoshop-like color picker + + * FileInput - experimental dijit-like input type="file" + + * FileInputAuto/Blind - extension to FileInput for + added flair/automation + + * FisheyeList - the classic FishEye Picker + + * Iterator - Basic array and datastore iterator class + + * Loader - an experimental Class that listens to XHR + connections in the background, and displays + a loading indicator. + + * MultiComboBox - an experimental ComboBox that allows + multiple entries bases on a separator character. + + * SortList - a degradable UL with a fixed header, scrolling, + and sorting. Can be the direct descendat of a + LayoutContainer and will size to fit. + + * TimeSpinner - a number spinner that revolves through + time constrainsts + + * Toaster - a messaging system to display non-obstrusive + alerts on screen. + + * Wizard - a StackContainer with built-in navigation to + ease in the creation of 'step-based' content. + Requires dojo >= 1.1 diff --git a/includes/js/dojox/widget/Rating.js b/includes/js/dojox/widget/Rating.js new file mode 100644 index 0000000..8f12d62 --- /dev/null +++ b/includes/js/dojox/widget/Rating.js @@ -0,0 +1,90 @@ +if(!dojo._hasResource["dojox.widget.Rating"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.Rating"] = true; +dojo.provide("dojox.widget.Rating"); + +dojo.require("dijit.form._FormWidget"); + +dojo.declare("dojox.widget.Rating", + dijit.form._FormWidget,{ + // summary: + // A widget for rating using stars. + // + // required: Boolean + // TODO: Can be true or false, default is false. + // required: false, + + templateString: null, + + // numStars: Integer + // The number of stars to show, default is 3. + numStars: 3, + // value: Integer + // The current value of the Rating + value: 0, + + constructor:function(params){ + // Build the templateString. The number of stars is given by this.numStars, + // which is normally an attribute to the widget node. + dojo.mixin(this, params); + + // TODO actually "dijitInline" should be applied to the surrounding div, but FF2 + // screws up when we dojo.query() for the star nodes, it orders them randomly, because of the use + // of display:--moz-inline-box ... very strange bug + // Since using ul and li in combintaion with dijitInline this problem doesnt exist anymore. + + // The focusNode is normally used to store the value, i dont know if that is right here, but seems standard for _FormWidgets + var tpl = '
                        ' + + '
                          ${stars}
                        ' + + '
                        '; + // the value-attribute is used to "read" the value for processing in the widget class --> + var starTpl = '
                      1. '; + var rendered = ""; + for(var i = 0; i < this.numStars; i++){ + rendered += dojo.string.substitute(starTpl, {value:i+1}); + } + this.templateString = dojo.string.substitute(tpl, {stars:rendered}); + }, + + postCreate: function(){ + this.inherited(arguments); + this._renderStars(this.value); + }, + + _onMouse: function(evt){ + this.inherited(arguments); + if(this._hovering){ + var hoverValue = +dojo.attr(evt.target, "value"); + this.onMouseOver(evt, hoverValue); + this._renderStars(hoverValue, true); + }else{ + this._renderStars(this.value); + } + }, + + _renderStars: function(value, hover){ + // summary: Render the stars depending on the value. + dojo.query(".dojoxRatingStar", this.domNode).forEach(function(star, i){ + if(i + 1 > value){ + dojo.removeClass(star, "dojoxRatingStarHover"); + dojo.removeClass(star, "dojoxRatingStarChecked"); + }else{ + dojo.removeClass(star, "dojoxRatingStar" + (hover ? "Checked" : "Hover")); + dojo.addClass(star, "dojoxRatingStar" + (hover ? "Hover" : "Checked")); + } + }); + }, + + onStarClick:function(/* Event */evt){ +// TODOC: needs summary + var newVal = +dojo.attr(evt.target, "value"); + this.setAttribute("value", newVal == this.value ? 0 : newVal); + this._renderStars(this.value); + this.onChange(this.value); // Do I have to call this by hand? + }, + + onMouseOver: function(/*evt, value*/){ + // summary: connect here if you like to, the value is passed to this function as the second parameter! + } +}); + +} diff --git a/includes/js/dojox/widget/Rating/Rating.css b/includes/js/dojox/widget/Rating/Rating.css new file mode 100644 index 0000000..f4c0957 --- /dev/null +++ b/includes/js/dojox/widget/Rating/Rating.css @@ -0,0 +1,20 @@ +.dojoxRating ul { + padding:0; + margin:0; +} +.dojoxRatingStar { + display:inline-block; + background-image:url(rating_empty.gif); + background-position:left center; + position:relative; + height:15px; + width:15px; + float:left; +} +.dojoxRatingStarChecked { + background-image:url(rating_full.gif); +} +.dojoxRatingStarHover { + background-image:url(rating_full.gif); + opacity:.5; +} diff --git a/includes/js/dojox/widget/Rating/Rating.css.commented.css b/includes/js/dojox/widget/Rating/Rating.css.commented.css new file mode 100644 index 0000000..5fcdcb4 --- /dev/null +++ b/includes/js/dojox/widget/Rating/Rating.css.commented.css @@ -0,0 +1,24 @@ +.dojoxRating ul { + padding:0; + margin:0; +} + +.dojoxRatingStar { + display:inline-block; + background-image:url(rating_empty.gif); + background-position:left center; + position:relative; + height:15px; + width:15px; + float:left; +} + +.dojoxRatingStarChecked { + background-image:url(rating_full.gif); +} + +.dojoxRatingStarHover { + background-image:url(rating_full.gif); + opacity:.5; +} + diff --git a/includes/js/dojox/widget/Rating/rating_empty.gif b/includes/js/dojox/widget/Rating/rating_empty.gif new file mode 100644 index 0000000000000000000000000000000000000000..8662c4385e786fa0b055408945cb5a6676684ac0 GIT binary patch literal 934 zcmZ?wbhEHbb=RVw4ySfdL2s#h)yU3=IDnbU=24@&p4% zGsAyQnIHU&2bM86eck9C>fYotZ;B>Wad|zVUeiB)WXchqVdB$ z!Ks~JC1{ODB2x=H7mJS7j{v7-T*8VnIVu{AO&!9T0TUV&5+644E4g(r9Arph<(JVZ l_z;k|kcn5E%|xOg@$ji;x%PkA0S*j@=HzRK@o+F$0|3Kt=CV)}MN+5JDKIve5U18^H5V7RjIpLOa#q*br~>lz zjl*%?32ajSn%jBrL$B8p-eMt^%RmG{h#H86?+fx%Jg#AFdK>2)BEGujH!6=fzB!cf zIM_DL6NEVUz7LbhhqP44G))=bPS$_HHwJe5b2fwVc;tGX*G{EU)l#W!7@3TWqdx6D zS;vvFA%lMZwTa+4Hlp@AY!s*DG}1t=4O|3sSwEx`J{Buj|&mE0F zcQpUp)A;jH?axE?KaW-aJXZVjRQ1nul|QePpYNUkcH<~98Ui#40mYvzj0_C_8FWCV zgYpCeM=QgBPMIJ2%mb tN{lWXvKBrMJ}@3~;uTktxl!P7sC6nkuYkg@d}c;wj^bl$BMcQ7tO2tjm1F<_ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/Rating/rating_full.png b/includes/js/dojox/widget/Rating/rating_full.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4c9f1a99e2f1afe941bc2b19f79d0f91d34a0b GIT binary patch literal 483 zcmV<90UZ8`P)@E!2KqKdYFf=n7HxkelqA3kxOd-8WkWhdNJXc&uM??38*QBp~TlQ7ipbhdg zDNSY~%Za(qYKTf8Od2M#uOYocX z_t#{Nt1jx7ZHx1n(|(<|m|6@KrgBs%BEQjw@MKL!^;F#ZAQ-pL;z;^-iXi!P%7z%HHjADCJP2R~|S#X*!Hc9gW$CQX_=?~4v9 zwx|y-x#Zq+?mhRu2edfH+Y3jn;$pMF>E>)AQodHx>2%`HVA&}z%WV>Om;VI5S{;f- zI&C!=lF-}R$E(MF1?E8dtSiH9fW$Bm8{og!eL>%UyC{isvVjN#ncT4Sj!vHE!d~ zxtL&gJEM%+Wu|GdY&OeC_eQIM9l{a8YNV!4Yog8@)T-xszE(fp3~UFx)%Hk`^vZCn z5?q_)Tb8d?Q52q{HU*1beXb)MLiN$b!)e)g_WJfRnr4(rB}BWTJY}vaI3RgysrZ7& zLM3IJ?%>Q?W~ElE4W6H$?G^HQ$g=#Uvhe8 nodes at any given time. + selected: null, + + // sortable: Boolean + // toggle to enable/disable sorting + sortable: true, + + // FIXME: this is really simple store support + store: "", + key: "name", + + templateString:"
                        \n\t\t
                        \n\t\t
                        \n\t\t${title}\n\t\t
                        \n\t\t
                        \n\t\t
                          \n\t
                          \n
                          \n", + + _addItem: function(item){ + var node = dojo.doc.createElement("li"); + var text = this.store.getValue(item,this.key); + node.innerHTML = text; + this.containerNode.appendChild(node); + }, + + postCreate: function(){ + if(this.store){ + this.store = dojo.getObject(this.store); + var props = { + onItem: dojo.hitch(this,"_addItem"), + onComplete: dojo.hitch(this,"onSort") + }; + this.store.fetch(props); + }else{ this.onSort(); } + this.inherited(arguments); + }, + + startup: function(){ + this.inherited(arguments); + if(this.heading){ + this.setTitle(this.heading); this.title=this.heading; + } + // we cheat, and give the browser just enough time so we know our height + setTimeout(dojo.hitch(this,"resize"),5); + if (this.sortable){ this.connect(this.titleNode,"onclick", "onSort"); } + }, + + resize: function(){ + // summary: do our additional calculations when resize() is called by or in a parent + this.inherited(arguments); + // FIXME: + // the 10 comes from the difference between the contentBox and calculated height + // because of badding and border extents. this shouldn't be done this way, a theme change will + // break it: but we also don't want to run getComputedStyle or dojo.coords() every time resize() + // is fired. + var offset = ((this._contentBox.h) - (dojo.style(this.titleNode,"height")))-10; + this.bodyWrapper.style.height = Math.abs(offset) + "px"; + }, + + onSort: function(/* Event */e){ + // summary: sort the data, and style the nodes. + + var arr = dojo.query("li",this.domNode); + if (this.sortable){ + this.descending = !this.descending; + dojo.addClass(this.titleNode,((this.descending)?"sortListDesc":"sortListAsc")); + dojo.removeClass(this.titleNode,((this.descending)?"sortListAsc":"sortListDesc")); + arr.sort(this._sorter); + if(this.descending){ arr.reverse(); } + } + var i=0; + dojo.forEach(arr,function(item){ + dojo[(i++)%2 === 0 ? "addClass" : "removeClass"](item,"sortListItemOdd"); + this.containerNode.appendChild(item); + },this); + }, + + _set: function(/* Event */e){ + // summary: set hover state + if(e.target !== this.bodyWrapper){ + dojo.addClass(e.target,"sortListItemHover"); + } + }, + + _unset: function(/* Event */e){ + // summary: remove hover state (FIXME: combine with _set?) + dojo.removeClass(e.target,"sortListItemHover"); + }, + + _handleClick: function(/* Event */e){ + // summary: click listener for data portion of widget. toggle selected state + // of node, and update this.selected array accordingly + dojo.toggleClass(e.target,"sortListItemSelected"); + e.target.focus(); + this._updateValues(e.target.innerHTML); + }, + + _updateValues: function(){ + this._selected = dojo.query("li.sortListItemSelected",this.containerNode); + this.selected = []; + dojo.forEach(this._selected,function(node){ + this.selected.push(node.innerHTML); + },this); + this.onChanged(arguments); + }, + + _sorter: function(a,b){ + // summary: a basic sort function, use query sort, or keep this? + var aStr = a.innerHTML; + var bStr = b.innerHTML; + if(aStr>bStr){ return 1; } + if(aStr +
                          +
                          + ${title} +
                          +
                          +
                            +
                            +
                            \ No newline at end of file diff --git a/includes/js/dojox/widget/TimeSpinner.js b/includes/js/dojox/widget/TimeSpinner.js new file mode 100644 index 0000000..a60c083 --- /dev/null +++ b/includes/js/dojox/widget/TimeSpinner.js @@ -0,0 +1,48 @@ +if(!dojo._hasResource["dojox.widget.TimeSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.TimeSpinner"] = true; +dojo.provide("dojox.widget.TimeSpinner"); + +dojo.require("dijit.form._Spinner"); +dojo.require("dijit.form.NumberTextBox"); +dojo.require("dojo.date"); +dojo.require("dojo.date.locale"); +dojo.require("dojo.date.stamp"); + +dojo.declare( +"dojox.widget.TimeSpinner", +[dijit.form._Spinner], +{ + // summary: Time Spinner + // description: This widget is the same as a normal NumberSpinner, but for the time component of a date object instead + + required: false, + + adjust: function(/* Object */ val, /*Number*/ delta){ + return dojo.date.add(val, "minute", delta) + }, + + //FIXME should we allow for constraints in this widget? + isValid: function(){return true;}, + + smallDelta: 5, + + largeDelta: 30, + + timeoutChangeRate: 0.50, + + parse: function(time, locale){ + return dojo.date.locale.parse(time, {selector:"time", formatLength:"short"}); + }, + + format: function(time, locale){ + if (dojo.isString(time)) { return time; } + return dojo.date.locale.format(time, {selector:"time", formatLength:"short"}); + }, + + serialize: dojo.date.stamp.toISOString, + + value: "12:00 AM" + +}); + +} diff --git a/includes/js/dojox/widget/Toaster.js b/includes/js/dojox/widget/Toaster.js new file mode 100644 index 0000000..5505ede --- /dev/null +++ b/includes/js/dojox/widget/Toaster.js @@ -0,0 +1,268 @@ +if(!dojo._hasResource["dojox.widget.Toaster"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.Toaster"] = true; +dojo.provide("dojox.widget.Toaster"); + +dojo.require("dojo.fx"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); + +dojo.declare("dojox.widget.Toaster", [dijit._Widget, dijit._Templated], { + // summary: + // Message that slides in from the corner of the screen, used for notifications + // like "new email". + + templateString: '
                            ', + + // messageTopic: String + // Name of topic; anything published to this topic will be displayed as a message. + // Message format is either String or an object like + // {message: "hello word", type: "error", duration: 500} + messageTopic: "", + + _uniqueId: 0, + + // messageTypes: Enumeration + // Possible message types. + messageTypes: { + MESSAGE: "message", + WARNING: "warning", + ERROR: "error", + FATAL: "fatal" + }, + + // defaultType: String + // If message type isn't specified (see "messageTopic" parameter), + // then display message as this type. + // Possible values in messageTypes enumeration ("message", "warning", "error", "fatal") + defaultType: "message", + + // positionDirection: String + // Position from which message slides into screen, one of + // ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"] + positionDirection: "br-up", + + // positionDirectionTypes: Array + // Possible values for positionDirection parameter + positionDirectionTypes: ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"], + + // duration: Integer + // Number of milliseconds to show message + duration: "2000", + + //separator: String + // String used to separate messages if consecutive calls are made to setContent before previous messages go away + separator: "
                            ", + + postCreate: function(){ + this.inherited(arguments); + this.hide(); + + this.clipNode.className = "dijitToasterClip"; + this.containerNode.className += " dijitToasterContainer"; + this.contentNode.className = "dijitToasterContent"; + if(this.messageTopic){ + dojo.subscribe(this.messageTopic, this, "_handleMessage"); + } + }, + + _handleMessage: function(/*String|Object*/message){ + if(dojo.isString(message)){ + this.setContent(message); + }else{ + this.setContent(message.message, message.type, message.duration); + } + }, + + _capitalize: function(/* String */w){ + return w.substring(0,1).toUpperCase() + w.substring(1); + }, + + setContent: function(/*String*/message, /*String*/messageType, /*int?*/duration){ + // summary: + // sets and displays the given message and show duration + // message: + // the message + // messageType: + // type of message; possible values in messageTypes enumeration ("message", "warning", "error", "fatal") + // duration: + // duration in milliseconds to display message before removing it. Widget has default value. + duration = duration||this.duration; + // sync animations so there are no ghosted fades and such + if(this.slideAnim){ + if(this.slideAnim.status() != "playing"){ + this.slideAnim.stop(); + } + if(this.slideAnim.status() == "playing" || (this.fadeAnim && this.fadeAnim.status() == "playing")){ + setTimeout(dojo.hitch(this, function(){ + this.setContent(message, messageType, duration); + }), 50); + return; + } + } + + // determine type of content and apply appropriately + for(var type in this.messageTypes){ + dojo.removeClass(this.containerNode, "dijitToaster" + this._capitalize(this.messageTypes[type])); + } + + dojo.style(this.containerNode, "opacity", 1); + + if(message && this.isVisible){ + message = this.contentNode.innerHTML + this.separator + message; + } + this.contentNode.innerHTML = message; + + dojo.addClass(this.containerNode, "dijitToaster" + this._capitalize(messageType || this.defaultType)); + + // now do funky animation of widget appearing from + // bottom right of page and up + this.show(); + var nodeSize = dojo.marginBox(this.containerNode); + this._cancelHideTimer(); + if(this.isVisible){ + this._placeClip(); + //update hide timer if no sticky message in stack + if (!this._stickyMessage) + this._setHideTimer(duration); + + }else{ + var style = this.containerNode.style; + var pd = this.positionDirection; + // sets up initial position of container node and slide-out direction + if(pd.indexOf("-up") >= 0){ + style.left=0+"px"; + style.top=nodeSize.h + 10 + "px"; + }else if(pd.indexOf("-left") >= 0){ + style.left=nodeSize.w + 10 +"px"; + style.top=0+"px"; + }else if(pd.indexOf("-right") >= 0){ + style.left = 0 - nodeSize.w - 10 + "px"; + style.top = 0+"px"; + }else if(pd.indexOf("-down") >= 0){ + style.left = 0+"px"; + style.top = 0 - nodeSize.h - 10 + "px"; + }else{ + throw new Error(this.id + ".positionDirection is invalid: " + pd); + } + this.slideAnim = dojo.fx.slideTo({ + node: this.containerNode, + top: 0, left: 0, + duration: 450}); + this.connect(this.slideAnim, "onEnd", function(nodes, anim){ + //we build the fadeAnim here so we dont have to duplicate it later + // can't do a fadeHide because we're fading the + // inner node rather than the clipping node + this.fadeAnim = dojo.fadeOut({ + node: this.containerNode, + duration: 1000}); + this.connect(this.fadeAnim, "onEnd", function(evt){ + this.isVisible = false; + this.hide(); + }); + this._setHideTimer(duration); + this.connect(this, 'onSelect', function(evt){ + this._cancelHideTimer(); + //force clear sticky message + this._stickyMessage=false; + this.fadeAnim.play(); + }); + + this.isVisible = true; + }); + this.slideAnim.play(); + } + }, + + _cancelHideTimer:function(){ + if (this._hideTimer){ + clearTimeout(this._hideTimer); + this._hideTimer=null; + } + }, + + _setHideTimer:function(duration){ + this._cancelHideTimer(); + //if duration == 0 we keep the message displayed until clicked + if(duration>0){ + this._cancelHideTimer(); + this._hideTimer=setTimeout(dojo.hitch(this, function(evt){ + // we must hide the iframe in order to fade + // TODO: figure out how to fade with a BackgroundIframe + if(this.bgIframe && this.bgIframe.iframe){ + this.bgIframe.iframe.style.display="none"; + } + this._hideTimer=null; + //force clear sticky message + this._stickyMessage=false; + this.fadeAnim.play(); + }), duration); + } + else + this._stickyMessage=true; + }, + + _placeClip: function(){ + var view = dijit.getViewport(); + + var nodeSize = dojo.marginBox(this.containerNode); + + var style = this.clipNode.style; + // sets up the size of the clipping node + style.height = nodeSize.h+"px"; + style.width = nodeSize.w+"px"; + + // sets up the position of the clipping node + var pd = this.positionDirection; + if(pd.match(/^t/)){ + style.top = view.t+"px"; + }else if(pd.match(/^b/)){ + style.top = (view.h - nodeSize.h - 2 + view.t)+"px"; + } + if(pd.match(/^[tb]r-/)){ + style.left = (view.w - nodeSize.w - 1 - view.l)+"px"; + }else if(pd.match(/^[tb]l-/)){ + style.left = 0 + "px"; + } + + style.clip = "rect(0px, " + nodeSize.w + "px, " + nodeSize.h + "px, 0px)"; + if(dojo.isIE){ + if(!this.bgIframe){ + this.clipNode.id = "__dojoXToaster_"+this._uniqueId++; + this.bgIframe = new dijit.BackgroundIframe(this.clipNode); + } + var iframe = this.bgIframe.iframe; + if(iframe){ iframe.style.display="block"; } + } + }, + + onSelect: function(/*Event*/e){ + // summary: callback for when user clicks the message + }, + + show: function(){ + // summary: show the Toaster + dojo.style(this.domNode, 'display', 'block'); + + this._placeClip(); + + if(!this._scrollConnected){ + this._scrollConnected = dojo.connect(window, "onscroll", this, this._placeClip); + } + }, + + hide: function(){ + // summary: hide the Toaster + + dojo.style(this.domNode, 'display', 'none'); + + if(this._scrollConnected){ + dojo.disconnect(this._scrollConnected); + this._scrollConnected = false; + } + + dojo.style(this.containerNode, "opacity", 1); + } + } +); + +} diff --git a/includes/js/dojox/widget/Toaster/Toaster.css b/includes/js/dojox/widget/Toaster/Toaster.css new file mode 100644 index 0000000..b898452 --- /dev/null +++ b/includes/js/dojox/widget/Toaster/Toaster.css @@ -0,0 +1,39 @@ + +.dijitToasterContent { + padding:1em; + padding-top:0.25em; + background:#73c74a; +} +.dijitToasterMessage{ + color:#fff; +} +.dijitToasterWarning{ } +.dijitToasterError, +.dijitToasterFatal{ + font-weight:bold; + color:#fff; +} +.dijitToasterWarning .dijitToasterContent{ + padding:1em; + padding-top:0.25em; + background:#d4d943; +} +.dijitToasterError .dijitToasterContent{ + padding:1em; + padding-top:0.25em; + background:#c46600; +} + +.dijitToasterClip { + position: absolute; + z-index: 5000; + overflow: hidden; +} +.dijitToasterContainer { + display: block; + position: absolute; + width: 17.5em; + margin: 0px; + font:0.75em Tahoma, Helvetica, Verdana, Arial; +} + diff --git a/includes/js/dojox/widget/Toaster/Toaster.css.commented.css b/includes/js/dojox/widget/Toaster/Toaster.css.commented.css new file mode 100644 index 0000000..b933063 --- /dev/null +++ b/includes/js/dojox/widget/Toaster/Toaster.css.commented.css @@ -0,0 +1,47 @@ +/* main classes for dojox.widget.Toaster */ + +.dijitToasterContent { + padding:1em; + padding-top:0.25em; + background:#73c74a; +} + +.dijitToasterMessage{ + color:#fff; +} + +.dijitToasterWarning{ } +.dijitToasterError, +.dijitToasterFatal{ + font-weight:bold; + color:#fff; +} + +.dijitToasterWarning .dijitToasterContent{ + padding:1em; + padding-top:0.25em; + background:#d4d943; +} + +.dijitToasterError .dijitToasterContent{ + padding:1em; + padding-top:0.25em; + background:#c46600; +} + +/* imported from dijit.css */ + +.dijitToasterClip { + position: absolute; + z-index: 5000; + overflow: hidden; +} + +.dijitToasterContainer { + display: block; + position: absolute; + width: 17.5em; + margin: 0px; + font:0.75em Tahoma, Helvetica, Verdana, Arial; +} + diff --git a/includes/js/dojox/widget/Wizard.js b/includes/js/dojox/widget/Wizard.js new file mode 100644 index 0000000..b8921b1 --- /dev/null +++ b/includes/js/dojox/widget/Wizard.js @@ -0,0 +1,192 @@ +if(!dojo._hasResource["dojox.widget.Wizard"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.widget.Wizard"] = true; +dojo.provide("dojox.widget.Wizard"); + +dojo.require("dijit.layout.StackContainer"); +dojo.require("dijit.layout.ContentPane"); +dojo.require("dijit.form.Button"); + +dojo.require("dojo.i18n"); +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.requireLocalization("dojox.widget", "Wizard", null, "zh,pt,da,tr,ru,de,sv,ja,he,fi,nb,el,ar,pt-pt,cs,fr,es,nl,ko,zh-tw,ROOT,pl,it,hu"); + +dojo.declare( + "dojox.widget.WizardContainer", + [dijit.layout.StackContainer,dijit._Templated], + { + // summary: + // A set of panels that display sequentially, typically notating a step-by-step + // procedure like an install + // + + widgetsInTemplate: true, + templateString:"
                            \n
                            \n
                            \n \n \n \n \n
                            \n
                            \n", + + // nextButtonLabel: String + // Label override for the "Next" button. + nextButtonLabel: "", + + // previousButtonLabel: String + // Label override for the "Previous" button. + previousButtonLabel: "", + + // cancelButtonLabel: String + // Label override for the "Cancel" button. + cancelButtonLabel: "", + + // doneButtonLabel: String + // Label override for the "Done" button. + doneButtonLabel: "", + + // cancelFunction: FunctionName + // Name of function to call if user presses cancel button. + // Cancel button is not displayed if function is not specified. + cancelFunction: "", + + // hideDisabled: Boolean + // If true, disabled buttons are hidden; otherwise, they are assigned the + // "WizardButtonDisabled" CSS class + hideDisabled: false, + + postMixInProperties: function(){ + this.inherited(arguments); + var labels = dojo.mixin({cancel: dojo.i18n.getLocalization("dijit", "common", this.lang).buttonCancel}, + dojo.i18n.getLocalization("dojox.widget", "Wizard", this.lang)); + for(prop in labels){ + if(!this[prop + "ButtonLabel"]){ + this[prop + "ButtonLabel"] = labels[prop]; + } + } + }, + + startup: function(){ + this.inherited(arguments); + + this.connect(this.nextButton, "onClick", "_forward"); + this.connect(this.previousButton, "onClick", "back"); + + if(this.cancelFunction){ + this.cancelFunction = dojo.getObject(this.cancelFunction); + this.connect(this.cancelButton, "onClick", this.cancelFunction); + }else{ + this.cancelButton.domNode.style.display = "none"; + } + this.connect(this.doneButton, "onClick", "done"); + + this._subscription = dojo.subscribe(this.id+"-selectChild", dojo.hitch(this,"_checkButtons")); + this._checkButtons(); + }, + + _checkButtons: function(){ + + var sw = this.selectedChildWidget; + + var lastStep = sw.isLastChild; + this.nextButton.setAttribute("disabled", lastStep); + this._setButtonClass(this.nextButton); + if(sw.doneFunction){ + this.doneButton.domNode.style.display = ""; + if(lastStep){ + this.nextButton.domNode.style.display = "none"; + } + }else{ + // #1438 issue here. + this.doneButton.domNode.style.display = "none"; + } + this.previousButton.setAttribute("disabled", !this.selectedChildWidget.canGoBack); + this._setButtonClass(this.previousButton); + }, + + _setButtonClass: function(button){ + button.domNode.style.display = (this.hideDisabled && button.disabled) ? "none" : ""; + }, + + _forward: function(){ + // summary: callback when next button is clicked + if(this.selectedChildWidget._checkPass()){ + this.forward(); + } + }, + + done: function(){ + // summary: Finish the wizard's operation + this.selectedChildWidget.done(); + }, + + destroy: function(){ + dojo.unsubscribe(this._subscription); + this.inherited(arguments); + } +}); + +dojo.declare( + "dojox.widget.WizardPane", + dijit.layout.ContentPane, + { + // summary: a panel in a WizardContainer + // + // description: + // An extended ContentPane with additional hooks for passing named + // functions to prevent the pane from going either forward or + // backwards. + // + // canGoBack: Boolean + // If true, then can move back to a previous panel (by clicking the "Previous" button) + canGoBack: true, + + // passFunction: String + // Name of function that checks if it's OK to advance to the next panel. + // If it's not OK (for example, mandatory field hasn't been entered), then + // returns an error message (String) explaining the reason. + passFunction: "", + + // doneFunction: String + // Name of function that is run if you press the "Done" button from this panel + doneFunction: "", + + postMixInProperties: function(){ + if(this.passFunction){ + this.passFunction = dojo.getObject(this.passFunction); + } + if(this.doneFunction){ + this.doneFunction = dojo.getObject(this.doneFunction); + } + this.inherited(arguments); + }, + + startup: function(){ + this.inherited(arguments); + if(this.isFirstChild){ this.canGoBack = false; } + }, + + _checkPass: function(){ + // summary: + // Called when the user presses the "next" button. + // Calls passFunction to see if it's OK to advance to next panel, and + // if it isn't, then display error. + // Returns true to advance, false to not advance. + var r = true; + if(this.passFunction && dojo.isFunction(this.passFunction)){ + var failMessage = this.passFunction(); + switch(typeof failMessage){ + case "boolean": + r = failMessage; + break; + case "string": + alert(failMessage); + r = false; + break; + } + } + return r; + }, + + done: function(){ + if(this.doneFunction && dojo.isFunction(this.doneFunction)){ + this.doneFunction(); + } + } + +}); + +} diff --git a/includes/js/dojox/widget/Wizard/Wizard.css b/includes/js/dojox/widget/Wizard/Wizard.css new file mode 100644 index 0000000..f1a9177 --- /dev/null +++ b/includes/js/dojox/widget/Wizard/Wizard.css @@ -0,0 +1,19 @@ +.dojoxWizard { + position:relative; +} +.dojoxWizardButtons { + position:absolute; + bottom:5px; + right:5px; +} +.tundra .dojoxWizard { + background: #eeeeee; + border: #b7b7b7 1px solid; + padding: 2px; + -moz-border-radius:3pt; + -webkit-border-radius:4pt; +} +.soria .dojoxWizard { + border:1px solid #b7b7b7; + padding:2px; +} diff --git a/includes/js/dojox/widget/Wizard/Wizard.css.commented.css b/includes/js/dojox/widget/Wizard/Wizard.css.commented.css new file mode 100644 index 0000000..61340f5 --- /dev/null +++ b/includes/js/dojox/widget/Wizard/Wizard.css.commented.css @@ -0,0 +1,22 @@ +.dojoxWizard { + position:relative; +} + +.dojoxWizardButtons { + position:absolute; + bottom:5px; + right:5px; +} + +.tundra .dojoxWizard { + background: #eeeeee; + border: #b7b7b7 1px solid; + padding: 2px; + -moz-border-radius:3pt; + -webkit-border-radius:4pt; +} + +.soria .dojoxWizard { + border:1px solid #b7b7b7; + padding:2px; +} diff --git a/includes/js/dojox/widget/Wizard/Wizard.html b/includes/js/dojox/widget/Wizard/Wizard.html new file mode 100644 index 0000000..1ae6a1e --- /dev/null +++ b/includes/js/dojox/widget/Wizard/Wizard.html @@ -0,0 +1,9 @@ +
                            +
                            +
                            + + + + +
                            +
                            diff --git a/includes/js/dojox/widget/nls/Wizard.js b/includes/js/dojox/widget/nls/Wizard.js new file mode 100644 index 0000000..ec10f3f --- /dev/null +++ b/includes/js/dojox/widget/nls/Wizard.js @@ -0,0 +1 @@ +({"next":"Next","done":"Done","previous":"Previous"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/ar/Wizard.js b/includes/js/dojox/widget/nls/ar/Wizard.js new file mode 100644 index 0000000..66209a5 --- /dev/null +++ b/includes/js/dojox/widget/nls/ar/Wizard.js @@ -0,0 +1 @@ +({"next":"تالي","done":"اتمام","previous":"سابق"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/cs/Wizard.js b/includes/js/dojox/widget/nls/cs/Wizard.js new file mode 100644 index 0000000..4075772 --- /dev/null +++ b/includes/js/dojox/widget/nls/cs/Wizard.js @@ -0,0 +1 @@ +({"next":"Další","done":"Hotovo","previous":"PÅ™edchozí"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/da/Wizard.js b/includes/js/dojox/widget/nls/da/Wizard.js new file mode 100644 index 0000000..a3b161f --- /dev/null +++ b/includes/js/dojox/widget/nls/da/Wizard.js @@ -0,0 +1 @@ +({"next":"Næste","done":"Udført","previous":"ForegÃ¥ende"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/de/Wizard.js b/includes/js/dojox/widget/nls/de/Wizard.js new file mode 100644 index 0000000..a7f2164 --- /dev/null +++ b/includes/js/dojox/widget/nls/de/Wizard.js @@ -0,0 +1 @@ +({"next":"Weiter","done":"Fertig","previous":"Zurück"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/el/Wizard.js b/includes/js/dojox/widget/nls/el/Wizard.js new file mode 100644 index 0000000..6a25346 --- /dev/null +++ b/includes/js/dojox/widget/nls/el/Wizard.js @@ -0,0 +1 @@ +({"next":"Επόμενο","done":"ΟλοκλήÏωση","previous":"ΠÏοηγοÏμενο"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/es/Wizard.js b/includes/js/dojox/widget/nls/es/Wizard.js new file mode 100644 index 0000000..aab5661 --- /dev/null +++ b/includes/js/dojox/widget/nls/es/Wizard.js @@ -0,0 +1 @@ +({"next":"Siguiente","done":"Terminado","previous":"Anterior"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/fi/Wizard.js b/includes/js/dojox/widget/nls/fi/Wizard.js new file mode 100644 index 0000000..ea6a9db --- /dev/null +++ b/includes/js/dojox/widget/nls/fi/Wizard.js @@ -0,0 +1 @@ +({"next":"Seuraava","done":"Valmis","previous":"Edellinen"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/fr/Wizard.js b/includes/js/dojox/widget/nls/fr/Wizard.js new file mode 100644 index 0000000..779919e --- /dev/null +++ b/includes/js/dojox/widget/nls/fr/Wizard.js @@ -0,0 +1 @@ +({"next":"Suivant","done":"Terminé","previous":"Précédent"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/he/Wizard.js b/includes/js/dojox/widget/nls/he/Wizard.js new file mode 100644 index 0000000..e5ee2ee --- /dev/null +++ b/includes/js/dojox/widget/nls/he/Wizard.js @@ -0,0 +1 @@ +({"next":"הב×","done":"סיו×","previous":"הקוד×"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/hu/Wizard.js b/includes/js/dojox/widget/nls/hu/Wizard.js new file mode 100644 index 0000000..6ad86c7 --- /dev/null +++ b/includes/js/dojox/widget/nls/hu/Wizard.js @@ -0,0 +1 @@ +({"next":"KövetkezÅ‘","done":"Kész","previous":"ElÅ‘zÅ‘"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/it/Wizard.js b/includes/js/dojox/widget/nls/it/Wizard.js new file mode 100644 index 0000000..78ea64b --- /dev/null +++ b/includes/js/dojox/widget/nls/it/Wizard.js @@ -0,0 +1 @@ +({"next":"Successivo","done":"Eseguito","previous":"Precedente"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/ja/Wizard.js b/includes/js/dojox/widget/nls/ja/Wizard.js new file mode 100644 index 0000000..6394cb3 --- /dev/null +++ b/includes/js/dojox/widget/nls/ja/Wizard.js @@ -0,0 +1 @@ +({"next":"次ã¸","done":"完了","previous":"å‰ã¸"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/ko/Wizard.js b/includes/js/dojox/widget/nls/ko/Wizard.js new file mode 100644 index 0000000..dec3546 --- /dev/null +++ b/includes/js/dojox/widget/nls/ko/Wizard.js @@ -0,0 +1 @@ +({"next":"다ìŒ","done":"완료","previous":"ì´ì „"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/nb/Wizard.js b/includes/js/dojox/widget/nls/nb/Wizard.js new file mode 100644 index 0000000..0cbe813 --- /dev/null +++ b/includes/js/dojox/widget/nls/nb/Wizard.js @@ -0,0 +1 @@ +({"next":"Neste","done":"Ferdig","previous":"Forrige"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/nl/Wizard.js b/includes/js/dojox/widget/nls/nl/Wizard.js new file mode 100644 index 0000000..d5e680f --- /dev/null +++ b/includes/js/dojox/widget/nls/nl/Wizard.js @@ -0,0 +1 @@ +({"next":"Volgende","done":"Klaar","previous":"Vorige"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/pl/Wizard.js b/includes/js/dojox/widget/nls/pl/Wizard.js new file mode 100644 index 0000000..c7dc6a1 --- /dev/null +++ b/includes/js/dojox/widget/nls/pl/Wizard.js @@ -0,0 +1 @@ +({"next":"Dalej","done":"Gotowe","previous":"Wstecz"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/pt-pt/Wizard.js b/includes/js/dojox/widget/nls/pt-pt/Wizard.js new file mode 100644 index 0000000..2b6bb1e --- /dev/null +++ b/includes/js/dojox/widget/nls/pt-pt/Wizard.js @@ -0,0 +1 @@ +({"next":"Seguinte","done":"Concluído","previous":"Anterior"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/pt/Wizard.js b/includes/js/dojox/widget/nls/pt/Wizard.js new file mode 100644 index 0000000..1840985 --- /dev/null +++ b/includes/js/dojox/widget/nls/pt/Wizard.js @@ -0,0 +1 @@ +({"next":"Avançar","done":"Concluído","previous":"Voltar"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/ru/Wizard.js b/includes/js/dojox/widget/nls/ru/Wizard.js new file mode 100644 index 0000000..bbc1b51 --- /dev/null +++ b/includes/js/dojox/widget/nls/ru/Wizard.js @@ -0,0 +1 @@ +({"next":"Далее","done":"Готово","previous":"Ðазад"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/sv/Wizard.js b/includes/js/dojox/widget/nls/sv/Wizard.js new file mode 100644 index 0000000..ae75b03 --- /dev/null +++ b/includes/js/dojox/widget/nls/sv/Wizard.js @@ -0,0 +1 @@ +({"next":"Nästa","done":"Stäng","previous":"FöregÃ¥ende"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/tr/Wizard.js b/includes/js/dojox/widget/nls/tr/Wizard.js new file mode 100644 index 0000000..752b8ac --- /dev/null +++ b/includes/js/dojox/widget/nls/tr/Wizard.js @@ -0,0 +1 @@ +({"next":"Ä°leri","done":"Bitti","previous":"Geri"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/zh-tw/Wizard.js b/includes/js/dojox/widget/nls/zh-tw/Wizard.js new file mode 100644 index 0000000..fe45203 --- /dev/null +++ b/includes/js/dojox/widget/nls/zh-tw/Wizard.js @@ -0,0 +1 @@ +({"next":"下一步","done":"完æˆ","previous":"上一步"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/nls/zh/Wizard.js b/includes/js/dojox/widget/nls/zh/Wizard.js new file mode 100644 index 0000000..fe45203 --- /dev/null +++ b/includes/js/dojox/widget/nls/zh/Wizard.js @@ -0,0 +1 @@ +({"next":"下一步","done":"完æˆ","previous":"上一步"}) \ No newline at end of file diff --git a/includes/js/dojox/widget/tests/_tags.json b/includes/js/dojox/widget/tests/_tags.json new file mode 100644 index 0000000..421031a --- /dev/null +++ b/includes/js/dojox/widget/tests/_tags.json @@ -0,0 +1,100 @@ +{identifier:"tag", +items: [ + {tag: "accounting"}, + {tag: "attorney"}, + {tag: "atv"}, + {tag: "backcountry"}, + {tag: "bakery"}, + {tag: "bandb"}, + {tag: "bank"}, + {tag: "bar"}, + {tag: "bicycle"}, + {tag: "cabin"}, + {tag: "cabinoutside"}, + {tag: "camp"}, + {tag: "campoutside"}, + {tag: "catering"}, + {tag: "chamber"}, + {tag: "church"}, + {tag: "city"}, + {tag: "classes"}, + {tag: "coffeehouse"}, + {tag: "condo"}, + {tag: "condooutside"}, + {tag: "conference"}, + {tag: "county"}, + {tag: "crosscountryski"}, + {tag: "dentist"}, + {tag: "dining"}, + {tag: "fishing"}, + {tag: "gallery"}, + {tag: "general"}, + {tag: "golf"}, + {tag: "graphicart"}, + {tag: "grocery"}, + {tag: "guideservice"}, + {tag: "hair"}, + {tag: "health"}, + {tag: "home"}, + {tag: "homeoutside"}, + {tag: "horse"}, + {tag: "hotel"}, + {tag: "hoteloutside"}, + {tag: "hotsprings"}, + {tag: "hotspringspool"}, + {tag: "hunting"}, + {tag: "iceclimbing"}, + {tag: "iceskating"}, + {tag: "inspection"}, + {tag: "insurance"}, + {tag: "internet"}, + {tag: "jeeping"}, + {tag: "jewelry"}, + {tag: "live"}, + {tag: "liveentertainment"}, + {tag: "lodging"}, + {tag: "manicure"}, + {tag: "manufacturing"}, + {tag: "maps"}, + {tag: "massage"}, + {tag: "menu:aboutouray"}, + {tag: "menu:recreation"}, + {tag: "minetour"}, + {tag: "mining"}, + {tag: "mountaineering"}, + {tag: "museum"}, + {tag: "nonprofit"}, + {tag: "offroad"}, + {tag: "online"}, + {tag: "ouraymuseum"}, + {tag: "park"}, + {tag: "performingarts"}, + {tag: "pet"}, + {tag: "pharmacy"}, + {tag: "photographer"}, + {tag: "photography"}, + {tag: "printing"}, + {tag: "publishing"}, + {tag: "rafting"}, + {tag: "railroad"}, + {tag: "realestate"}, + {tag: "recreation"}, + {tag: "rentals"}, + {tag: "retail"}, + {tag: "rockclimbing"}, + {tag: "rv"}, + {tag: "rvoutside"}, + {tag: "school"}, + {tag: "shop"}, + {tag: "skirentals"}, + {tag: "snowmobiling"}, + {tag: "spa"}, + {tag: "summer"}, + {tag: "tours"}, + {tag: "trails"}, + {tag: "utility"}, + {tag: "waterfall"}, + {tag: "wedding"}, + {tag: "weddingplanner"}, + {tag: "winter"} +]} diff --git a/includes/js/dojox/widget/tests/demo_FisheyeList-orig.html b/includes/js/dojox/widget/tests/demo_FisheyeList-orig.html new file mode 100644 index 0000000..a36d32c --- /dev/null +++ b/includes/js/dojox/widget/tests/demo_FisheyeList-orig.html @@ -0,0 +1,111 @@ + + + + FisheyeList Widget Demonstration + + + + + +
                            +
                            +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            +
                            + +
                            +

                            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.

                            + +

                            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.

                            + +

                            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.

                            + +

                            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.

                            + +

                            Sed aliquam, quam consectetuer condimentum bibendum, neque libero commodo metus, non consectetuer magna risus vitae eros. Pellentesque mollis augue id libero. Morbi nonummy hendrerit dui. Morbi nisi felis, fringilla ac, euismod vitae, dictum mollis, pede. Integer suscipit, est sed posuere ullamcorper, ipsum lectus interdum nunc, quis blandit erat eros hendrerit pede. Vestibulum varius, elit id mattis mattis, nulla est feugiat ante, eget vestibulum augue eros ut odio. Maecenas euismod purus quis felis. Ut hendrerit tincidunt est. Fusce euismod, nunc eu tempus tempor, purus ligula volutpat tellus, nec lacinia sapien enim id risus. Aliquam orci turpis, condimentum sed, sollicitudin vel, placerat in, purus. Proin tortor nisl, blandit quis, imperdiet quis, scelerisque at, nisl. Maecenas suscipit fringilla erat. Curabitur consequat, dui blandit suscipit dictum, felis lectus imperdiet tellus, sit amet ornare risus mauris non ipsum. Fusce a purus. Vestibulum sodales. Sed porta ultrices nibh. Vestibulum metus.

                            + + +
                            + + + + + diff --git a/includes/js/dojox/widget/tests/demo_FisheyeList.html b/includes/js/dojox/widget/tests/demo_FisheyeList.html new file mode 100644 index 0000000..703fc55 --- /dev/null +++ b/includes/js/dojox/widget/tests/demo_FisheyeList.html @@ -0,0 +1,117 @@ + + + + FisheyeList Widget Demonstration + + + + + +
                            +
                            + + + + + + + + + + + +
                            + +
                            +

                            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.

                            + +

                            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.

                            + +

                            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.

                            + +

                            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.

                            + +

                            Sed aliquam, quam consectetuer condimentum bibendum, neque libero commodo metus, non consectetuer magna risus vitae eros. Pellentesque mollis augue id libero. Morbi nonummy hendrerit dui. Morbi nisi felis, fringilla ac, euismod vitae, dictum mollis, pede. Integer suscipit, est sed posuere ullamcorper, ipsum lectus interdum nunc, quis blandit erat eros hendrerit pede. Vestibulum varius, elit id mattis mattis, nulla est feugiat ante, eget vestibulum augue eros ut odio. Maecenas euismod purus quis felis. Ut hendrerit tincidunt est. Fusce euismod, nunc eu tempus tempor, purus ligula volutpat tellus, nec lacinia sapien enim id risus. Aliquam orci turpis, condimentum sed, sollicitudin vel, placerat in, purus. Proin tortor nisl, blandit quis, imperdiet quis, scelerisque at, nisl. Maecenas suscipit fringilla erat. Curabitur consequat, dui blandit suscipit dictum, felis lectus imperdiet tellus, sit amet ornare risus mauris non ipsum. Fusce a purus. Vestibulum sodales. Sed porta ultrices nibh. Vestibulum metus.

                            + + +
                            + + + + + diff --git a/includes/js/dojox/widget/tests/demo_FisheyeLite.html b/includes/js/dojox/widget/tests/demo_FisheyeLite.html new file mode 100644 index 0000000..e937698 --- /dev/null +++ b/includes/js/dojox/widget/tests/demo_FisheyeLite.html @@ -0,0 +1,175 @@ + + + + A responsive Fisheye-like FisheyeLite widget | The Dojo Toolkit + + + + + + + + +
                            +
                            +

                            The Dojo Toolkit:

                            +
                            + +
                            +
                            +
                            + Dojo Pane +
                            +
                            +
                            +
                            + Dijit Pane +
                            +
                            +
                            +
                            + DojoX Pane +
                            +
                            +
                            +
                            + + + \ No newline at end of file diff --git a/includes/js/dojox/widget/tests/images/fisheye_1.png b/includes/js/dojox/widget/tests/images/fisheye_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7499dccdc9659859569158b44c371c268c25a851 GIT binary patch literal 3799 zcmV;|4k+=7P)Qm@&#_6-j})GE%o*FvmFk{d|8$kSuB=$_}gXJUc#MY z0o2O&?TW|aN5kQ8XCM$bNB~>ClZN$0OtU}Imy6K0#q>8Sf&Ap6bNp&yAH1CcDNz}VTn`(0@fUX?i(8$JLvcO zy_0}5Wx!Yp=$cYMG&VL~0w6Yn4R_%8a;Z3F9Kh@WFxv+P26`A6@kv-y^nh5DU?4Wk zv)k?W0f;Z-cZXCO5&$hEb#RTUK#TLHvIE*mN} zi6hSJ8Xg|r1|8-=;ayr@+?aI=SRu3XT3cFLR+W{N9RwK5*xyT4Wb|RN)9LJRxm>=H zk&*u@ZoZ;(Sv(lzp5`J>?8N?3X$A`1*xwOfHX^>9Vr+>k*pi$sK$LX^v0^1Mr`_1E z%2WTTkR$*77POOTH~0Tzr%#`b(N0@in+=X@Jhf{$7K?4@?d?5; z{TK&~vW_VjAQ?fsva+(gy1IHBsC{o9I(rtn2f7!=ek-4MH$Wr6Rzo|WO-9d$*s>E$ z`QG^Wcu>KXoC3ZjA7G%SXoi2?Z?K-Aj_hS1yjlp?18|lzaN3PzesEz&gTdhKfk5C4 z>qjhCP%H+)uu?jUcyY);g*^&=6#5K+=%0?50APqIYoPZ-T{)hnI}{4t47PNtxG-T* zEJnbXGiT0qHk<7Q>^J7nfdB*I7XadHF$8M>(}2yL44B#+PT@n%a+}xdJ&OHkE}&Qp zfN>+hcpm!|IW+wH(8mEppcu0#07GDGf^N;>Mx_A00uEUy17es9sPkdcp8`JXhH5_SdmrucLv~s0{$( znNqAf01U+!s;lfeKITVES%H}HKRuwxIv7IPR3pH6K_?i0ga%@i zWn~o%6kFP!*?^HnT~$p@%@1_e8I;DZf+l9lkO}n#`X%a{4p0_0G&DTS+?|!F@`^dVboYwI7e{gmK!pGHI16)^j$!DcP=+t8XU zhOK_I-xs{NX2WXd|0yokh; z8&JdDrO3K6m?CG39rY0SzK3+AwyO&S#9HXI1EG-BqA4*7>hDxlRW+!j!WJbU86&vJ zp&t_LaJuM=76^!4QsG|}(qc)<2Fw;(QVl>JP^7^VwpU|_+}PMS5A?cIuss{5vd#bq z%bk|C%KB^z1?0 z5${h?r$l1cpmhGZ#bZUr60*sIBBe=1Ma6oKAt{z*xGW@AZo$|=&oQ2!!hUHzN2hDg zL+2l3z!aNM`_2lmqyquIQR%WK7~*s~X`IF>aKVSC_~FuP8bGXr4i>A=Vzzly;83T_ z<+_cJBQo! zOcqNX&`Od}X3+T75uPFNR`M4`XjrIMb!Gq<60?=2dx!0B;$sLsnx$7R+XN9eML$cl z+*V6ShVqtW)baRPM_r7y^VuhS(39=FM3&ZHE|s!vsTU zoL=Ch`%Sy%ESk1M9JxNVsjI7VW5=Uadw_b!OuOdnwvGwZB#l(H%ZMM>2%PhXX;#DX zFU_*u>AZ^4-H!;I>}}JYhUKI{9GOo6UF4xpr)f{aqG>~rV=e(AQh&T}+S9OT+K}oI zSs{)6L#hQ1^qclHEawCm;!1zXUrQ3EJq?S9 z4O5l6=2y~C*o>I=G+Z2t*l?C?nyR>j010Xx)YjHkX`0HI2-+}2fW!rXGsXDLuO)Fh zXh`6|I@6wpMRSgoWHLD_Nrc1UKZ|5qpxzSGwz}Qb5|Jzw@#Akqjuaq%zn@ZHk;k-aO%v-D zO`E}8^_@F+j_SeGSXPp`trrDOzM4%KX^I#-$X1#YD#YV)nrSaF;j&00k;rob*P!n? ztT9b3ENdizFVLd&cv)f-W~Lbu_xXIsK%MslF0z@;-f7C@>>wL$7I0Um0)fB@2FQmD zk0h(Q7uyPr*^YKl5LYDL%q z2@eksKhFV@-~ovv()(yVCV>+*m>HL5W~G_@AecWJ3{wb_O{ z!5o&qkR4=`Z32fzM@B|=OPSM>XEKCzaB#32EO}Pog!DewBPIkF$Rm=#yKZ2|OK?{o z@bN>HA%qyJ#wR4Pmmk{MB*UhhXUCnA*bq|!p6KU{9Wjn2iS(Ng8K9tY?*vOk=cnC? zhFoQW(RPJ&e)elgfE@>ihKAl%f{`9NQ8FaO5(Idft3%`k2)k%QX1I_IMCOS(hp_Nt z6?SAWgl9?Wp9nYu$dN^-KKeB7kbM_1JE-qM>up6MksYB>$gcuMGR+W4Esl`(_V)e~ zmE^w#+ttn{9=q7U*d-V@=$ZM^{{H@b%)U`Im&MO%%THuxV`DImnwpx+D=RB$X$sNT zNogYGdoL0&p2X%J!NW%pH*Q5{)y0Z$(g@QSA48NbE6tP?dhmB$;c)mHI@);;8oJ{m z0Aq&^FlYery8z=9V+PNTjJ2wi@0+T*uBg}R{XH^+U+HM?CNy~W33_jV{ z*VhhEXz{Z!r@~W>s|NUJG#Uiu*5CrCb@YK6{wg}sJOjX>KD?|Gj2^iB4FDs=0EkS+ zj%@>B0r>;{fca!r<3&ftX+5ej(fDYgL|5I2?Y|>-GMQ zt1%*qT0<8Yxd5UDij~X0Qoz7{U5dE!L$GD>OdL8%BofCEE4C=crXt+7V9R$;28xw; zVYKylJa^db_WPvV*C;PG8I43DPxSZq?^TRTsj)&g7*Y;7wlv95i}Lp*ilY;;SnL4e zOC{LyQ3E%?w37n;IOzBL?;RQ%dQ-qfC2|2n%7cL{+z^b?h1vPQPw6pgmi1Pv_4AUx zRhOp~2n6jzxUqI4rS0U5&IjzM3M&%a%_$WU5Vc_zc@ki3lpkMg z0SjIS8+tectAP<$Q6(di`M#s20szAY{%ip8nqn82Qv-n7kUrC_&u!3Fn!PifC1U?d zg~3mzgDQPh494$)b|YPVXKZY&8#>4Z-h={(_#^=E0Xy$Nq~-qt3;>>0kT>Q>8lwOJ N002ovPDHLkV1k4c_yzy~ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/fisheye_2.png b/includes/js/dojox/widget/tests/images/fisheye_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2db041b71e88d53a75300aae097a6d82ed562c00 GIT binary patch literal 4479 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� z?hNSocUj`&O!bqjAS1c zxNOv+2Mwe^w#?&T2+GLnzkpCsh8#L4E`-RI>{jMUfqBsQT*0>~KxA~SHffMrM7W}v#}CDE2#Vi-Aw zLMIgb^Qjdlvx$_*%wTLu7mz?8(4kCDPJSeDvPCR=%7HWiG3>*MiHT#1*Xtd?zR~2j za)|PkSpvi;GPgXlHt)M~BZEFVI@(WO)-=?X%zUer*+4^L)HfNa&JFvHvTBnVQGtB$ zc>$89V%T@EA0MhfLO!4Gk20PXL~qIGpz|z!Z^HY`&`X8=c%SjlqC*Ceh%AA_#3Igr~@C?RW@#0RtpJ>FzIVWuh}!T$dKBM_bA5*K-dXYaJ5 zx>_&cMOpQEH1*LV66)%t$K&~!1351t?A!_fzmd4sEEzG(Ko~S6Vl-A|<)rIXOk&6# z-j$fxKO!MvCe$#AeH};a>~le<`)+if541WqFS0-BSuOM66w8WCnK0ltwGmWY=ycqlUieFXy^t=$O*2M zsQO)^gi!T*y{8Kc3t#1nb;T-lL0YWkb_=DWOlKH_I(0p6R82OcCZ5rInw$CGw3rwI zp>tU|k?u(e7$hBU07jQ+KU4{cBo5$Gky}wwaVem@&*Uc2-EBoiAezX=lAk9_55`gp z6Pc~X=0%A^Lx8ay5^_|Kj!0?^#?I&b3rh+mYJ@G>CE1SWd6MBo)m5rtbXW}IVsZDp;T{-I{!d2 zzXvgyNO=@?<5n2+4$;kJ=QERrv=X9~5*12rO-;?R+}zw3Otkg?sm3oHK>R^}fB#z= z>4=#omgyLHI(VwDukS5*2ER7Z-UoTY`fP=<-3$!a;@yDp4p&WT)y@BIm}*>&;N5O_ zacyla*^?_ww4Ge%RiE?aDvtH^^sEGwQNd>TSd>)birzVNq$DskH8lqPw+0tDW#S&F z;qTx^>azd_-NTzEVRXX9T?ZKB9DqNTbVQR7t%09mPhjLPfsucenVW!3AB|GNkH)YHOg5IDjEy`l$mC`7D7JW@8ehJh5y8-4C<)*C@}lGV1sHpX=@I-K80q(vu3)FcJZxg`()Fuy8FbEUbjY zJmhpbS4J7Cv4v0s0)bb&UhlIL6BFvor74}kLcIul+H9w?1fi&7VphIcwIeru_W;uR(II0h}+QR$B~!<}ZH) z2!|jA??DE=W!p0L_8>d>P`JIjBvPy_28c ziTz779ezwTs`RNCI=>V3G~Csr@Q_ZUdIiH9(trrY03aG{%R#8+e*z2upbg2$ilCPK P00000NkvXXu0mjfa$^8f literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/fisheye_4.png b/includes/js/dojox/widget/tests/images/fisheye_4.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7455089e3dfe36d0b971806b7823e56c3795fa GIT binary patch literal 4389 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/icon_email.png b/includes/js/dojox/widget/tests/images/icon_email.png new file mode 100644 index 0000000000000000000000000000000000000000..899dfa55cfc4a85642b22802b873a9e159512d7d GIT binary patch literal 17133 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 Gg#QPZ%coWV literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/icon_update.png b/includes/js/dojox/widget/tests/images/icon_update.png new file mode 100644 index 0000000000000000000000000000000000000000..b741cd05a4b729f6d3f1bef396002887d1058d91 GIT binary patch literal 21984 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/icon_users.png b/includes/js/dojox/widget/tests/images/icon_users.png new file mode 100644 index 0000000000000000000000000000000000000000..569e712329e912477bfce7ed40782213e56135be GIT binary patch literal 24802 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

                            4b}Y6$Z29W}Bvy^MJFe92Rj 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 literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/rating_empty.png b/includes/js/dojox/widget/tests/images/rating_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..3515d1a33c07cb13369ade694d6039c17eeb0c65 GIT binary patch literal 2031 zcmVPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$8IAwC2;Q#;!Nl8RO zR7gvmS6ytARTySv-~?0WI+!6Ic z7Gp3Wy0zVZyS3d2ZtYlq)^7b<|JHS%&r`k+hXJzCwsuamn#^qBelofdY#9-*YIy5w7nVfVa=jQIL5t9x_l6{8m?yIy>D3ulT zp)XdURIAk$Ik6qkXeeq?lZmqjFV8`EFNF8OXunRU+m8^+fkSwIL#&-4Kgau;O>&>!{V_Kc=0&VF-UvlVl?fc0I;e8O^OD$?r_yfFrgc*JY;ZrcG zg2PvxotV7C&Dq>(6$#o zSe>)vAeTm?t%C3=YEX-s6uy9$pV9d@W~+u_yI!yFg0sHA|5ney;NY#{;o*NqM@MIz zPUm7E5X{Eoi9#x!7KnHvQ3wQsS&q?$wuA7&4|DDXm7xp!-%f67P>Y%rzKE9_jg5^a zL_5>n-4iyMOfiea5+Ac#6B82?$tkBZg{ZQAzaNpt3h7Kn$mLdw$e@kL3mo&n1`|k4 zOiU)N@U>WO$4w@4466_(H#Mk5O$syo%jneLLU7`EERBtgut{;kdX{X#Gl62g&) z5R1o)QRY@wgnT|<#0uK!bVi6{ED~81unmIW9}v7=-MP*8fsCK zH_R(I0w-_=uV7FOBO4-Jn0C7}h@!B#v?L@F31K;vDn^&f|& z{yI6yO$};Mlft~zOVP0dvnhwcJGl72>C)?~aTlA$$HzlHpD(`@jTWP3WQ=-cMcQLT zi+4sFjl~4t++3bM1Mo#kSCfmJ{ABUiO-(t|^r0^~$OYbQ7kIh1j}&GZ+zI11 z;dH*QufHDW(1Y`so1gcu@oX}A+-`RY%O54!oPJOP zVOFc7I0BbYar7wm^V6ui9?wjk%ZQt35oK@&ckvj(HZGh+T&ro?;Nr>I?BnzFB?r04 z`9NW*@FNMB*)PEO;}(_b8g6+DmMv@_A5UTeVPv@LrqO7|E!5nm(Of6kMpZH+lU=kK zAD>9#;~;(Ak{P)!+)eIZ=*K2)k9B#Z*} z^(U0iZ*fdc5^S@NW3<7=<1_a4g;0^E$U!cMA0YR`giC7W@-he?g7umDhK6QDZ9{Rl zws&-NYP8yFEZw>0=H~Yy$ghlYf^GJ33|}tQSb9Tv=ClgtG^D%WWmtW*@#XkI;s;^nqv_L~F>4 z3GkoBE>YvZVm$`jSKBA}6_v z3HJY`mZGM?^T12Mi@>wMlcLl8dn7W56Of{(Eq&-q4swxmi!^Dv{R<-k1M%`Ul0X0e N002ovPDHLkV1mN}%7g#_ literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/images/rating_full.gif b/includes/js/dojox/widget/tests/images/rating_full.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e816a874fa666b5d37b30200e9369fa5d868a7b GIT binary patch literal 1314 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 P00000NkvXXu0mjf3}Zu} literal 0 HcmV?d00001 diff --git a/includes/js/dojox/widget/tests/test_ColorPicker.html b/includes/js/dojox/widget/tests/test_ColorPicker.html new file mode 100644 index 0000000..87d173e --- /dev/null +++ b/includes/js/dojox/widget/tests/test_ColorPicker.html @@ -0,0 +1,41 @@ + + + + Dojox ColorPicker Test + + + + + + + + +

                            Dojox ColorPicker test

                            + +

                            defaults:

                            +
                            + +

                            no animation, no hsv, no rgb, no webSafe info:

                            +
                            + + + diff --git a/includes/js/dojox/widget/tests/test_FileInput.html b/includes/js/dojox/widget/tests/test_FileInput.html new file mode 100644 index 0000000..caccd0f --- /dev/null +++ b/includes/js/dojox/widget/tests/test_FileInput.html @@ -0,0 +1,115 @@ + + + + dojox.widget.FileInput | The Dojo Toolkit + + + + + + + + + +

                            dojox FileInput widget:

                            +

                            This is a prototype of a dojo input type="file" with a FormWidget mixin, to be styled to match tundra and soria themes

                            +

                            The API is up for discussion, nor is it known to drop into forms and "just work" yet

                            +

                            FileInputAuto API is up for discussion, as well, though by use of the url="" attrib, you can basically + do all your file-processing server side, and just use the filename sent that remains in the form input

                            +

                            There are two parts. dojo.require("dojox.widget.FileInput") for just the base class, or dojo.require("dojox.widget.FileInputAuto"); + to provide the Auto Uploading widget (on blur), and the Blind Auto Upload widget.

                            +

                            Both themes are defined in the FileInput.css file, as well as basic styling needed to run

                            + +

                            A standard file input:

                            + + +

                            The default dojox.widget.FileInput:

                            +

                            + +

                            + +

                            default dojox.widget.FileInput, tundra:

                            +

                            + +

                            + +

                            dojox.widget.FileInputAuto, soria theme:

                            +

                            + +

                            + +

                            another one, tundra theme (with callback)

                            +

                            + +

                            + +

                            a blind auto upload widget, tundra:

                            +

                            + +

                            + +

                            dojox.widget.FileInputBlind - soria

                            +

                            + +

                            + +

                            dynamic, tundra, dojox.widget.FileInputAuto:

                            + +

                            +
                            + + + diff --git a/includes/js/dojox/widget/tests/test_FisheyeList.html b/includes/js/dojox/widget/tests/test_FisheyeList.html new file mode 100644 index 0000000..348ea13 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_FisheyeList.html @@ -0,0 +1,144 @@ + + + + FisheyeList Widget Dojo Tests + + + + + + + +

                            dojox.widget.FisheyeList test

                            +

                            HTML before

                            + +

                            HTML before

                            +

                            HTML before

                            +

                            Liberal trigger: move the mouse anywhere near the menu and it will start to expand:

                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            +
                            + +

                            HTML after

                            +

                            HTML after

                            +

                            HTML after

                            +

                            This one has strict triggering, so you actually have to mouse over the menu to make it start moving:

                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            + +
                            +
                            +
                            + + + + diff --git a/includes/js/dojox/widget/tests/test_FisheyeLite.html b/includes/js/dojox/widget/tests/test_FisheyeLite.html new file mode 100644 index 0000000..0935d10 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_FisheyeLite.html @@ -0,0 +1,257 @@ + + + + A responsive Fisheye-like FisheyeLite widget | The Dojo Toolkit + + + + + + + +
                            + +
                            +
                              +
                            • Dojo
                              the javascript toolkit
                            • +
                            • Dijit
                              UI y mas - themeable, plugable.
                            • +
                            • DojoX
                              extensions, experimentals, extras. innovation.
                            • +
                            • Dojo
                              the javascript toolkit
                            • +
                            • Dijit
                              UI y mas - themeable, plugable.
                            • +
                            • DojoX
                              extensions, experimentals, extras. innovation.
                            • +
                            • Dojo
                              the javascript toolkit
                            • +
                            • Dijit
                              UI y mas - themeable, plugable.
                            • +
                            +
                            + +

                            A paragraph: (with links)

                            + +

                            + 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. +

                            + +

                            read the fine print:

                            + +

                            + + + + +

                            + +
                            + 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. +
                            + +

                            + 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. +

                            +

                            + 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. +

                            +

                            + 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. +

                            +

                            + 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. +

                            +

                            another list: (no target, or ilk)

                            +
                            +
                            +
                              +
                            • Foo
                            • +
                            • Bar
                            • +
                            • Baz
                            • +
                            • Bam
                            • +
                            +
                            +
                            + +

                            oh right, Images:

                            + +
                            + + + + + + + +
                            + +
                            +
                            +
                            +
                            +
                            +
                            +
                            + +
                            + +

                            + + 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. +

                            + +

                            the end

                            + +
                            + + diff --git a/includes/js/dojox/widget/tests/test_Iterator.html b/includes/js/dojox/widget/tests/test_Iterator.html new file mode 100644 index 0000000..7cf82ff --- /dev/null +++ b/includes/js/dojox/widget/tests/test_Iterator.html @@ -0,0 +1,73 @@ + + + + Dojox Iterator Test + + + + + + + + +

                            Dojox Iterator test

                            + +
                            + +

                            Data store backed Iterator

                            +
                              +
                            • before
                            • +
                            • + ${name} +
                            • +
                            • after
                            • +
                            + +

                            Array backed Iterator

                            +
                              +
                            • before
                            • + +
                            • + ${name} ${thinger} +
                            • +
                            • after
                            • +
                            + +

                            Array-property Iterator

                            +
                              +
                            • before
                            • +
                            • blah
                            • +
                            • + ${value} +
                            • +
                            • after
                            • +
                            + + + diff --git a/includes/js/dojox/widget/tests/test_Loader.html b/includes/js/dojox/widget/tests/test_Loader.html new file mode 100644 index 0000000..3c014a2 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_Loader.html @@ -0,0 +1,81 @@ + + + + Dojo Visual Loader Test + + + + + + + +
                            + + + +

                            Dojox xhrListener test

                            + + start xhrGet demo + start xhrPost demo + +

                            No additional code is required except for the existance of a + dojoType="dojox.widget.Loader" node. It will listen for the start + and end of xhr* requests (via _ioSetArgs [ugh] and Deferred.prototype._fire .. +

                            + +
                            +
                            + +
                            spacer
                            + + + diff --git a/includes/js/dojox/widget/tests/test_MultiComboBox.html b/includes/js/dojox/widget/tests/test_MultiComboBox.html new file mode 100644 index 0000000..86f6c54 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_MultiComboBox.html @@ -0,0 +1,70 @@ + + + + Multi-input ComboBox widget + + + + + + +

                            dojox.widget.MultiComboBox

                            +

                            + This widget is an extension to ComboBox to allow "tag" style input using a datastore. Start typing + into the box, and your options will be presented. The default delimiter is a comma, which can be over-ridden + by the delimiter="" attrbute. +

                            + +
                            + +

                            Default:

                            + + +

                            Alternate delimiter (:)

                            + + +

                            From code:

                            +
                            + + + + + + diff --git a/includes/js/dojox/widget/tests/test_Rating.html b/includes/js/dojox/widget/tests/test_Rating.html new file mode 100644 index 0000000..e87168f --- /dev/null +++ b/includes/js/dojox/widget/tests/test_Rating.html @@ -0,0 +1,91 @@ + + + + Dojox Rating Test + + + + + + + + + + + + +

                            Dojox Rating test

                            + +

                            default usage:

                            + The attribute "numStars" is not given, so the default 3 stars are shown.
                            + + The value is: 0 +

                            + +

                            5 stars:

                            + The attribute "numStars" is given and set to 5, the initial value is 3.
                            + +

                            + +

                            Customized, "my big stars":

                            + The stars are bigger, and styled this way that there is space around each. + When hovering the background color is changed too. All this is achieved via CSS, see top of this file. +
                            + The attribute "numStars" is set to 10, so we see ten stars. +
                            + + + + +

                            + The value is: 0 +
                            + The mouse is over: 0 +
                            + +

                            Spacing

                            + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space
                            + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space + Surrounded by text to see that it really takes all it's space +

                            + + diff --git a/includes/js/dojox/widget/tests/test_SortList.html b/includes/js/dojox/widget/tests/test_SortList.html new file mode 100644 index 0000000..55cb7a1 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_SortList.html @@ -0,0 +1,74 @@ + + + + Dojox SortList Test + + + + + + + + + +

                            Dojox SortList test

                            + +
                            + +

                            Simple sortable example

                            +
                              + +

                              Children of a TabContainer

                              +
                              +
                              +
                              +
                              +
                              + +

                              Child of a SplitContainer

                              +
                              +
                              +
                              +
                              +
                              + +
                              +

                              Raw, degradable UL list:

                              +
                                +
                              • one
                              • +
                              • two
                              • +
                              • three
                              • +
                              • four
                              • +
                              • five
                              • +
                              • six
                              • +
                              • four
                              • +
                              • five
                              • +
                              • six
                              • +
                              • four
                              • +
                              • five
                              • +
                              • six
                              • +
                              • four
                              • +
                              • five
                              • +
                              • six
                              • +
                              + +

                              normal ul:

                              +
                                +
                              • one
                              • one
                              • one
                              • one
                              • one
                              • one
                              • one
                              • one
                              • +
                              + + + diff --git a/includes/js/dojox/widget/tests/test_TimeSpinner.html b/includes/js/dojox/widget/tests/test_TimeSpinner.html new file mode 100644 index 0000000..6009f6d --- /dev/null +++ b/includes/js/dojox/widget/tests/test_TimeSpinner.html @@ -0,0 +1,87 @@ + + + + Dojo Spinner Widget Test + + + + + + + + + + +

                              Dojox TimeSpinner Test

                              + Try typing values, and use the up/down arrow keys and/or the arrow push + buttons to spin +
                              + +

                              time spinner

                              +
                              + + + +
                              + +
                              + + + diff --git a/includes/js/dojox/widget/tests/test_Toaster.html b/includes/js/dojox/widget/tests/test_Toaster.html new file mode 100644 index 0000000..015ebbe --- /dev/null +++ b/includes/js/dojox/widget/tests/test_Toaster.html @@ -0,0 +1,147 @@ + + + + Toaster Widget Dojo Tests + + + + + + +
                              + +
                              + + + + + +

                              dojox.widget.Toaster test

                              + +
                              + When you click any of the buttons above, the bottom right hand message will + stay on the screen until you acknowledge it by clicking inside the message + box. If you click one of the message buttons while a message is still + displayed in the bottom right corner it should append the new message below + the old one with a separator between them. +
                              +

                              + 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. +

                              +

                              + 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. +

                              +

                              + 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. +

                              +

                              + 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. +

                              +

                              + 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. +

                              +

                              + 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. +

                              +

                              + 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. +

                              + + diff --git a/includes/js/dojox/widget/tests/test_Wizard.html b/includes/js/dojox/widget/tests/test_Wizard.html new file mode 100644 index 0000000..5de9f02 --- /dev/null +++ b/includes/js/dojox/widget/tests/test_Wizard.html @@ -0,0 +1,118 @@ + + +Wizard Demo + + + + + + + + + + + + +
                              + +

                              dojox.widget.Wizard tests

                              + +

                              This example shows a wizard with customized button labels.

                              + +
                              +
                              +

                              Tab 1

                              +

                              Sized content, box one

                              +
                              +
                              +

                              Tab 2

                              +
                              +
                              +

                              Tab 3

                              + + You won't be able to come back, but you can finish now... +
                              +
                              +

                              Tab 4

                              + + ... and now you can't go back. +
                              +
                              +

                              Tab 5

                              + ... and now you can finish up. +
                              +
                              + +

                              The next shows the option to hide the inactive buttons, with a smaller width...

                              + +
                              +
                              +

                              Step 1 of 3

                              +

                              Lorem ipsum dolor sit amet

                              +
                              +
                              +

                              Step 2 of 3

                              +

                              consectetur adipisicing elit

                              +
                              +
                              +

                              Step 3 of 3

                              +

                              sed do eiusmod tempor incididunt ut labore et dolore magna aliqua

                              +
                              +
                              + +

                              The next shows blocking moving to the next step with a JS function...

                              + + +
                              +
                              +

                              Agreement Terms

                              + +
                              + +
                              +

                              + I accept the terms of this agreement. +

                              +
                              +
                              +
                              +

                              Complete

                              +

                              The license has been accepted.

                              +
                              +
                              +
                              + + + + + diff --git a/includes/js/dojox/wire.js b/includes/js/dojox/wire.js new file mode 100644 index 0000000..7eb0b85 --- /dev/null +++ b/includes/js/dojox/wire.js @@ -0,0 +1,7 @@ +if(!dojo._hasResource["dojox.wire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire"] = true; +dojo.provide("dojox.wire"); +dojo.require("dojox.wire._base"); + + +} diff --git a/includes/js/dojox/wire/CompositeWire.js b/includes/js/dojox/wire/CompositeWire.js new file mode 100644 index 0000000..7d1015d --- /dev/null +++ b/includes/js/dojox/wire/CompositeWire.js @@ -0,0 +1,103 @@ +if(!dojo._hasResource["dojox.wire.CompositeWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.CompositeWire"] = true; +dojo.provide("dojox.wire.CompositeWire"); + +dojo.require("dojox.wire._base"); +dojo.require("dojox.wire.Wire"); + +dojo.declare("dojox.wire.CompositeWire", dojox.wire.Wire, { + // summary: + // A Wire for composite values in object or array + // description: + // This class has multiple child Wires for object properties or array + // elements. + // When an object with Wires is specified to 'children' property, they + // are used to get or set an object with property values. + // When an array of Wiares is specified to 'children' property, they + // are used to get or set an array with element values. + + _wireClass: "dojox.wire.CompositeWire", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If object properties or array elements specified in 'children' + // property are not Wires, Wires are created from them as + // arguments, with 'parent' property set to this Wire instance. + // args: + // Arguments to initialize properties + // children: + // An object or array containing child Wires + this._initializeChildren(this.children); + }, + _getValue: function(/*Object||Array*/object){ + // summary: + // Return an object with property values or an array with element + // values + // description: + // This method calls getValue() method of the child Wires with + // 'object' argument and returns an object with the values as + // properties or an arary of the values as elements. + // object: + // A root object + // returns: + // An object or array with values + if(!object || !this.children){ + return object; //Object||Array + } + + var value = (dojo.isArray(this.children) ? [] : {}); // array or object + for(var c in this.children){ + value[c] = this.children[c].getValue(object); + } + return value;//Object||Array + }, + + _setValue: function(/*Object||Array*/object, /*Object||Array*/value){ + // summary: + // Set an object properties or an array elements to an object + // desription: + // This method calls setValues() method of the child Wires with + // a corresponding property or element in 'value' argument and + // 'object' argument. + // object: + // A root object + // value: + // An object or array with values to set + // returns: + // 'object' + if(!object || !this.children){ + return object; //Object||Array + } + + for(var c in this.children){ + this.children[c].setValue(value[c], object); + } + return object; //Object||Array + }, + + _initializeChildren: function(/*Object||Array*/children){ + // summary: + // Initialize child Wires + // description: + // If object properties or array elements specified in 'children' + // argument are not Wires, Wires are created from them as + // arguments, with 'parent' property set to this Wire instance. + // children: + // An object or array containing child Wires + if(!children){ + return; //undefined + } + + for(var c in children){ + var child = children[c]; + child.parent = this; + if(!dojox.wire.isWire(child)){ + children[c] = dojox.wire.create(child); + } + } + } +}); + +} diff --git a/includes/js/dojox/wire/DataWire.js b/includes/js/dojox/wire/DataWire.js new file mode 100644 index 0000000..ecb6223 --- /dev/null +++ b/includes/js/dojox/wire/DataWire.js @@ -0,0 +1,179 @@ +if(!dojo._hasResource["dojox.wire.DataWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.DataWire"] = true; +dojo.provide("dojox.wire.DataWire"); + +dojo.require("dojox.wire.Wire"); + +dojo.declare("dojox.wire.DataWire", dojox.wire.Wire, { + // summary: + // A Wire for item attributes of data stores + // description: + // This class accesses item attributes of data stores with a dotted + // notation of attribute names specified to 'attribute' property, + // using data APIs of a data store specified to 'dataStore' property. + // The root object for this class must be an item of the data store. + // Intermediate attribute names in the dotted notation specify + // attributes for child items, which are used for repeated calls to + // data APIs until reached to a descendant attribute. + // Attribute names may have an array index, such as "a[0]", to + // identify an array element of the attribute value. + + _wireClass: "dojox.wire.DataWire", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If 'dataStore' property is not specified, but 'parent' property + // is specified, 'dataStore' property is copied from the parent. + // args: + // Arguments to initialize properties + // dataStore: + // A data store + // attribute: + // A dotted notation to a descendant attribute + if(!this.dataStore && this.parent){ + this.dataStore = this.parent.dataStore; + } + }, + _getValue: function(/*Object*/object){ + // summary: + // Return an attribute value of an item + // description: + // This method uses a root item passed in 'object' argument and + // 'attribute' property to call getValue() method of + // 'dataStore'. + // If an attribute name have an array suffix ("[]"), getValues() + // method is called, instead. + // If an index is specified in the array suffix, an array element + // for the index is returned, instead of the array itself. + // object: + // A root item + // returns: + // A value found, otherwise 'undefined' + if(!object || !this.attribute || !this.dataStore){ + return object; //Object + } + + var value = object; + var list = this.attribute.split('.'); + for(var i in list){ + value = this._getAttributeValue(value, list[i]); + if(!value){ + return undefined; //undefined + } + } + return value; //anything + }, + + _setValue: function(/*Object*/object, /*anything*/value){ + // summary: + // Set an attribute value to an item + // description: + // This method uses a root item passed in 'object' argument and + // 'attribute' property to identify an item. + // Then, setValue() method of 'dataStore' is called with a leaf + // attribute name and 'value' argument. + // If an attribute name have an array suffix ("[]"), setValues() + // method is called, instead. + // If an index is specified in the array suffix, an array element + // for the index is set to 'value', instead of the array itself. + // object: + // A root item + // value: + // A value to set + // returns: + // 'object', or 'undefined' for invalid attribute + if(!object || !this.attribute || !this.dataStore){ + return object; //Object + } + + var item = object; + var list = this.attribute.split('.'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + item = this._getAttributeValue(item, list[i]); + if(!item){ + return undefined; //undefined + } + } + this._setAttributeValue(item, list[last], value); + return object; //Object + }, + + _getAttributeValue: function(/*Object*/item, /*String*/attribute){ + // summary: + // Return an attribute value of an item + // description: + // This method uses an item passed in 'item' argument and + // 'attribute' argument to call getValue() method of 'dataStore'. + // If an attribute name have an array suffix ("[]"), getValues() + // method is called, instead. + // If an index is specified in the array suffix, an array element + // for the index is returned, instead of the array itself. + // item: + // An item + // attribute + // An attribute name + // returns: + // A value found, otherwise 'undefined' + var value = undefined; + var i1 = attribute.indexOf('['); + if(i1 >= 0){ + var i2 = attribute.indexOf(']'); + var index = attribute.substring(i1 + 1, i2); + attribute = attribute.substring(0, i1); + var array = this.dataStore.getValues(item, attribute); + if(array){ + if(!index){ // return array for "attribute[]" + value = array; + }else{ + value = array[index]; + } + } + }else{ + value = this.dataStore.getValue(item, attribute); + } + return value; //anything + }, + + _setAttributeValue: function(/*Object*/item, /*String*/attribute, /*anything*/value){ + // summary: + // Set an attribute value to an item + // description: + // This method uses an item passed in 'item' argument and + // 'attribute' argument to call setValue() method of 'dataStore' + // with 'value' argument. + // If an attribute name have an array suffix ("[]"), setValues() + // method is called, instead. + // If an index is specified in the array suffix, an array element + // for the index is set to 'value', instead of the array itself. + // item: + // An item + // attribute: + // An attribute name + // value: + // A value to set + var i1 = attribute.indexOf('['); + if(i1 >= 0){ + var i2 = attribute.indexOf(']'); + var index = attribute.substring(i1 + 1, i2); + attribute = attribute.substring(0, i1); + var array = null; + if(!index){ // replace whole array for "attribute[]" + array = value; + }else{ + array = this.dataStore.getValues(item, attribute); + if(!array){ + array = []; + } + array[index] = value; + } + this.dataStore.setValues(item, attribute, array); + }else{ + this.dataStore.setValue(item, attribute, value); + } + } +}); + +} diff --git a/includes/js/dojox/wire/README b/includes/js/dojox/wire/README new file mode 100644 index 0000000..8f3f831 --- /dev/null +++ b/includes/js/dojox/wire/README @@ -0,0 +1,53 @@ +------------------------------------------------------------------------------- +DojoX Wire +------------------------------------------------------------------------------- +Version 1.0 +Release date: 05/29/2007 +------------------------------------------------------------------------------- +Project state: stable +------------------------------------------------------------------------------- +Project authors + Jared Jurkiewicz (jared.jurkiewicz@gmail.com) +------------------------------------------------------------------------------- +Project description + +The DojoX Wire project is a set of functions that build a generic data binding +and service invocation library to simplify how data values across a wide +variety of widget and non-widget JavaScript constructs are accessed, updated, +and passed to and from services. It also provides a set of widgets +within the dojox.wire.ml package to allow for declarative data binding +definitions in addition to the programmatic APIs. + +In essense, this project is an API to provide a simplified way of doing MVC +patterns in the client. + +------------------------------------------------------------------------------- +Dependencies: + +DojoX Wire has dependencies on core dojo, the dijit widget system (for classes +in the dojox.wire.ml package), dojox.data, and the D.O.H. unit test framework. +------------------------------------------------------------------------------- +Documentation: + +See the Dojo API tool (http://dojotoolkit.org/api) +------------------------------------------------------------------------------- +Installation instructions + +Grab the following from the Dojo SVN Repository: +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/wire.js +http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/wire/* + +Install into the following directory structure: +/dojox/wire/ + +...which should be at the same level as your Dojo checkout. + +It should look like: +/dojox/wire.js +/dojox/wire/* + +Require in dojox.wire for all baseline functions (dojox.wire.connect, +dojox.wire.register, etc). For specific Wire classes, +require in the appropriate dojox.wire.. +------------------------------------------------------------------------------- + diff --git a/includes/js/dojox/wire/TableAdapter.js b/includes/js/dojox/wire/TableAdapter.js new file mode 100644 index 0000000..16a5280 --- /dev/null +++ b/includes/js/dojox/wire/TableAdapter.js @@ -0,0 +1,88 @@ +if(!dojo._hasResource["dojox.wire.TableAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.TableAdapter"] = true; +dojo.provide("dojox.wire.TableAdapter"); + +dojo.require("dojox.wire.CompositeWire"); + +dojo.declare("dojox.wire.TableAdapter", dojox.wire.CompositeWire, { + // summary: + // A composite Wire for table rows + // description: + // This class has multiple child Wires for object properties or array + // elements of a table row. + // The root object for this class must be an array. + // When an object with Wires is specified to 'columns' property, they + // are used to get a row object with property values. + // When an array of Wires is specified to 'columns' property, they + // are used to get a row array with element values. + // The row values are returned in an array. + // This class only supports getValue(), but not setValue(). + + _wireClass: "dojox.wire.TableAdapter", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If object properties or array elements specified in 'columns' + // property are not Wires, Wires are created from them as + // arguments, with 'parent' property set to this Wire instance. + // args: + // Arguments to initialize properties + // columns: + // An object or array containing child Wires for column values + this._initializeChildren(this.columns); + }, + + _getValue: function(/*Array*/object){ + // summary: + // Return an array of table row value (object or array) + // description: + // This method iterates over an array specified to 'object' + // argument and calls getValue() method of the child Wires with + // each element of the array to get a row object or array. + // Finally, an array with the row objects or arrays are retuned. + // object: + // A root array + // returns: + // An array of table row value + if(!object || !this.columns){ + return object; //Array + } + + var array = object; + if(!dojo.isArray(array)){ + array = [array]; + } + + var rows = []; + for(var i in array){ + var row = this._getRow(array[i]); + rows.push(row); + } + return rows; //Array + }, + + _setValue: function(/*Array*/object, /*Array*/value){ + // summary: + // Not supported + throw new Error("Unsupported API: " + this._wireClass + "._setValue"); + }, + + _getRow: function(/*Object||Array*/object){ + // summary: + // Return an array or object for a table row + // description: + // This method calls getValue() method of the child Wires to + // create a row object or array. + // returns: + // An array or object for a table row + var row = (dojo.isArray(this.columns) ? [] : {}); // array or object + for(var c in this.columns){ + row[c] = this.columns[c].getValue(object); + } + return row; //Array||Object + } +}); + +} diff --git a/includes/js/dojox/wire/TextAdapter.js b/includes/js/dojox/wire/TextAdapter.js new file mode 100644 index 0000000..36e7f1d --- /dev/null +++ b/includes/js/dojox/wire/TextAdapter.js @@ -0,0 +1,88 @@ +if(!dojo._hasResource["dojox.wire.TextAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.TextAdapter"] = true; +dojo.provide("dojox.wire.TextAdapter"); + +dojo.require("dojox.wire.CompositeWire"); + +dojo.declare("dojox.wire.TextAdapter", dojox.wire.CompositeWire, { + // summary: + // A composite Wire for a concatenated text + // description: + // This class has multiple child Wires for text segment values. + // Wires in 'segments' property are used to get text segments and + // values are concatenated with an optional delimiter string specified + // to 'delimiter' property. + + _wireClass: "dojox.wire.TextAdapter", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If array elements specified in 'segments' are not Wires, Wires + // are created from them as arguments, with 'parent' property set + // to this Wire instance. + // args: + // Arguments to initialize properties + // segments: + // An array containing child Wires for text segment values + // delimiter: + // A delimiter string + this._initializeChildren(this.segments); + if(!this.delimiter){ + this.delimiter = ""; + } + }, + + _getValue: function(/*Object||Array*/object){ + // summary: + // Return a concatenated text + // description: + // This method calls getValue() method of the child Wires wuth + // 'object' argument and concatenate the values with 'delimiter' + // property to return. + // arg: + // A root object + // returns: + // A concatinated text + if(!object || !this.segments){ + return object; //Object||Array + } + + var text = ""; + for(var i in this.segments){ + var segment = this.segments[i].getValue(object); + text = this._addSegment(text, segment); + } + return text; //String + }, + + _setValue: function(/*Object||Array*/object, /*String*/value){ + // summary: + // Not supported + throw new Error("Unsupported API: " + this._wireClass + "._setValue"); + }, + + _addSegment: function(/*String*/text, /*String*/segment){ + // summary: + // Return a concatenated text + // description: + // This method add a text segment specified to 'segment' argument + // to a base text specified to 'text', with 'delimiter' property. + // text: + // A base text + // segment: + // A text segment to add + // returns: + // A concatinated text + if(!segment){ + return text; //String + }else if(!text){ + return segment; //String + }else{ + return text + this.delimiter + segment; //String + } + } +}); + +} diff --git a/includes/js/dojox/wire/TreeAdapter.js b/includes/js/dojox/wire/TreeAdapter.js new file mode 100644 index 0000000..b9b16bf --- /dev/null +++ b/includes/js/dojox/wire/TreeAdapter.js @@ -0,0 +1,188 @@ +if(!dojo._hasResource["dojox.wire.TreeAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.TreeAdapter"] = true; +dojo.provide("dojox.wire.TreeAdapter"); + +dojo.require("dojox.wire.CompositeWire"); + +dojo.declare("dojox.wire.TreeAdapter", dojox.wire.CompositeWire, { + // summary: + // A composite Wire for tree nodes + // description: + // This class has multiple child Wires for tree nodes, their title and + // child nodes. + // The root object for this class must be an array. + // 'node' Wires in 'nodes' property is used to identify an object + // representing a node. + // 'title' Wires in 'nodes' property is used to get the title string + // of a node. + // 'children' Wires in 'nodes' property is used to iterate over child + // node objects. + // The node values are returned in an array as follows: + // [ + // {title: title1, + // children: [ + // {title: title2, + // child: ...}, + // {title: title3, + // child: ...}, + // ... + // ]}, + // ... + // ] + // This class only supports getValue(), but not setValue(). + + _wireClass: "dojox.wire.TreeAdapter", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If object properties ('node', 'title' and 'children') of array + // elements specified in 'nodes' property are not Wires, Wires are + // created from them as arguments, with 'parent' property set to + // this Wire instance. + // args: + // Arguments to initialize properties + // nodes: + // An array containing objects for child Wires for node values + this._initializeChildren(this.nodes); + }, + _getValue: function(/*Array*/object){ + // summary: + // Return an array of tree node values + // description: + // This method iterates over an array specified to 'object' + // argument and calls getValue() method of 'node' Wires with each + // element of the array to get object(s) that represetns nodes. + // (If 'node' Wires are omitted, the array element is used for + // further processing.) + // Then, getValue() method of 'title' Wires are called to get + // title strings for nodes. + // (If 'title' Wires are omitted, the objects representing nodes + // are used as title strings.) + // And if an array of objects with 'node' and 'title' Wires is + // specified to 'children', it is used to gather child nodes and + // their title strings in the same way recursively. + // Finally, an array of the top-level node objects are retuned. + // object: + // A root array + // returns: + // An array of tree node values + if(!object || !this.nodes){ + return object; //Array + } + + var array = object; + if(!dojo.isArray(array)){ + array = [array]; + } + + var nodes = []; + for(var i in array){ + for(var i2 in this.nodes){ + nodes = nodes.concat(this._getNodes(array[i], this.nodes[i2])); + } + } + return nodes; //Array + }, + + _setValue: function(/*Array*/object, /*Array*/value){ + // summary: + // Not supported + throw new Error("Unsupported API: " + this._wireClass + "._setValue"); + }, + + _initializeChildren: function(/*Array*/children){ + // summary: + // Initialize child Wires + // description: + // If 'node' or 'title' properties of array elements specified in + // 'children' argument are not Wires, Wires are created from them + // as arguments, with 'parent' property set to this Wire instance. + // If an array element has 'children' property, this method is + // called recursively with it. + // children: + // An array of objects containing child Wires + if(!children){ + return; //undefined + } + + for(var i in children){ + var child = children[i]; + if(child.node){ + child.node.parent = this; + if(!dojox.wire.isWire(child.node)){ + child.node = dojox.wire.create(child.node); + } + } + if(child.title){ + child.title.parent = this; + if(!dojox.wire.isWire(child.title)){ + child.title = dojox.wire.create(child.title); + } + } + if(child.children){ + this._initializeChildren(child.children); + } + } + }, + + _getNodes: function(/*Object*/object, /*Object*/child){ + // summary: + // Return an array of tree node values + // description: + // This method calls getValue() method of 'node' Wires with + // 'object' argument to get object(s) that represents nodes. + // (If 'node' Wires are omitted, 'object' is used for further + // processing.) + // Then, getValue() method of 'title' Wires are called to get + // title strings for nodes. + // (If 'title' Wires are omitted, the objects representing nodes + // are used as title strings.) + // And if an array of objects with 'node' and 'title' Wires is + // specified to 'children', it is used to gather child nodes and + // their title strings in the same way recursively. + // Finally, an array of node objects are returned. + // object: + // An object + // child: + // An object with child Wires + // returns: + var array = null; + if(child.node){ + array = child.node.getValue(object); + if(!array){ + return []; + } + if(!dojo.isArray(array)){ + array = [array]; + } + }else{ + array = [object]; + } + + var nodes = []; + for(var i in array){ + object = array[i]; + var node = {}; + if(child.title){ + node.title = child.title.getValue(object); + }else{ + node.title = object; + } + if(child.children){ + var children = []; + for(var i2 in child.children){ + children = children.concat(this._getNodes(object, child.children[i2])); + } + if(children.length > 0){ + node.children = children; + } + } + nodes.push(node); + } + return nodes; //Array + } +}); + +} diff --git a/includes/js/dojox/wire/Wire.js b/includes/js/dojox/wire/Wire.js new file mode 100644 index 0000000..f9dde1d --- /dev/null +++ b/includes/js/dojox/wire/Wire.js @@ -0,0 +1,336 @@ +if(!dojo._hasResource["dojox.wire.Wire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.Wire"] = true; +dojo.provide("dojox.wire.Wire"); + +dojo.require("dojox.wire._base"); + +dojo.declare("dojox.wire.Wire", null, { + // summary: + // A default and base Wire to access an object property + // description: + // This class accesses a property of an object with a dotted notation + // specified to 'property' property, such as "a.b.c", which identifies + // a descendant property, "object.a.b.c". + // Property names in the dotted notation may have an array index, such + // as "a[0]", to identify an array element, literally, "object.a[0]". + // When a notation start with an array index, such as "[0].a", it + // specifies an array element of the root object (array), + // "object[0].a". + // This class also serves as a base class for other Wire classes, + // preparing a root object and converting a return value, so that + // sub-classes just can implement _getValue() and _setValue() called + // from getValue() and setValue() implemented by this calss. + + _wireClass: "dojox.wire.Wire", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // If 'converter' property is specified and is a string for + // a converter class, an instanceof the converter class is + // created. + // args: + // Arguments to initialize properties + // object: + // A root object (or another Wire to access a root object) + // property: + // A dotted notation to a descendant property + // type: + // A type of the return value (for the source Wire) + // converter: + // A converter object (or class name) to convert the return + // value (for the source Wire) + dojo.mixin(this, args); + + if(this.converter){ + if(dojo.isString(this.converter)){ + //First check the object tree for it. Might be defined variable + //name/global function (like a jsId, or just a function name). + var convertObject = dojo.getObject(this.converter); + if (dojo.isFunction(convertObject)){ + //We need to see if this is a pure function or an object constructor... + try{ + var testObj = new convertObject(); + if(testObj && !dojo.isFunction(testObj["convert"])){ + //Looks like a 'pure' function... + this.converter = {convert: convertObject}; + }else{ + this.converter = testObj; + } + }catch(e){ + //Do if this fails. + } + }else if(dojo.isObject(convertObject)){ + //It's an object, like a jsId ... see if it has a convert function + if(dojo.isFunction(convertObject["convert"])){ + this.converter = convertObject; + } + } + + //No object with that name (Converter is still a string), + //then look for a class that needs to be dynamically loaded... + if (dojo.isString(this.converter)) { + var converterClass = dojox.wire._getClass(this.converter); + if(converterClass){ + this.converter = new converterClass(); + }else{ + this.converter = undefined; + } + } + }else if(dojo.isFunction(this.converter)){ + this.converter = {convert: this.converter}; + } + } + }, + + getValue: function(/*Object||Array*/defaultObject){ + // summary: + // Return a value of an object + // description: + // This method first determins a root object as follows: + // 1. If 'object' property specified, + // 1.1 If 'object' is a Wire, its getValue() method is called to + // obtain a root object. + // 1.2 Otherwise, use 'object' as a root object. + // 2. Otherwise, use 'defaultObject' argument. + // 3. If 'property' is specified, it is used to get a property + // value. + // Then, if a sub-class implements _getValue() method, it is + // called with the root object to get the return value. + // Otherwise, the root object (typically, a property valye) is + // used for the return value. + // Finally, if 'type' property is specified, the return value is + // converted to the specified primitive type ("string", "number", + // "boolean" and "array"). + // If 'converter' property is specified, its convert() method is + // called to convert the value. + // defaultObject: + // A default root object + // returns: + // A value found + var object = undefined; + if(dojox.wire.isWire(this.object)){ + object = this.object.getValue(defaultObject); + }else{ + object = (this.object || defaultObject); + } + + if(this.property){ + var list = this.property.split('.'); + for(var i in list){ + if(!object){ + return object; //anything (null, undefined, etc) + } + object = this._getPropertyValue(object, list[i]); + } + } + + var value = undefined; + if(this._getValue){ + value = this._getValue(object); + }else{ + value = object; + } + + if(value){ + if(this.type){ + if(this.type == "string"){ + value = value.toString(); + }else if(this.type == "number"){ + value = parseInt(value); + }else if(this.type == "boolean"){ + value = (value != "false"); + }else if(this.type == "array"){ + if(!dojo.isArray(value)){ + value = [value]; + } + } + } + if(this.converter && this.converter.convert){ + value = this.converter.convert(value, this); // optional "this" context + } + } + return value; //anything + }, + + setValue: function(/*anything*/value, /*Object||Array*/defaultObject){ + // summary: + // Set a value to an object + // description: + // This method first determins a root object as follows: + // 1. If 'object' property specified, + // 1.1 If 'object' is a Wire, its getValue() method is called to + // obtain a root object. + // 1.2 Otherwise, use 'object' as a root object. + // 2. Otherwise, use 'defaultObject' argument. + // 3. If 'property' is specified, it is used to get a property + // value. + // Then, if a sub-class implements _setValue() method, it is + // called with the root object and 'value' argument to set + // the value. + // Otherwise, 'value' is set to a property specified with + // 'property' property. + // If the root object is undefined and 'object' property is a Wire + // and a new object is created and returned by _setValue() it is + // set through 'object' (setValue() method). + // value: + // A value to set + // defaultObject: + // A default root object + var object = undefined; + if(dojox.wire.isWire(this.object)){ + object = this.object.getValue(defaultObject); + }else{ + object = (this.object || defaultObject); + } + + var property = undefined; + if(this.property){ + if(!object){ + if(dojox.wire.isWire(this.object)){ + object = {}; + this.object.setValue(object, defaultObject); + }else{ + throw new Error(this._wireClass + ".setValue(): invalid object"); + } + } + var list = this.property.split('.'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + var p = list[i]; + var o = this._getPropertyValue(object, p); + if(!o){ + o = {}; + this._setPropertyValue(object, p, o); + } + object = o; + } + property = list[last]; + } + + if(this._setValue){ + if(property){ + var o = this._getPropertyValue(object, property); + if(!o){ + o = {}; + this._setPropertyValue(object, property, o); + } + object = o; + } + var newObject = this._setValue(object, value); + if(!object && newObject){ + if(dojox.wire.isWire(this.object)){ + this.object.setValue(newObject, defaultObject); + }else{ + throw new Error(this._wireClass + ".setValue(): invalid object"); + } + } + }else{ + if(property){ + this._setPropertyValue(object, property, value); + }else{ + if(dojox.wire.isWire(this.object)){ + this.object.setValue(value, defaultObject); + }else{ + throw new Error(this._wireClass + ".setValue(): invalid property"); + } + } + } + }, + + _getPropertyValue: function(/*Object||Array*/object, /*String*/property){ + // summary: + // Return a property value of an object + // description: + // A value for 'property' of 'object' is returned. + // If 'property' ends with an array index, it is used to indentify + // an element of an array property. + // If 'object' implements getPropertyValue(), it is called with + // 'property' to obtain the property value. + // If 'object' implements a getter for the property, it is called + // to obtain the property value. + // object: + // A default root object + // property: + // A property name + // returns: + // A value found, otherwise 'undefined' + var value = undefined; + var i1 = property.indexOf('['); + if(i1 >= 0){ + var i2 = property.indexOf(']'); + var index = property.substring(i1 + 1, i2); + var array = null; + if(i1 === 0){ // object is array + array = object; + }else{ + property = property.substring(0, i1); + array = this._getPropertyValue(object, property); + if(array && !dojo.isArray(array)){ + array = [array]; + } + } + if(array){ + value = array[index]; + } + }else if(object.getPropertyValue){ + value = object.getPropertyValue(property); + }else{ + var getter = "get" + property.charAt(0).toUpperCase() + property.substring(1); + if(object[getter]){ + value = object[getter](); + }else{ + value = object[property]; + } + } + return value; //anything + }, + + _setPropertyValue: function(/*Object||Array*/object, /*String*/property, /*anything*/value){ + // summary: + // Set a property value to an object + // description: + // 'value' is set to 'property' of 'object'. + // If 'property' ends with an array index, it is used to indentify + // an element of an array property to set the value. + // If 'object' implements setPropertyValue(), it is called with + // 'property' and 'value' to set the property value. + // If 'object' implements a setter for the property, it is called + // with 'value' to set the property value. + // object: + // An object + // property: + // A property name + // value: + // A value to set + var i1 = property.indexOf('['); + if(i1 >= 0){ + var i2 = property.indexOf(']'); + var index = property.substring(i1 + 1, i2); + var array = null; + if(i1 === 0){ // object is array + array = object; + }else{ + property = property.substring(0, i1); + array = this._getPropertyValue(object, property); + if(!array){ + array = []; + this._setPropertyValue(object, property, array); + } + } + array[index] = value; + }else if(object.setPropertyValue){ + object.setPropertyValue(property, value); + }else{ + var setter = "set" + property.charAt(0).toUpperCase() + property.substring(1); + if(object[setter]){ + object[setter](value); + }else{ + object[property] = value; + } + } + } +}); + +} diff --git a/includes/js/dojox/wire/XmlWire.js b/includes/js/dojox/wire/XmlWire.js new file mode 100644 index 0000000..dc5666f --- /dev/null +++ b/includes/js/dojox/wire/XmlWire.js @@ -0,0 +1,244 @@ +if(!dojo._hasResource["dojox.wire.XmlWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.XmlWire"] = true; +dojo.provide("dojox.wire.XmlWire"); + +dojo.require("dojox.data.dom"); +dojo.require("dojox.wire.Wire"); + +dojo.declare("dojox.wire.XmlWire", dojox.wire.Wire, { + // summary: + // A Wire for XML nodes or values (element, attribute and text) + // description: + // This class accesses XML nodes or value with a simplified XPath + // specified to 'path' property. + // The root object for this class must be an DOM document or element + // node. + // "@name" accesses to an attribute value of an element and "text()" + // accesses to a text value of an element. + // The hierarchy of the elements from the root node can be specified + // with slash-separated list, such as "a/b/@c", which specifies + // the value of an attribute named "c" of an element named "b" as + // a child of another element named "a" of a child of the root node. + + _wireClass: "dojox.wire.XmlWire", + + constructor: function(/*Object*/args){ + // summary: + // Initialize properties + // description: + // 'args' is just mixed in with no further processing. + // args: + // Arguments to initialize properties + // path: + // A simplified XPath to an attribute, a text or elements + }, + _getValue: function(/*Node*/object){ + // summary: + // Return an attribute value, a text value or an array of elements + // description: + // This method first uses a root node passed in 'object' argument + // and 'path' property to identify an attribute, a text or + // elements. + // If 'path' starts with a slash (absolute), the first path + // segment is ignored assuming it point to the root node. + // (That is, "/a/b/@c" and "b/@c" against a root node access + // the same attribute value, assuming the root node is an element + // with a tag name, "a".) + // object: + // A root node + // returns: + // A value found, otherwise 'undefined' + if(!object || !this.path){ + return object; //Node + } + + var node = object; + var path = this.path; + if(path.charAt(0) == '/'){ // absolute + // skip the first expression (supposed to select the top node) + var i = path.indexOf('/', 1); + path = path.substring(i + 1); + } + var list = path.split('/'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + node = this._getChildNode(node, list[i]); + if(!node){ + return undefined; //undefined + } + } + var value = this._getNodeValue(node, list[last]); + return value; //String||Array + }, + + _setValue: function(/*Node*/object, /*String*/value){ + // summary: + // Set an attribute value or a child text value to an element + // description: + // This method first uses a root node passed in 'object' argument + // and 'path' property to identify an attribute, a text or + // elements. + // If an intermediate element does not exist, it creates + // an element of the tag name in the 'path' segment as a child + // node of the current node. + // Finally, 'value' argument is set to an attribute or a text + // (a child node) of the leaf element. + // object: + // A root node + // value: + // A value to set + if(!this.path){ + return object; //Node + } + + var node = object; + var doc = this._getDocument(node); + var path = this.path; + if(path.charAt(0) == '/'){ // absolute + var i = path.indexOf('/', 1); + if(!node){ + var name = path.substring(1, i); + node = doc.createElement(name); + object = node; // to be returned as a new object + } + // skip the first expression (supposed to select the top node) + path = path.substring(i + 1); + }else{ + if(!node){ + return undefined; //undefined + } + } + + var list = path.split('/'); + var last = list.length - 1; + for(var i = 0; i < last; i++){ + var child = this._getChildNode(node, list[i]); + if(!child){ + child = doc.createElement(list[i]); + node.appendChild(child); + } + node = child; + } + this._setNodeValue(node, list[last], value); + return object; //Node + }, + + _getNodeValue: function(/*Node*/node, /*String*/exp){ + // summary: + // Return an attribute value, a text value or an array of elements + // description: + // If 'exp' starts with '@', an attribute value of the specified + // attribute is returned. + // If 'exp' is "text()", a child text value is returned. + // Otherwise, an array of child elements, the tag name of which + // match 'exp', is returned. + // node: + // A node + // exp: + // An expression for attribute, text or elements + // returns: + // A value found, otherwise 'undefined' + var value = undefined; + if(exp.charAt(0) == '@'){ + var attribute = exp.substring(1); + value = node.getAttribute(attribute); + }else if(exp == "text()"){ + var text = node.firstChild; + if(text){ + value = text.nodeValue; + } + }else{ // assume elements + value = []; + for(var i = 0; i < node.childNodes.length; i++){ + var child = node.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == exp){ + value.push(child); + } + } + } + return value; //String||Array + }, + + _setNodeValue: function(/*Node*/node, /*String*/exp, /*String*/value){ + // summary: + // Set an attribute value or a child text value to an element + // description: + // If 'exp' starts with '@', 'value' is set to the specified + // attribute. + // If 'exp' is "text()", 'value' is set to a child text. + // node: + // A node + // exp: + // An expression for attribute or text + // value: + // A value to set + if(exp.charAt(0) == '@'){ + var attribute = exp.substring(1); + if(value){ + node.setAttribute(attribute, value); + }else{ + node.removeAttribute(attribute); + } + }else if(exp == "text()"){ + while(node.firstChild){ + node.removeChild(node.firstChild); + } + if(value){ + var text = this._getDocument(node).createTextNode(value); + node.appendChild(text); + } + } + // else not supported + }, + + _getChildNode: function(/*Node*/node, /*String*/name){ + // summary: + // Return a child node + // description: + // A child element of the tag name specified with 'name' is + // returned. + // If 'name' ends with an array index, it is used to pick up + // the corresponding element from multiple child elements. + // node: + // A parent node + // name: + // A tag name + // returns: + // A child node + var index = 1; + var i1 = name.indexOf('['); + if(i1 >= 0){ + var i2 = name.indexOf(']'); + index = name.substring(i1 + 1, i2); + name = name.substring(0, i1); + } + var count = 1; + for(var i = 0; i < node.childNodes.length; i++){ + var child = node.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == name){ + if(count == index){ + return child; //Node + } + count++; + } + } + return null; //null + }, + + _getDocument: function(/*Node*/node){ + // summary: + // Return a DOM document + // description: + // If 'node' is specified, a DOM document of the node is returned. + // Otherwise, a DOM document is created. + // returns: + // A DOM document + if(node){ + return (node.nodeType == 9 /* DOCUMENT_NODE */ ? node : node.ownerDocument); //Document + }else{ + return dojox.data.dom.createDocument(); //Document + } + } +}); + +} diff --git a/includes/js/dojox/wire/_base.js b/includes/js/dojox/wire/_base.js new file mode 100644 index 0000000..cc632c1 --- /dev/null +++ b/includes/js/dojox/wire/_base.js @@ -0,0 +1,195 @@ +if(!dojo._hasResource["dojox.wire._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire._base"] = true; +dojo.provide("dojox.wire._base"); + +dojox.wire._defaultWireClass = "dojox.wire.Wire"; + +dojox.wire._wireClasses = { + "attribute": "dojox.wire.DataWire", + "path": "dojox.wire.XmlWire", + "children": "dojox.wire.CompositeWire", + "columns": "dojox.wire.TableAdapter", + "nodes": "dojox.wire.TreeAdapter", + "segments": "dojox.wire.TextAdapter" +}; + +dojox.wire.register = function(/*Function||String*/wireClass, /*String*/key){ + // summary: + // Register a Wire class + // desription: + // The specified Wire class or a class name is registered with + // a key property of arguments to create a Wire + // wireClass: + // A class or full qualified class name + // key: + // A key property of arguments to create a Wire + if(!wireClass || !key){ + return; //undefined + } + if(dojox.wire._wireClasses[key]){ // key already in use + return; //undefined + } + dojox.wire._wireClasses[key] = wireClass; +}; + +dojox.wire._getClass = function(/*String*/name){ + // summary: + // Returns a class + // description: + // The class is loaded by dojo.require() and returned + // by dojo.getObject(). + // name: + // A class name + // returns: + // A class + dojo["require"](name); // use dojo["require"] instead of dojo.require to avoid a build problem + return dojo.getObject(name); //Function +}; + +dojox.wire.create = function(/*Object*/args){ + // summary: + // Create a Wire from arguments + // description: + // If 'args' specifies 'wireClass', it is used as a class or full + // qualified class name to create a Wire with 'args' as arguments. + // Otherwise, a Wire class is determined by other proeprties of 'args' + // checking if 'args' specifies a key property for a Wire class. + // If no key property found, the default Wire class is used. + // args: + // Arguments to create a Wire + // returns: + // A Wire + if(!args){ + args = {}; + } + var wireClass = args.wireClass; + if(wireClass){ + if(dojo.isString(wireClass)){ + wireClass = dojox.wire._getClass(wireClass); + } + }else{ + for(var key in args){ + if(!args[key]){ + continue; + } + wireClass = dojox.wire._wireClasses[key]; + if(wireClass){ + if(dojo.isString(wireClass)){ + wireClass = dojox.wire._getClass(wireClass); + dojox.wire._wireClasses[key] = wireClass; + } + break; + } + } + } + if(!wireClass){ + if(dojo.isString(dojox.wire._defaultWireClass)){ + dojox.wire._defaultWireClass = dojox.wire._getClass(dojox.wire._defaultWireClass); + } + wireClass = dojox.wire._defaultWireClass; + } + return new wireClass(args); //Object +}; + +dojox.wire.isWire = function(/*Object*/wire){ + // summary: + // Check if an object is a Wire + // description: + // If the specified object is a Wire, true is returned. + // Otherwise, false is returned. + // wire: + // An object to check + // returns: + // True if the object is a Wire, otherwise false + return (wire && wire._wireClass); //Boolean +}; + +dojox.wire.transfer = function(/*Wire||Object*/source, /*Wire||Object*/target, /*Object?*/defaultObject, /*Object?*/defaultTargetObject){ + // summary: + // Transfer a source value to a target value + // description: + // If 'source' and/or 'target' are not Wires, Wires are created with + // them as arguments. + // A value is got through the source Wire and set through the target + // Wire. + // 'defaultObject' is passed to Wires as a default root object. + // If 'defaultTargetObject' is specified, it is passed to the target + // Wire as a default root object, instead of 'defaultObject'. + // source: + // A Wire or arguments to create a Wire for a source value + // target: + // A Wire or arguments to create a Wire for a target value + // defaultObject: + // defaultTargetObject; + // Optional default root objects passed to Wires + if(!source || !target){ + return; //undefined + } + if(!dojox.wire.isWire(source)){ + source = dojox.wire.create(source); + } + if(!dojox.wire.isWire(target)){ + target = dojox.wire.create(target); + } + + var value = source.getValue(defaultObject); + target.setValue(value, (defaultTargetObject || defaultObject)); +}; + +dojox.wire.connect = function(/*Object*/trigger, /*Wire||Object*/source, /*Wire||Object*/target){ + // summary: + // Transfer a source value to a target value on a trigger event or + // topic + // description: + // If 'trigger' specifies 'topic', the topic is subscribed to transer + // a value on the topic. + // Otherwise, the event specified to 'event' of 'trigger' is listened + // to transfer a value. + // On the specified event or topic, transfer() is called with + // 'source', 'target' and the arguments of the event or topic (as + // default root objects). + // trigger: + // An event or topic to trigger a transfer + // source: + // A Wire or arguments to create a Wire for a source value + // target: + // A Wire or arguments to create a Wire for a target value + // returns: + // A connection handle for disconnect() + if(!trigger || !source || !target){ + return; //undefined + } + + var connection = {topic: trigger.topic}; + if(trigger.topic){ + connection.handle = dojo.subscribe(trigger.topic, function(){ + dojox.wire.transfer(source, target, arguments); + }); + }else if(trigger.event){ + connection.handle = dojo.connect(trigger.scope, trigger.event, function(){ + dojox.wire.transfer(source, target, arguments); + }); + } + return connection; //Object +}; + +dojox.wire.disconnect = function(/*Object*/connection){ + // summary: + // Remove a connection or subscription for transfer + // description: + // If 'handle' has 'topic', the topic is unsubscribed. + // Otherwise, the listener to an event is removed. + // connection: + // A connection handle returned by connect() + if(!connection || !connection.handle){ + return; //undefined + } + + if(connection.topic){ + dojo.unsubscribe(connection.handle); + }else{ + dojo.disconnect(connection.handle); + } +}; + +} diff --git a/includes/js/dojox/wire/demos/TableContainer.css b/includes/js/dojox/wire/demos/TableContainer.css new file mode 100644 index 0000000..fded51f --- /dev/null +++ b/includes/js/dojox/wire/demos/TableContainer.css @@ -0,0 +1,25 @@ +.tablecontainer { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; + border-collapse: separate; +} +.tablecontainer th { + text-align: left; +} +.tablecontainer tr { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} +.tablecontainer tr td { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} +.alternate { + background-color: #EEEEEE; +} diff --git a/includes/js/dojox/wire/demos/TableContainer.css.commented.css b/includes/js/dojox/wire/demos/TableContainer.css.commented.css new file mode 100644 index 0000000..4ee2706 --- /dev/null +++ b/includes/js/dojox/wire/demos/TableContainer.css.commented.css @@ -0,0 +1,30 @@ +.tablecontainer { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; + border-collapse: separate; +} + +.tablecontainer th { + text-align: left; +} + +.tablecontainer tr { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} + +.tablecontainer tr td { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} + +.alternate { + background-color: #EEEEEE; +} + diff --git a/includes/js/dojox/wire/demos/TableContainer.js b/includes/js/dojox/wire/demos/TableContainer.js new file mode 100644 index 0000000..fd4ad73 --- /dev/null +++ b/includes/js/dojox/wire/demos/TableContainer.js @@ -0,0 +1,68 @@ +if(!dojo._hasResource["dojox.wire.demos.TableContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.demos.TableContainer"] = true; +dojo.provide("dojox.wire.demos.TableContainer"); + +dojo.require("dojo.parser"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); + +dojo.declare("dojox.wire.demos.TableContainer", [ dijit._Widget, dijit._Templated, dijit._Container ], { + // summary: + // Extremely simple 'widget' that is a table generator with an addRow function that takes an array + // as the row to add, where each entry is a cell in the row. This demo widget is for use with the + // wire demos. + + templateString: "
                              ", + rowCount: 0, + headers: "", + addRow: function(array){ + // summary: + // Function to add in a new row from the elements in the array map to cells in the row. + // array: + // Array of row values to add. + try{ + var row = document.createElement("tr"); + if((this.rowCount%2) === 0){ + dojo.addClass(row, "alternate"); + } + this.rowCount++; + for(var i in array){ + var cell = document.createElement("td"); + var text = document.createTextNode(array[i]); + cell.appendChild(text); + row.appendChild(cell); + + } + this.tableContainer.appendChild(row); + }catch(e){ console.debug(e); } + }, + + clearTable: function(){ + // summary: + // Function to clear all the current rows in the table, except for the header. + + //Always leave the first row, which is the table header. + while(this.tableContainer.firstChild.nextSibling){ + this.tableContainer.removeChild(this.tableContainer.firstChild.nextSibling); + } + this.rowCount = 0; + }, + + postCreate: function(){ + // summary: + // Widget lifecycle function to handle generation of the header elements in the table. + var headers = this.headers.split(","); + var tr = document.createElement("tr"); + for(i in headers){ + + var header = headers[i]; + var th = document.createElement("th"); + var text = document.createTextNode(header); + th.appendChild(text); + tr.appendChild(th); + } + this.tableContainer.appendChild(tr); + } +}); + +} diff --git a/includes/js/dojox/wire/demos/WidgetRepeater.js b/includes/js/dojox/wire/demos/WidgetRepeater.js new file mode 100644 index 0000000..ad1b8b0 --- /dev/null +++ b/includes/js/dojox/wire/demos/WidgetRepeater.js @@ -0,0 +1,33 @@ +if(!dojo._hasResource["dojox.wire.demos.WidgetRepeater"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.demos.WidgetRepeater"] = true; +dojo.provide("dojox.wire.demos.WidgetRepeater") + +dojo.require("dojo.parser"); +dojo.require("dijit._Widget"); +dojo.require("dijit._Templated"); +dojo.require("dijit._Container"); + +dojo.declare("dojox.wire.demos.WidgetRepeater", [ dijit._Widget, dijit._Templated, dijit._Container ], { + // summary: + // Simple widget that does generation of widgets repetatively, based on calls to + // the createNew function and contains them as child widgets. + templateString: "
                              ", + widget: null, + repeater: null, + createNew: function(obj){ + // summary: + // Function to handle the creation of a new widget and appending it into the widget tree. + // obj: + // The parameters to pass to the widget. + try{ + if(dojo.isString(this.widget)){ + dojo.require(this.widget); + this.widget = dojo.getObject(this.widget); + } + this.addChild(new this.widget(obj)); + this.repeaterNode.appendChild(document.createElement("br")); + }catch(e){ console.debug(e); } + } +}); + +} diff --git a/includes/js/dojox/wire/demos/markup/countries.json b/includes/js/dojox/wire/demos/markup/countries.json new file mode 100644 index 0000000..ad3a07a --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/countries.json @@ -0,0 +1,43 @@ +{ identifier: 'name', + items: [ + { name:'Africa', type:'continent', + 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/dojox/wire/demos/markup/demo_ActionChaining.html b/includes/js/dojox/wire/demos/markup/demo_ActionChaining.html new file mode 100644 index 0000000..596d6ec --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_ActionChaining.html @@ -0,0 +1,108 @@ + + + + Sample Action Chaining + + + + + + + + + + Demo of Chaining Actions:

                              + This demo shows how you can chain actions together to fire in a sequence. + Such as the completion of setting one value on a widget triggers the setting of another value on the widget +
                              +
                              + + + + + + + + + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + + + + +
                              +
                              +
                              +
                              + + +
                              +
                              +
                              +
                              + + +
                              + +
                              +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/demo_ActionWiring.html b/includes/js/dojox/wire/demos/markup/demo_ActionWiring.html new file mode 100644 index 0000000..995b67f --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_ActionWiring.html @@ -0,0 +1,142 @@ + + + + Sample declarative data binding + + + + + + + + + +
                              +
                              + Demo Searcher (Searches on Attribute 'name'):

                              + Usage:
                              + Enter the name you want to search the store for. Wildcards * (multiple character), and ? (single character), are allowed. +
                              +
                              + + + + + +
                              +
                              Search Datastore
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + + + + +
                              +
                              + + +
                              +
                              +
                              +
                              + + +
                              +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/demo_BasicChildWire.html b/includes/js/dojox/wire/demos/markup/demo_BasicChildWire.html new file mode 100644 index 0000000..f5973e7 --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_BasicChildWire.html @@ -0,0 +1,78 @@ + + + + Sample Composite (Child) Wire usage. + + + + + + + +
                              +
                              + + +
                              +
                              + + +
                              +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html b/includes/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html new file mode 100644 index 0000000..48c327e --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_BasicColumnWiring.html @@ -0,0 +1,90 @@ + + + + Sample Declarative Data Binding using ColumnWire + + + + + + + + +
                              +
                              + + +
                              + + +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/demo_ConditionalActions.html b/includes/js/dojox/wire/demos/markup/demo_ConditionalActions.html new file mode 100644 index 0000000..ea0ca64 --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_ConditionalActions.html @@ -0,0 +1,221 @@ + + + + Conditional Actions Demo + + + + + + + + + + Demo of Conditional Actions:

                              + This demo shows how you can use actions to read and set widget values, as well as have actions only occur if + if certain conditions are met, such as cloning values as they are typed from the billing address over to the + shipping address if the 'Use Same Address' checkbox is checked true. +
                              +
                              +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + Use Same Address:
                              +
                              + Billing Address + + Shipping Address +
                              + Name:
                              +
                              + Name:
                              +
                              + Address 1:
                              +
                              + Address 1:
                              +
                              + Address 2:
                              +
                              + Address 2:
                              +
                              + City:
                              +
                              + City:
                              +
                              + State:
                              +
                              + State:
                              +
                              + Zip code:
                              +
                              + Zip code:
                              +
                              + + + + + +
                              +
                              +
                              + + + +
                              + +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + +
                              +
                              +
                              +
                              + + + +
                              +
                              + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + + diff --git a/includes/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html b/includes/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html new file mode 100644 index 0000000..54068a9 --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_FlickrStoreWire.html @@ -0,0 +1,281 @@ + + + + Demo of FlickrStore + + + + + + + +

                              + DEMO: FlickrStore Search +

                              +
                              +

                              + Description: +

                              +

                              + This simple demo shows how services, such as Flickr, can be wrapped by the datastore API. In this demo, you can search public + Flickr images through a simple FlickrStore by specifying a series of tags (separated by spaces) to search on. The results + will be displayed below the search box. This demo is the same as the example demo provided in dojox/data/demos/demo_FlickrStore.html, + except that all the interactions are implemented via Wire instead of a script that runs at dojo.addOnLoad(). +

                              +

                              + For fun, search on the 3dny tag! +

                              + +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + Status: + +
                              +
                              + ID: + +
                              +
                              + Tags: + +
                              +
                              + Tagmode: + + +
                              + Number of Pictures: + +
                              +
                              + +
                              +
                              +
                              + +
                              +
                              + + + + + +
                              +
                              +
                              +
                              +
                              +
                              + + + +
                              + + +
                              +
                              + + + +
                              +
                              +
                              +
                              + +
                              +
                              + +
                              +
                              + + + +
                              +
                              +
                              +
                              + + +
                              +
                              +
                              + + + +
                              +
                              + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/demo_TopicWiring.html b/includes/js/dojox/wire/demos/markup/demo_TopicWiring.html new file mode 100644 index 0000000..e091e8b --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/demo_TopicWiring.html @@ -0,0 +1,78 @@ + + + + Sample Topic Wiring + + + + + + + + + + Demo of Topic Wiring

                              + This demo shows how you can wire events to publish to a topic as well as recieve topic events +
                              +
                              + + + + + + + +
                              +
                              +
                              +
                              +
                              + + + + + +
                              +
                              +
                              + + +
                              + + diff --git a/includes/js/dojox/wire/demos/markup/flickrDemo.css b/includes/js/dojox/wire/demos/markup/flickrDemo.css new file mode 100644 index 0000000..793d1c6 --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/flickrDemo.css @@ -0,0 +1,29 @@ +.flickrView { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; + border-collapse: separate; + width: 100%; +} +.flickrView th { + text-align: left; +} +.flickrView tr { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} +.flickrView tr td { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} +.flickrView { + background-color: #EFEFEF; +} +.flickrTitle { + background-color: #CCCCCC; +} diff --git a/includes/js/dojox/wire/demos/markup/flickrDemo.css.commented.css b/includes/js/dojox/wire/demos/markup/flickrDemo.css.commented.css new file mode 100644 index 0000000..7e75a5d --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/flickrDemo.css.commented.css @@ -0,0 +1,35 @@ +.flickrView { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; + border-collapse: separate; + width: 100%; +} + +.flickrView th { + text-align: left; +} + +.flickrView tr { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} + +.flickrView tr td { + padding: 3 3 3 3; + border-width: 1px; + border-style: solid; + border-color: #000000; +} + +.flickrView { + background-color: #EFEFEF; +} + +.flickrTitle { + background-color: #CCCCCC; +} + diff --git a/includes/js/dojox/wire/demos/markup/states.json b/includes/js/dojox/wire/demos/markup/states.json new file mode 100644 index 0000000..bdaa609 --- /dev/null +++ b/includes/js/dojox/wire/demos/markup/states.json @@ -0,0 +1,56 @@ +{"identifier":"abbreviation", +"label": "label", +"items": [ + {"name":"Alabama", "label":"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":"California", "label":"California","abbreviation":"CA"}, + {"name":"Colorado", "label":"Colorado","abbreviation":"CO"}, + {"name":"Connecticut", "label":"Connecticut","abbreviation":"CT"}, + {"name":"Delaware", "label":"Delaware","abbreviation":"DE"}, + {"name":"Florida", "label":"Florida","abbreviation":"FL"}, + {"name":"Georgia", "label":"Georgia","abbreviation":"GA"}, + {"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":"Ohio", "label":"Ohio","abbreviation":"OH"}, + {"name":"Oklahoma", "label":"Oklahoma","abbreviation":"OK"}, + {"name":"Oregon", "label":"Oregon","abbreviation":"OR"}, + {"name":"Pennsylvania", "label":"Pennsylvania","abbreviation":"PA"}, + {"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":"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/dojox/wire/ml/Action.js b/includes/js/dojox/wire/ml/Action.js new file mode 100644 index 0000000..637de41 --- /dev/null +++ b/includes/js/dojox/wire/ml/Action.js @@ -0,0 +1,225 @@ +if(!dojo._hasResource["dojox.wire.ml.Action"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.Action"] = true; +dojo.provide("dojox.wire.ml.Action"); +dojo.provide("dojox.wire.ml.ActionFilter"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Container"); +dojo.require("dojox.wire.Wire"); +dojo.require("dojox.wire.ml.util"); + +dojo.declare("dojox.wire.ml.Action", [dijit._Widget, dijit._Container], { + // summary: + // A base widget to "run" a task on an event or a topic + // description: + // This widget represents a controller task to be run when an event + // (a function) or a topic is issued. + // Sub-classes must implement _run() method to implement their tasks. + // 'trigger' specifies an event scope, an ID of a widget or an DOM + // element, or its property with the optional dotted notation. + // If this widget has child ActionFilter widgets, their filter() + // methods are called with the arguments to the event or the topic. + // If one of filter() methods returns false, run() won't be invoked. + // This widget also can serve as a composite task to run child + // Actions on an event or a topic specified to this widget. + // trigger: + // An event scope + // triggerEvent: + // An event (function) name + // triggerTopic: + // A topic name + trigger: "", + triggerEvent: "", + triggerTopic: "", + + postCreate: function(){ + // summary: + // Call _connect() + // description: + // See _connect(). + this._connect(); + }, + + _connect: function(){ + // summary: + // Connect run() method to an event or a topic + // description: + // If 'triggerEvent' and 'trigger' are specified, connect() is + // used to set up run() to be called on the event. + // If 'triggerTopic' is specified, subscribe() is used to set up + // run() to be called on the topic. + if(this.triggerEvent){ + if(this.trigger){ + var scope = dojox.wire.ml._getValue(this.trigger); + if(scope){ + if(!scope[this.triggerEvent]){ + // set a dummy function for an anonymous object + scope[this.triggerEvent] = function(){}; + } + this._triggerHandle = dojo.connect(scope, this.triggerEvent, this, "run"); + } + }else{ + var event = this.triggerEvent.toLowerCase(); + if(event == "onload"){ + var self = this; + dojo.addOnLoad(function(){ + self._run.apply(self, arguments); + }); + } + } + }else if(this.triggerTopic){ + this._triggerHandle = dojo.subscribe(this.triggerTopic, this, "run"); + } + }, + + _disconnect: function(){ + // summary: + // Disconnect run() method from an event or a topic + // description: + // If 'triggerEvent' and 'trigger' are specified, disconnect() is + // used to set up run() not to be called on the event. + // If 'triggerTopic' is specified, unsubscribe() is used to set up + // run() not to be called on the topic. + if(this._triggerHandle){ + if(this.triggerTopic){ + dojo.unsubscribe(this.triggerTopic, this._triggerHandle); + }else{ + dojo.disconnect(this._triggerHandle); + } + } + }, + + run: function(){ + // summary: + // Run a task + // description: + // This method calls filter() method of child ActionFilter + // widgets. + // If one of them returns false, this method returns. + // Otherwise, _run() method is called. + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if(child instanceof dojox.wire.ml.ActionFilter){ + if(!child.filter.apply(child, arguments)){ + return; + } + } + } + this._run.apply(this, arguments); + }, + + _run: function(){ + // summary: + // Call run() methods of child Action widgets + // description: + // If this widget has child Action widgets, their run() methods + // are called. + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if(child instanceof dojox.wire.ml.Action){ + child.run.apply(child, arguments); + } + } + }, + + uninitialize: function(){ + // summary: + // Over-ride of base widget unitialize function to do some connection cleanup. + this._disconnect(); + return true; + } +}); + +dojo.declare("dojox.wire.ml.ActionFilter", dijit._Widget, { + // summary: + // A widget to define a filter for the parent Action to run + // description: + // This base class checks a required property specified with + // 'required' attribute. + // If 'message' is specified, the message is set to a property + // specified with 'error'. + // Subclasses may implement their own filter() method. + // required: + // A property required + // requiredValue: + // Optional. A specific value the property is required to have. If this isn't provided + // than any non-false/non-null value of the required propery will cause this filter + // to pass. + // type: + // Optional. A specific type to compare the values as (if requiredValue is set) + // Valid values for type are boolean, int, string. Default is string. + // message: + // An error message to emit if the filter doesn't execute due to property mismatch. + // error: + // A property to store an error due to property mismatch. + required: "", + requiredValue: "", + type: "", + message: "", + error: "", + + + filter: function(){ + // summary: + // Check if a required property is specified. Also, if provided, check to see + // if the required property contains a specific value. + // description: + // If a value is undefined for a property, specified with + // 'required', this method returns false. + // If the value for a property is defined, but there isn't a requiredValue for it + // then any non-false value will cause the method to return true. + // if requiredValue is set, then filter compares that value with the value from + // the required property and returns true if and only if they match. + // The type option just allows for a way to convert the required property values + // into a proper form for comparison (boolean, number, etc). + // If 'message' is specified, it is set to a proeprty specified + // with 'error' or shown with alert(). + // If 'required' starts with "arguments", a property of + // the method arguments are checked. + // returns: + // True if a required property is specified (and if requiredValue is specified, + // that they match), otherwise false + if(this.required === ""){ + return true; //Boolean + }else{ + var value = dojox.wire.ml._getValue(this.required, arguments); + if(this.requiredValue === ""){ + //Just see if there's a value, nothing to compare it to. + if(value){ + return true; //Boolean + } + }else{ + //See if we need to type convert. + var reqValue = this.requiredValue; + if(this.type !== ""){ + var lType = this.type.toLowerCase(); + if(lType === "boolean"){ + if(reqValue.toLowerCase() === "false"){ + reqValue = false; + }else{ + reqValue = true; + } + }else if(lType === "number"){ + reqValue = parseInt(reqValue, 10); + } + } + if(value === reqValue){ + return true; //boolean + } + } + } + + if(this.message){ + if(this.error){ + dojox.wire.ml._setValue(this.error, this.message); + }else{ + alert(this.message); + } + } + return false; //Boolean + } +}); + +} diff --git a/includes/js/dojox/wire/ml/Data.js b/includes/js/dojox/wire/ml/Data.js new file mode 100644 index 0000000..71ab0ad --- /dev/null +++ b/includes/js/dojox/wire/ml/Data.js @@ -0,0 +1,143 @@ +if(!dojo._hasResource["dojox.wire.ml.Data"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.Data"] = true; +dojo.provide("dojox.wire.ml.Data"); +dojo.provide("dojox.wire.ml.DataProperty"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Container"); +dojo.require("dojox.wire.ml.util"); + +dojo.declare("dojox.wire.ml.Data", [dijit._Widget, dijit._Container], { + // summary: + // A widget for a data object + // description: + // This widget represents an object with '_properties' property. + // If child 'DataProperty' widgets exist, they are used to initialize + // propertiy values of '_properties' object. + + startup: function(){ + // summary: + // Call _initializeProperties() + // description: + // See _initializeProperties(). + this._initializeProperties(); + }, + + _initializeProperties: function(/*Boolean*/reset){ + // summary: + // Initialize a data object + // description: + // If this widget has child DataProperty widgets, their getValue() + // methods are called and set the return value to a property + // specified by 'name' attribute of the child widgets. + // reset: + // A boolean to reset current properties + if(!this._properties || reset){ + this._properties = {}; + } + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if((child instanceof dojox.wire.ml.DataProperty) && child.name){ + this.setPropertyValue(child.name, child.getValue()); + } + } + }, + + getPropertyValue: function(/*String*/property){ + // summary: + // Return a property value + // description: + // This method returns the value of a property, specified with + // 'property' argument, in '_properties' object. + // property: + // A property name + // returns: + // A property value + return this._properties[property]; //anything + }, + + setPropertyValue: function(/*String*/property, /*anything*/value){ + // summary: + // Store a property value + // description: + // This method stores 'value' as a property, specified with + // 'property' argument, in '_properties' object. + // property: + // A property name + // value: + // A property value + this._properties[property] = value; + } +}); + +dojo.declare("dojox.wire.ml.DataProperty", [dijit._Widget, dijit._Container], { + // summary: + // A widget to define a data property + // description: + // Attributes of this widget are used to add a property to the parent + // Data widget. + // 'type' attribute specifies one of "string", "number", "boolean", + // "array", "object" and "element" (DOM Element) + // (default to "string"). + // If 'type' is "array" or "object", child DataProperty widgets are + // used to initialize the array elements or the object properties. + // name: + // A property name + // type: + // A property type name + // value: + // A property value + name: "", + type: "", + value: "", + + getValue: function(){ + // summary: + // Returns a property value + // description: + // If 'type' is specified, 'value' attribute is converted to + // the specified type and returned. + // Otherwise, 'value' attribute is returned as is. + // returns: + // A property value + var value = this.value; + if(this.type){ + if(this.type == "number"){ + value = parseInt(value); + }else if(this.type == "boolean"){ + value = (value == "true"); + }else if(this.type == "array"){ + value = []; + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if(child instanceof dojox.wire.ml.DataProperty){ + value.push(child.getValue()); + } + } + }else if(this.type == "object"){ + value = {}; + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if((child instanceof dojox.wire.ml.DataProperty) && child.name){ + value[child.name] = child.getValue(); + } + } + }else if(this.type == "element"){ + value = new dojox.wire.ml.XmlElement(value); + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if((child instanceof dojox.wire.ml.DataProperty) && child.name){ + value.setPropertyValue(child.name, child.getValue()); + } + } + } + } + return value; //anything + } +}); + +} diff --git a/includes/js/dojox/wire/ml/DataStore.js b/includes/js/dojox/wire/ml/DataStore.js new file mode 100644 index 0000000..e366d05 --- /dev/null +++ b/includes/js/dojox/wire/ml/DataStore.js @@ -0,0 +1,116 @@ +if(!dojo._hasResource["dojox.wire.ml.DataStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.DataStore"] = true; +dojo.provide("dojox.wire.ml.DataStore"); + +dojo.require("dijit._Widget"); +dojo.require("dojox.wire._base"); + +dojo.declare("dojox.wire.ml.DataStore", dijit._Widget, { + // summary: + // A widget for a data store + // description: + // This widget represents a data store of 'storeClass' attribute. + // storeClass: + // A class name of a data store + storeClass: "", + + postCreate: function(){ + // summary: + // Call _createStore() + // description: + // See _createStore(). + this.store = this._createStore(); + }, + + _createStore: function(){ + // summary: + // Create a data store + // desription: + // A data store of 'storeClass' is created with arguments + // specified with attributes. + // returns: + // A data store + if(!this.storeClass){ + return null; //null + } + var storeClass = dojox.wire._getClass(this.storeClass); + if(!storeClass){ + return null; //null + } + var args = {}; + var attributes = this.domNode.attributes; + for(var i = 0; i < attributes.length; i++){ + var a = attributes.item(i); + if(a.specified && !this[a.nodeName]){ + args[a.nodeName] = a.nodeValue; + } + } + return new storeClass(args); //Object + }, + + getFeatures: function(){ + // summary: + // Call getFeatures() method of a data store + // description: + // See dojo.data.api.Read.getFeatures(). + // returns: + // A features object + return this.store.getFeatures(); //Object + }, + + fetch: function(/*Object*/request){ + // summary: + // Call fetch() method of a data store + // description: + // See dojo.data.api.Read.fetch(). + // request: + // A request object + // returns: + // A request object + return this.store.fetch(request); //Object + }, + + save: function(/*Object*/args){ + // summary: + // Call save() method of a data store + // description: + // See dojo.data.api.Write.save(). + // args: + // A save arguments object + this.store.save(args); + }, + + newItem: function(/*Object*/args){ + // summary: + // Call newItem() method of a data store + // description: + // See dojo.data.api.Write.newItem(). + // args: + // A new item arguments object + // returns: + // A new item + return this.store.newItem(args); //Object + }, + + deleteItem: function(/*Object*/item){ + // summary: + // Call deleteItem() method of a data store + // description: + // See dojo.data.api.Write.deleteItem(). + // returns: + // A boolean + return this.store.deleteItem(item); //Boolean + }, + + revert: function(){ + // summary: + // Call revert() method of a data store + // description: + // See dojo.data.api.Write.revert(). + // returns: + // A boolean + return this.store.revert(); //Boolean + } +}); + +} diff --git a/includes/js/dojox/wire/ml/Invocation.js b/includes/js/dojox/wire/ml/Invocation.js new file mode 100644 index 0000000..3d36623 --- /dev/null +++ b/includes/js/dojox/wire/ml/Invocation.js @@ -0,0 +1,171 @@ +if(!dojo._hasResource["dojox.wire.ml.Invocation"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.Invocation"] = true; +dojo.provide("dojox.wire.ml.Invocation"); + +dojo.require("dojox.wire.ml.Action"); + +dojo.declare("dojox.wire.ml.Invocation", dojox.wire.ml.Action, { + // summary: + // A widget to invoke a method or publish a topic + // description: + // This widget represents a controller task to invoke a method or + // publish a topic when an event (a function) or a topic is issued. + // object: + // A scope of a method to invoke + // method: + // A name of a method to invoke + // topic: + // A name of a topic to publish + // parameters: + // Arguments for the method or the topic + // result: + // A property to store a return value of the method call + // error: + // A property to store an error on the method call + object: "", + method: "", + topic: "", + parameters: "", + result: "", + error: "", + + _run: function(){ + // summary: + // Invoke a method or publish a topic + // description: + // If 'topic' is specified, the topic is published with arguments + // specified to 'parameters'. + // If 'method' and 'object' are specified, the method is invoked + // with arguments specified to 'parameters' and set the return + // value to a property specified to 'result'. + // 'object', 'parameters' and 'result' can specify properties of + // a widget or an DOM element with the dotted notation. + // If 'parameters' are omitted, the arguments to this method are + // passed as is. + if(this.topic){ + var args = this._getParameters(arguments); + try{ + dojo.publish(this.topic, args); + this.onComplete(); + }catch(e){ + this.onError(e); + } + }else if(this.method){ + var scope = (this.object ? dojox.wire.ml._getValue(this.object) : dojo.global); + if(!scope){ + return; //undefined + } + var args = this._getParameters(arguments); + var func = scope[this.method]; + if(!func){ + func = scope.callMethod; + if(!func){ + return; //undefined + } + args = [this.method, args]; + } + try{ + var connected = false; + if(scope.getFeatures){ + var features = scope.getFeatures(); + if((this.method == "fetch" && features["dojo.data.api.Read"]) || + (this.method == "save" && features["dojo.data.api.Write"])){ + var arg = args[0]; + if(!arg.onComplete){ + arg.onComplete = function(){}; + } + //dojo.connect(arg, "onComplete", this, "onComplete"); + this.connect(arg, "onComplete", "onComplete"); + if(!arg.onError){ + arg.onError = function(){}; + } + //dojo.connect(arg, "onError", this, "onError"); + this.connect(arg, "onError", "onError"); + connected = true; + } + } + var r = func.apply(scope, args); + if(!connected){ + if(r && (r instanceof dojo.Deferred)){ + var self = this; + r.addCallbacks( + function(result){self.onComplete(result);}, + function(error){self.onError(error);} + ); + }else{ + this.onComplete(r); + } + } + }catch(e){ + this.onError(e); + } + } + }, + + onComplete: function(/*anything*/result){ + // summary: + // A function called when the method or the topic publish + // completed + // description: + // If 'result' attribute is specified, the result object also set + // to the specified property. + // result: + // The return value of a method or undefined for a topic + if(this.result){ + dojox.wire.ml._setValue(this.result, result); + } + if(this.error){ // clear error + dojox.wire.ml._setValue(this.error, ""); + } + }, + + onError: function(/*anything*/error){ + // summary: + // A function called on an error occurs + // description: + // If 'error' attribute is specified, the error object also set to + // the specified property. + // error: + // The exception or error occurred + if(this.error){ + if(error && error.message){ + error = error.message; + } + dojox.wire.ml._setValue(this.error, error); + } + }, + + _getParameters: function(/*Array*/args){ + // summary: + // Returns arguments to a method or topic to invoke + // description: + // This method retunrs an array of arguments specified by + // 'parameters' attribute, a comma-separated list of IDs and + // their properties in a dotted notation. + // If 'parameters' are omitted, the original arguments are + // used. + // args: + // Arguments to a trigger event or topic + if(!this.parameters){ + // use arguments as is + return args; //Array + } + var parameters = []; + var list = this.parameters.split(","); + if(list.length == 1){ + var parameter = dojox.wire.ml._getValue(dojo.trim(list[0]), args); + if(dojo.isArray(parameter)){ + parameters = parameter; + }else{ + parameters.push(parameter); + } + }else{ + for(var i in list){ + parameters.push(dojox.wire.ml._getValue(dojo.trim(list[i]), args)); + } + } + return parameters; //Array + } +}); + +} diff --git a/includes/js/dojox/wire/ml/Service.js b/includes/js/dojox/wire/ml/Service.js new file mode 100644 index 0000000..15f074b --- /dev/null +++ b/includes/js/dojox/wire/ml/Service.js @@ -0,0 +1,340 @@ +if(!dojo._hasResource["dojox.wire.ml.Service"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.Service"] = true; +dojo.provide("dojox.wire.ml.Service"); +dojo.provide("dojox.wire.ml.RestHandler"); +dojo.provide("dojox.wire.ml.XmlHandler"); +dojo.provide("dojox.wire.ml.JsonHandler"); + +dojo.require("dijit._Widget"); +dojo.require("dojox.data.dom"); +dojo.require("dojox.wire._base"); +dojo.require("dojox.wire.ml.util"); + +dojo.declare("dojox.wire.ml.Service", dijit._Widget, { + // summary: + // A widget for a service + // description: + // This widget represents a service defined by a service description + // specified with 'url' attribute. + // If 'serviceType' and 'serviceUrl' attributes are specified, 'url' + // attribute can be omitted. + // url: + // A URL to a service description + // serviceUrl: + // A URL to a service + // serviceType: + // A service type + // handlerClass: + // A service handler class name + url: "", + serviceUrl: "", + serviceType: "", + handlerClass: "", + preventCache: true, + + postCreate: function(){ + // summary: + // Call _createHandler() + // description: + // See _createHandler(). + this.handler = this._createHandler(); + }, + + _handlerClasses: { + "TEXT": "dojox.wire.ml.RestHandler", + "XML": "dojox.wire.ml.XmlHandler", + "JSON": "dojox.wire.ml.JsonHandler", + "JSON-RPC": "dojo.rpc.JsonService" + }, + + _createHandler: function(){ + // summary: + // Create a service handler + // desription: + // A service handler class is determined by: + // 1. 'handlerClass' attribute + // 2. 'serviceType' attribute + // 3. 'serviceType' property in a service description + // returns: + // A service handler + if(this.url){ + var self = this; + var d = dojo.xhrGet({ + url: this.url, + handleAs: "json", + sync: true + }); + d.addCallback(function(result){ + self.smd = result; + }); + if(this.smd && !this.serviceUrl){ + this.serviceUrl = (this.smd.serviceUrl || this.smd.serviceURL); + } + } + var handlerClass = undefined; + if(this.handlerClass){ + handlerClass = dojox.wire._getClass(this.handlerClass); + }else if(this.serviceType){ + handlerClass = this._handlerClasses[this.serviceType]; + if(handlerClass && dojo.isString(handlerClass)){ + handlerClass = dojox.wire._getClass(handlerClass); + this._handlerClasses[this.serviceType] = handlerClass; + } + }else if(this.smd && this.smd.serviceType){ + handlerClass = this._handlerClasses[this.smd.serviceType]; + if(handlerClass && dojo.isString(handlerClass)){ + handlerClass = dojox.wire._getClass(handlerClass); + this._handlerClasses[this.smd.serviceType] = handlerClass; + } + } + if(!handlerClass){ + return null; //null + } + return new handlerClass(); //Object + }, + + callMethod: function(method, parameters){ + // summary: + // Call a service method with parameters + // method: + // A method name + // parameters: + // An array parameters + var deferred = new dojo.Deferred(); + this.handler.bind(method, parameters, deferred, this.serviceUrl); + return deferred; + } +}); + +dojo.declare("dojox.wire.ml.RestHandler", null, { + // summary: + // A REST service handler + // description: + // This class serves as a base REST service. + // Sub-classes may override _getContent() and _getResult() to handle + // specific content types. + contentType: "text/plain", + handleAs: "text", + + bind: function(method, parameters, deferred, url){ + // summary: + // Call a service method with parameters. + // description: + // A service is called with a URL generated by _getUrl() and + // an HTTP method specified with 'method'. + // For "POST" and "PUT", a content is generated by _getContent(). + // When data is loaded, _getResult() is used to pass the result to + // Deferred.callback(). + // method: + // A method name + // parameters: + // An array of parameters + // deferred: + // 'Deferred' + // url: + // A URL for the method + method = method.toUpperCase(); + var self = this; + var args = { + url: this._getUrl(method, parameters, url), + contentType: this.contentType, + handleAs: this.handleAs, + headers: this.headers, + preventCache: this.preventCache + }; + var d = null; + if(method == "POST"){ + args.postData = this._getContent(method, parameters); + d = dojo.rawXhrPost(args); + }else if(method == "PUT"){ + args.putData = this._getContent(method, parameters); + d = dojo.rawXhrPut(args); + }else if(method == "DELETE"){ + d = dojo.xhrDelete(args); + }else{ // "GET" + d = dojo.xhrGet(args); + } + d.addCallbacks(function(result){ + deferred.callback(self._getResult(result)); + }, function(error){ + deferred.errback(error); + }); + }, + + _getUrl: function(/*String*/method, /*Array*/parameters, /*String*/url){ + // summary: + // Generate a URL + // description: + // If 'method' is "GET" or "DELETE", a query string is generated + // from a query object specified to the first parameter in + // 'parameters' and appended to 'url'. + // If 'url' contains variable seguments ("{parameter_name}"), + // they are replaced with corresponding parameter values, instead. + // method: + // A method name + // parameters: + // An array of parameters + // url: + // A base URL + // returns: + // A URL + var query; + if(method == "GET" || method == "DELETE"){ + if(parameters.length > 0){ + query = parameters[0]; + } + }else{ // "POST" || "PUT" + if(parameters.length > 1){ + query = parameters[1]; + } + } + if(query){ + var queryString = ""; + for(var name in query){ + var value = query[name]; + if(value){ + value = encodeURIComponent(value); + var variable = "{" + name + "}"; + var index = url.indexOf(variable); + if(index >= 0){ // encode in path + url = url.substring(0, index) + value + url.substring(index + variable.length); + }else{ // encode as query string + if(queryString){ + queryString += "&"; + } + queryString += (name + "=" + value); + } + } + } + if(queryString){ + url += "?" + queryString; + } + } + return url; //String + }, + + _getContent: function(/*String*/method, /*Array*/parameters){ + // summary: + // Generate a request content + // description: + // If 'method' is "POST" or "PUT", the first parameter in + // 'parameters' is returned. + // method: + // A method name + // parameters: + // An array of parameters + // returns: + // A request content + if(method == "POST" || method == "PUT"){ + return (parameters ? parameters[0] : null); //anything + }else{ + return null; //null + } + }, + + _getResult: function(/*anything*/data){ + // summary: + // Extract a result + // description: + // A response data is returned as is. + // data: + // A response data returned by a service + // returns: + // A result object + return data; //anything + } +}); + +dojo.declare("dojox.wire.ml.XmlHandler", dojox.wire.ml.RestHandler, { + // summary: + // A REST service handler for XML + // description: + // This class provides XML handling for a REST service. + contentType: "text/xml", + handleAs: "xml", + + _getContent: function(/*String*/method, /*Array*/parameters){ + // description: + // If 'method' is "POST" or "PUT", the first parameter in + // 'parameters' is used to generate an XML content. + // method: + // A method name + // parameters: + // An array of parameters + // returns: + // A request content + var content = null; + if(method == "POST" || method == "PUT"){ + var p = parameters[0]; + if(p){ + if(dojo.isString(p)){ + content = p; + }else{ + var element = p; + if(element instanceof dojox.wire.ml.XmlElement){ + element = element.element; + }else if(element.nodeType === 9 /* DOCUMENT_NODE */){ + element = element.documentElement; + } + var declaration = ""; // TODO: encoding? + content = declaration + dojox.data.dom.innerXML(element); + } + } + } + return content; + }, + + _getResult: function(/*Document*/data){ + // summary: + // Extract a result + // description: + // A response data (XML Document) is returned wrapped with + // XmlElement. + // data: + // A response data returned by a service + // returns: + // A result object + if(data){ + data = new dojox.wire.ml.XmlElement(data); + } + return data; + } +}); + +dojo.declare("dojox.wire.ml.JsonHandler", dojox.wire.ml.RestHandler, { + // summary: + // A REST service handler for JSON + // description: + // This class provides JSON handling for a REST service. + contentType: "text/json", + handleAs: "json", + headers: {"Accept": "*/json"}, + + _getContent: function(/*String*/method, /*Array*/parameters){ + // summary: + // Generate a request content + // description: + // If 'method' is "POST" or "PUT", the first parameter in + // 'parameter' is used to generate a JSON content. + // method: + // A method name + // parameters: + // An array of parameters + // returns: + // A request content + var content = null; + if(method == "POST" || method == "PUT"){ + var p = (parameters ? parameters[0] : undefined); + if(p){ + if(dojo.isString(p)){ + content = p; + }else{ + content = dojo.toJson(p); + } + } + } + return content; //String + } +}); + +} diff --git a/includes/js/dojox/wire/ml/Transfer.js b/includes/js/dojox/wire/ml/Transfer.js new file mode 100644 index 0000000..c7780ca --- /dev/null +++ b/includes/js/dojox/wire/ml/Transfer.js @@ -0,0 +1,359 @@ +if(!dojo._hasResource["dojox.wire.ml.Transfer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.Transfer"] = true; +dojo.provide("dojox.wire.ml.Transfer"); +dojo.provide("dojox.wire.ml.ChildWire"); +dojo.provide("dojox.wire.ml.ColumnWire"); +dojo.provide("dojox.wire.ml.NodeWire"); +dojo.provide("dojox.wire.ml.SegmentWire"); + +dojo.require("dijit._Widget"); +dojo.require("dijit._Container"); +dojo.require("dojox.wire._base"); +dojo.require("dojox.wire.ml.Action"); + +dojo.declare("dojox.wire.ml.Transfer", dojox.wire.ml.Action, { + // summary: + // A widget to transfer values through source and target Wires + // description: + // This widget represents a controller task to transfer a value from + // a source to a target, through a source and a target Wires, when + // an event (a function) or a topic is issued. + // If this widget has child ChildWire widgets, their _addWire() + // methods are called to add Wire arguments to a source or a target + // Wire. + // source: + // A source object and/or property + // sourceStore: + // A data store for a source data item + // sourceAttribute: + // An attribute of a source data item + // sourcePath: + // A simplified XPath to a source property of an XML element + // type: + // A type of the value to be transferred + // converter: + // A class name of a converter for the value to be transferred + // target: + // A target object and/or property + // targetStore: + // A data store for a target data item + // targetAttribute: + // An attribute of a target data item + // targetPath: + // A simplified XPath to a target property of an XML element + source: "", + sourceStore: "", + sourceAttribute: "", + sourcePath: "", + type: "", + converter: "", + delimiter: "", + target: "", + targetStore: "", + targetAttribute: "", + targetPath: "", + + _run: function(){ + // summary: + // Transfer a value from a source to a target + // description: + // First, Wires for a source and a target are created from attributes. + // Then, a value is obtained by getValue() of the source Wire is set + // by setValue() of the target Wire. + // The arguments to this method is passed to getValue() and setValue() + // of Wires, so that they can be used to identify the root objects off + // the arguments. + var sourceWire = this._getWire("source"); + var targetWire = this._getWire("target"); + dojox.wire.transfer(sourceWire, targetWire, arguments); + }, + + _getWire: function(/*String*/which){ + // summary: + // Build Wire arguments from attributes + // description: + // Arguments object for a source or a target Wire, specified by + // 'which' argument, are build from corresponding attributes, + // including '*Store' (for 'dataStore'), '*Attribute' + // (for 'attribute), '*Path' (for 'path'), 'type' and 'converter'. + // 'source' or 'target' attribute is parsed as: + // "object_id.property_name[.sub_property_name...]" + // If 'source' or 'target' starts with "arguments", 'object' + // argument for a Wire is set to null, so that the root object is + // given as an event or topic arguments. + // If this widget has child ChildWire widgets with a corresponding + // 'which' attribute, their _addWire() methods are called to add + // additional Wire arguments and nested Wire is created, + // specifying the Wire defined by this widget to 'object' argument. + // which: + // Which Wire arguments to build, "source" or "target" + // returns: + // Wire arguments object + var args = undefined; + if(which == "source"){ + args = { + object: this.source, + dataStore: this.sourceStore, + attribute: this.sourceAttribute, + path: this.sourcePath, + type: this.type, + converter: this.converter + }; + }else{ // "target" + args = { + object: this.target, + dataStore: this.targetStore, + attribute: this.targetAttribute, + path: this.targetPath + }; + } + if(args.object){ + if(args.object.length >= 9 && args.object.substring(0, 9) == "arguments"){ + args.property = args.object.substring(9); + args.object = null; + }else{ + var i = args.object.indexOf('.'); + if(i < 0){ + args.object = dojox.wire.ml._getValue(args.object); + }else{ + args.property = args.object.substring(i + 1); + args.object = dojox.wire.ml._getValue(args.object.substring(0, i)); + } + } + } + if(args.dataStore){ + args.dataStore = dojox.wire.ml._getValue(args.dataStore); + } + var childArgs = undefined; + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if(child instanceof dojox.wire.ml.ChildWire && child.which == which){ + if(!childArgs){ + childArgs = {}; + } + child._addWire(this, childArgs); + } + } + if(childArgs){ // make nested Wires + childArgs.object = dojox.wire.create(args); + childArgs.dataStore = args.dataStore; + args = childArgs; + } + return args; //Object + } +}); + +dojo.declare("dojox.wire.ml.ChildWire", dijit._Widget, { + // summary: + // A widget to add a child wire + // description: + // Attributes of this widget are used to add a child Wire to + // a composite Wire of the parent Transfer widget. + // which: + // Which Wire to add a child Wire, "source" or "target", default to + // "source" + // object: + // A root object for the value + // property: + // A property for the value + // type: + // A type of the value + // converter: + // A class name of a converter for the value + // attribute: + // A data item attribute for the value + // path: + // A simplified XPath for the value + // name: + // A composite property name + which: "source", + object: "", + property: "", + type: "", + converter: "", + attribute: "", + path: "", + name: "", + + _addWire: function(/*Transfer*/parent, /*Object*/args){ + // summary: + // Add a child Wire to Wire arguments + // description: + // If 'name' attribute is specified, a child Wire is added as + // the named property of 'children' object of 'args'. + // Otherwise, a child Wire is added to 'children' array of 'args'. + // parent: + // A parent Transfer widget + // args: + // Wire arguments + if(this.name){ // object + if(!args.children){ + args.children = {}; + } + args.children[this.name] = this._getWire(parent); + }else{ // array + if(!args.children){ + args.children = []; + } + args.children.push(this._getWire(parent)); + } + }, + + _getWire: function(/*Transfer*/parent){ + // summary: + // Build child Wire arguments from attributes + // description: + // Arguments object for a child Wire are build from attributes, + // including 'object', 'property', 'type', 'converter', + // 'attribute' and 'path'. + // parent: + // A parent Transfer widget + // returns: + // Wire arguments object + return { + object: (this.object ? dojox.wire.ml._getValue(this.object) : undefined), + property: this.property, + type: this.type, + converter: this.converter, + attribute: this.attribute, + path: this.path + }; //Object + } +}); + +dojo.declare("dojox.wire.ml.ColumnWire", dojox.wire.ml.ChildWire, { + // summary: + // A widget to add a column wire + // description: + // Attributes of this widget are used to add a column Wire to + // a TableAdapter of the parent Transfer widget. + // column: + // A column name + column: "", + + _addWire: function(/*Transfer*/parent, /*Object*/args){ + // summary: + // Add a column Wire to Wire arguments + // description: + // If 'column' attribute is specified, a column Wire is added as + // the named property of 'columns' object of 'args'. + // Otherwise, a column Wire is added to 'columns' array of 'args'. + // parent: + // A parent Transfer widget + // args: + // Wire arguments + if(this.column){ // object + if(!args.columns){ + args.columns = {}; + } + args.columns[this.column] = this._getWire(parent); + }else{ // array + if(!args.columns){ + args.columns = []; + } + args.columns.push(this._getWire(parent)); + } + } +}); + +dojo.declare("dojox.wire.ml.NodeWire", [dojox.wire.ml.ChildWire, dijit._Container], { + // summary: + // A widget to add node wires + // description: + // Attributes of this widget are used to add node Wires to + // a TreeAdapter of the parent Transfer widget. + // titleProperty: + // A property for the node title + // titleAttribute: + // A data item attribute for the node title + // titlePath: + // A simplified XPath for the node title + titleProperty: "", + titleAttribute: "", + titlePath: "", + + _addWire: function(/*Transfer*/parent, /*Object*/args){ + // summary: + // Add node Wires to Wire arguments + // description: + // Node Wires are added to 'nodes' array of 'args'. + // parent: + // A parent Transfer widget + // args: + // Wire arguments + if(!args.nodes){ + args.nodes = []; + } + args.nodes.push(this._getWires(parent)); + }, + + _getWires: function(/*Transfer*/parent){ + // summary: + // Build node Wires arguments from attributes + // description: + // Arguments object for 'node' Wire are build from attributes, + // including 'object', 'property', 'type', 'converter', + // 'attribute' and 'path'. + // Arguments object for 'title' Wire are build from another set of + // attributes, 'titleProperty', 'titleAttribute' and 'titlePath'. + // If this widget has child NodeWire widgets, their _getWires() + // methods are called recursively to build 'children' array of + // 'args'. + // parent: + // A parent Transfer widget + // returns: + // Wire arguments object + var args = { + node: this._getWire(parent), + title: { + type: "string", + property: this.titleProperty, + attribute: this.titleAttribute, + path: this.titlePath + } + }; + var childArgs = []; + var children = this.getChildren(); + for(var i in children){ + var child = children[i]; + if(child instanceof dojox.wire.ml.NodeWire){ + childArgs.push(child._getWires(parent)); + } + } + if(childArgs.length > 0){ + args.children = childArgs; + } + return args; //Object + } +}); + +dojo.declare("dojox.wire.ml.SegmentWire", dojox.wire.ml.ChildWire, { + // summary: + // A widget to add a segment wire + // description: + // Attributes of this widget are used to add a segment Wire to + // a TextAdapter of the parent Transfer widget. + + _addWire: function(/*Transfer*/parent, /*Object*/args){ + // summary: + // Add a segument Wire to Wire arguments + // description: + // A segment Wire is added to 'segments' array of 'args'. + // If 'parent' has 'delimiter' attribute, it is used for + // 'delimiter' property of 'args'. + // parent: + // A parent Transfer widget + // args: + // Wire arguments + if(!args.segments){ + args.segments = []; + } + args.segments.push(this._getWire(parent)); + if(parent.delimiter && !args.delimiter){ + args.delimiter = parent.delimiter; + } + } +}); + +} diff --git a/includes/js/dojox/wire/ml/util.js b/includes/js/dojox/wire/ml/util.js new file mode 100644 index 0000000..a336b28 --- /dev/null +++ b/includes/js/dojox/wire/ml/util.js @@ -0,0 +1,295 @@ +if(!dojo._hasResource["dojox.wire.ml.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.util"] = true; +dojo.provide("dojox.wire.ml.util"); + +dojo.require("dojox.data.dom"); +dojo.require("dojox.wire.Wire"); + +dojox.wire.ml._getValue = function(/*String*/source, /*Array*/args){ + // summary: + // Return a value + // description: + // This method obtains an object by an ID of a widget or an DOM + // element. + // If 'source' specifies a dotted notation to its property, a Wire is + // used to get the object property. + // If 'source' starts with "arguments", 'args' is used as a root + // object for the Wire. + // source: + // A string to specify an object and its property + // args: + // An optional arguments array + // returns: + // A value + if(!source){ + return undefined; //undefined + } + var property = undefined; + if(args && source.length >= 9 && source.substring(0, 9) == "arguments"){ + property = source.substring(9); + return new dojox.wire.Wire({property: property}).getValue(args); + } + var i = source.indexOf('.'); + if(i >= 0){ + property = source.substring(i + 1); + source = source.substring(0, i); + } + var object = (dijit.byId(source) || dojo.byId(source) || dojo.getObject(source)); + if(!object){ + return undefined; //undefined + } + if(!property){ + return object; //Object + }else{ + return new dojox.wire.Wire({object: object, property: property}).getValue(); //anything + } +}; + +dojox.wire.ml._setValue = function(/*String*/target, /*anything*/value){ + // summary: + // Store a value + // description: + // This method stores a value by an ID of a widget or an DOM + // element with a dotted notation to its property, using a Wire. + // target: + // A string to specify an object and its property + // value: + // A value + if(!target){ + return; //undefined + } + var i = target.indexOf('.'); + if(i < 0){ + return; //undefined + } + var object = this._getValue(target.substring(0, i)); + if(!object){ + return; //undefined + } + var property = target.substring(i + 1); + new dojox.wire.Wire({object: object, property: property}).setValue(value); +}; + +dojo.declare("dojox.wire.ml.XmlElement", null, { + // summary: + // An object wrapping an XML element + // description: + // This class represents an XML element. + + constructor: function(/*Element||String*/element){ + // summary: + // Initialize with an XML element or a tag name + // element: + // An XML element or a tag name + if(dojo.isString(element)){ + element = this._getDocument().createElement(element); + } + this.element = element; + }, + getPropertyValue: function(/*String*/property){ + // summary: + // Return a property value + // description: + // If 'property' starts with '@', the attribute value is returned. + // If 'property' specifies "text()", the value of the first child + // text is returned. + // Otherwise, child elements of the tag name specified with + // 'property' are returned. + // property: + // A property name + // returns: + // A property value + var value = undefined; + if(!this.element){ + return value; //undefined + } + if(!property){ + return value; //undefined + } + + if(property.charAt(0) == '@'){ + var attribute = property.substring(1); + value = this.element.getAttribute(attribute); + }else if(property == "text()"){ + var text = this.element.firstChild; + if(text){ + value = text.nodeValue; + } + }else{ // child elements + var elements = []; + for(var i = 0; i < this.element.childNodes.length; i++){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == property){ + elements.push(new dojox.wire.ml.XmlElement(child)); + } + } + if(elements.length > 0){ + if(elements.length === 1){ + value = elements[0]; + }else{ + value = elements; + } + } + } + return value; //String||Array||XmlElement + }, + + setPropertyValue: function(/*String*/property, /*String||Array||XmlElement*/value){ + // summary: + // Store a property value + // description: + // If 'property' starts with '@', 'value' is set to the attribute. + // If 'property' specifies "text()", 'value' is set as the first + // child text. + // If 'value' is a string, a child element of the tag name + // specified with 'property' is created and 'value' is set as + // the first child text of the child element. + // Otherwise, 'value' is set to as child elements. + // property: + // A property name + // value: + // A property value + if(!this.element){ + return; //undefined + } + if(!property){ + return; //undefined + } + + if(property.charAt(0) == '@'){ + var attribute = property.substring(1); + if(value){ + this.element.setAttribute(attribute, value); + }else{ + this.element.removeAttribute(attribute); + } + }else if(property == "text()"){ + while(this.element.firstChild){ + this.element.removeChild(this.element.firstChild); + } + if(value){ + var text = this._getDocument().createTextNode(value); + this.element.appendChild(text); + } + }else{ // child elements + var nextChild = null; + for(var i = this.element.childNodes.length - 1; i >= 0; i--){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == property){ + if(!nextChild){ + nextChild = child.nextSibling; + } + this.element.removeChild(child); + } + } + if(value){ + if(dojo.isArray(value)){ + for(var i in value){ + var e = value[i]; + if(e.element){ + this.element.insertBefore(e.element, nextChild); + } + } + }else if(value instanceof dojox.wire.ml.XmlElement){ + if(value.element){ + this.element.insertBefore(value.element, nextChild); + } + }else{ // assume string + var child = this._getDocument().createElement(property); + var text = this._getDocument().createTextNode(value); + child.appendChild(text); + this.element.insertBefore(child, nextChild); + } + } + } + }, + + toString: function(){ + // summary: + // Return a value of the first text child of the element + // description: + // A value of the first text child of the element is returned. + // returns: + // A value of the first text child of the element + var s = ""; + if(this.element){ + var text = this.element.firstChild; + if(text){ + s = text.nodeValue; + } + } + return s; //String + }, + + toObject: function(){ + // summary: + // Return an object representation of the element + // description: + // An object with properties for child elements, attributes and + // text is returned. + // returns: + // An object representation of the element + if(!this.element){ + return null; //null + } + var text = ""; + var obj = {}; + var elements = 0; + for(var i = 0; i < this.element.childNodes.length; i++){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */){ + elements++; + var o = new dojox.wire.ml.XmlElement(child).toObject(); + var name = child.nodeName; + var p = obj[name]; + if(!p){ + obj[name] = o; + }else if(dojo.isArray(p)){ + p.push(o); + }else{ + obj[name] = [p, o]; // make them array + } + }else if(child.nodeType === 3 /* TEXT_NODE */ || + child.nodeType === 4 /* CDATA_SECTION_NODE */){ + text += child.nodeValue; + } + } + var attributes = 0; + if(this.element.nodeType === 1 /* ELEMENT_NODE */){ + attributes = this.element.attributes.length; + for(var i = 0; i < attributes; i++){ + var attr = this.element.attributes[i]; + obj["@" + attr.nodeName] = attr.nodeValue; + } + } + if(elements === 0){ + if(attributes === 0){ + // text only + return text; //String + } + // text with attributes + obj["text()"] = text; + } + // else ignore text + return obj; //Object + }, + + _getDocument: function(){ + // summary: + // Return a DOM document + // description: + // If 'element' is specified, a DOM document of the element is + // returned. + // Otherwise, a DOM document is created. + // returns: + // A DOM document + if(this.element){ + return (this.element.nodeType == 9 /* DOCUMENT_NODE */ ? + this.element : this.element.ownerDocument); //Document + }else{ + return dojox.data.dom.createDocument(); //Document + } + } +}); + +} diff --git a/includes/js/dojox/wire/tests/markup/Action.html b/includes/js/dojox/wire/tests/markup/Action.html new file mode 100644 index 0000000..75cbd49 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Action.html @@ -0,0 +1,147 @@ + + +Test Action + + + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + +
                              +
                              +
                              +
                              +
                              + +
                              +
                              +
                              +
                              +
                              + +
                              +
                              +
                              +
                              +
                              + + + diff --git a/includes/js/dojox/wire/tests/markup/Data.html b/includes/js/dojox/wire/tests/markup/Data.html new file mode 100644 index 0000000..b1107c0 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Data.html @@ -0,0 +1,105 @@ + + +Test Data + + + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/tests/markup/DataStore.html b/includes/js/dojox/wire/tests/markup/DataStore.html new file mode 100644 index 0000000..3c55f7e --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/DataStore.html @@ -0,0 +1,66 @@ + + +Test DataStore + + + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/tests/markup/DataStore.xml b/includes/js/dojox/wire/tests/markup/DataStore.xml new file mode 100644 index 0000000..eeff4c2 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/DataStore.xml @@ -0,0 +1,18 @@ + + + + X1 + Y1 + Z1 + + + X2 + Y2 + Z2 + + + X3 + Y3 + Z3 + + diff --git a/includes/js/dojox/wire/tests/markup/Invocation.html b/includes/js/dojox/wire/tests/markup/Invocation.html new file mode 100644 index 0000000..dd6f6e4 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Invocation.html @@ -0,0 +1,53 @@ + + +Test Invocation + + + + +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/tests/markup/Service.html b/includes/js/dojox/wire/tests/markup/Service.html new file mode 100644 index 0000000..0448c61 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Service.html @@ -0,0 +1,84 @@ + + +Test Service + + + + +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/tests/markup/Service/JSON.smd b/includes/js/dojox/wire/tests/markup/Service/JSON.smd new file mode 100644 index 0000000..2ac9682 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Service/JSON.smd @@ -0,0 +1,11 @@ +{ + "serviceType": "JSON", + "serviceURL": "Service/{name}.json", + "methods": [{ + "name": "get", + "parameters": [{ + "name": "name", + "type": "str" + }] + }] +} diff --git a/includes/js/dojox/wire/tests/markup/Service/XML.smd b/includes/js/dojox/wire/tests/markup/Service/XML.smd new file mode 100644 index 0000000..d833f88 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Service/XML.smd @@ -0,0 +1,11 @@ +{ + "serviceType": "XML", + "serviceURL": "Service/{name}.xml", + "methods": [{ + "name": "get", + "parameters": [{ + "name": "name", + "type": "str" + }] + }] +} diff --git a/includes/js/dojox/wire/tests/markup/Service/a.json b/includes/js/dojox/wire/tests/markup/Service/a.json new file mode 100644 index 0000000..93fc00b --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Service/a.json @@ -0,0 +1,5 @@ +{ + "item": { + "name": "a" + } +} diff --git a/includes/js/dojox/wire/tests/markup/Service/a.xml b/includes/js/dojox/wire/tests/markup/Service/a.xml new file mode 100644 index 0000000..21e4367 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Service/a.xml @@ -0,0 +1,5 @@ + + + a + + diff --git a/includes/js/dojox/wire/tests/markup/Transfer.html b/includes/js/dojox/wire/tests/markup/Transfer.html new file mode 100644 index 0000000..3ec11a4 --- /dev/null +++ b/includes/js/dojox/wire/tests/markup/Transfer.html @@ -0,0 +1,157 @@ + + +Test Transfer + + + + +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              +
                              + + diff --git a/includes/js/dojox/wire/tests/module.js b/includes/js/dojox/wire/tests/module.js new file mode 100644 index 0000000..17f10c3 --- /dev/null +++ b/includes/js/dojox/wire/tests/module.js @@ -0,0 +1,13 @@ +if(!dojo._hasResource["dojox.wire.tests.module"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.module"] = true; +dojo.provide("dojox.wire.tests.module"); + +try{ + dojo.require("dojox.wire.tests.wire"); + dojo.require("dojox.wire.tests.wireml"); +}catch(e){ + doh.debug(e); +} + + +} diff --git a/includes/js/dojox/wire/tests/programmatic/CompositeWire.js b/includes/js/dojox/wire/tests/programmatic/CompositeWire.js new file mode 100644 index 0000000..ae9866a --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/CompositeWire.js @@ -0,0 +1,51 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.CompositeWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.CompositeWire"] = true; +dojo.provide("dojox.wire.tests.programmatic.CompositeWire"); + +dojo.require("dojox.wire.CompositeWire"); + +tests.register("dojox.wire.tests.programmatic.CompositeWire", [ + + function test_CompositeWire_children(t){ + var source = {a: "A", b: "B"}; + var target = {}; + var children = {x: {property: "a"}, y: {property: "b"}}; + var value = new dojox.wire.CompositeWire({object: source, children: children}).getValue(); + t.assertEqual(source.a, value.x); + t.assertEqual(source.b, value.y); + new dojox.wire.CompositeWire({object: target, children: children}).setValue(value); + t.assertEqual(source.a, target.a); + t.assertEqual(source.b, target.b); + + // with argument + target = {}; + value = new dojox.wire.CompositeWire({children: children}).getValue(source); + t.assertEqual(source.a, value.x); + t.assertEqual(source.b, value.y); + new dojox.wire.CompositeWire({children: children}).setValue(value, target); + t.assertEqual(source.a, target.a); + t.assertEqual(source.b, target.b); + + // by array + target = {}; + children = [{property: "a"}, {property: "b"}]; + value = new dojox.wire.CompositeWire({object: source, children: children}).getValue(); + t.assertEqual(source.a, value[0]); + t.assertEqual(source.b, value[1]); + new dojox.wire.CompositeWire({object: target, children: children}).setValue(value); + t.assertEqual(source.a, target.a); + t.assertEqual(source.b, target.b); + + // by array with argument + target = {}; + value = new dojox.wire.CompositeWire({children: children}).getValue(source); + t.assertEqual(source.a, value[0]); + t.assertEqual(source.b, value[1]); + new dojox.wire.CompositeWire({children: children}).setValue(value, target); + t.assertEqual(source.a, target.a); + t.assertEqual(source.b, target.b); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/ConverterDynamic.js b/includes/js/dojox/wire/tests/programmatic/ConverterDynamic.js new file mode 100644 index 0000000..2665148 --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/ConverterDynamic.js @@ -0,0 +1,12 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.ConverterDynamic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.ConverterDynamic"] = true; +dojo.provide("dojox.wire.tests.programmatic.ConverterDynamic"); + +dojo.declare("dojox.wire.tests.programmatic.ConverterDynamic", null, { + convert: function(v){ + return v + 1; + } +}); + + +} diff --git a/includes/js/dojox/wire/tests/programmatic/DataWire.js b/includes/js/dojox/wire/tests/programmatic/DataWire.js new file mode 100644 index 0000000..b146901 --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/DataWire.js @@ -0,0 +1,25 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.DataWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.DataWire"] = true; +dojo.provide("dojox.wire.tests.programmatic.DataWire"); + +dojo.require("dojox.wire.DataWire"); +dojo.require("dojox.data.XmlStore"); + +tests.register("dojox.wire.tests.programmatic.DataWire", [ + + function test_DataWire_attribute(t){ + var store = new dojox.data.XmlStore(); + var item = store.newItem({tagName: "x"}); + new dojox.wire.DataWire({dataStore: store, object: item, attribute: "y"}).setValue("Y"); + var value = new dojox.wire.DataWire({dataStore: store, object: item, attribute: "y"}).getValue(); + t.assertEqual("Y", value); + + // nested attribute + new dojox.wire.DataWire({dataStore: store, object: item, attribute: "y.z"}).setValue("Z"); + value = new dojox.wire.DataWire({dataStore: store, object: item, attribute: "y.z"}).getValue(); + t.assertEqual("Z", value); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/TableAdapter.js b/includes/js/dojox/wire/tests/programmatic/TableAdapter.js new file mode 100644 index 0000000..9e6adc1 --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/TableAdapter.js @@ -0,0 +1,24 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.TableAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.TableAdapter"] = true; +dojo.provide("dojox.wire.tests.programmatic.TableAdapter"); + +dojo.require("dojox.wire.TableAdapter"); + +tests.register("dojox.wire.tests.programmatic.TableAdapter", [ + + function test_TableAdapter_columns(t){ + var source = [ + {a: "A1", b: "B1", c: "C1"}, + {a: "A2", b: "B2", c: "C2"}, + {a: "A3", b: "B3", c: "C3"} + ]; + var columns = {x: {property: "a"}, y: {property: "b"}, z: {property: "c"}}; + var value = new dojox.wire.TableAdapter({object: source, columns: columns}).getValue(); + t.assertEqual(source[0].a, value[0].x); + t.assertEqual(source[1].b, value[1].y); + t.assertEqual(source[2].c, value[2].z); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/TextAdapter.js b/includes/js/dojox/wire/tests/programmatic/TextAdapter.js new file mode 100644 index 0000000..1014b5c --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/TextAdapter.js @@ -0,0 +1,25 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.TextAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.TextAdapter"] = true; +dojo.provide("dojox.wire.tests.programmatic.TextAdapter"); + +dojo.require("dojox.wire.TextAdapter"); + +tests.register("dojox.wire.tests.programmatic.TextAdapter", [ + + function test_TextAdapter_segments(t){ + var source = {a: "a", b: "b", c: "c"}; + var segments = [{property: "a"}, {property: "b"}, {property: "c"}]; + var value = new dojox.wire.TextAdapter({object: source, segments: segments}).getValue(); + t.assertEqual("abc", value); + }, + + function test_TextAdapter_delimiter(t){ + var source = {a: "a", b: "b", c: "c"}; + var segments = [{property: "a"}, {property: "b"}, {property: "c"}]; + var value = new dojox.wire.TextAdapter({object: source, segments: segments, delimiter: "/"}).getValue(); + t.assertEqual("a/b/c", value); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/TreeAdapter.js b/includes/js/dojox/wire/tests/programmatic/TreeAdapter.js new file mode 100644 index 0000000..e1671ed --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/TreeAdapter.js @@ -0,0 +1,29 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.TreeAdapter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.TreeAdapter"] = true; +dojo.provide("dojox.wire.tests.programmatic.TreeAdapter"); + +dojo.require("dojox.wire.TreeAdapter"); + +tests.register("dojox.wire.tests.programmatic.TreeAdapter", [ + + function test_TreeAdapter_nodes(t){ + var source = [ + {a: "A1", b: "B1", c: "C1"}, + {a: "A2", b: "B2", c: "C2"}, + {a: "A3", b: "B3", c: "C3"} + ]; + var nodes = [ + {title: {property: "a"}, children: [ + {node: {property: "b"}}, + {title: {property: "c"}} + ]} + ]; + var value = new dojox.wire.TreeAdapter({object: source, nodes: nodes}).getValue(); + t.assertEqual(source[0].a, value[0].title); + t.assertEqual(source[1].b, value[1].children[0].title); + t.assertEqual(source[2].c, value[2].children[1].title); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/Wire.js b/includes/js/dojox/wire/tests/programmatic/Wire.js new file mode 100644 index 0000000..25a82ec --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/Wire.js @@ -0,0 +1,123 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.Wire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.Wire"] = true; +dojo.provide("dojox.wire.tests.programmatic.Wire"); +dojo.require("dojox.wire.Wire"); + +//Simple connverter class to try to use. +dojo.declare("dojox.wire.tests.programmatic.Wire.Converter", null, { + convert: function(v){ + return v + 1; + } +}); + +//Simple converter function to try to use. +//To get it in the global namespace, gotta assign it to the +//'window' toplevel object. Otherwise it ends up in the +//dojo NS and can't be found. +if (dojo.isBrowser) { + window["__wireTestConverterFunction"] = function(v){ + return v + 1; + }; +}else{ + var __wireTestConverterFunction = function(v){ + return v + 1; + }; +} + +tests.register("dojox.wire.tests.programmatic.Wire", [ + + function test_Wire_property(t){ + var source = {a: "A", b: {c: "B.C"}}; + var target = {a: "a", b: {c: "b.c"}}; + var value = new dojox.wire.Wire({object: source, property: "a"}).getValue(); + new dojox.wire.Wire({object: target, property: "a"}).setValue(value); + t.assertEqual(source.a, target.a); + + // child property + value = new dojox.wire.Wire({object: source, property: "b.c"}).getValue(); + new dojox.wire.Wire({object: target, property: "b.c"}).setValue(value); + t.assertEqual(source.b.c, target.b.c); + + // new property + target = {}; + value = new dojox.wire.Wire({object: source, property: "a"}).getValue(); + new dojox.wire.Wire({object: target, property: "a"}).setValue(value); + t.assertEqual(source.a, target.a); + + // new parent and child property + target.b = {}; + value = new dojox.wire.Wire({object: source, property: "b.c"}).getValue(); + new dojox.wire.Wire({object: target, property: "b.c"}).setValue(value); + t.assertEqual(source.b.c, target.b.c); + + // new parent and child property + target = {}; + value = new dojox.wire.Wire({object: source, property: "b.c"}).getValue(); + new dojox.wire.Wire({object: target, property: "b.c"}).setValue(value); + t.assertEqual(source.b.c, target.b.c); + + // new array property + source = {a: ["A"]}; + target = {}; + value = new dojox.wire.Wire({object: source, property: "a[0]"}).getValue(); + new dojox.wire.Wire({object: target, property: "a[0]"}).setValue(value); + t.assertEqual(source.a[0], target.a[0]); + + // by getter/setter + source = {getA: function() { return this._a; }, _a: "A"}; + target = {setA: function(a) { this._a = a; }}; + value = new dojox.wire.Wire({object: source, property: "a"}).getValue(); + new dojox.wire.Wire({object: target, property: "a"}).setValue(value); + t.assertEqual(source._a, target._a); + + // by get/setPropertyValue + source = {getPropertyValue: function(p) { return this["_" + p]; }, _a: "A"}; + target = {setPropertyValue: function(p, v) { this["_" + p] = v; }}; + value = new dojox.wire.Wire({object: source, property: "a"}).getValue(); + new dojox.wire.Wire({object: target, property: "a"}).setValue(value); + t.assertEqual(source._a, target._a); + }, + + function test_Wire_type(t){ + var source = {a: "1"}; + var string = new dojox.wire.Wire({object: source, property: "a"}).getValue(); + t.assertEqual("11", string + 1); + var number = new dojox.wire.Wire({object: source, property: "a", type: "number"}).getValue(); + t.assertEqual(2, number + 1); + }, + + function test_Wire_converterObject(t){ + var source = {a: "1"}; + var converter = {convert: function(v) { return v + 1; }}; + var string = new dojox.wire.Wire({object: source, property: "a", converter: converter}).getValue(); + t.assertEqual("11", string); + }, + + function test_Wire_converterFunction(t){ + var source = {a: "1"}; + var converter = {convert: function(v) { return v + 1; }}; + var number = new dojox.wire.Wire({object: source, property: "a", type: "number", converter: converter.convert}).getValue(); + t.assertEqual(2, number); + }, + + function test_Wire_converterObjectByString(t){ + var source = {a: "1"}; + var number = new dojox.wire.Wire({object: source, property: "a", type: "number", converter: "dojox.wire.tests.programmatic.Wire.Converter"}).getValue(); + t.assertEqual(2, number); + }, + + function test_Wire_converterFunctionByString(t){ + var source = {a: "1"}; + var number = new dojox.wire.Wire({object: source, property: "a", type: "number", converter: "__wireTestConverterFunction"}).getValue(); + t.assertEqual(2, number); + }, + + function test_Wire_converterObjectByStringDynamic(t){ + var source = {a: "1"}; + var number = new dojox.wire.Wire({object: source, property: "a", type: "number", converter: "dojox.wire.tests.programmatic.ConverterDynamic"}).getValue(); + t.assertEqual(2, number); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/XmlWire.js b/includes/js/dojox/wire/tests/programmatic/XmlWire.js new file mode 100644 index 0000000..b0772d7 --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/XmlWire.js @@ -0,0 +1,32 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic.XmlWire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic.XmlWire"] = true; +dojo.provide("dojox.wire.tests.programmatic.XmlWire"); + +dojo.require("dojox.wire.XmlWire"); + +tests.register("dojox.wire.tests.programmatic.XmlWire", [ + + function test_XmlWire_path(t){ + var object = {}; + var wire = dojox.wire.create({object: object, property: "element"}); + new dojox.wire.XmlWire({object: wire, path: "/x/y/text()"}).setValue("Y"); + var value = new dojox.wire.XmlWire({object: object, property: "element", path: "y/text()"}).getValue(); + t.assertEqual("Y", value); + + // attribute + new dojox.wire.XmlWire({object: object, property: "element", path: "y/@z"}).setValue("Z"); + value = new dojox.wire.XmlWire({object: wire, path: "/x/y/@z"}).getValue(); + t.assertEqual("Z", value); + + // with index + var document = object.element.ownerDocument; + var element = document.createElement("y"); + element.appendChild(document.createTextNode("Y2")); + object.element.appendChild(element); + value = new dojox.wire.XmlWire({object: object.element, path: "y[2]/text()"}).getValue(); + t.assertEqual("Y2", value); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/programmatic/_base.js b/includes/js/dojox/wire/tests/programmatic/_base.js new file mode 100644 index 0000000..00f9abe --- /dev/null +++ b/includes/js/dojox/wire/tests/programmatic/_base.js @@ -0,0 +1,111 @@ +if(!dojo._hasResource["dojox.wire.tests.programmatic._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.programmatic._base"] = true; +dojo.provide("dojox.wire.tests.programmatic._base"); + +dojo.require("dojox.wire._base"); + +tests.register("dojox.wire.tests.programmatic._base", [ + + function test_create(t){ + var wire = dojox.wire.create({}); + t.assertTrue(wire instanceof dojox.wire.Wire); + + wire = dojox.wire.create({property: "a"}); + t.assertTrue(wire instanceof dojox.wire.Wire); + + wire = dojox.wire.create({attribute: "a"}); + t.assertTrue(wire instanceof dojox.wire.DataWire); + + wire = dojox.wire.create({path: "a"}); + t.assertTrue(wire instanceof dojox.wire.XmlWire); + + wire = dojox.wire.create({children: "a"}); + t.assertTrue(wire instanceof dojox.wire.CompositeWire); + + wire = dojox.wire.create({columns: "a"}); + t.assertTrue(wire instanceof dojox.wire.TableAdapter); + + wire = dojox.wire.create({nodes: "a"}); + t.assertTrue(wire instanceof dojox.wire.TreeAdapter); + + wire = dojox.wire.create({segments: "a"}); + t.assertTrue(wire instanceof dojox.wire.TextAdapter); + + wire = dojox.wire.create({wireClass: "dojox.wire.DataWire"}); + t.assertTrue(wire instanceof dojox.wire.DataWire); + }, + + function test_transfer(t){ + var source = {a: "A"}; + var target = {}; + dojox.wire.transfer( + {object: source, property: "a"}, + {object: target, property: "a"}); + t.assertEqual(source.a, target.a); + }, + + function test_connect(t){ + var trigger = {transfer: function() {}, transferArgument: function() {}}; + var source = {a: "A"}; + var target = {}; + dojox.wire.connect({scope: trigger, event: "transfer"}, + {object: source, property: "a"}, + {object: target, property: "a"}); + trigger.transfer(); + t.assertEqual(source.a, target.a); + + // with argument + target = {}; + dojox.wire.connect({scope: trigger, event: "transferArgument"}, + {property: "[0].a"}, + {object: target, property: "a"}); + trigger.transferArgument(source); + t.assertEqual(source.a, target.a); + + // by topic + target = {}; + dojox.wire.connect({topic: "transfer"}, + {object: source, property: "a"}, + {object: target, property: "a"}); + dojo.publish("transfer"); + t.assertEqual(source.a, target.a); + + // by topic with argument + target = {}; + dojox.wire.connect({topic: "transferArgument"}, + {property: "[0].a"}, + {object: target, property: "a"}); + dojo.publish("transferArgument", [source]); + t.assertEqual(source.a, target.a); + }, + + function test_disconnect(t){ + var trigger = {transferDisconnect: function() {}}; + var source = {a: "A"}; + var target = {}; + var connection = dojox.wire.connect({scope: trigger, event: "transferDisconnect"}, + {object: source, property: "a"}, + {object: target, property: "a"}); + trigger.transferDisconnect(); + t.assertEqual(source.a, target.a); + delete target.a; + dojox.wire.disconnect(connection); + trigger.transferDisconnect(); + t.assertEqual(undefined, target.a); + + // by topic + target = {}; + connection = dojox.wire.connect({topic: "transferDisconnect"}, + {object: source, property: "a"}, + {object: target, property: "a"}); + dojo.publish("transferDisconnect"); + t.assertEqual(source.a, target.a); + delete target.a; + dojox.wire.disconnect(connection); + dojo.publish("transferDisconnect"); + t.assertEqual(undefined, target.a); + } + +]); + +} diff --git a/includes/js/dojox/wire/tests/runTests.html b/includes/js/dojox/wire/tests/runTests.html new file mode 100644 index 0000000..f4a51de --- /dev/null +++ b/includes/js/dojox/wire/tests/runTests.html @@ -0,0 +1,9 @@ + + + + Dojox.wire Unit Test Runner + + + Redirecting to D.O.H runner. + + diff --git a/includes/js/dojox/wire/tests/wire.js b/includes/js/dojox/wire/tests/wire.js new file mode 100644 index 0000000..e4e2a21 --- /dev/null +++ b/includes/js/dojox/wire/tests/wire.js @@ -0,0 +1,18 @@ +if(!dojo._hasResource["dojox.wire.tests.wire"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.wire"] = true; +dojo.provide("dojox.wire.tests.wire"); + +try{ + dojo.require("dojox.wire.tests.programmatic._base"); + dojo.require("dojox.wire.tests.programmatic.Wire"); + dojo.requireIf(dojo.isBrowser, "dojox.wire.tests.programmatic.DataWire"); + dojo.requireIf(dojo.isBrowser, "dojox.wire.tests.programmatic.XmlWire"); + dojo.require("dojox.wire.tests.programmatic.CompositeWire"); + dojo.require("dojox.wire.tests.programmatic.TableAdapter"); + dojo.require("dojox.wire.tests.programmatic.TreeAdapter"); + dojo.require("dojox.wire.tests.programmatic.TextAdapter"); +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/wire/tests/wireml.js b/includes/js/dojox/wire/tests/wireml.js new file mode 100644 index 0000000..db47056 --- /dev/null +++ b/includes/js/dojox/wire/tests/wireml.js @@ -0,0 +1,18 @@ +if(!dojo._hasResource["dojox.wire.tests.wireml"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.tests.wireml"] = true; +dojo.provide("dojox.wire.tests.wireml"); + +try{ + if(dojo.isBrowser){ + doh.registerUrl("dojox.wire.tests.ml.Action", dojo.moduleUrl("dojox", "wire/tests/markup/Action.html")); + doh.registerUrl("dojox.wire.tests.ml.Transfer", dojo.moduleUrl("dojox", "wire/tests/markup/Transfer.html")); + doh.registerUrl("dojox.wire.tests.ml.Invocation", dojo.moduleUrl("dojox", "wire/tests/markup/Invocation.html")); + doh.registerUrl("dojox.wire.tests.ml.Data", dojo.moduleUrl("dojox", "wire/tests/markup/Data.html")); + doh.registerUrl("dojox.wire.tests.ml.DataStore", dojo.moduleUrl("dojox", "wire/tests/markup/DataStore.html")); + doh.registerUrl("dojox.wire.tests.ml.Service", dojo.moduleUrl("dojox", "wire/tests/markup/Service.html")); + } +}catch(e){ + doh.debug(e); +} + +} diff --git a/includes/js/dojox/xml/DomParser.js b/includes/js/dojox/xml/DomParser.js new file mode 100644 index 0000000..f61e653 --- /dev/null +++ b/includes/js/dojox/xml/DomParser.js @@ -0,0 +1,379 @@ +if(!dojo._hasResource["dojox.xml.DomParser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.xml.DomParser"] = true; +dojo.provide("dojox.xml.DomParser"); + +dojox.xml.DomParser=new (function(){ + /********************************************************** + * The DomParser is a close-to (but not entirely) + * conforming XML parser based on regular + * expressions. It will take any XML fragment + * and return a lightweight JS structure that is + * similar to (but not exactly) the DOM specification. + * + * Getter and setter methods are NOT available; the goal + * was to keep the resulting object model entirely JS-like. + * + * All node types but document fragments are supported; + * all nodes support getElementsByTagName and + * getElementsByTagNameNS (with short names byName and + * byNameNS). The document node supports getElementById + * (byId), and all nodes support a supplimental + * childrenByName/childrenByNameNS method as well. + * + * The object model is intended to be a READONLY format; + * mutation events are NOT supported, and though you + * can change properties on a node-by-node basis, certain + * operations are not supported (such as changing the ID + * of an element). + **********************************************************/ + + // internal use only. + var nodeTypes={ ELEMENT:1, ATTRIBUTE:2, TEXT:3, CDATA_SECTION:4, PROCESSING_INSTRUCTION:7, COMMENT:8, DOCUMENT:9 }; + + // compile the regular expressions once. + var reTags=/<([^>\/\s+]*)([^>]*)>([^<]*)/g; + var reAttr=/([^=]*)="([^"]*)"/g; + var reEntity=//g; + var reCData=//g; + var reComments=//g; + var trim=/^\s+|\s+$/g; + var normalize=/\s+/g; + var egt=/\>/g; + var elt=/\</g; + var equot=/\"/g; + var eapos=/\'/g; + var eamp=/\&/g; + var dNs="_def_"; + + // create a root node. + function _doc(){ + return new (function(){ + var all={}; + this.nodeType=nodeTypes.DOCUMENT; + this.nodeName="#document"; + this.namespaces={}; + this._nsPaths={}; + this.childNodes=[]; + this.documentElement=null; + + // any element with an ID attribute will be added to the internal hashtable. + this._add=function(obj){ + if(typeof(obj.id)!="undefined"){ all[obj.id]=obj; } + }; + this._remove=function(id){ + if(all[id]){ delete all[id]; } + }; + + this.byId=this.getElementById=function(id){ return keys[id]; }; + this.byName=this.getElementsByTagName=byName; + this.byNameNS=this.getElementsByTagNameNS=byNameNS; + this.childrenByName=childrenByName; + })(); + } + + // functions attached to element nodes + function byName(name){ + // return all descendants with name. Fully qualified (i.e. svg:svg) + function __(node, name, arr){ + dojo.forEach(node.childNodes, function(c){ + if(c.nodeType==nodeTypes.ELEMENT){ + if(name=="*"){ arr.push(c); } + else if(c.nodeName==name){ arr.push(c); } + __(c, name, arr); + } + }); + } + var a=[]; + __(this, name, a); + return a; + } + function byNameNS(name, ns){ + // return all descendants with name by namespace. If no namespace passed, the default is used. + function __(node, name, ns, arr){ + dojo.forEach(node.childNodes, function(c){ + if(c.nodeType==nodeTypes.ELEMENT){ + if(name=="*"&&c.ownerDocument._nsPaths[ns]==c.namespace){ arr.push(c); } + else if(c.localName==name&&c.ownerDocument._nsPaths[ns]==c.namespace){ arr.push(c); } + __(c, name, ns, arr); + } + }); + } + if(!ns){ ns=dNs; } + var a=[]; + __(this, name, ns, a); + return a; + } + // Only child nodes with name. + function childrenByName(name){ + var a=[]; + dojo.forEach(this.childNodes, function(c){ + if(c.nodeType==nodeTypes.ELEMENT){ + if(name=="*"){ a.push(c); } + else if(c.nodeName==name){ a.push(c); } + } + }); + return a; + } + + function _createTextNode(v){ + return { + nodeType:nodeTypes.TEXT, + nodeName:"#text", + nodeValue:v.replace(normalize," ").replace(egt,">").replace(elt,"<").replace(eapos,"'").replace(equot,'"').replace(eamp,"&") + }; + } + + // attribute functions + function getAttr(name){ + for(var i=0; i0){ + return p.childNodes[i-1]; + } + } + } + return null; + } + function next(){ + var p=this.parentNode; + if(p){ + for(var i=0;i0){ + var entity, eRe=[]; + if(reEntity.test(str)){ + reEntity.lastIndex=0; + // match entities + while((entity=reEntity.exec(str))!=null){ + eRe.push({ + entity:"&"+entity[1].replace(trim,"")+";", + expression:entity[2] + }); + } + // replace instances in the document. + for(var i=0; i0) + obj.appendChild(_createTextNode(text)); + }else + + // open tags. + if(res[1].length>0){ + // figure out the type of node. + if(res[1].charAt(0)=="?"){ + // processing instruction + var name=res[1].substr(1); + var target=res[2].substr(0,res[2].length-2); + obj.childNodes.push({ + nodeType:nodeTypes.PROCESSING_INSTRUCTION, + nodeName:name, + nodeValue:target + }); + } + else if(res[1].charAt(0)=="!"){ + // CDATA; skip over any declaration elements. + if(res[1].indexOf("![CDATA[")==0){ + var val=parseInt(res[1].replace("![CDATA[","").replace("]]","")); + obj.childNodes.push({ + nodeType:nodeTypes.CDATA_SECTION, + nodeName:"#cdata-section", + nodeValue:cdSections[val] + }); + } + // Comments. + else if(res[1].substr(0,3)=="!--"){ + var val=parseInt(res[1].replace("!--","").replace("--","")); + obj.childNodes.push({ + nodeType:nodeTypes.COMMENT, + nodeName:"#comment", + nodeValue:comments[val] + }); + } + } + else { + // Elements (with attribute and text) + var name=res[1].replace(trim,""); + var o={ + nodeType:nodeTypes.ELEMENT, + nodeName:name, + localName:name, + namespace:dNs, + ownerDocument:root, + attributes:[], + parentNode:null, + childNodes:[] + }; + + // check to see if it's namespaced. + if(name.indexOf(":")>-1){ + var t=name.split(":"); + o.namespace=t[0]; + o.localName=t[1]; + } + + // set the function references. + o.byName=o.getElementsByTagName=byName; + o.byNameNS=o.getElementsByTagNameNS=byNameNS; + o.childrenByName=childrenByName; + o.getAttribute=getAttr; + o.getAttributeNS=getAttrNS; + o.setAttribute=setAttr; + o.setAttributeNS=setAttrNS; + o.previous=o.previousSibling=prev; + o.next=o.nextSibling=next; + + // parse the attribute string. + var attr; + while((attr=reAttr.exec(res[2]))!=null){ + if(attr.length>0){ + var name=attr[1].replace(trim,""); + var val=attr[2].replace(normalize," ") + .replace(egt,">") + .replace(elt,"<") + .replace(eapos,"'") + .replace(equot,'"') + .replace(eamp,"&"); + if(name.indexOf("xmlns")==0){ + if(name.indexOf(":")>0){ + var ns=name.split(":"); + root.namespaces[ns[1]]=val; + root._nsPaths[val]=ns[1]; + } else { + root.namespaces[dNs]=val; + root._nsPaths[val]=dNs; + } + } else { + var ln=name; + var ns=dNs; + if(name.indexOf(":")>0){ + var t=name.split(":"); + ln=t[1]; + ns=t[0]; + } + o.attributes.push({ + nodeType:nodeTypes.ATTRIBUTE, + nodeName:name, + localName:ln, + namespace:ns, + nodeValue:val + }); + + // only add id as a property. + if(ln=="id"){ o.id=val; } + } + } + } + root._add(o); + + if(obj){ + obj.childNodes.push(o); + o.parentNode=obj; + // if it's not a self-closing node. + if(res[2].charAt(res[2].length-1)!="/"){ + obj=o; + } + } + var text=res[3]; + if(text.length>0){ + obj.childNodes.push(_createTextNode(text)); + } + } + } + } + + // set the document element + for(var i=0; i "); + if(!byId("logBody")){ + _logBacklog.push(msg); + return; + }else if((_logBacklog.length)&&(!skip)){ + var tm; + while(tm=_logBacklog.shift()){ + sendToLogPane(tm, true); + } + } + var tn = document.createElement("div"); + tn.innerHTML = msg; + byId("logBody").appendChild(tn); + } + + doh._init = (function(oi){ + return function(){ + var lb = byId("logBody"); + if(lb){ + // clear the console before each run + while(lb.firstChild){ + lb.removeChild(lb.firstChild); + } + } + oi.apply(doh, arguments); + } + })(doh._init); + + if(this["opera"] && opera.postError){ + doh.debug = function(){ + var msg = ""; + for(var x=0; x 700)){ + _nameTimes[name] = new Date(); + var tc = document.createElement("span"); + byId("hiddenAudio").appendChild(tc); + tc.innerHTML = ''; + } + } + } + + doh._testFinished = function(group, fixture, success){ + var fn = getFixtureNode(group, fixture); + if(fn){ + fn.getElementsByTagName("td")[3].innerHTML = (fixture.endTime-fixture.startTime)+"ms"; + fn.className = (success) ? "success" : "failure"; + + if(!success){ + _playSound("doh"); + var gn = getGroupNode(group); + if(gn){ + gn.className = "failure"; + _getGroupToggler(group)(null, true); + } + } + } + this.debug(((success) ? "PASSED" : "FAILED"), "test:", fixture.name); + } + + // FIXME: move implementation to _browserRunner? + doh.registerUrl = function( /*String*/ group, + /*String*/ url, + /*Integer*/ timeout){ + var tg = new String(group); + this.register(group, { + name: url, + setUp: function(){ + doh.currentGroupName = tg; + doh.currentGroup = this; + doh.currentUrl = url; + this.d = new doh.Deferred(); + doh.currentTestDeferred = this.d; + showTestPage(); + byId("testBody").src = url; + }, + timeout: timeout||10000, // 10s + // timeout: timeout||1000, // 10s + runTest: function(){ + // FIXME: implement calling into the url's groups here!! + return this.d; + }, + tearDown: function(){ + doh.currentGroupName = null; + doh.currentGroup = null; + doh.currentTestDeferred = null; + doh.currentUrl = null; + // this.d.errback(false); + // byId("testBody").src = "about:blank"; + showLogPage(); + } + }); + } + + // + // Utility code for runner.html + // + // var isSafari = navigator.appVersion.indexOf("Safari") >= 0; + var tabzidx = 1; + var _showTab = function(toShow, toHide){ + // FIXME: I don't like hiding things this way. + byId(toHide).style.display = "none"; + with(byId(toShow).style){ + display = ""; + zIndex = ++tabzidx; + } + } + + showTestPage = function(){ + _showTab("testBody", "logBody"); + } + + showLogPage = function(){ + _showTab("logBody", "testBody"); + } + + var runAll = true; + toggleRunAll = function(){ + // would be easier w/ query...sigh + runAll = (!runAll); + if(!byId("testList")){ return; } + var tb = byId("testList").tBodies[0]; + var inputs = tb.getElementsByTagName("input"); + var x=0; var tn; + while(tn=inputs[x++]){ + tn.checked = runAll; + doh._groups[tn.group].skip = (!runAll); + } + } + + var listHeightTimer = null; + var setListHeight = function(){ + if(listHeightTimer){ + clearTimeout(listHeightTimer); + } + var tl = byId("testList"); + if(!tl){ return; } + listHeightTimer = setTimeout(function(){ + tl.style.display = "none"; + tl.style.display = ""; + + }, 10); + } + + _addOnEvt("resize", setListHeight); + _addOnEvt("load", setListHeight); + _addOnEvt("load", function(){ + if(loaded){ return; } + loaded = true; + groupTemplate = byId("groupTemplate"); + if(!groupTemplate){ + // make sure we've got an ammenable DOM structure + return; + } + groupTemplate.parentNode.removeChild(groupTemplate); + groupTemplate.style.display = ""; + testTemplate = byId("testTemplate"); + testTemplate.parentNode.removeChild(testTemplate); + testTemplate.style.display = ""; + doh._updateTestList(); + }); + + _addOnEvt("load", + function(){ + doh._onEnd = function(){ + if(doh._failureCount == 0){ + doh.debug("WOOHOO!!"); + _playSound("woohoo"); + }else{ + console.debug("doh._failureCount:", doh._failureCount); + } + if(byId("play")){ + toggleRunning(); + } + } + if(!byId("play")){ + // make sure we've got an ammenable DOM structure + return; + } + var isRunning = false; + var toggleRunning = function(){ + // ugg, this would be so much better w/ dojo.query() + if(isRunning){ + byId("play").style.display = byId("pausedMsg").style.display = ""; + byId("playingMsg").style.display = byId("pause").style.display = "none"; + isRunning = false; + }else{ + byId("play").style.display = byId("pausedMsg").style.display = "none"; + byId("playingMsg").style.display = byId("pause").style.display = ""; + isRunning = true; + } + } + doh.run = (function(oldRun){ + return function(){ + if(!doh._currentGroup){ + toggleRunning(); + } + return oldRun.apply(doh, arguments); + } + })(doh.run); + var btns = byId("toggleButtons").getElementsByTagName("span"); + var node; var idx=0; + while(node=btns[idx++]){ + node.onclick = toggleRunning; + } + } + ); + }else{ + // we're in an iframe environment. Time to mix it up a bit. + + _doh = window.parent.doh; + var _thisGroup = _doh.currentGroupName; + var _thisUrl = _doh.currentUrl; + if(_thisGroup){ + doh._testRegistered = function(group, tObj){ + _doh._updateTestList(_thisGroup, tObj); + } + doh._onEnd = function(){ + _doh._errorCount += doh._errorCount; + _doh._failureCount += doh._failureCount; + _doh._testCount += doh._testCount; + // should we be really adding raw group counts? + _doh._groupCount += doh._groupCount; + _doh.currentTestDeferred.callback(true); + } + var otr = doh._getTestObj; + doh._getTestObj = function(){ + var tObj = otr.apply(doh, arguments); + tObj.name = _thisUrl+"::"+arguments[0]+"::"+tObj.name; + return tObj; + } + doh.debug = doh.hitch(_doh, "debug"); + doh.registerUrl = doh.hitch(_doh, "registerUrl"); + doh._testStarted = function(group, fixture){ + _doh._testStarted(_thisGroup, fixture); + } + doh._testFinished = function(g, f, s){ + _doh._testFinished(_thisGroup, f, s); + } + doh._report = function(){}; + } + } + +})(); diff --git a/includes/js/util/doh/_rhinoRunner.js b/includes/js/util/doh/_rhinoRunner.js new file mode 100644 index 0000000..ae47597 --- /dev/null +++ b/includes/js/util/doh/_rhinoRunner.js @@ -0,0 +1,17 @@ +if(this["dojo"]){ + dojo.provide("doh._rhinoRunner"); +} + +doh.debug = print; + +// Override the doh._report method to make it quit with an +// appropriate exit code in case of test failures. +(function(){ + var oldReport = doh._report; + doh._report = function(){ + oldReport.apply(doh, arguments); + if(this._failureCount > 0 || this._errorCount > 0){ + quit(1); + } + } +})(); diff --git a/includes/js/util/doh/_sounds/LICENSE b/includes/js/util/doh/_sounds/LICENSE new file mode 100644 index 0000000..e8e11d4 --- /dev/null +++ b/includes/js/util/doh/_sounds/LICENSE @@ -0,0 +1,10 @@ +License Disclaimer: + +All contents of this directory are Copyright (c) the Dojo Foundation, with the +following exceptions: +------------------------------------------------------------------------------- + +woohoo.wav, doh.wav, dohaaa.wav: + * Copyright original authors. + Copied from: + http://simpson-homer.com/homer-simpson-soundboard.html diff --git a/includes/js/util/doh/_sounds/doh.wav b/includes/js/util/doh/_sounds/doh.wav new file mode 100644 index 0000000000000000000000000000000000000000..5e8a583c81d6d9398bd68e3a4ed8330e0177a8f4 GIT binary patch literal 2878 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 J?*DI`{{wNSQgi?S literal 0 HcmV?d00001 diff --git a/includes/js/util/doh/_sounds/woohoo.wav b/includes/js/util/doh/_sounds/woohoo.wav new file mode 100644 index 0000000000000000000000000000000000000000..eb6921735e67559d2924bc067ee62bfaec5eec25 GIT binary patch literal 3814 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 pW(&|QK>v8Nzu92l84)Ie9T58;qraK + + + + The Dojo Unit Test Harness, $Rev$ + + + + + + + + + + + + + + + + + + +
                              +

                              D.O.H.: The Dojo Objective Harness

                              + + + + + +
                              + + + + + + Stopped + + + + + +
                              +
                              + + + + + + + + + + + + + + + + + + + + + + + +
                                + + testtime
                              +
                              +
                              +
                              +
                              +
                              
                              +						
                              + + +
                              +
                              + + + + diff --git a/includes/js/util/doh/runner.js b/includes/js/util/doh/runner.js new file mode 100644 index 0000000..f5e47e1 --- /dev/null +++ b/includes/js/util/doh/runner.js @@ -0,0 +1,948 @@ +// FIXME: need to add async tests +// FIXME: need to handle URL wrapping and test registration/running from URLs + +// package system gunk. +try{ + dojo.provide("doh.runner"); +}catch(e){ + if(!this["doh"]){ + doh = {}; + } +} + +// +// Utility Functions and Classes +// + +doh.selfTest = false; + +doh.hitch = function(/*Object*/thisObject, /*Function|String*/method /*, ...*/){ + var args = []; + for(var x=2; x= 0)) { + this._fire(); + } + }, + + _continue: function(res){ + this._resback(res); + this._unpause(); + }, + + _resback: function(res){ + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + this._fire(); + }, + + _check: function(){ + if(this.fired != -1){ + if(!this.silentlyCancelled){ + throw new Error("already called!"); + } + this.silentlyCancelled = false; + return; + } + }, + + callback: function(res){ + this._check(); + this._resback(res); + }, + + errback: function(res){ + this._check(); + if(!(res instanceof Error)){ + res = new Error(res); + } + this._resback(res); + }, + + addBoth: function(cb, cbfn){ + var enclosed = this.getFunctionFromArgs(cb, cbfn); + if(arguments.length > 2){ + enclosed = doh.hitch(null, enclosed, arguments, 2); + } + return this.addCallbacks(enclosed, enclosed); + }, + + addCallback: function(cb, cbfn){ + var enclosed = this.getFunctionFromArgs(cb, cbfn); + if(arguments.length > 2){ + enclosed = doh.hitch(null, enclosed, arguments, 2); + } + return this.addCallbacks(enclosed, null); + }, + + addErrback: function(cb, cbfn){ + var enclosed = this.getFunctionFromArgs(cb, cbfn); + if(arguments.length > 2){ + enclosed = doh.hitch(null, enclosed, arguments, 2); + } + return this.addCallbacks(null, enclosed); + }, + + addCallbacks: function(cb, eb){ + this.chain.push([cb, eb]) + if(this.fired >= 0){ + this._fire(); + } + return this; + }, + + _fire: function(){ + var chain = this.chain; + var fired = this.fired; + var res = this.results[fired]; + var self = this; + var cb = null; + while (chain.length > 0 && this.paused == 0){ + // Array + var pair = chain.shift(); + var f = pair[fired]; + if(f == null){ + continue; + } + try { + res = f(res); + fired = ((res instanceof Error) ? 1 : 0); + if(res instanceof doh.Deferred){ + cb = function(res){ + self._continue(res); + } + this._pause(); + } + }catch(err){ + fired = 1; + res = err; + } + } + this.fired = fired; + this.results[fired] = res; + if((cb)&&(this.paused)){ + res.addBoth(cb); + } + } +}); + +// +// State Keeping and Reporting +// + +doh._testCount = 0; +doh._groupCount = 0; +doh._errorCount = 0; +doh._failureCount = 0; +doh._currentGroup = null; +doh._currentTest = null; +doh._paused = true; + +doh._init = function(){ + this._currentGroup = null; + this._currentTest = null; + this._errorCount = 0; + this._failureCount = 0; + this.debug(this._testCount, "tests to run in", this._groupCount, "groups"); +} + +// doh._urls = []; +doh._groups = {}; + +// +// Test Registration +// + +doh.registerTestNs = function(/*String*/ group, /*Object*/ ns){ + // summary: + // adds the passed namespace object to the list of objects to be + // searched for test groups. Only "public" functions (not prefixed + // with "_") will be added as tests to be run. If you'd like to use + // fixtures (setUp(), tearDown(), and runTest()), please use + // registerTest() or registerTests(). + for(var x in ns){ + if( (x.charAt(0) != "_") && + (typeof ns[x] == "function") ){ + this.registerTest(group, ns[x]); + } + } +} + +doh._testRegistered = function(group, fixture){ + // slot to be filled in +} + +doh._groupStarted = function(group){ + // slot to be filled in +} + +doh._groupFinished = function(group, success){ + // slot to be filled in +} + +doh._testStarted = function(group, fixture){ + // slot to be filled in +} + +doh._testFinished = function(group, fixture, success){ + // slot to be filled in +} + +doh.registerGroup = function( /*String*/ group, + /*Array||Function||Object*/ tests, + /*Function*/ setUp, + /*Function*/ tearDown){ + // summary: + // registers an entire group of tests at once and provides a setUp and + // tearDown facility for groups. If you call this method with only + // setUp and tearDown parameters, they will replace previously + // installed setUp or tearDown functions for the group with the new + // methods. + // group: + // string name of the group + // tests: + // either a function or an object or an array of functions/objects. If + // an object, it must contain at *least* a "runTest" method, and may + // also contain "setUp" and "tearDown" methods. These will be invoked + // on either side of the "runTest" method (respectively) when the test + // is run. If an array, it must contain objects matching the above + // description or test functions. + // setUp: a function for initializing the test group + // tearDown: a function for initializing the test group + if(tests){ + this.register(group, tests); + } + if(setUp){ + this._groups[group].setUp = setUp; + } + if(tearDown){ + this._groups[group].tearDown = tearDown; + } +} + +doh._getTestObj = function(group, test){ + var tObj = test; + if(typeof test == "string"){ + if(test.substr(0, 4)=="url:"){ + return this.registerUrl(group, test); + }else{ + tObj = { + name: test.replace("/\s/g", "_") + }; + tObj.runTest = new Function("t", test); + } + }else if(typeof test == "function"){ + // if we didn't get a fixture, wrap the function + tObj = { "runTest": test }; + if(test["name"]){ + tObj.name = test.name; + }else{ + try{ + var fStr = "function "; + var ts = tObj.runTest+""; + if(0 <= ts.indexOf(fStr)){ + tObj.name = ts.split(fStr)[1].split("(", 1)[0]; + } + // doh.debug(tObj.runTest.toSource()); + }catch(e){ + } + } + // FIXME: try harder to get the test name here + } + return tObj; +} + +doh.registerTest = function(/*String*/ group, /*Function||Object*/ test){ + // summary: + // add the provided test function or fixture object to the specified + // test group. + // group: + // string name of the group to add the test to + // test: + // either a function or an object. If an object, it must contain at + // *least* a "runTest" method, and may also contain "setUp" and + // "tearDown" methods. These will be invoked on either side of the + // "runTest" method (respectively) when the test is run. + if(!this._groups[group]){ + this._groupCount++; + this._groups[group] = []; + this._groups[group].inFlight = 0; + } + var tObj = this._getTestObj(group, test); + if(!tObj){ return; } + this._groups[group].push(tObj); + this._testCount++; + this._testRegistered(group, tObj); + return tObj; +} + +doh.registerTests = function(/*String*/ group, /*Array*/ testArr){ + // summary: + // registers a group of tests, treating each element of testArr as + // though it were being (along with group) passed to the registerTest + // method. + for(var x=0; x 1) ? "s" : "")+" to run"); +} + +doh._handleFailure = function(groupName, fixture, e){ + // this.debug("FAILED test:", fixture.name); + // mostly borrowed from JUM + this._groups[groupName].failures++; + var out = ""; + if(e instanceof this._AssertFailure){ + this._failureCount++; + if(e["fileName"]){ out += e.fileName + ':'; } + if(e["lineNumber"]){ out += e.lineNumber + ' '; } + out += e+": "+e.message; + this.debug("\t_AssertFailure:", out); + }else{ + this._errorCount++; + } + this.debug(e); + if(fixture.runTest["toSource"]){ + var ss = fixture.runTest.toSource(); + this.debug("\tERROR IN:\n\t\t", ss); + }else{ + this.debug("\tERROR IN:\n\t\t", fixture.runTest); + } + + if(e.rhinoException){ + e.rhinoException.printStackTrace(); + }else if(e.javaException){ + e.javaException.printStackTrace(); + } +} + +try{ + setTimeout(function(){}, 0); +}catch(e){ + setTimeout = function(func){ + return func(); + } +} + +doh._runFixture = function(groupName, fixture){ + var tg = this._groups[groupName]; + this._testStarted(groupName, fixture); + var threw = false; + var err = null; + // run it, catching exceptions and reporting them + try{ + // let doh reference "this.group.thinger..." which can be set by + // another test or group-level setUp function + fixture.group = tg; + // only execute the parts of the fixture we've got + if(fixture["setUp"]){ fixture.setUp(this); } + if(fixture["runTest"]){ // should we error out of a fixture doesn't have a runTest? + fixture.startTime = new Date(); + var ret = fixture.runTest(this); + fixture.endTime = new Date(); + // if we get a deferred back from the test runner, we know we're + // gonna wait for an async result. It's up to the test code to trap + // errors and give us an errback or callback. + if(ret instanceof doh.Deferred){ + + tg.inFlight++; + ret.groupName = groupName; + ret.fixture = fixture; + + ret.addErrback(function(err){ + doh._handleFailure(groupName, fixture, err); + }); + + var retEnd = function(){ + if(fixture["tearDown"]){ fixture.tearDown(doh); } + tg.inFlight--; + if((!tg.inFlight)&&(tg.iterated)){ + doh._groupFinished(groupName, (!tg.failures)); + } + doh._testFinished(groupName, fixture, ret.results[0]); + if(doh._paused){ + doh.run(); + } + } + + var timer = setTimeout(function(){ + // ret.cancel(); + // retEnd(); + ret.errback(new Error("test timeout in "+fixture.name.toString())); + }, fixture["timeout"]||1000); + + ret.addBoth(function(arg){ + clearTimeout(timer); + retEnd(); + }); + if(ret.fired < 0){ + doh.pause(); + } + return ret; + } + } + if(fixture["tearDown"]){ fixture.tearDown(this); } + }catch(e){ + threw = true; + err = e; + if(!fixture.endTime){ + fixture.endTime = new Date(); + } + } + var d = new doh.Deferred(); + setTimeout(this.hitch(this, function(){ + if(threw){ + this._handleFailure(groupName, fixture, err); + } + this._testFinished(groupName, fixture, (!threw)); + + if((!tg.inFlight)&&(tg.iterated)){ + doh._groupFinished(groupName, (!tg.failures)); + }else if(tg.inFlight > 0){ + setTimeout(this.hitch(this, function(){ + doh.runGroup(groupName); // , idx); + }), 100); + this._paused = true; + } + if(doh._paused){ + doh.run(); + } + }), 30); + doh.pause(); + return d; +} + +doh._testId = 0; +doh.runGroup = function(/*String*/ groupName, /*Integer*/ idx){ + // summary: + // runs the specified test group + + // the general structure of the algorithm is to run through the group's + // list of doh, checking before and after each of them to see if we're in + // a paused state. This can be caused by the test returning a deferred or + // the user hitting the pause button. In either case, we want to halt + // execution of the test until something external to us restarts it. This + // means we need to pickle off enough state to pick up where we left off. + + // FIXME: need to make fixture execution async!! + + var tg = this._groups[groupName]; + if(tg.skip === true){ return; } + if(this._isArray(tg)){ + if(idx<=tg.length){ + if((!tg.inFlight)&&(tg.iterated == true)){ + if(tg["tearDown"]){ tg.tearDown(this); } + doh._groupFinished(groupName, (!tg.failures)); + return; + } + } + if(!idx){ + tg.inFlight = 0; + tg.iterated = false; + tg.failures = 0; + } + doh._groupStarted(groupName); + if(!idx){ + this._setupGroupForRun(groupName, idx); + if(tg["setUp"]){ tg.setUp(this); } + } + for(var y=(idx||0); y-+({*Zn^4{XF;c-p|X=UwwJV z)Y!%tfk2r0`5p)Yzh2<8!%!c5OO$sj5r|En_#N2)b;2ODq?xvRoM!+w5HJiu)}6YQ z&0x)@_t5$R*E2WLoD9z?`X{B_O+PF2-fshxMx#Lx6crVfE}qjJ24GcH71xsnQ79j7 zUn9c3oHH>oArJ`v8`j<34M1C4+ja03U7^)#4GawAa```%7j=XXwx`zLUp0%=Q%_2p zsndTeBL)UO>&Ul+j%r7z@it!6s> z?4^1PGzG)(H}}3XGBnKlc0ZqK{#Je9@%Skm}7hwbZSs%bg{&+7CbVF5X!IT7lH(^`=6M z1@a52NWU@PtKEFRX7i;kOe6D9`YbBgxNwJ`Wk5{E+j39b`Ce`reloP6f@MqLoWqL~ z=ZA6n!dHHU+fu@IcF1f}f;t~6qO0>!DZ|=;W#D-j_72d{%|3eYliC4^^tp72Q22ql zd2Vj5IscFA_&9*2mzO)9c_V6Xw??7#jYh%Uc)v3$;S{+=Zv_WpVq8j82RBYlO$h{o z7&q~%5mrgv$Azg#;5Hl%M`A+~iNvC9d1YBUP)~`mJpM6oPm)5mi=hZ5k(49NuxiYQ z@W9{SA7dc7wmX~=>!Bl|dTbxHva+hL*osEen^u4o!Td##$-qCN3Y2q_MtQW%H0i-A(g2`MIY6mZukn4 zmb1dq$8CS`Owtt&wN%)B+xUB`W_rY@Ga(_2E=I_bObGWeleVA!IJP?RtLmta($e&i z$j8~}-E|d$*olqeITQ*tG&BSh=h}HmD&BQmb+pLL$};9dfx*FK7;)#%dmG!O zty2^fSOJQne^BdQvzN6RA1E^;qg5vRH8pi?_RTX=PX?o_qeFCJX;Ny3$Kx3hD#fSn z?(_|&`_~yBK77bvw1b|23C(qgR}S$iLu$Q;L_%R+K|!lfSVz;&gK{9*NZuf5j_Gh_ z`d^*h-KWT8(xZ!RXU3Q2-^$C5ut%d9Yrd^Rn^spi9~B_YtTMS zT3}!xkjLZk&N_Ty{N2%`&(4hqK;5-vWtpj|ST{GTAp4gC11>Hu{+!P(kAy@6MhDr#Ti{FK4wt(g0+%{1+=d3i$M zH8h$!Gu~=$=Q+fSD{p9Efz~{II@6kswm5Ck@95y*-2@(u3sh>vnKRB#PCOu#Zf@rs zF5s|OE#UaJZHs?)p~vNTUGA1)VtR=!l}h#V^NWmpbMxj+N?Q)7eR@=s4h(iybU`&L zT3ASkkB^UxjI_5e1rc|n`*HV=VQO-(T*=5@T3JqEuX_Xn&)C?R+qZYHh_U0V7Ylk{eByTU(!vawAVq&IeHInDcHxk1pE_7a kYcm+<_}|t4|MMXc(Un*BdK+8)wi@Ag@XG@=-sH6Z0OaGEMgRZ+ literal 0 HcmV?d00001 diff --git a/scuttle.css b/scuttle.css index 61a0133..12cc247 100644 --- a/scuttle.css +++ b/scuttle.css @@ -470,3 +470,13 @@ ul { margin-right: 1em; width: 75%; } + +/* DOJO Style */ + +.scuttletheme .dijitInputField input, +.scuttletheme .dijitTextBox, +.scuttletheme .dijitComboBox, +.scuttletheme .dijitSpinner { + width: 100%; + margin: 0 0 0 0; +} diff --git a/templates/editbookmark.tpl.php b/templates/editbookmark.tpl.php index b4c74ba..0b6899b 100644 --- a/templates/editbookmark.tpl.php +++ b/templates/editbookmark.tpl.php @@ -18,9 +18,9 @@ switch ($row['bStatus']) { ?>
                              @@ -42,9 +42,13 @@ window.onload = function() { - + + + + + " to include one tag in another. e.g.: europe>france>paris')?> diff --git a/templates/top.inc.php b/templates/top.inc.php index b17c8f0..46698d0 100644 --- a/templates/top.inc.php +++ b/templates/top.inc.php @@ -2,51 +2,67 @@ - <?php echo filter($GLOBALS['sitename'] . (isset($pagetitle) ? ': ' . $pagetitle : '')); ?> - - - - + + + +'; + echo ''; } - } - if (isset($loadjs)) { - echo ''; - } - ?> +} +?> + + + + + + + + + + + + - + + - + '. $subtitle ."\n"; + echo '

                              '. $subtitle ."

                              \n"; } if (isset($error)) { - echo '

                              '. $error ."

                              \n"; + echo '

                              '. $error ."

                              \n"; } if (isset($msg)) { - echo '

                              '. $msg ."

                              \n"; + echo '

                              '. $msg ."

                              \n"; } -?> +?> \ No newline at end of file